- 桌面应用
- 图形学
【免费下载链接】fontforge
Free (libre) font editor for Windows, Mac OS X and GNU+Linux
导读
本篇是 FontForge 官方入门教程的第三章(承接 editexample.rst 的字体与字形创建、editexample2.rst 的字母 "o" 方向约定),核心主题是:在拉丁(希腊、西里尔)字体的设计过程中,如何保证茎宽(stem width)、衬线(serif)与字高(x-height / ascent height)的一致性。文章将以 "l"、"i"、"k" 三个字母为例,完整演示导入位图、衬线翻转复制、标尺测量、Guide 引导层、Knife 切割与 Correct Direction 修正方向等关键操作,并对照 FontForge 源码解释底层原理。读完本文,你将掌握一套可复现的、保证字体整体一致性的字形编辑工作流,以及 FontForge 中与一致性检查相关的全部工具用法。
为什么字体的一致性如此重要
几乎所有拉丁(Greek、Cyrillic)字体都带有衬线——位于茎干末端的特殊收尾装饰。而在几乎所有 LGC 字体中,应当只使用少数几种茎宽:例如字母 "l" 与 "i" 的垂直茎干,宽度应该相同;同一字体中所有字母的 x-height(x 字高)、上升部高度(ascent height)也应当对齐到统一的基准。
FontForge 本身并没有一个"强制一致性"的开关,但它提供了多种命令与工具来帮助你检查一致性、发现不一致之处,例如:
- 标尺工具(Ruler):精确测量茎宽、位移与角度;
- Guide 引导层:在字体级共享的辅助图层上绘制 x-height、ascend 等参考线;
- 复制与翻转:用同一个 "l" 的形状作为其他字母的构造基础,从源头保证茎宽与字宽一致;
- Correct Direction 命令:自动修正轮廓的绘制方向,保证外轮廓顺时针、内轮廓逆时针(详见 editexample2.rst 的方向约定部分)。
下面我们以 "l" 为起点,走一遍完整的流程。
第一步:构建字母 "l"——导入位图并描出右半衬线
与 editexample.rst 中的 "C" 一样,我们从导入位图开始:
- 在字体视图中双击 "l" 对应的方块,打开 Outline Glyph 窗口;
- 通过
File --> Import导入 "l" 的位置图(如果位图恰好是一 em 高,FontForge 会自动缩放到正确尺寸,见 editexample2.rst 的说明); - 使用放大镜(Magnify)工具放大观察底部衬线,注意:底部衬线在左右方向上应当是对称的。
先在前景层(Foreground, F)上描出衬线的右半边轮廓(添加点、切线点与角点的方式同 "C" 的绘制流程),然后用指针工具选中整个轮廓:
- 执行
Edit --> Copy,再执行Edit --> Paste; - 执行
Element --> Transformations --> Transform,在弹出对话框的下拉列表中选择Flip(翻转),并勾选Horizontal(水平翻转)。
拼接翻转后的两半衬线
翻转后的衬线是右半部分的镜像,接下来:
- 用指针工具把翻转后的衬线拖到左侧,让它紧贴字形左边缘(见 l5.png);
- 取消选中整个路径,然后只选中一个端点,把它拖到另一半对应的端点上,使两半端点重合,完成闭合(见 l6.png 与 l7.png);
- 微调曲线控制点,完成整个 "l" 字形(见 l8.png)。
小技巧:由于两半是由同一段轮廓复制翻转而来,只要把端点精确对齐,两半的曲率天然对称,无需手动重画。
第二步:测量茎宽,并在 Guide 层标记升部线
字形画完之后,还有两件重要的事:
用标尺工具测量茎宽
从工具面板中选择标尺(Ruler)工具,从茎干的一侧边缘拖动到另一侧边缘,松开鼠标后会弹出一个小的测量窗口,显示:
- 宽度(Width):例如 58 units;
- 拖动方向(Angle):例如 180 度;
- 水平位移:例如 -58 units;
- 垂直位移:例如 0 units。
这个 58 units 的数值就是该字体中 "l" 的茎宽基准。后续构建 "i"、"k" 时都应以这个数值为目标保持一致。
坐标系统背景:字形窗口中的单位由字体的 em-size 决定,即 ascent 与 descent 之和(PostScript 惯例为 1000,TrueType 常为 2048 或 4096),坐标原点位于基线,水平原点即字形绘制起点(参见 editexample.rst 中对坐标系的说明)。因此 58 units 表示茎宽约为 em 的 5.8%(当 em 为 1000 时)。
在 Guide 层标记升部线
打开图层面板(Layers Palette),选择Guide(#)单选按钮,使引导层变为可编辑状态。然后在 "l" 顶部画一条水平线。
这条线会在所有字形中可见,它标记了该字体的上升部高度(ascent height)——即字体信息对话框中设置的 Ascent 值对应的位置(见 l10.png)。Guide 层在 editexample.rst 中已有介绍:背景层(B)存放针对单个字形的图像与线稿,而 Guide(#)层存放字体级共享的参考线,如 x-height 与升部线。
第三步:构建字母 "i"——复制 "l" 并调整衬线高度
"i" 看起来就像一个短一些的 "l" 上面加一个点。因此最聪明的做法是把 "l" 复制进 "i",这会自动继承:
- 正确的茎宽(与 "l" 完全一致);
- 正确的字宽(advance width)。
复制有两种途径,任选其一:
- 从字体视图复制:在字体视图中选中 "l" 方块,按
Edit --> Copy; - 从轮廓视图复制:在 "l" 的轮廓窗口中执行
Edit --> Select --> Select All再Edit --> Copy。
粘贴同样有两种途径:
- 在字体视图粘贴:选中 "i" 方块后按
Edit --> Paste; - 在轮廓视图粘贴:打开 "i" 字形窗口后按
Edit --> Paste。
粘贴完成后(此时 "i" 还是完整的 "l" 形状),进行以下调整(见 i1.png 至 i4.png):
- 选中 "l" 的顶部衬线(用指针工具框选);
- 把它向下拖动到合适的 x-height 高度——即 "i" 的小写 x 字高,通常比升部线低;
- 切回Guide 层,在 x-height 位置再添加一条引导线,标记该字体的小写 x 字高基准;
- 最后补上 "i" 上方的点(dot)。
至此,字体中已经建立了ascend 线与 x-height 线两条全局参考,后续所有字母的顶部高度都可以参照它们对齐。
关于 Overshoot:曲线为什么需要"越界"一点
回顾之前构建的 "o"(见 editexample2.rst),你可能会注意到:"o" 略微高出我们标注的 x-height 引导线,也略微低于基线。
这并非失误,而是有意的过冲(overshoot)设计——这是对视错觉(optical illusion)的补偿:曲线部分在视觉上会比同高度的直线"显得矮",所以曲线必须实际高出约直径的 3%,才能在肉眼中恰好落在 x-height 上。
这也解释了为什么在设计阶段建立 Guide 参考线如此重要:有了基线、x-height 线、ascend 线,你才能有意识地区分"真正的对齐"与"为补偿视错觉而做的过冲",而不是凭感觉随手摆放。
第四步:构建字母 "k"——Knife 切割与内外轮廓
"k" 的构造思路依然是以 "l" 为起点:
- 导入 "k" 的位图,并把 "l" 复制进 "k" 字形(见 k1.png);
- 注意 x-height 线恰好与 "k" 的上部对齐(这正是引导线的价值所在);
- "l" 的宽度对 "k" 并不合适,所以先选中茎干并拖到合适位置。
用 Knife 工具切割茎干
从工具面板中选择刀(Knife)工具,在 "l" 形状的茎干上、为 "k" 设计好的交叉点位置进行切割(见 k2.png),把字形切出上臂(arm)与腿(leg)的雏形。
删除多余样条
切割之后,删除切割点之间的样条。最省事的方法:
- 直接用指针工具点选样条本身(这会同时选中它的两个端点);
- 执行
Edit --> Clear删除该段(见 k3.png)。
将端点转为角点
选中相关端点,执行Point --> Corner把它们转换为角点(Corner Point),以便锐利地连接直线段(见 k4.png)。角点与曲线点、切线点的区别详见 editexample.rst。
绘制外轮廓与内轮廓,并修正方向
接下来:
- 绘制外轮廓("k" 的主体外形,见 k5.png);
- 绘制内轮廓(内部挖空部分,见 k6.png);
- 最后执行
Edit --> Select --> Select All全选所有轮廓,再执行Element --> Correct Direction。
Correct Direction 的底层原理
正如 editexample2.rst 所强调的:PostScript 与 TrueType 都要求外轮廓为顺时针、内轮廓为逆时针(在 FontForge 内部的非零环绕数规则约定下),如果方向画反,栅格化结果会出现填充错误。
Correct Direction命令会逐个检查被选中的轮廓,判断它是外轮廓还是内轮廓,并在绘制方向错误时自动反转。这一命令并非只出现在菜单中:
- 图形界面中,它由 fontview.c(字体视图菜单)与 charview.c(字符视图菜单)注册与分发;
- 在脚本/命令行环境(FontForge 的
.pe脚本或 Python 接口)中,对应命令为CorrectDirection,实现位于 scripting.cpp 与 fontviewbase.c。
因此,无论是交互式点击菜单,还是用脚本批量处理大量字形,都可以利用这条命令来统一修正轮廓方向——这正是它被用于字体工程自动化的原因之一。
小结:一致性工作流的三个关键习惯
回顾本章,保证 l / i / k 一致的要点可归纳为三条可复用的习惯:
- 以单一母版派生:从 "l" 复制出 "i"、"k",让茎宽、字宽自动继承,避免逐字重画造成的偏差;
- 用工具量化验证:用标尺工具记录茎宽数值,用 Guide 层固化 ascend / x-height 基准线,把"目测一致"变成"数值一致";
- 构建后统一收尾:全选轮廓并执行
Element --> Correct Direction,从底层数据上保证填充正确性,为后续的 editexample4.rst(重音字形、连字与 OpenType feature 构建)打好基础。
本章使用的所有插图(l1-l10、i1-i4、k1-k6、o5)均位于 doc/sphinx/images,完整教程目录见 doc/sphinx/tutorial.rst。
- 桌面应用
- 图形学
【免费下载链接】fontforge
Free (libre) font editor for Windows, Mac OS X and GNU+Linux
相关推荐
FontForge 开源字体编辑器使用教程
FontForge 开源字体编辑器使用教程 1. 项目介绍 FontForge 是一个免费开源的字体编辑器,支持 Windows、Mac OS X 和 GNU/
桌面应用图形学Iosevka 26.3.3 更新全解:字形变体命名重构、希腊字母衬线与斜体样式集修复
Iosevka 26.3.3 更新全解:字形变体命名重构、希腊字母衬线与斜体样式集修复 Iosevka 是一款"由代码编写的代码字体"(Versatile ty
开发工具老Mac如何免费装上新版macOS:OpenCore Legacy Patcher 完整指南
老Mac如何免费装上新版macOS:OpenCore Legacy Patcher 完整指南 OpenCore Legacy Patcher(OCLP)是一个免
操作系统固件驱动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考