请考虑以下文档:
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}
\def\text{0}
\newlength\len
\settowidth \len\text
width: \the\len % width: 5.47499pt
\settoheight\len\text
height: \the\len % height: 7.17827pt
\end{document}
我想确切了解 LaTeX 是如何得出这两个数字的。我想我已经接近答案了,但还没有找到答案。
首先,当我们建议 article 类选择 11pt 的字体大小时,它实际上决定选择 10.95pt 的字体大小。这很合理。latex/base/classes.dtx:
%<*11pt>
\@setfontsize\normalsize\@xipt{13.6}% %% \@xipt equals 10.95
\abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
%</11pt>
现在,Latin Modern 不提供 10.95pt 字符,因此我们需要采用不同大小的字符并对其进行缩放。Latin Modern 配置文件告诉我们,对于 10.95pt,我们应该采用 10pt 字符并将其放大。latex/lm/t1lmss.fd:
\DeclareFontShape{T1}{lmss}{m}{n}
{<-8.5> ec-lmss8
<8.5-9.5> ec-lmss9 <9.5-11> ec-lmss10
<11-15.5> ec-lmss12 <15.5-> ec-lmss17
}{}
接下来,我们需要使用字体编辑器检查字体文件。当我打开拉丁现代使用 FontForge 时,它告诉我0
宽度为 500 UPM(单位/Em),(可能?)高度为 656 UPM,并且一个 Em 在每个方向上由 1000 UPM 组成。为了将这些值转换为pt
,Em 被缩放到所需的点大小(在我们的例子中是 10.95)。好的,让我们来算一下:
宽度:500 * 0.001 * 10.95 = 5.475pt(我猜这足够接近 5.47499pt)
高度:656 * 0.001 * 10.95 = 7.1832pt(这与 7.17827pt 不太接近......)
问题:
- 为什么我计算的值与 LaTeX 输出的值不匹配?浮点计算并不精确,我不知道 LaTeX 如何执行这些计算,但我感觉,在仅使用相对较好的数字进行两次乘法之后,误差就达到 ~0.005,这太大了。而且第一种情况下的误差也小得多。所以似乎有些不对劲。
- 我之前写过身高是大概656 UPM。实际上,Font Forge 很好地显示了字形的宽度及其左轴承和右轴承,但(令我惊讶的是)没有显示高度。据我所知,字体设计师为每个字形定义了自定义宽度和高度(对吗?),所以我希望字体编辑器能够平等地显示这个宽度和高度,但事实似乎并非如此。656 UPM 处有一行可能高度,但我不太确定。如何检索字形的高度?
- 拉丁现代风格有不同的形式,例如lm/字体/afm/公共/lm/lmss10.afm,lm/字体/opentype/公共/lm/lmsans10-regular.otf或者lm/字体/type1/公共/lm/lmss10.pfb。我检查了
lmss10.pfb
。什么决定了实际使用哪一个?