绘制高质量的路径

教程
作者:Rainer Erich Scheichelbauer

7 一月 2013 发布日期: 6 一月 2013

There are two kinds of paths. Good ones and bad ones. Here’s how to spot the bad ones and how to correct or avoid the most frequent problems. You’ll be so glad you’ve read this tutorial!

画得不好的轮廓会很让人头疼。你的字母可能看上去被搞乱了,或者干脆显示不出来。记下一些基本的规则,你就能避免这些麻烦。

魔力三角形

这一点很重要:每一个曲线段都必须完全处在一个三角形中。

“线段指什么?” 我听到你这样问了。很简单,线段就是两个相邻节点之间的部分,“节点” 亦即曲线上的点。线段有两种,直线和曲线。直线仅包含这两个节点,而曲线还有两个曲线外的点,即 “贝塞尔控制点”(BCP)或称 “手柄”。

要牢记“魔力三角形”由线段两端的节点以及手柄延长线的交点构成。这意味着手柄绝不能超出三角形范围之外。如果它们超出了,你需要考虑重新布置节点。所以,这两件事绝对不能发生:一条手柄穿过了另一条手柄;一条手柄穿过了另一条手柄的延长线。这可能产生不必要的拐点、突兀甚至自相交叉的曲线,所有这些都可能让字体的栅格化渲染器陷入困境。

如果你曾有过使用 Illustrator 等矢量软件的经验,这可能会让你感到吃惊。首先,手柄不属于节点,而是属于线段;其次,一个曲线段一定拥有两个贝塞尔控制点,不可能只有一个。Illustrator 似乎允许你绘制只有一个手柄的曲线,但实际上 Illustrator 只是将另一个贝塞尔控制点藏到了它旁边的节点里。这点很不好,因为在字体的矢量图形中,不应有两个点位于同样的坐标处。此外,如果善加利用两个手柄,你能更好地控制路径。

如果两个手柄之一不见了,它就是藏在旁边的节点中了。要修正它最简单的办法是,选中相邻的点,可以是节点也可以是手柄,然后按 tab 键切换选择为隐藏的手柄点。使用 Shift-tab 向另一个方向切换选择。浅灰色的标注表明手柄被选中了。现在,使用方向键把手柄移出节点。如果你同时按住 option 键,手柄的方向将保持不变;按住 Shift,以 10 为增量移动:

三角形规则也意味着曲线段应当仅有一个方向,亦即不含拐点,不会从顺时针方向变为逆时针方向。不过,这里也有例外:通常在绘制类似 S 或波浪线这类字符形时,你需要在曲线中包含拐点,尤其是为了插值的情况下。

特例: 在为适于屏显的字体绘制杯形衬线时,一定需要带有拐点的曲线段:

确保点 A 和点 C 位于同一高度,所有手柄均为水平(或位于 B 和 A/C 之间,即不超过这两个高度所限定的范围),且基线和 B 之间的距离小于 20 单位。在 “文件 > 字体信息 > 字体” 中,添加一个 blueShift 自定义参数,“值” 设定为杯形深度 +1。然后 PostScript 自动渲染提示器会应用被称作 flex hint 的方式,在极低的分辨率下不显示杯形凹陷。最重要的是,让 B 点位于基线上。是的,你没听错,是 B 点!包含 A 和 C 的杯形部分需要完全被包含在基线的渲染提示压缩区域中。阅读更多关于 PostScript 渲染提示的内容。

路径方向和顺序

错误的路径方向会搞乱字腔,并让某些渲染提示无法实现。路径的方向必须是逆时针,字腔则需要是顺时针。选中路径,右键单击,在上下文菜单中选择 “反转所选轮廓方向” 即可控制路径方向。不想记这么多?没问题,Glyphs 可以为你完成。只要选择 “路径 > 修正路径方向”(Cmd-Shift-R)就完成了。这个命令对多个字符形,甚至是整个字体,都起作用。

顺便说,“路径 > 修正路径方向”(Cmd-Shift-R)还会将你的路径重新排序,并为每个封闭路径重置起始节点。

在做多母版工作?按住 Option 键,菜单命令会变为 “路径 > 在所有字体母版中修正路径方向”(Cmd-Opt-Shift-R)。顾名思义,会在所选字符形的所有图层中同时施展这一魔法。当你想让一个多母版字符形重新兼容时,这非常方便。你可以用这种方法解决大多数插值问题。阅读更多保持轮廓兼容的内容。

自相交叉

最终导出的字体文件中,路径不得自相交叉。你可以选中出错的路径,执行 “滤镜 > 去除重叠”(Cmd-Shift-O)来修复自相交叉的问题。不过,在你的 Glyphs 文件中,你可能想保持交叉状态,以便编辑和插值。这种情况下,确保在导出字体(Cmd-E)时,勾选 “去除重叠”。

提示:适用于可变字体。

你可以通过上下文菜单中的 “展开角” 和 “重新连接节点” 命令创建重叠:

高级技巧: 这些命令也可在 “路径 > 其他” 子菜单中找到,因此你可以在“系统偏好设置 > 键盘 > 快捷键 > 应用程序快捷键”中轻松添加键盘快捷键。

不过,保持重叠时会有一个问题:双重叠。就是说,如果你在一个重叠中还有另一个重叠,那么在形状中会出现小小的白色缺口。在一个重叠当中,如果有一条曲线段和直线段相接,曲线向错误的方向弯曲得有点多了——这时,这种问题就会发生。

怎样找到这些点?嗯,有一个 Python 脚本可以检查去除重叠之后的字符形是什么样子的,看看是否在哪里留下了一些轮廓碎片。在 mekkablue 脚本库 中,有一个名为 Path > New Tab with Small Paths 的脚本,它可以打开一个新的标签页,其中包含了它能找到的、带有这样细小路径的全部字符形:

多余点和错误的节点类型

不是什么大事,但可以改善字体的渲染性能:“路径 > 清理路径”(Cmd-Opt-Shift-T)可以去除多余的节点和手柄。换句话说,它会去掉一切无关当前形状的点,比如一条完全笔直线段上的手柄,等等。这一命令也会修正节点的类型,在相应的地方将蓝色的角节点转换为绿色的曲线节点(或反之)。它也会解决位于同样坐标的两个相邻点,也即 “零长度线段”,由红色圆圈指示。

极值点

在我们的工作中,如果在路径的水平或垂直尽端处,也就是路径切线完全水平的地方插入节点,很多事情会都变得容易得多。通常情况下,这让你可以无视其他的点,同时实现更简单的路径、更少的节点和更小的文件大小。

执行 “路径 > 添加极值点” 可以在所选轮廓、所选字符甚至整个字体中添加极值点,或者如果想更方便地控制,只需使用钢笔工具(P)按住 Shift 键单击路径。Glyphs 会寻找最近的曲线极值点或拐点,并在那里插入节点。

插入极值点后,通常可以在不影响形状的情况下去掉一些中间点:

要实现这一点,你可以选择一个绿色的斜向节点,并按下 Delete 键。如果每次只删除一个节点,Glyphs 将用单个线段尽量重建这个形状。实际效果因人而异。

高级技巧: 你可能需要避免在可能出现轻微曲线的情况下添加极值点,所谓“轻微曲线”可能仅有几个单位深。为什么要避免轻微曲线?因为点的坐标通常不会出现小数,而这样的曲线段会搞乱形状,无论你的节点和手柄布置得多么高明。

开放和闭合

最终导出的字体中整条路径都不见了?可能它没有闭合。开放路径会在导出时被无视,所以,所有路径都应该是闭合的。

要闭合一段路径,只需用选择工具(V)将一个开放端点拖放到另一个开放端点即可。使用钢笔工具(P)并依次点击两个端点,添加线段来闭合路径。或者,选择开放的路径,右键打开上下文菜单,选择 “闭合路径”。

边界外的图形

左右的边距值很不对劲?可能在字符形中的可见部分之外有一些对象。这里是如何删掉它们的方法:

  1. 确保当前活跃的是正确的字符形,即光标位于该字符形之前。提示:注意灰色信息框(Cmd-Shift-I)中左边距和右边距的数值,看看它是不是一个大得离谱的数字(可能是负数)。
  2. 点击工具栏上的箭头图标切换为选择工具。
  3. 执行 “编辑 > 全选”(Cmd-A),字符形中的所有路径就都被选中了。
  4. 按住 Shift 键的同时,框选想要保留的部分。这会取消选择它们,仅剩边界之外的残片被选中。
  5. 敲 Delete 键。

插件

通过 “窗口 > 插件管理器”,你可以在“显示”菜单添加几个插件,帮助您识别轮廓中的潜在问题点。这方面的一些优秀插件包括 “Show Angled Handles”(译者注,下同:显示倾斜手柄)、Jens Kutílek 的 “Red Arrow”(指出可能有问题的地方)、Simon Cozens 的 “Heatmap”(通过显示热力图检查笔画粗细),可能 “Show Tops and Bottoms”(显示字符形的最顶端和最底端)也会派上用场。

在插件管理器中,你还可以找到帮助解决问题的 “滤镜” 菜单扩展。“Fix Zero Handles”(整理包含零长度手柄的曲线段)以及 “Delete Small Paths”(删除尺寸小于某阈值的路径)就是两个例子。另外,考虑一下你的设计需要什么,看看是否有可用与此的插件。

此外,请查看 “扩展” 页面 上列出的脚本库,其中许多都包含了能够帮助你修复字体问题的脚本,如上面提到的那些。
现在,是检查你的字符形并优化矢量曲线的大好时机。相信我,这样做会省去你之后的不少麻烦。


2018-08-04 更新:修改文本并适配当前的软件版本。增加了 “双重叠”、重新连接和展开角的部分,以及脚本和插件提示。
2018-08-19 更新:更精确地描述了 “多余点和错误的节点类型” 一节中的 “清理路径”。增加 “杯形衬线” 例子的说明和截图。整理了描述拐点的用词。

Chinese translation by Willie Liu (刘育黎) from 3type (三言).