字体定义系统是 Fira Code 的核心基础,它定义了所有字形、它们的形状、度量和它们之间的关系。它作为构建所有字体文件的主要来源。本文档解释了该系统的结构和组件,重点介绍了 .glyphs 文件格式及其关键元素。
有关如何从这些定义生成连字的信息,请参阅 连字生成系统。有关如何从这些定义构建字体文件的详细信息,请参阅 构建和打包系统。
字体定义系统围绕一个主文件:FiraCode.glyphs。此文件包含生成完整字体家族所需的所有信息,包括每个字形形状、OpenType 功能和字体元数据。
来源:FiraCode.glyphs1-7 CHANGELOG.md15-16
.glyphs 文件是 Glyphs 字体编辑器使用的结构化文本格式。虽然它看起来与 JSON 相似,但它使用自己的解析规则和格式。该文件以元数据开头,并包含几个顶级部分
{
.appVersion = "3343";
.formatVersion = 3;
DisplayStrings = (
"aáăâäàāąåã"
);
axes = (
{
name = Weight;
tag = wght;
}
);
...
}
Fira Code 项目包含基于 Clojure 的自定义工具来解析和操作此文件格式。这些工具支持对字体定义的程序化修改,特别是对 OpenType 功能的更新。
来源:FiraCode.glyphs1-12 clojure/fira_code/glyphs.clj1-106
Fira Code 中的每个字形都定义了特定的属性,包括其名称、Unicode 值以及不同粗细的形状信息。完整的字体包含数千个字形,从基本的拉丁字母到专门的编程符号和连字。
字体定义中的字形具有以下关键属性:
a,a.cv01,greater_greater.liga)字形在字体文件中被组织成逻辑组,尽管它们在实际定义中显示为平面列表。
Fira Code 中的字符类定义了共享公共属性或行为的字形组。这些类在 OpenType 功能定义中广泛用于对字符集应用转换。
字体定义了几个关键类:
| 类名 | 目的 | 示例成员 |
|---|---|---|
| NotSpace | 所有非空格字形 | a, b, 1, 2, +, -, 等。 |
| Uppercase | 大写字母 | A, B, C, Á, Β, Γ, 等。 |
| Lowercase | 小写字母 | a, b, c, á, β, γ, 等。 |
| OpeningBracket | 开括号 | (, [, { |
| ClosingBracket | 闭括号 | ), ], } |
| Digit | 数字 | 0, 1, 2, 3, 等。 |
| HexDigit | 十六进制数字 | 0-9, a-f, A-F |
| Tall | 全高字符 | A, B, 1, 2, (, 等。 |
字符类定义为字形名称列表,可以使用 @ 符号引用其他类。例如,Tall 类包含 @Uppercase 和其他字形。
来源:FiraCode.glyphs14-73 clojure/fira_code/not_space.clj1-13
OpenType 功能定义了字体的智能行为,包括连字、上下文替换和样式变体。这些功能使用指定替换和定位规则的特性代码来定义。
| 功能 | 标签 | 目的 |
|---|---|---|
| 上下文替换 | calt | 编程连字的核心功能 |
| 标准连字 | liga | 传统连字 |
| 字符变体 | cv01-cv32 | 替代字形设计 |
| 样式集 | ss01-ss10 | 风格替换组 |
上下文替换功能(calt)对 Fira Code 尤为重要,因为它定义了大多数编程连字。此功能代码按文件组织,便于维护
来源:features/calt/center.fea1-25 CHANGELOG.md37-68
Fira Code 使用“间隔符”字形系统来辅助连字构建和定位。这些字形不会出现在最终渲染的文本中,而是作为复杂连字中的组件。
间隔符字形遵循以 .spacer 后缀命名的约定(例如,equal.spacer,hyphen.spacer)。这些是在需要连字时由字体工具自动生成和维护的。
来源:clojure/fira_code/spacers.clj1-31
Fira Code 是一种可变字体,具有粗细轴,允许从细体到粗体的连续变化。粗细轴在字体元数据中定义。
字体中的每个字形都有不同的粗细主字形的不同图层定义,从而可以精确控制字形外观在粗细范围内的变化。
来源:FiraCode.glyphs7-12 clojure/fira_code/glyphs.clj191-203
字体定义包含影响字体识别和使用方式的重要元数据。
这些元数据嵌入在生成的字体文件中,操作系统和使用字体的应用程序都可以看到。
Fira Code 存储库包含几个基于 Clojure 的工具来操作字体定义。
| 工具 | 目的 |
|---|---|
glyphs.clj | .glyphs 文件格式的解析和序列化 |
spacers.clj | 为连字添加间隔符字形 |
not_space.clj | 重新生成 NotSpace 字符类 |
calt.clj | 生成上下文替换功能代码 |
这些工具支持对字体定义的程序化修改,特别是用于在字体发展过程中维护 OpenType 功能和字符类。
来源:clojure/fira_code/glyphs.clj107-223 clojure/fira_code/spacers.clj1-31 clojure/fira_code/not_space.clj1-13
字体定义系统随 Fira Code 的每个版本而演进。字体定义的主要更改包括:
每次更改都记录在 CHANGELOG.md 文件中,该文件提供了字体定义修改的全面历史记录。
字体定义系统是 Fira Code 中其他系统的基础。
了解字体定义系统对于任何想要为 Fira Code 做贡献或基于其创建衍生作品的人来说都至关重要。