maxp 与变量轴(fvar / STAT)
最后更新 2026-11-02
EN中文
本页目录
maxp 只有一件事:告诉程序「这个字体里一共有多少个字形」。fvar 与 STAT 则是变量字体才有的表,说明「有哪些轴、每个轴从哪到哪、命名实例叫什么」。
三张表放在一起讲,是因为它们都在回答「这个字体有多少东西」——一个数量字形的,一个数量变体的。
maxp:字形总数
两个版本:
| 版本 | 内容 | 谁用 |
|---|---|---|
| 0.5 | 只有 numGlyphs |
CFF 轮廓的字体 |
| 1.0 | numGlyphs + 各类点的最大值 + hinting 相关计数 |
TrueType 轮廓的字体 |
numGlyphs 不等于「认多少个字」,差在三处:
- 一个字形可以被多个码位映射(
cmap里多对一),所以码位数 ≥ 字形数; - 连字、小型大写、上下标这些「替代字形」占字形名额但不占码位;
.notdef(0 号)也在里面。
所以一个 2,000 字形的字体可能覆盖 3,000 个码位,也可能只覆盖 800 个。想知道覆盖多少字符,只能读 cmap。
fvar:轴
fvar 定义了这个字体有哪些可调维度,每个轴的四个数最要紧:
| 字段 | 含义 |
|---|---|
min / default / max |
轴的取值范围,以及「不指定时的默认位置」 |
tag |
轴的名字,四个字符 |
常见的轴:
| tag | 含义 | 单位 |
|---|---|---|
wght |
字重 | 与 usWeightClass 同一套数值(100–900) |
wdth |
字宽 | 百分比,100 = 正常 |
opsz |
光学尺寸 | 大致是「设计时假设的字号」 |
slnt |
倾斜 | 角度 |
ital |
斜体 | 0 或 1 |
自定义轴用大写字母开头(如 GRAD、XTRA),小写开头留给标准轴。所以看到 wght 就知道它是什么意思,看到 GRAD 就得查文档。
命名实例
fvar 里还有一组 命名实例:把几个轴的位置组合起来,起个名字(Regular、Bold、Display),名字同样存在 name 表里。
这就是「一个变量字体文件,在系统字体列表里显示成好几项」的来源:那些项不是多个文件,而是同一个文件的几个预设位置。
STAT:系统怎么给这些变体分组
STAT 是较新的表,告诉操作系统「这个字体有哪些轴、某个位置该叫什么名字」,用于把变量字体正确地归到家族里、并在菜单里列出正确名称。
它和 fvar 的区别:fvar 是给渲染用的(值在这里插值),STAT 是给命名与分组用的(这个位置该显示成什么)。两者不一致时,不同系统会显示不同的名字。
还有什么表
gvar:TrueType 变量字体的每个轴上的字形差异;CFF2:CFF 变量字体的对应物;avar:轴映射,把用户看到的数值线性映射到设计空间(常见于wght的非线性分布);HVAR/VVAR/MVAR:度量随轴变化。
本站怎么处理变量字体
保守做法:一个文件算一个条目,只记录默认位置的字重与宽度,不把轴展开成多个字款。
原因是数据模型:档案与收藏都是按「一个字款一个标识」建的,而变量字体的一「款」不是一个离散对象。真要挑某个轴上的某个值,是排版测试那一侧的事。
延伸阅读
- OpenType 规范:
maxp、fvar、gvar、avar、STAT - OpenType 规范:registered axis tags(标准轴的完整列表)