OpenType 特性(二):上下文替换

教程
作者:Rainer Erich Scheichelbauer
en fr zh

8 一月 2013 发布日期: 21 七月 2012

想要仅在特定场合下替换字符形?“上下文替换” 就可以实现这一功能。

你肯定已经知道了如何在 InDesign 中打开上下文替代字。而且,你可能也听说过有些字体用这一功能做出了非常酷的东西。本文就将介绍如何在你的字体里也创建出这样的功能。

我们要关注的特性是 calt上下文变体)和 clig上下文合字)。这两者都通过 InDesign 中的 “上下文替代字” 开关来打开。

创建替代字符形

那么,找一款你自己的字体,我们来在其中加入一个替代字符形。这个替代形式应该仅在特定情况下替换常规字符形。作为例子,我们选择字母 j。

我想在这个例子中,当 j 位于字母 g 之后时,它的末端应该稍微收缩一点。所以我们通过 “字符 > 添加字符形…” 新建一个字符形。在弹出的文本框中输入 j=j.alt 并点击 “生成”。这样就会创建一个名为 j.alt 的字符形,其中带有一个作为部件的 j。然后你可以在右键菜单中释放部件,并调节末端长度。

你可以这样在编辑视图中 “输入” j 的变体:按下 Cmd-F,在弹出窗口的搜索框中输入j.alt

编写上下文替换规则

现在,我们需要编写 calt 特性。按下 Cmd-I 打开 “字体信息”,切换到 “特性” 选项卡。点击加号按钮创建新特性,新建的特性会保持名称选定以便修改。我们将其命名为 calt。在上方的输入框中,输入:

sub g j' by j.alt;

如果一切正常,你的特性窗口将如图所示:

subby 之间,时这一特性所查找的完整上下文内容。本例中,是 g 后接 j。但我们只想替换 j,而不是 g。所以我们在 j 后标记一个单直引号:j’。关键词 by 后面的替换内容,j.alt,仅会对带有单引号标记的字母生效,本例中即为 j

我们来试一下特性是否有效。点击 “编译” 按钮,然后在字体窗口中新建一个编辑选项卡,在左下角的 “特性” 菜单中选择 calt 并输入一个包含“gj”的单词。

为替换规则添加分类

当我们的 j 位于 g 之后时,就会缩短尾巴——这是个不错的注意。不过,如果前面是其他带有下降部的字母,比如 qy 或另一个 j 时,也应当如此。当然了,我们可以calt 特性中这样写:

sub g j' by j.alt;
sub q j' by j.alt;
sub y j' by j.alt;
sub j j' by j.alt;

但是这就很繁琐,尤其是之后如果想修改什么内容的话。对于同样的作用,这里有一种更为有效的写法:

sub [g j q y] j' by j.alt;

方括号会创建一个 “类”(class),其含义为 “这些字母中的任何一个”。所以这个特性就是在说,“如果跟在 g、j、q 或 y 中的任何字母之后,就将 j 替换为 j.alt。”

在替换结果中也可以使用类。你只需要确保两个类包含同等数量的内容,且顺序一致。假如我们还有一个对应字母 ĵ 的 jcircumflex.alt,那么特性代码可以这样:

sub [g j q y] [j jcircumflex]' by [j.alt jcircumflex.alt];

当你经常使用一个类时,就不想一次次地反复输入整个类。尤其是当你发现类中漏掉了一个字符形,你就要全盘修改。有一个更好的办法是,点击加号按钮并创建一个类别定义。你可以通过双击 xxxx 来对其进行重命名,和重命名特性标签时的操作相同。类名称必须由大写字母 A-Z 或小写字母 a-z 开头,也可包含下划线 _、句点 . 和数字。名称不限于四个字母长。我将这一类命名为 descender_on_the_right,并在其中添加 g j q y

现在,我们可以像这样重写 calt 特性:

sub @descender_on_the_right [j jcircumflex]' by [j.alt jcircumflex.alt];

@ 符号用于标记类名称。如果你不写 @,Glyphs 会将其识别为字符形名称并报错。

就是这样了。实际上,这还不是全部内容。在下一篇,OpenType 特性(三):上下文替换中,我们会更进一步,编写高阶的上下文特性代码。


示例字体:Jordana,由 Stella Chupik 设计
2015-06-22 更新:升级为 Glyphs 2。
2019-03-29 更新:删去 “字体” 菜单;现在位于 “字符” 菜单中。修正录入错误。

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