本文档解释了 Fira Code 中实现的 OpenType 功能,以及它们如何增强字体以用于编程。它涵盖了功能定义的技术方面、它们的工作方式以及如何在不同环境中启用或禁用它们。有关 Fira Code 中可用连字(ligatures)的特定信息,请参阅连字和编程符号。有关可用字符变体和样式集的详细信息,请参阅字符变体和样式集。
OpenType 功能是内置于字体中的特殊排版功能,可实现高级文本渲染功能。Fira Code 使用这些功能来实现编程连字、替代字符形式和字形定位调整。
来源:FiraCode.glyphs6-17 CHANGELOG.md38-68
在 Fira Code 中,OpenType 功能通过功能文件(.fea)实现,这些文件定义了基于上下文的字形替换规则。这些文件在主字体定义文件(FiraCode.glyphs)中引用,并在构建阶段进行处理。
来源:features/calt/equal_arrows.fea1-73 features/ss09.fea1-21 features/ss10.fea1-32
calt 功能是实现 Fira Code 编程连字的主要机制。它使用上下文敏感规则将字符序列替换为自定义字形。
例如,在features/calt/equal_arrows.fea中,存在复杂的替换规则,可以实现
->、-->、--->)=>、==>、===>)<=>、>=>、<===>)来源:features/calt/equal_arrows.fea7-29 features/calt/center.fea1-25
字符变体(cv01-cv32)和样式集(ss01-ss10)提供了字符或字符组的替代设计
ss02 影响比较运算符)来源:features/ss09.fea1-21 features/ss10.fea1-32 CHANGELOG.md44-68
Fira Code 的 OpenType 功能随着时间的推移发生了显著变化,这在更新日志中有记载。值得注意的发展包括
| 版本 | 功能变更 |
|---|---|
| 7.0-6.0 | 重新组织了功能,将某些连字移至样式集 |
| 6.0 | 添加了许多字符变体(cv01-cv32) |
| 5.0-4.0 | 实现了组合箭头替换 |
| 3.0-2.0 | 添加了更多符号和连字 |
| 1.0 | 从 liga 切换到 calt 以获得更好的编辑器兼容性 |
最重大的架构变化发生在 4.0 版本,当时单个箭头连字被替换为一个组合系统,该系统允许任意长度的箭头序列,从而大大提高了性能和灵活性。
来源:CHANGELOG.md5-68 CHANGELOG.md93-104
让我们看一下等号箭头替换的工作原理
替换通过 OpenType 引擎的多个传递(passes)进行增量式处理
这实现了 Fira Code 特有的任意长度序列,例如箭头。
来源:features/calt/equal_arrows.fea7-72
Fira Code 中的 OpenType 功能是通过查找表实现的,这些表定义了替换规则。规则按顺序处理,后面的规则可能会覆盖前面的规则。
一些重要的规则类型
替换规则:根据上下文将一个字形替换为另一个字形
sub [equal_start.seq equal_middle.seq] equal' by equal_end.seq;
忽略规则:在特定上下文中阻止替换
ignore sub greater' equal less; # Prevents >=< ligature
多重替换:一次替换多个字形
sub less' less equal by less.spacer; # Handles <<= sequence
来源:features/calt/equal_arrows.fea3-72 features/calt/center.fea11-17
不同的应用程序和环境提供不同的控制 OpenType 功能的方法
VS Code
JetBrains IDE: 设置 > 编辑器 > 字体 > 启用连字
有关编辑器特定的详细信息,请参阅编辑器和终端兼容性。
根据展示和用户偏好,一些有用的功能组合包括
ss02 以实现清晰的比较运算符cv01、cv02、ss01 以获得更清晰的字母形式calt,仅启用 ss10 以实现传统的文本连字来源:extras/showcases.txt45-136 CHANGELOG.md38-68
如果 OpenType 功能不起作用
| 功能 | 描述 | 示例 |
|---|---|---|
calt | 上下文交替(主要连字) | -> → 箭头,=> → 粗箭头 |
liga | 标准连字 | fi fl ft |
zero | 带斜线的零 | 0 → 带斜线的 0 |
onum | 旧式数字 | 0123456789 → 旧式数字 |
cv01-cv32 | 字符变体 | 特定字符的替代形式 |
ss01-ss10 | 样式集 | 分组的替代设计 |
来源:FiraCode.glyphs6-17 CHANGELOG.md38-68 extras/showcases.txt102-136