数字:上标和下标数字

教程
作者:Rainer Erich Scheichelbauer
en fr zh

29 八月 2013 发布日期: 24 七月 2013

The final figure frontier: superscript, subscript and scientific subscript figures. Implement those with this quick step by step tutorial.

本文假定你已经拥有了分数字。我们会在上下标数字中复用它们。

上标:sups 特性

设想一下 “m 的平方”——平方米,设想一下 “x 的三次方”。这就是上标数字所该出现的高度。根据你的设计,可以完全复制分子的造型。不过,在许多设计中,需要把它们向上移动一点:

那么,如何做呢?前往 “字符 > 添加字符形…”(Cmd-Shift-G),使用配方创建分子的部件副本:

zero.dnom=zerosuperior
one.dnom=onesuperior
two.dnom=twosuperior
three.dnom=threesuperior
four.dnom=foursuperior
five.dnom=fivesuperior
six.dnom=sixsuperior
seven.dnom=sevensuperior
eight.dnom=eightsuperior
nine.dnom=ninesuperior

然后选中 superior 字符形(在字体视图或编辑视图中都可以)将它们向上移动:你可以通过 “滤镜 > 变换 > 变换” 一步将它们全部向上移动。在 “Y” 文本框中输入合适的值,就可以了:

在 “文件 > 字体信息 > 特性” 中,按下 “更新” 按钮,Glyphs 就会生成 sups(上标)特性:

请注意,使用这种方式,上标数字会获得单独的 Unicode 值因此,该特性会搞乱字符。根据官方技术文档,这是可以的:

这可能包括语义值的变化。除了原始字符代码之外,应用程序还应该存储新字符的代码。

这里的关键词是 “语义值的变化”。OpenType 特性通常不会像这样改变 Unicode 值,从而使语义值发生变化。然而,也有一些例外,巧的是 sups 就是其中之一。因此,我们的特性代码是没问题的,这就是我们全心全意推荐这种方法的原因。

下标:subs 与 sinf

什么?下标有两个不同的 OpenType 特性?在官方用语表中,subs (下标)用于:

“subs” 特性可以将默认字符形替换为下标字符形,或者也可以将替代字符形与定位调整符相结合,以获得合适的位置。[……] 注意:这改变了语义值。除了原始字符代码之外,应用程序还应该存储新字符的代码。

重点还是 subs 会触发 “语义值的变化”,即,在字符层面做了动作。理论上,OpenType 特性不应该这么做,但这种情况下,Unicode 已经编码了下标数字,所以我们也可以将它们用在这个特性上。

sinf(科学用下标)用于科学用途

将定高或变高数字替换为下标数字(低于标准基线的、更小的字符形,主要用于化学或数学标记)。也可以将小写字符替换为下标字母。

所以,当二氧化碳或水的化学式中需要下标的 2 时,就是 sinf 的工作了:

你想让 subs 数字和 sinf 数字完全相同,这完全没问题。不过,官方上 sinf 不允许语义变化。不论如何,这样做都不是问题,为两者都使用同一组下标数字就可以了。这也是我们建议的方式。

若要这样做,只需添加带有 inferior(不带点)后缀的数字。要想创建它们,执行 “字符 > 添加字符形…”,在出现的对话框中粘贴以下内容即可:

zero.dnom=zeroinferior
one.dnom=oneinferior
two.dnom=twoinferior
three.dnom=threeinferior
four.dnom=fourinferior
five.dnom=fiveinferior
six.dnom=sixinferior
seven.dnom=seveninferior
eight.dnom=eightinferior
nine.dnom=nineinferior

按下 “生成”,Glyphs 会用分母的部件副本创建新的字符形。然后。使用 “滤镜 > 变换” 将它们下移,只不过这次 “Y” 填入负值。

继续前往 “文件 > 字体信息 > 特性” 并按下 “更新” 按钮,Glyphs 会用这些字符形生成 subssinf 两个特性。这样就完成了,祝贺你!

实用脚本

上面描述的所有步骤都非常繁琐。如果你希望所有这些都能自动完成,我非常理解你。我也处于同样的境地,这就是为什么在 mekkablue 脚本集中,有一个 “Build Glyphs > Build Small Figures”(创建小型数字)脚本。运行这个脚本时,你会看到这样一个对话框:


使用带有默认后缀 “Default Suffix”(例如 .dnum)的字符形的部件副本,创建派生字符形 “Derivatives”(逗号分隔的 “后缀:y坐标偏移” 组合)。放置部件时,会考虑斜体角度。

复选框:
仅应用于当前母版(取消勾选应用于所有母版)
释放带有默认后缀的小型数字
为受影响的字符形打开新标签页

插件的效果正如其所述,因此使用方法相当简单:

  1. 在 “Default Suffix” 文本框中,输入 “基础小型数字” 的后缀,即接在 onetwo 后面的部分。一般这里会是分母的后缀 .dnom,因为分母通常会落在基线上,所以很适合作为起始点。
    你的默认数字应该是基于轮廓的,即不包含部件。如果你不确定,使用 “Decompose small figures with Default Suffix” 选项将带有默认后缀的小型数字进行部件释放。
  2. 在 “Derivatives” 中,列出所有派生小型数字的后缀,每个后缀后接冒号和垂直偏移量。将多个条目用逗号分隔。如果后缀名上带点,不要忘记加上这个点。例如 .numr:250, superior:350, inferior:-125
  3. 按下 “Build” 按钮。脚本就会将小型数字重新建立为部件字符形。其中的部件即为带有默认后缀的数字。

很酷。字符形的创建和部件的变换都在一步内完成。节省下来的时间,我们就可以去喝一杯咖啡了。

激进案例:避免语义变化

不论出于何种原因,如果你想避免我们前面提到的语义变化,或者你需要让语义上的上标和纯 OpenType 上标彼此区分,那么请为你的上标数字使用 .sups 后缀。为什么?因为带有点后缀名的字符形不会获得新的 Unicode 值。这里是用于这样做的配方:

zero.dnom=zero.sups
one.dnom=one.sups
two.dnom=two.sups
three.dnom=three.sups
four.dnom=four.sups
five.dnom=five.sups
six.dnom=six.sups
seven.dnom=seven.sups
eight.dnom=eight.sups
nine.dnom=nine.sups

注意:我们不建议这样做。我们编码 superior 数字的方法没有问题,可以很好地工作。所以,仅当你需要解决技术问题的时候才这样做。

类似地,如果你需要区分 subssinf,或避免上面提到的语言变化,请使用 .sinf.subs 两个后缀名,带上前面的点。而不要使用不带点的 inferior 数字。要开始这样做的话,这里是用于 “字符 > 添加字符形…” 的配方:

zero.dnom=zero.sinf
one.dnom=one.sinf
two.dnom=two.sinf
three.dnom=three.sinf
four.dnom=four.sinf
five.dnom=five.sinf
six.dnom=six.sinf
seven.dnom=seven.sinf
eight.dnom=eight.sinf
nine.dnom=nine.sinf

zero.dnom=zero.subs
one.dnom=one.subs
two.dnom=two.subs
three.dnom=three.subs
four.dnom=four.subs
five.dnom=five.subs
six.dnom=six.subs
seven.dnom=seven.subs
eight.dnom=eight.subs
nine.dnom=nine.subs

然后,“滤镜 > 变换 > 变换” 会帮你将数字重新移动到正确的地方。导出字体之前,别忘了在 “文件 > 字体信息 > 特性” 中更新特性。


示例字体:MARTHA,谨感谢 LISA SCHULTZ 提供。

2019-05-06 更新:更新了用于 Glyphs 2.6 的介绍。感谢 @madigens。也更新了解释语义变化的链接。
2019-12-10 更新:添加了关于脚本的一节。
2020-01-11 更新:更正了细小的录入错误。
2020-03-25 更新:更改了标题。

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