LaTeX 如何计算字符的边界框?

LaTeX 如何计算字符的边界框?

请考虑以下文档:

\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 不太接近......)

问题:

  1. 为什么我计算的值与 LaTeX 输出的值不匹配?浮点计算并不精确,我不知道 LaTeX 如何执行这些计算,但我感觉,在仅使用相对较好的数字进行两次乘法之后,误差就达到 ~0.005,这太大了。而且第一种情况下的误差也小得多。所以似乎有些不对劲。
  2. 我之前写过身高是大概656 UPM。实际上,Font Forge 很好地显示了字形的宽度及其左轴承和右轴承,但(令我惊讶的是)没有显示高度。据我所知,字体设计师为每个字形定义了自定义宽度和高度(对吗?),所以我希望字体编辑器能够平等地显示这个宽度和高度,但事实似乎并非如此。656 UPM 处有一行可能高度,但我不太确定。如何检索字形的高度?
  3. 拉丁现代风格有不同的形式,例如lm/字体/afm/公共/lm/lmss10.afmlm/字体/opentype/公共/lm/lmsans10-regular.otf或者lm/字体/type1/公共/lm/lmss10.pfb。我检查了lmss10.pfb。什么决定了实际使用哪一个?

相关内容