maxp 与变量轴(fvar / STAT)

最后更新 2026-11-02

EN中文
本页目录

maxp 只有一件事:告诉程序「这个字体里一共有多少个字形」。fvar 与 STAT 则是变量字体才有的表,说明「有哪些轴、每个轴从哪到哪、命名实例叫什么」。

三张表放在一起讲,是因为它们都在回答「这个字体有多少东西」——一个数量字形的,一个数量变体的。

maxp:字形总数

两个版本:

版本 内容 谁用
0.5 只有 numGlyphs CFF 轮廓的字体
1.0 numGlyphs + 各类点的最大值 + hinting 相关计数 TrueType 轮廓的字体

numGlyphs 不等于「认多少个字」,差在三处:

  1. 一个字形可以被多个码位映射(cmap 里多对一),所以码位数 ≥ 字形数;
  2. 连字、小型大写、上下标这些「替代字形」占字形名额但不占码位;
  3. .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(标准轴的完整列表)