菜单

字体定义系统

相关源文件

字体定义系统是 Fira Code 的核心基础,它定义了所有字形、它们的形状、度量和它们之间的关系。它作为构建所有字体文件的主要来源。本文档解释了该系统的结构和组件,重点介绍了 .glyphs 文件格式及其关键元素。

有关如何从这些定义生成连字的信息,请参阅 连字生成系统。有关如何从这些定义构建字体文件的详细信息,请参阅 构建和打包系统

概述

字体定义系统围绕一个主文件:FiraCode.glyphs。此文件包含生成完整字体家族所需的所有信息,包括每个字形形状、OpenType 功能和字体元数据。

来源:FiraCode.glyphs1-7 CHANGELOG.md15-16

.glyphs 文件格式

.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 值以及不同粗细的形状信息。完整的字体包含数千个字形,从基本的拉丁字母到专门的编程符号和连字。

字形结构

字体定义中的字形具有以下关键属性:

  • 字形名称:唯一标识符(例如,aa.cv01greater_greater.liga
  • Unicode 值:用于标准字符(连字不包含此项)
  • 图层:每个粗细(细体、常规、粗体)的形状信息
  • 度量:宽度、侧边距和其他间距信息
  • 导出标志:字形是否包含在最终字体中

字形在字体文件中被组织成逻辑组,尽管它们在实际定义中显示为平面列表。

来源:FiraCode.glyphs13-69

字符类

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 特性

OpenType 功能定义了字体的智能行为,包括连字、上下文替换和样式变体。这些功能使用指定替换和定位规则的特性代码来定义。

关键 OpenType 功能

功能标签目的
上下文替换calt编程连字的核心功能
标准连字liga传统连字
字符变体cv01-cv32替代字形设计
样式集ss01-ss10风格替换组

功能文件组织

上下文替换功能(calt)对 Fira Code 尤为重要,因为它定义了大多数编程连字。此功能代码按文件组织,便于维护

来源:features/calt/center.fea1-25 CHANGELOG.md37-68

间隔符和特殊字形

Fira Code 使用“间隔符”字形系统来辅助连字构建和定位。这些字形不会出现在最终渲染的文本中,而是作为复杂连字中的组件。

间隔符字形遵循以 .spacer 后缀命名的约定(例如,equal.spacerhyphen.spacer)。这些是在需要连字时由字体工具自动生成和维护的。

来源:clojure/fira_code/spacers.clj1-31

粗细轴

Fira Code 是一种可变字体,具有粗细轴,允许从细体到粗体的连续变化。粗细轴在字体元数据中定义。

字体中的每个字形都有不同的粗细主字形的不同图层定义,从而可以精确控制字形外观在粗细范围内的变化。

来源:FiraCode.glyphs7-12 clojure/fira_code/glyphs.clj191-203

字体元数据

字体定义包含影响字体识别和使用方式的重要元数据。

  • 字体族名称:“Fira Code”
  • 版本信息:用于版本化字体文件
  • 版权与许可:法律信息
  • 设计者信息:致谢
  • OpenType 功能:可用功能的定义
  • 粗细轴:粗细变化范围的定义

这些元数据嵌入在生成的字体文件中,操作系统和使用字体的应用程序都可以看到。

来源:FiraCode.glyphs1-7

操作工具

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 的每个版本而演进。字体定义的主要更改包括:

  • 添加用于附加 Unicode 覆盖的新字形
  • 添加或修改连字
  • 创建新的字符变体或样式集
  • 调整度量和间距
  • 修复特定字形的渲染问题

每次更改都记录在 CHANGELOG.md 文件中,该文件提供了字体定义修改的全面历史记录。

来源:CHANGELOG.md1-393

与其他系统的关系

字体定义系统是 Fira Code 中其他系统的基础。

  1. 连字生成系统处理定义以创建 OpenType 功能代码。
  2. 构建系统将定义转换为实际的字体文件。
  3. QA 系统验证定义的正确性。

了解字体定义系统对于任何想要为 Fira Code 做贡献或基于其创建衍生作品的人来说都至关重要。

来源:CHANGELOG.md1-10