渲染提示:手动 TrueType 提示

教程
作者:Rainer Erich Scheichelbauer
en fr zh

21 七月 2020

TrueType 渲染提示是屏显优化的圣杯。相比 CFF/PostScript,它能让你对字符形的屏幕渲染形状有更多控制。虽然它也会更复杂一些,文件体积上效率也更高,如果你掌握了诀窍,可以相当快速地完成。

做还是不做

在我们走进渲染提示——或如 TrueType 提示也常被称作 “指令”——之前,让我先来重复一遍我的提示真言:提示是一项扭曲你的轮廓使其更好地适应像素网格的技术。说得透一点。提示并不用来保持你的形状。恰恰相反,提示会将其拉伸、压缩或扭曲到任何给定的低分辨率字号中。其要点在于,使用更清晰锐利的像素图像保持可识别性——牺牲形状的准确度。换句话说,仅当保持低分辨率可识别性有意义时才对你的字体进行渲染提示。

如果,对于想要问的字体而言,保持其字母形状比可读性更重要,那么就不要渲染提示。标题展示用字体、手写字体、复杂轮廓图标字体不需要提示。没有提示的字体会更多地使用抗锯齿,这可以更好地保留形状,但在低分辨率下会很模糊,难以阅读。

现在我们假设扭曲轮廓可以让字体变得更加清晰易读。什么情况下我们会想要通过 TT 提示来完成呢?简而言之:如果字体是设计用于 Windows 的话。

TT 提示在 Android 设备上也会有效果。不过,即使字体没有添加提示,Android 也会做一些动态优化。所以,如果你的字体是为 Android 设备而做,就可以放心发售一款不做提示的字体。在 Apple 设备上,完全不会用到 TT 提示。所以,如果你的字体只会用在 Mac 或 iPhone 上,就不必费心做提示了。

所以你的字体可以做吗?可?那就接着读吧。

自动与手动 TT 提示

请记住,当你做 PostScript(PS)提示时,你通常会让自动提示算法料理整个字体,仅在有字符形表现得不那么好的时候对其介入手动提示。换句话说,PostScript 中,你既可以有手动提示的字符形,也可以有自动提示的字符形。

TT 提示则不然。TT 提示在技术上更加复杂,需要另外在特殊的表中设置字体层面的信息,这些表为 CVTprepfpgm。简而言之,自动提示和手动 TT 提示创建的这些表很不相同。这意味着,在 TrueType 的世界中,自动提示和手动提示并不兼容,也没有办法在同一次字体导出中将两者相结合。

不要理解错了:你可以.glyphs 文件中同时拥有手动和自动提示信息。但当你导出时,你需要选择在你的 TTF 文件中包含何者。打开 “自动提示” 选项,你就会获得 TTF 自动提示,然后就没有其他东西了。关闭这个选项,你会过获得你的手动提示,然后也没有其他东西了。

考虑文件大小

不必说,渲染提示信息会在一个 TTF 文件中占据一定空间。快速地比较一个简单的无衬线字体,得到这样的结果:

  • 无提示:15 KB
  • 手动提示,仅水平提示:18 KB(+20%)
  • TTF 自动提示:24 KB(+60%)

当然,对于不同的字体,你会获得不同的结果。但是你总是会发现同样的规律:首先,完全没有渲染提示会获得最小的文件尺寸。啊,当然了,你可能会说,这不出所料——这确实没错。不过,这减小的程度非常可观。所以,如果你是为一个渲染提示并不重要的场合创造字体,就考虑一下不做提示的字体文件吧,你的网络管理员会喜欢的。其次,手动提示比自动提示占据的空间明显要小,一个重要的因素是,在手动提示中你可以选择只考虑水平字干,而自动提示的尺寸就很难减小。

因此,手动提示的优点就是,文件较小,且文件内容更好控制。但代价就是,付出更多的工作量,以及必须通读这篇冗长的教程。这很遗憾,但是也有两件事可以让我们的生也变得轻松一点。继续读吧。

渲染提示基础知识

对于 PS 和 TT 提示都是如此:在多母版设置中,你只需要对一个母版做提示。默认状态下,就是你的第一个母版,即在 “文件 > 字体信息 > 母版” 中列在首位的那个。

在某些情况下,这可能不是最佳选择。想象如果第一个母版是一个极细、极窄的设计,选择用于提示所必要的点可能会变得很难,所以你要选取一个中间字重的母版用于提示。这种情况下,在 “文件 > 字体信息 > 字体” 中添加一个 Get Hints From Master 自定义参数,然后选择一个你觉得容易提示的母版:

你的第一个母版,或者是你用自定义参数选择的任何一个母版,会成为你的 “主母版”。这会产生一些区别,你会在下面看到的。

并且,你可以在编辑视图中向 PostScript 轮廓添加 TT 提示。你不需要转换为二次曲线。实际上保持 PS 曲线并让 Glyphs 完成转换会更好。路径会在导出时被转换为二次曲线,每个字体都会尽可能获得最好的 TT 曲线。这样你就省去了摆弄 TT 曲线并保持它们兼容的麻烦。

所以,总结一下:选择要提示的母版,并保持 PS 轮廓不变。

字体层面的提示:区域和字干

和 PS 提示类似,从定义每个母版的字干和区域开始。你定义的字干和区域必须在每个母版中保持相同的数目和顺序,以便值可以插值。这不会出问题,因为如果你在一个母版中添加字干或区域,则实际上是在字体层面上添加的,一次对所有母版都有效。母版中的区域和字干定义是最重要的,因为某些设置只能在这里进行。

TrueType 区域

“区域” 有助于统一整个字体中形状的垂直对齐方式。将轮廓拟合到屏幕像素网格时,位于同一 “区域” 的垂直形状极值点将坐标值取整到相同的高度(通常是像素边缘)。要使你做过提示和网格拟合的字体获得统一的外观,你可能希望将区域设置为垂直量度线上,例如基线、下降部线、上升部线、字肩高度、数字高度、牙高度、大写高度、字头高度、小型大写高度或其他对你的设计有意义的值。

要添加一个区域,前往 “文件 > 字体信息 > 母版”,并新建自定义参数,选择 TTFZones 作为其属性,并单击其值来打开设置:

如果你已经为 PostScript 提示设定好了对齐区域,那么将它们复制为 TT 区域即可:单击齿轮菜单,并选择 “获取 PS 区域”。或者通过加号和减号按钮自己添加/删除区域。区域的数目不受限制,基本上可以添加任意多个区域,也可以为不同集合的字符形添加不同的区域。添加一个区域之后,编辑其设置:

  • 位置及尺寸:首先,一个区域由这些关键数值定义。顶部区域的尺寸为正,底部区域的尺寸为负。顶部区域用于形状在垂直方向上的高度极值,如 x 高度、字肩高度、大写字母高度或牙高度。底部区域用于捕获形状的底端,如基线、下降部,或分子、下标和上标数字等小型数字的底部。

    确保位置和区域定义的范围包含了全部应该被渲染器忽略在一个像素之外的部分。例如,在 x 高度处,将 “位置” 定为 x 的高度,确保 “尺寸” 足够大,包含了全部的弧笔越线,比如小写 o。如果你熟悉 PS 区域,这也差不多是一样的。

  • 名称:你可以选择给区域命名。 名称任意,但显然越贴切越好,尤其是在你会定义很多个区域的情况下。它需要在你之后从用户界面中其他某处的下拉菜单中选择时,让你能够认得出来。区域名称可以是 “任意” 的一个例外是代表 x 高度区域的 xHeight,因为它在网格适配的时候被不同地看待。在小尺寸下,带有这一名称区域比其他区域四舍五入的可能性更高。

  • 对齐:你可以使用 “对齐” 选项,将一个区域链接到另一个区域。如果一个区域被链接到了另一个区域,两个区域位置间的距离会被取整并应用在这个区域上。这会让你的字体变换像素字号时的过渡更加统一。当两个高度位置非常接近、甚至是有部分重叠时,在低分辨率像素渲染时,如果两者在排版中彼此相邻,可能会使两者位置差距过大,产生问题——在这种情况下,将这两个高度对齐。被对齐的区域会在彼此差距小于半像素的时候显示为同样的高度;差距大于等于半像素时显示为一像素,以此类推。

    在拉丁字体设计中,唯一有意义的应用是 “将小型大写高度链接到 x 高度上”。可能 “上升部链接到大写高度” 也算,但后者通常不是问题。

    例:x 高度和小型大写高度会被取整到各自不同的像素网格上, 在不同的字号下,一个区域依次向上、再向下取整,而另一个区域在不同的字号下向上或向下取整。结果就是,x 高度和小型大写高度在 12 的 PPM 下一样高,13 PPM 下差两像素,14 PPM 下差一像素,15 PPM 下又一样高。尤其是在 12 和 13 字号之间切换时,过于引人注目,会影响可识别性。因此,你选择将小型大写高度的点打开对齐选项到 x 高度。这样,两个区域直到 13 PPM 时都是相同的像素高度,14 PPM 及以上时则差一像素高。

  • 微调区域:通过 Δ 图标,你可以为特定的子样在特定的 PPM 下上下调节一像素。完成字体的提示,或至少提示了大部分后,以瀑布流(见下文 “测试提示过的 TTF”)测试字体,确定哪个区域是否需要大些或小些。反复点击相应区域来切换选项:“上调”(上箭头)、“下调”(下箭头)、“不变”(空)。通常你只需要做一套这样的调整。Δ 图标仅会出现在主母版中。

  • 过滤器:通过最右栏的地球图标(🌐),你可以添加一个字符形过滤器。如果你的某个区域只在特定字符形中需要,这就很有意义:比如 x 高度、下降部和上升部只用于小写拉丁字母,大写高度只用于大写拉丁、西里尔和希腊字母,牙高度仅用于阿拉伯字母,字肩高度仅用于古木基文和天城文,数字高度仅用于名称中带 .lf 的数字,等等。你可以通过字符形名称、分类、次分类和文种(书写系统)过滤,并组合多个过滤器。按住 Option 键单击加号按钮可以添加更多精确的逻辑选项。地球图标仅会出现在主母版中。

TrueType 字干

字干帮助统一低分辨率下笔画粗细的显示尺寸。当渲染器找到应用了同样字干提示的不同轮廓部件,就会尽可能以相同数目的像素显示它们。这有助于避免在低分辨率下相似的字干被取整到不同的尺寸。例如,设想一个无衬线小写 c。通常你会想让顶部和底部具有相同的粗细。在某个特定的 PPM 字号下,底部会以某种方式在像素网格中显示为 3 像素,而顶部恰好显示为 2 像素。你可能会说这不过一像素之差,但在这种情况下就是 50% 的区别。在两部分中都应用一个水平字干提示,就可以确保它们都以同样数目的像素显示。

通常你会想让字干的数目较少。为类似的字干找到一个很好的平均值会比较好,而不是创建一大堆字干来描述每种可能的笔画粗细。这样的话,在低分辨率下,相似的字干就会取整到同样数目的像素。

要添加字干,前往 “文件 > 字体信息 > 母版”,并添加自定义参数 TTFStems。单击其值打开设置:

如果你已经为 PostScript 提示设置了字干,你可以从齿轮菜单中选择 “获取 PS 字干”,将其复制为 TT 字干。或者使用加号和减号按钮来增删你自己的字干。添加了字干之后,你可以编辑它们的属性:

  • 方向:一个提示可以以 ↔︎ 水平或 ↕︎ 垂直两者之一贴齐。要切换方向,只需点击左栏中的双向箭头按钮。现在,请仔细看:

    你要将 ↕︎ 垂直贴齐提示应用在水平的造型上,例如小写拉丁字母 t 的横杠,或汉字 “亖”。另一方面,当然了,↔︎ 水平贴齐提示用于垂直字干和曲线,例如大写拉丁字母 D 的垂直字干和曲线,或老傈僳文音节 ꔖ。

    或者拿一个拉丁字母 L,最适合图解这两者:

    为什么我要和你说这些?嗯,问题在于,人们说 “水平提示”,意思是 “将水平字干垂直地贴齐”,或者是完全相反的意思。因此,不论何时你跟别人说你的字干提示时,复查一下其含义和你所做的内容一致。或者带上铅笔和纸来画出来。或者,也可以不跟任何人讲你的提示。

  • 名称:你可以选择自定义字干的名称。名称任意,但还是最好尽可能地贴切,原因和区域中的相同。

  • 尺寸:字干的平均粗细,以单位计。在屏显渲染中,粗细相近的字干会被统一,以同等数目的像素显示。

  • 字干取整:通过 Δ 图标,你可以定义字干取整。和区域中类似,刚刚设置好字干就确定取整没有意义,而是要以瀑布流测试后再确定取整。界面的操作和区域相同。字母是否在特定的 PPM 字号下黑度过高?将字干向下取整。如果显得过轻,则向上取整。重要:字干 Δ 只应用于 ClearType 式的渲染模型(也称作 Windows GDI)。

  • 过滤器:地球图标(🌐):添加过滤器,使字干仅用于特定字符形。你可以按字符形名称、分类、次分类和文种(书写系统)过滤。字干过滤器和区域过滤器效果完全相同,见前文了解更多细节。

TrueType BlueFuzz

使用名为 TTFBlueFuzz 的自定义参数,以其值中所设定的数目来扩展所有 TT 区域。设定的数目会同时添加在每个区域的上下两侧。默认为 1 单位。

你既可以在 “文件 > 字体信息 > 字体” 中添加这一参数,也可以在 “母版” 或 “子样” 中添加。如果你认为在字体家族的所有插值中都需要同样的区域扩展,就在 “字体” 中添加。添加在 “母版” 中的好处在于可以插值它,例如从最细母版的 0 到最粗母版的 4。插值的子样会获得两者之间的近似值。

这有助于测试字干值,或用于修正插值中的误差:即便图形在全部母版的区域中都有很好的结果,它们也还是有可能在插值子样中出错。取整错误就可能导致这样的误差。所以:测试,查看是否全部子样中区域都正常,如果不,就添加一点 TTFBlueFuzz

字符形层面的提示:指令 UI

我们来看一下用户界面。回到编辑视图中,键入并打开一个字母,切换为 TrueType 指令(工具快捷键 I),在底部的预览区域中选择一个样式。请记住,在主母版中操作,因为只有在主母版中添加提示才有意义。

这是一个字符形在提示过程中可能的样子:

未扭曲的轮廓和扭曲的轮廓

首先,在字符形母版的黑色轮廓线之外,我们还会看到两种颜色的轮廓所表示的当前所选样式、像素字号和渲染意图。

  • 蓝色轮廓表示当前所选样式经插值合并后的轮廓。它没有被扭曲,换句话说,就是轮廓在指令和网格适配生效之前的状态。在窗口底部边缘的样式弹出菜单中选择一个不同的样式,你可能需要点击眼睛图标来打开预览,以便访问弹出菜单。
  • 红色轮廓表示同样形状的扭曲版本,即根据当前渲染意图(灰度渲染、ClearType 或 DirectWrite) 和像素字号,应用指令和网格适配之后。红色轮廓线使用实际的 Microsoft 代码绘制,是在实际的 Windows 中使用的准确轮廓扭曲。换句话说,你在为 Windows 做 TT 提示时,就是在塑造这个红色轮廓。

当然,如果你的字符形中(还)没有提示,红色和蓝色轮廓就会是一样的。

像素字号

在灰色信息框上,你会看到标有 “px” 的数字框。这是当前视图的 PPM。PPM 是 “每全身字宽像素数”(pixels per em)的缩写,代表字体的实际像素字号。其含义为,多少像素被用于一个全身字宽。你可以看到一个在像素网格背景上的像素字号预览,连同当前渲染意图下的一个渲染样例。

举个例子:假设你的字体使用 1000 UPM,当前的像素字号是 12 PPM,那么一像素等同于(1000÷12 ≈)83 单位。

PPM 数值是和号数(pt)相对的真像素字号(px)。如果你了解号数制,你就知道多少 DTP 字号(1 pt ≈ 0.3527778 mm)等于一个全身字宽。然而,你永远不知道多少像素会被用于全身字宽,因为这取决于相应渲染环境下的输出分辨率。即使在同样的屏幕上,你也可能在两个不同应用程序中有着两种渲染分辨率,导致同样字号下的像素尺寸不同。这就是为什么我们需要一个真正的像素量度。

你可以通过输入新数值来更改像素字号。或者淡季数值框旁边的上/下小按钮,或按下键盘上的句号/逗号或加号/减号来逐一遍历像素字号。

渲染意图

在 Windows 中,一个 TT 字体中字符形的位图再现可能会以三种方式绘制,或按照字友所称,三种渲染意图

  • 灰度渲染,应用每像素水平四倍、垂直四倍的过采样进行渲染。这意味着每个像素被细分为(4 × 4 =)16 份像素。取决于这些细分的中心有多少位于经指令处理过的轮廓内部,这多少个 1/16 的灰阶值会被用于绘制相应的屏显像素。
  • GDI ClearType,Windows XP 中使用,应用 8×1 过采样,即横向 8 倍,但竖向不进行过采样。这意味着所有的横画都被显示为完整像素。如果字干很细就会出问题,因为它们会变得很粗;弧笔或接近水平的笔画通常会产生锯齿。
  • DirectWrite,通常简称 “DW”,自从 Windows 7 开始应用,使用 5 × 5 过采样。

关于水平和垂直过采样相等的一个好处是,你可以旋转它们。所以它们适用于手持设备,能够在横屏和竖屏之间来回切换,并在过程中保持文本外观。而另一方面,GDI ClearType 渲染会在水平方向上给你很高的分辨率,适用于次像素渲染,但不能旋转,所以被严格限制在桌面和笔记本设备上。从某种意义上说,DirectWrite 是一个很好的折衷方案,因为它在水平方向上仍然具有可观的过采样数字,因此可以产生不错的次像素渲染效果,但同时可以提供非常好的灰度抗锯齿,最多可以显示 25 级灰度。

提示方向

在灰色信息框(Cmd-Shift-I)的右边,你可以看到一个波浪双向箭头标志。它表示提示的方向。现在请注意:

  • 垂直双向箭头表示垂直方向的提示,用于为水平字干进行垂直方向的适配。在垂直模式下,你可以将点链接到区域。
  • 水平双向箭头代表你在插入水平方向的提示,来为垂直字干进行水平方向的适配。在水平模式下,你可以将一个字符形的左右边距也包含在内:你会看到两个黑点出现在边线和基线交点的下方。

点击箭头标志或按下键盘上的 X 键来切换方向。你仍然会看到另一个方向提示的一个较暗的、灰掉的版本,但不会不小心编辑到它们。

插入字符形层面的提示

好,那么我们来上手操作一下。请记住,渲染提示的目的是让轮廓变形,以便其更好地适应像素网格。

提示会按时间次序被应用在他们所链接在的点上。顺序很重要,因为提示会彼此叠加。当一个提示连接到轮廓上的一个点时,这个点按照提示的指令移动,成为一个 “被移动的” 点。当所有提示都被应用上之后,余下 “未被移动的” 点的位置会和次序上最相邻的被移动点之间插值。这有时被称作 IUP,或 “插值未移动点”(Interpolate Untouched Points)指令。

如果你点击底部的眼睛图标打开 “预览” 区域,就可以一直看到你在做什么。当 “TrueType 指令” 工具(I)活跃时,预览区域会变为垂直,贴在编辑视图的右侧边缘,并使用当前选择的样式和渲染意图,以瀑布显示编辑视图中当前文本的 PPM 字号。你可以通过拉动分隔线来调整预览的大小,并通过上下文菜单在三个像素缩放级别之间切换。你可以上下拖动它,以在视图中显示不同的 PPM 字号:

总体而言,要添加一个指令,选择一些节点并在上下文采菜单中选择一个提示类型,或按下相应的快捷键。

贴齐(A):

“贴齐” 提示(快捷键 A)将一个之前未被移动的点取整到最近的像素边缘。要应用一个 “贴齐” 指令,选择一个或多个未被移动的点并按 A 或从上下文菜单中选择 “贴齐点”。你可以同时贴齐多个点。

当提示选中时,在灰色信息框(Cmd-Shift-I)中管理提示信息。从弹出菜单中,选择以下选项之一:

  • “自动”:在垂直模式下,如果一个点在某个区域中,那么这个点会吸附在这个区域被取整到的像素边缘上。你可以使用 TTFZones 参数控制区域的取整。“自动” 选项通常就是你想要的效果。
  • “无区域” 告知指令一并忽略区域。这种情况下指令只会寻找最近的像素边缘。
  • 任一 “命名的区域” 会将其与指定区域保持一定距离,并确保贴齐的节点不会落在该区域的 “错误” 一侧。这是为了使保持间隙,而不是为了捕捉到区域。将其用于变音符,以免它们接触基底字符形,例如,将其用于小写 i 的点。它的工作方式类似于 TTFZones 说明中所述的,一个区域与另一个区域的 “对齐”。

以下符号按钮指示指令触发的 “取整” 类型:

  • 取整(默认):会将点取整到最近的像素边缘。
  • 向上取整:会将点取整到上方(垂直模式)或右边(水平模式)最近的像素边缘。
  • 向下取整:会将点取整到下方(垂直模式)或左边(水平模式)最近的像素边缘。
  • 不取整:保持点在原始位置。有助于抑制 IUP 效果。
  • 仅在 ClearType/GDI 中取整:类似 “取整” 项,但仅在 ClearType 渲染意图中应用。当你想在灰度渲染和 DirectWrite 渲染意图中使用抗锯齿功能,而 ClearType 中必须取整到全像素时非常有用。仅在提示水平字干时才有意义,因为 GDI ClearType 没有垂直方向的过采样。

字干提示(S):

字干提示(快捷键 S)将两个原本未被移动的点,或一个被移动、一个未被移动的点的位置,取整到 TT 字干所确定的距离。字干提示具有一个起始点和一个目标点,会被移动的是目标点。右击字干提示并在上下文菜单中选择 “反向” 可以对调起始点和目标点。你可以同时为多对点添加字干提示,条件是选中的点数为偶数。

起始于某个区域中的字干提示会自动将起始点锚定在区域中。所以,不要先锚定一个点、然后再其上添加字干提示,而是直接添加字干提示。指令工具足够智能,可以将区域内的节点设为起始点。

点击蓝色标签选中字干提示,以便在灰色信息框中设定选项。弹出菜单会给你不同字干之间的选项:

  • 自动:提示会按照 TTFStems 参数中的设定使用最接近的字干。如果你的字干区分明确,这就是最佳选项。
  • 命名的字干:在菜单中选择任一字干;你看到的名称和 TTFStems 参数中的字干定义同步。仅在你发现 “自动” 模式会给你错误结果的情况下使用这一选项。
  • 无字干:目标点不贴齐网格,只有它们到起始节点间的距离得到保留。即,仅当起始点移动时,目标点才会移动。如果你的目的是在中等程度(并不太小)的像素字号下形状更加保真,那么这就是最佳选项。或者你觉得最终渲染环境中的扭曲太过疯狂的话。

菜单下方的图标代表提示选项:

  • 取整:会将目标点取整到最近的像素边缘。

  • 向上取整:字干尺寸向上取整,即,会将目标点贴齐到离起始点更远的像素边缘。如果你的字干提示指向下方,那么目标点的位置就会向下取整。

  • 向下取整:字干尺寸向下取整,即,会将目标点贴齐到离起始点更近的像素边缘。如果你的字干提示指向下方,那么目标点的位置就会向上取整。

  • 不取整(默认):不会将字干取整到像素边缘,但仍然会取整到当前渲染意图所提供的过采样边缘。

  • 仅在 GDI ClearType 中取整(A 符号):和 “取整” 选项相同,但仅对于 GDI ClearType 渲染意图。如果字干不和某个区域相邻,这个选项有助于保持字干的至少一侧对齐到最近的像素边界。这对于 E 和 e 的中部横杠很有帮助,和插值(G)指令结合则最好:

字干粗细取自 TTFStems 参数,根据相应渲染意图的过采样取整。这意味着水平字干在 ClearType 中会被取整到完整像素,在灰度渲染中被取整到四分之一像素,在 DirectWrite 被取整到五分之一像素。要想不覆盖这一情况,“字干” 不应被取整(选择 “不取整” 选项)。字干不取整到完整像素边缘意味着字干的至少一侧将出现灰色边缘。最终的渲染效果会略差一些,但可以更好地保留设计细节。并且它产生的轮廓变形问题更少,比如被挤掉的内白空间更少。

你是否有三个水平字干?你可以按住 Shift 依次单击来全选三个字干,然后右键单击并在上下文菜单中选择 “建立三联提示”。字干提示会变为紫色,表示它们现在互相关联,即便在最差的情况下也会尽量留出至少一像素的间距:

偏移(F):

“偏移”(快捷键 F)指令将一个被移动的点的位移迁移到未被移动点的点上。这样,你可以确保一个字符形的两部分应用相同的扭曲。换句话说,它将目标点和主点以同样的方式偏移。要应用一个 “偏移” 指令,选择一个被移动的和未被移动的点,然后按 F 或从上下文菜单中选择 “偏移”。你可以在同一个起始点上同时添加多个偏移(F)指令,条件是所选内容中的一个点为被移动(= 起始点),其余点未被移动(= 目标点)。

当然,作为可选项,你会无法选择一个字干或区域,但你仍然可以选择对齐指令:

  • 取整:向最近的像素边缘取整目标点。
  • 向上取整:向上方最近的像素边缘取整目标点。
  • 向下取整: 向下方最近的像素边缘取整目标点。
  • 不取整(默认):会按原样保持转移的移动。在 99.9% 的情况下都会是你所想要的方式。
  • 仅在 GDI ClearType 中取整:类似 “取整”,但仅用于 GDI ClearType。

很好的例子:拉丁字母小写 n 的两腿。在基线区域锚定左腿,但为字肩添加一个字干提示之后,另一条腿就会失去同步:

会发生这种情况,是因为沿着路径的线条上,左下角贴齐点(A)指令的影响被顶部的字干(S)指令打断。因此,对于右腿,随后发生的 IUP(插值未移动点) 只会外推字干(S)指令、而不是贴齐(A)指令造成的变形。最终效果上,贴齐(A)指令被限制在左腿上。

所以,从左侧的被移动点(锚定)到右腿上的点之一添加一个偏移(F)指令:

偏移(F)指令在右腿中复制左腿的移动,使目标点成为被移动的点。这样,右腿会始终和左腿同样移动。在拉丁字母小写 m 中更好:

你可能会问,为什么不直接在右边添加同样的贴齐点(A)指令?两个原因:首先,偏移(F)指令比其他提示要省一点内存。所以,如果你可以用偏移(F)提示的话,就总能省出一两个字节。其二,你总会担心第二个指总会有取整不同的风险,这样的混乱会多花不少时间。我知道如果两个节点在同一个区域中,就不应该发生这种情况,但你并不知道。

插值(G):

插值指令(快捷键 G)让一个未移动的点和两个移动的点保持相对位置,和未添加指令的轮廓相比保持不变。要应用一个插值指令,选择两个移动的点,以及一个未移动的点,再按下 G 键或在上下文菜单中选择 “插值”。

插值(G)提示的主要意图在于,纠正 IUP(插值未移动点)的不良副作用。 通常,你会遇到内白堵塞或字怀消失的情况。并且你可以使用插值指令使中间字干与(已被移动的)外部字干保持相同的相对距离,如以下小写字母 e 所示:

在选项中,你自然将无法选择字干或区域,但仍可以选择对齐:

  • 取整:向最近的像素边缘取整目标点。如果你想在目标点上安植入字干提示,选择此项。
  • 向上取整:向上方最近的像素边缘取整目标点。
  • 向下取整: 向下方最近的像素边缘取整目标点。
  • 不取整(默认):会保持插值位置不取整。通常你要选择此项。
  • 仅在 GDI ClearType 中取整:仅在 GDI ClearType 渲染意图下贴齐倒最近的像素边缘,其他不受影响。

斜向(D):

斜向(快捷键 D)指令将斜向字干(如 A、K、V、W、X、Y 和 Z 中)在 GDI ClearType 下保持其相对角度和比例。要插入一个斜向(D)提示,选择任意四个点,并在上下文菜单中选择 “斜向” 或按下 D。

它解决了一个 ClearType 渲染的特殊问题,在水平和垂直过采样之间有很大的差异:点只会在垂直方向上贴齐到完整的像素边缘,而在水平方向上会捕捉到像素的八分之一。在像素字号和/或字重间遍历时,会产生不均匀的失真:在水平方向上平滑增长,但只会在垂直方向上发生完整像素的跳变。应用斜向(D)提示后,水平和垂直方向的增长将保持同步。

请注意,一旦应用斜向(D)提示后,红色轮廓的斜向笔画将会更细,从而让水平和垂直尺寸保持同步。

斜向(D)提示仅对 GDI Cleartype 渲染有用,且考虑到其市场份额在不断缩小,可能已不值得再去做它。它们在技术上很复杂,会相对增加更大的字体文件体积。

增量(E):

增量提示(快捷键 E)将一个点向上下移动正好 1 像素,但仅在特定的字体样式(子样)和特定的像素字号下。增量(E)提示预期在所有其他提示都应用后,作最后的像素修正。要添加一个增量提示,选择任意数量的点并按 E 或从上下文菜单中选择 “增量”。然后选择一个或多个增量提示,单击灰色信息框中的增量(Δ)图标,反复单击某个特定字号/样式组合的方格,在 “向上一像素”(绿色上箭头)、“向下一像素”(蓝色下箭头)和 “不变”(空格)之间切换:

记住,增量(E)提示:

  • 如果用,请少用;
  • 要在其他提示之后添加;
  • 在可变字体中会被忽略,且
  • 仅适用于垂直提示(↕︎)。

提示策略

这些技巧被证实在 TrueType 提示中有用:

  • 保持三次 PostScript 曲线。只要将提示加在 PS 贝塞尔曲线上即可。不需要将其转换为二次,或翻转路径方向,或以任何特殊方式准备路径。如果这样做,甚至会适得其反,因为在静态字体导出中,PS 到 TT 的转换会为每个插值自定义理想的 TT 路径。
  • 使用键盘快捷键(A、S、D、F、G、E、X)来添加提示或切换方向。它们全部在你左手触手可及的地方。如果你的键盘布局有所不同,中间一行并不以 ASDFG 开头,它们仍是中间一行字母的前五个键。例如,在法语 AZERTY 键盘中,快捷键为 QSDFGEX 而非 ASDFGEX。如果你使用左手操作鼠标,考虑将右手放在键盘的左端。
  • 从区域中开始做,最好先做字干(S)或贴齐(A)提示。
  • 然后使用偏移(F)或插值(G)提示向内做
  • 尽量地避免增量(E)提示。
  • 除非你知道你在做什么,否则不要添加斜向(D)提示。
  • 尽可能少使用提示。不要使字符形中的提示过于复杂。
  • 在结合变音符中,从最靠近连接 _top_bottom 锚点的节点上的贴齐(A)指令开始,将提示关联到相连的锚点所处在的区域中。。例:在 caroncomb 中,你会锚定最低点,并从提示选项的区域弹出菜单中选择 x 高度。
  • 在字体视图(Cmd-Opt-1)中,使用 “智能过滤器” 显示仅有轮廓的字符形,因为这些字符形和提示相关。然后回到编辑视图中,使用 Shift-PageUp 和 Shift-PageDown 在字体视图中所选的字符形间切换。在 MacBook 的紧凑键盘上,按 Fn-Shift-左/右箭头。
  • 测试时,忘掉 GDI ClearType。专注于灰阶和 DirectWrite。

重叠部分中的点:

你可以在 TrueType 指令工具(I)激活时显示的所有节点上添加提示,包括重叠部分中的点。在静态字体导出时,当然所有重叠部分都会被去除。幸运的是,Glyphs 足够智能,可以在去除重叠执行时将提示移动到最近一个所获得的交点上。因此,这两个提示在静态字体中是等价的:

不过,在可变字体中,重叠不会被去除。连接在这些交点上的提示会被忽略。因此,如果你想为静态和可变字体同时做提示,请加在重叠内部的节点上,因为这个节点是在 OT 可变字体中确实会连接提示,而在静态字体中,提示会被移动到所形成的交点上。总之,当你提示 OT 可变字体时,考虑以下两件事:

  1. 增量提示在可变字体导出中会被忽略。
  2. 以交叉点(“额外节点”)为起始点或目标点的提示也会被忽略。

更多自定义参数

一旦你在 TT 提示中钻得更深,就会感到颇为……嗯,特别。所以这里有一些额外的参数,以供你们这些 TT 极客:

  • TTFOvershootSuppressionBelowPPM(TTF 越线压缩小于 PPM):使用此参数,你可以设定一个像素字号的上限,到此字号为止,可以保险地将弧笔越线压平。和设置合适的 TTF 区域结合,你可以很好地控制 TTF 的外观。

  • TTZoneRoundingThreshold(TT 区域取整阈值):在 “字体信息 > 字体” 或 “字体信息 > 样式”(当然,在静态字体中后者优先)中:控制正值区域被向上推一像素的可能性。取较小的小数作为值,通常在 0.1 或 0.2 左右。该值会添加在正值区域的 “位置” 上(取整前添加),对于 x 高度区域(名为 xHeight 的 TrueType 区域)添加两次。如果不加设置,默认值取 0.09375。

    例:在特定字号下,小型大写区域位于 6.45 像素处,x 高度 5.25 像素。若不加修改,小型大写高度会被取整并贴齐 6 像素,x 高度会被处理为 5 像素。若将值设为 0.2,小型大写被处理为 (6.45+0.2=6.65≈) 7 像素,x 高度为 (5.25+2×0.2=5.65≈) 6 像素。

  • TTMinimumDistance(TT 最小距离):在 “字体信息 > 样式” 中:默认为 0.25,这意味着任何做过提示的字干都会以最小四分之一像素的长度绘制,不论像素字号多大,只要其上应用了字干提示。如果你不满意默认的 0.25 像素,可以通过这一参数自行设置最小距离(以像素计)。当像素字号较小、细小的部分具有缺失风险时,该值会起到作用。

  • Prep Table AssemblyFpgm Table AssemblyCVT Table(Prep 表汇编、Frgm 表汇编、CVT 汇编):导出带渲染提示的 TTF 时,Glyphs 会自动添加这些参数。它们分别以汇编代码或普通值列表的形式涵盖了现有的提示。仅在你要修复 TTF 中的一些问题但不篡改现有 TT 提示时,此功能才有用。从技术上讲,这是 Glyphs 支持的第三种 TT 提示。

  • gasp Table(gasp 表):为 TrueType 字体设定 “网格适配和扫描转换程序”。该参数控制两个 PPM 阈值,此时所建议的屏幕渲染行为会发生改变。gasp 表包含了传统灰度渲染和 ClearType 次像素渲染器两者的渲染建议。然而请注意,渲染器可能会忽略此处存储的数据。默认阈值为 8 和 12 PPM。因为有两个阈值,因此可以区分三个范围:

    • 无提示 & 均等:直到第一个阈值字号为止,都不会应用网格适配,文本在所有可能的情况下都以抗锯齿渲染。“在非常小的字号下,灰阶设备上的最佳效果通常可以通过不使用提示的灰阶渲染而得到。”
    • 提示 & 非均等:在两个阈值之间,建议渲染器应用网格适配,禁用灰阶。“在中等字号下,渲染提示和单色渲染通常会产生最佳效果。” 在 ClearType 中,其处理方式并不均等,即,竖直方向上应用网格适配,水平方向上使用次像素渲染。
    • 提示 & 均等:在阈值之上,渲染器被指令应用网格适配,并以灰阶渲染形状。“在大字号下,渲染提示和灰阶渲染相结合通常会获得最佳效果。” ClearType 栅格化器被指令应用均等平滑,即,除水平方向应用次像素渲染外,y 方向上应用抗锯齿。“在屏幕上的展示字号下,[…] Windows 字体渲染器的这一新增改善可以产生更平滑、外观更整洁的字体”(来源:Now Read this: The Microsoft Cleartype Font Collection,Microsoft 2004,第 14 页)。
  • Keep Overlapping Components(保留重叠部件)和 Keep Transformed Components(保留变换部件):技术上讲,TrueType 支持重叠和变形(缩放、倾斜、镜像及旋转)的部件。不一定和提示直接相关,更多的是在 TrueType 整体层面上,使得文件体积较小,因此对网页字体有意义。警告:并非所有环境都可以处理变换的部件,因此请明智地使用此参数,并广泛测试。

实用设定、脚本和插件

在画布上任意位置右键单击鼠标来打开上下文菜单。

若 TrueType 指令工具(I)处于活动状态且有点被选中时,你会看到和当前所选内容相适应的添加提示选项。不论所选内容为何,你都会看到以下和 TT 相关的额外选项:

  • 自动提示:会试图猜测当前字符形的字干(S)和贴齐(A)提示。无法处理偏移(F),斜向(D)或插值(G)提示。适用于作为起点,仅此而已,结果通常不会是可用的提示,你可能会收到错误信息:“编译 TrueType 指令时发生错误。”尽管如此,她仍然可以作为不错的起点,并且你可以批量处理多个字符形。

  • 移除提示:会清除当前字符形中的全部 TT 提示。要了解如何更精细地移除提示,见下方脚本。

  • 显示预览地址:会启动 web 服务器并使用当前 IP 地址展示其 URL:

    将其粘贴在 web 浏览器中,最好在 Windows 虚拟环境中,来查看当前编辑选项卡文本、当前样式的 PPM 瀑布展示,每 2 秒刷新一次:

  • 显示点索引:会显示结果轮廓中曲线上节点的索引数目。有一个名为 TTPreviewAlsoShowOffCurveIndexes 的隐藏设置,可以切换为显示包括曲线外点的全部点索引数目:

    你可以在 “窗口 > 宏面板” 中运行 Glyphs.defaults["TTPreviewAlsoShowOffCurveIndexes"]=True 或使用 mekkablue 脚本 “App > Set Hidden App Preferences”:

  • 缩放预览选项:“不缩放预览”、“缩放预览 2×”、“缩放预览 4×”。设定编辑视图中的预览的像素缩放。

要更具体地移除提示,使用 mekkablue 脚本 “Hinting > Remove TT Hints”。它允许你清除特定类型和方向的提示:

mekkablue 脚本 “Hinting > Set TT Stem Hints to Auto” 和 “Set TT Stem Hints to No Stem” 将所选字符形中全部字干(S)提示切换为相应的字干选项。“无字干” 用于为 Adobe 应用程序中的可变字体创造更好的表现,而 “自动” 会让渲染更锐利,通常会在 Windows 的 Office 软件中看上去更好。

在 mekkablue 脚本中,在你导出字体为网页字体后,还可以使用 “Test > Webfont Test HTML” 脚本。该脚本会为当前字体中所有启用的样式创建一个 HTML 文件,放在最近一次网页字体导出的文件夹中,并在访达中为你打开这个文件夹。这让在 Windows 浏览器中测试字体很容易。


2020-09-16 更新:在 “位置及尺寸” 中添加 “用于” 一词(英文原文)。在 TrueType BlueFuzz 一节中添加了遗漏的 “两者之间的”。其他细微更正和重写。
2020-11-03 更新:修正细微笔误,细微重新分段(感谢 Nathalie 和 Ben!)。

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