- 开发工具
- CLI
【免费下载链接】nerd-fonts
Iconic font aggregator, collection, & patcher. 3,600+ icons, 50+ patched fonts: Hack, Source Code Pro, more. Glyph collections: Font Awesome, Material Design Icons, Octicons, & more
Ubuntu 字体家族是 Canonical 资助、Dalton Maag 设计的开源字体,被 Nerd Fonts 收纳并打上 3,600+ 图标字形。本篇技术指南以 src/unpatched-fonts/Ubuntu/README.md 为骨架,深入讲解 Nerd Fonts 针对 Ubuntu 系列字体的两项关键预处理——移除fi/fl等标准连字、以及通过直接打补丁修正 Ubuntu Condensed 的OS/2usWidthClass字段,并给出可复现的配置与脚本级证据。读完本文,你将掌握 Nerd Fonts 预处理源字体的完整思路、--removeligatures与配置文件的联动机制,以及如何解析并校验 TrueType 字体表结构。
Ubuntu 字体家族与 Nerd Fonts 的集成背景
根据关联文档记载,Ubuntu 字体家族是一组相互匹配的自由/开源字体,主体开发发生在 2010–2011 年,并在 2015 年进行了进一步的功能扩展与缺陷修复。项目由 Canonical Ltd 代表更广泛的自由软件社区与 Ubuntu 项目出资,技术字体设计与实现工作由 Dalton Maag 完成。
该字体家族的两个关键属性值得开发者注意:
- 开源许可:最终交付的 TrueType/OpenType 字体文件以及用于生成字体家族的设计文件均在开放许可下发布,上游明确鼓励使用者对其进行实验、修改、共享与改进。Nerd Fonts 正是基于这一许可前提,才得以合法地对字体进行再加工。
- 非等宽特性:Ubuntu 并非等宽(monospaced)字体,字宽逐字符变化。这意味着在要求每个字符严格落入同一单元格的终端环境中,直接使用可能出现错位观感,这一约束直接影响了 Nerd Fonts 对它的处理与使用建议(详见后文"终端使用建议")。
Nerd Fonts 在仓库中保留了该字体的未打补丁源文件(src/unpatched-fonts/Ubuntu/),当前处理的 Ubuntu 字体版本为0.83。
预处理一:移除fi、fl连字以让位于 Font Awesome 字形
关联文档明确指出:fi、fl以及类似的连字被移除,原因是它们会阻挡部分 Font Awesome 字形("Thefi,fl, and similar ligatures are removed because they would block some Font Awesome glyphs.")。
配置层:Ubuntu 专属 config.cfg
这一预处理由 src/unpatched-fonts/Ubuntu/config.cfg 驱动,内容如下:
[Config] commandline: --removeligatures --makegroups 2 abort-mono-patch: True [Subtables] ligatures: [ "'liga' Standard Ligatures in Latin lookup 20 subtable", "'liga' Standard Ligatures in Greek lookup 21 subtable", "'liga' Standard Ligatures in Cyrillic lookup 22 subtable" ]逐项拆解其含义:
commandline: --removeligatures --makegroups 2:指定修补该字体时附加的 CLI 参数。--removeligatures(别名--removeligs)触发连字移除流程;--makegroups 2则使用替代的字族命名策略。abort-mono-patch: True:Ubuntu 本身非等宽,强制终止将其生成为 Mono 变体的操作,避免生成名不副实的"等宽版"。[Subtables] ligatures:列出需要删除的 GSUB 查找子表(lookup subtable),覆盖拉丁(Latin)、希腊(Greek)与西里尔(Cyrillic)三种书写系统的'liga'标准连字子表,确保fi/fl等连字在这些书写系统中均不会占用字形槽位。
实现层:font-patcher 的 remove_ligatures 调用链
配置文件并非孤立生效,而是与 font-patcher 主脚本深度联动。在参数解析阶段(约 font-patcher),--removeligs/--removeligatures被声明为expert_group下的开关参数,帮助信息明确写着"Removes ligatures specified in configuration file (needs --configfile)",即该参数必须配合--configfile使用。
随后在remove_ligatures()方法(约 font-patcher)中,脚本执行以下逻辑:
- 读取
--configfile指定的配置文件,若Subtables段缺失则输出警告并返回; - 从
Subtables段解析ligatures配置项(JSON 数组格式); - 对每个子表条目,通过
self.sourceFont.removeLookupSubtable(subtable)(FontForge API)执行实际删除; - 支持复杂的正则条件条目:形如
[ regex, table ]的复合条目中,若正则首字符为!则取反匹配,用于按字体名精确筛选需要删除的子表。
从源码结构可以看出,该机制是通用的:任何字体都可通过类似 config.cfg 的配置声明自己的连字黑名单,Ubuntu 的这份配置即是这一通用能力在具体字体上的落地。
预处理二:Ubuntu Condensed 的 usWidthClass 直接打补丁
关联文档记录的另一项预处理是:针对Ubuntu Condensed字体,Nerd Fonts 通过直接打补丁的方式,将OS/2表中的usWidthClass字段修正为 Condensed(值 3)。文档指出所用脚本位于Condensed/目录——需要说明的是,在本仓库的实际布局中,该脚本位于 src/unpatched-fonts/Ubuntu/make_condensed.py,预处理产物则为同目录下的Ubuntu-C_modified.ttf。
为什么要修正 usWidthClass
OS/2表的usWidthClass是 OpenType 字体中描述字符宽度的关键元数据,取值范围 1–9,其中3 表示 Condensed(紧缩/窄体)。上游 Ubuntu Condensed 字体的该字段标注可能不准确,Nerd Fonts 在打包前将其显式修正为 Condensed,从而保证字体在操作系统、排版软件与各类渲染环境中的宽度语义正确。
脚本原理:不依赖外部库的二进制级表修复
make_condensed.py 是一个不依赖 FontForge 等外部库的独立 Python 脚本(标注 Nerd Fonts Version 3.0.1),它直接在字体二进制流上完成修改,核心工作流如下:
- 定位表结构:通过
find_table()遍历字体的表目录(table directory),查找head与OS/2表的偏移量、长度与校验和元数据,并兼容ttcf字体集合文件的子字体索引场景; - 修改宽度字段:读取
OS/2表中位于usWidthClass偏移处的 16 位整数,写入固定值3(代码注释明确标注# 3 == Condensed); - 重算校验和:调用
reset_table_checksum()重算被修改表的校验和,并调用reset_full_checksum()依据 TrueType 规范(魔术常量0xB1B0AFBA)重算文件头checksumAdjustment,确保修改后的字体文件在技术上完整合法。
脚本的goto()方法用命名位置表(如'widthClass'对应2+2+2字节偏移)精确定位字段,全程以getshort/putshort/getlong/putlong这类位级读写原语操作二进制数据,体现了对 TrueType 文件格式(表目录、偏移表、校验和算法)的底层理解。这种"直接打补丁"的方式与使用 FontForge 重新生成字体的路线不同,它只改动单个字段并同步校验和,尽可能保留原字体的其他数据不动。
修补产物:patched-fonts/Ubuntu 下的三种变体
预处理完成后的源字体(包括修正过的Ubuntu-C_modified.ttf)经由 font-patcher 注入图标字形后,产出物位于 patched-fonts/Ubuntu/。从目录清单可以观察到三种命名变体,对应三种使用场景:
UbuntuNerdFont-*(NF):默认形态,图标字形宽度约为普通字母的 1.5 倍,适合支持非等宽字体的终端或编辑器;UbuntuNerdFontPropo-*(NFP):比例(Proportional)形态,适合 GUI 元素、演示文稿等比例排版上下文;- 由于
abort-mono-patch: True的配置约束,该字体不生成UbuntuNerdFontMono-*变体——这一点正印证了关联文档"非等宽"的定位,也与 font-patcher 中--single(Mono)与--nonmono(Propo)的命名逻辑(见 font-patcher)相呼应。
样式方面覆盖 Regular、Italic、Bold、Bold-Italic、Light、Light-Italic、Medium、Medium-Italic 以及预处理后的 Condensed,每个样式子目录下均附有 LICENCE.txt、LICENCE-FAQ.txt 与 README.md。
终端使用建议与字体选择
关联文档(及 patched-fonts/Ubuntu/README.md)特别提醒:Ubuntu 不是等宽字体,在要求每个字符占据相同"单元格"的终端中,字宽差异可能造成视觉错位。因此它更适合作为编辑器、IDE 或图形界面字体,而非传统等宽终端字体。
若你确实需要在终端场景使用 Nerd Fonts 字体,可遵循以下通用选择逻辑(同样适用于其他非等宽源字体):
- 受限于等宽字体的环境,选择带
Nerd Font Mono(NFM)后缀的字体; - 希望获得更大图标(约 1.5 个普通字母宽度)且终端支持,选择不带
Mono的Nerd Font(NF)字体; - 工作在比例上下文(GUI 元素、演示文稿),选择
Nerd Font Propo(NFP)字体。
如何复现 Ubuntu 字体的预处理流程
本仓库是只读资源,但你可以基于下述路径自行复现整个流程:
- 获取源字体:查看 src/unpatched-fonts/Ubuntu/ 目录,包含
Ubuntu-R.ttf、Ubuntu-B.ttf、Ubuntu-C_modified.ttf等原始字体文件及上游的 LICENCE.txt、FONTLOG.txt、TRADEMARKS.txt; - 执行 Condensed 修正:以 make_condensed.py 为模板,对其余需要修正的字体运行
python make_condensed.py <字体文件>,脚本会自动完成usWidthClass=3的写入与校验和重算; - 执行连字移除与打补丁:参考 config.cfg 的格式编写自己的配置,再用 font-patcher 配合
--configfile与--removeligatures参数对字体打补丁(完整配置参数可对照 src/config.sample.cfg 示例文件查阅)。
小结
Ubuntu 字体在 Nerd Fonts 中的集成并非简单的字形拼接,而是包含了两层精细的预处理:一是通过 config.cfg 声明并借助 font-patcher 的--removeligatures机制移除与 Font Awesome 字形冲突的fi/fl等连字;二是通过 make_condensed.py 对 Ubuntu Condensed 的OS/2usWidthClass字段进行直接二进制打补丁并重算校验和。这两项处理分别体现了"配置驱动的通用修补能力"与"面向单字段的精确二进制修复"两种技术路线,对于理解 Nerd Fonts 的字体流水线、乃至自行定制其他开源字体均有直接的参考价值。
- 开发工具
- CLI
【免费下载链接】nerd-fonts
Iconic font aggregator, collection, & patcher. 3,600+ icons, 50+ patched fonts: Hack, Source Code Pro, more. Glyph collections: Font Awesome, Material Design Icons, Octicons, & more
相关推荐
Nerd Fonts Ubuntu Condensed 补丁字体指南:OS/2 宽度类预处理、连字移除与终端应用
Nerd Fonts Ubuntu Condensed 补丁字体指南:OS/2 宽度类预处理、连字移除与终端应用 Ubuntu Condensed 是 Ubun
开发工具CLIUbuntu 字体 Nerd Fonts 补丁版完全指南:Light 变体、字形选择与连字处理
Ubuntu 字体 Nerd Fonts 补丁版完全指南:Light 变体、字形选择与连字处理 本篇技术指南围绕 Nerd Fonts 仓库中 patched
开发工具CLInerd-fonts 中的 Overpass 字体:连字移除原理、补丁配置与 Nerd Font 化实战
nerd fonts 中的 Overpass 字体:连字移除原理、补丁配置与 Nerd Font 化实战 Overpass 是 Red Hat 开源的一套面向
开发工具CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考