关于 Font Metrics 的一些基础
UPM: Units per Em
UPM的意思是每个em由多少个单位(unit)组成。Em大概可以理解成一个字母的宽度,但它没有固定的大小,计算机处理字体时都先将Em变成一定的point(点),比如某个字体的大小是12pt(points),那么在这个例子中em就等于12pt。Em是字体最基本的单位,在不同的字体中不一样。Em不是字母"M"的宽度,但基本上等于一个 em dash (Unicode: 2014) 的宽度(但也不完全等于)。在一个字体中,一个字母(或标点符号)和这个字体的 em square (边长是一个em的正方形)的比例是固定不变,不管字体的大小是12pt或100pt。
UPM一般设为1000。在1995年左右,有建议将UPM设为2的正次方倍数,1024或2048是最理想的数值,即2的10或11次方。这是因为当时的计算机运算速度很慢,象1024这样的数值方便计算机运算,正如人类计算1000除以10很容易一样,1024除以2对于计算机而言一样容易。2048曾被认为是最理想的数值,因为可以包含足够多的细节也很容易计算。但随着计算机运算速度的提高,UPM一般都设为1000,当设计师想要更高的精确度或更多的细节时,可以将UPM设为2000,2048,甚至10000(FontLab的最大限制)。
在FontLab 5中设置字体的UPM值,见下图。

设计字体的时候,第一步应当是确定字体的比例,即大写字母和小写字母的比例,这一步非常,非常,非常的重要。相应的,descender的比例也可以确定下来 (至于如何确定我可能大概也许在不久的将来会写个教程)。一个字体,尽管是不同样式(粗体,斜体等),font metrics 的设置应当是一样的,不然从常规体转到粗体的时候,用户发现字体大小竟然变了,这样的结果肯定不是我们想要的(当然这种可能性不应该排除)。
需要注意的是,descender的值都是是用负数表示的,因为它在基线(baseline)以下。
下图是一个比较不怎么典型的Font Metrics设置,在FontLab 5中。

关于上图的一点解释:
Set dimensions for the master,该选项只适用于有multiple master的字体,除非你的字体用有multiple master设置,可以无视。
Ascender,descender 等等就略过了,凡是看这篇文章能从头看到这里的人也应该知道。右边那个有图标的按钮是让FontLab自动计算左边的4个值,不建议用,经常是错的。
Copy values to TrueType metrics,是自动把上面的4个值添到TrueType信息里,见下一图。该选项适合懒人用。
Italic angle,意大利体的倾斜角度。Slant angle,斜体的倾斜角度。这两个选项适合给有一定倾斜角度的字体用,如果不是就无视。(意大利体和斜体的区别?什么‽你不知道‽) 这两个值一般是负数(没错,的确有向左倾斜的斜体)。
Underline,你的字体的下划线的中间的位置,因为是在基线一下,所以是用负数表示。(你的下划线在基线以上?)
Thickness,你的字体的下划线的厚度。
Font is monospaced,你的字体的所有字符都是一样宽度么? 如果是就钩上。
Font BBox,即Font Bounding Box,代表你的字体的上下限。该选项不是选项。
在FontLab 5中如何设置Font Metrics
终于步入正题了。见下图。请参照上图的数字的以便你确认下图的这些数字不是胡编乱造的。下图不是一个比较不典型的例子,不过这个不重要。我的系统是苹果的而且换了系统皮肤所以你在你的电脑上看到的有很大的可能性和下图不一样。

关于上图的解释:
Font metrics,可以理解成字体的度量规格,是储存在字体里的一些数字,用来让程序知道该字体的ascender, descender, linegap (行距)等等是什么,以便程序能够正确地显示和处理字体,尤其是行距。当然,不同的系统和不同的程序处理字体的方式也不同。Windows一般用 OS/2 规格 (table),而苹果只用 hhea 规格。Font metrics 直接关系到你的字体在实际应用的时候是什么样子,所以非常,非常,非常的重要,就好比人的衣服一样。Font metrics 实际上比较复杂而且混乱,连微软自己的程序员都搞错了(他们的理解能力估计有问题)。
下面是 "基本的计算公式" 。
OS/2.TypoAscender + |OS/2.TypoDescender| + OS/2.TypoLineGap
=
hhea.Ascender + |hhea.Descender| + hhea.LineGap
= OS/2.WinAscent +
OS/2.WinDescent注: "||" 表示绝对值。
UPM = TypoAscender + |TypoDescender|
TypoLineGap = hhea.LineGap = 0
hhea.Ascender = OS/2.WinAscender
hhea.Descender = OS/2.WinDescender
计算 WinAscent 和 WinDescent 这两个值。下面是适用于拉丁文语言字体的公式(对于中文,阿拉伯文等其他文字要用其他方法):
WinAscent =
Ascender * 1.20
WinDescent =
Descender * 1.20WinAscent + |WinDescent| = UPM * 1.20
1.2 可以换成 1.25, 1.3 等等,根据不同语言作出调整。
相关资料
OS/2 Table from Microsoft