宽度是

宽度是

lualatex当我喂食时,我感到很惊讶

\documentclass{standalone}
\usepackage{unicode-math}
\setmathfont{TeX Gyre Termes Math}% or \setmathfont{texgyretermes-math.otf}
\begin{document}
Width of $L$: \setbox0\hbox{$L$}\the\wd0. \text{Width of}\ $Y$:\ \setbox0\hbox{$Y$}\the\wd0. \text{Width of}\ $Z$:\ \setbox0\hbox{$Z$}\the\wd0.
\end{document}

产量

宽度输出

这三个符号的宽度真的相等吗?我觉得难以置信,因为这些数字看起来太漂亮了,每个只占 3 位小数。我可能会想象,在转换为 pt 时,不同长度(以 sp 或其他单位给出)被四舍五入为相同的数字。真的是这样吗?如果是这样,是否有可能区分数学模式的宽度

答案1

字符长度不是依赖于某些测量精度的测量属性,而是由字体设计者设置的属性。

修改您的示例为

\documentclass{article}
\usepackage{unicode-math}
\setmathfont{TeX Gyre Termes Math}% or \setmathfont{texgyretermes-math.otf}
\begin{document}
Width of $L$: \setbox0\hbox{$L$}\the\wd0. \text{Width of}\ $Y$:\ \setbox0\hbox{$Y$}\the\wd0. \text{Width of}\ $Z$:\ \setbox0\hbox{$Z$}\the\wd0.


L 
\the\fontcharwd\textfont0 119871,
\the\fontcharic\textfont0 119871,

Y 
\the\fontcharwd\textfont0 119884,
\the\fontcharic\textfont0 119884,

Z 
\the\fontcharwd\textfont0 119885,
\the\fontcharic\textfont0 119885,

\end{document}

你得到

在此处输入图片描述

使用 luatex,以及

在此处输入图片描述

使用 xetex。

因此这三个字符具有相同的宽度,但斜体校正不同。

luatex 与 xetex 相反,它不会在数学运算末尾添加斜体校正,这解释了为什么使用 xetex 会得到不同的框宽度。

答案2

是也不是。三个字符的前进宽度都是 556。如果我们只看下面的橙色框,我们会看到(这里字符被挤在一起,以更清楚地显示橙色框的宽度相同):

LYZ 互相叠在一起

我们注意到 L 和 Z 向左突出,而 Y 和 Z 向右突出(实际上 L 也向右突出,但非常非常小,见下文)。如果我们查看字体数据,我们会看到以下内容:

  [119871]={ -- L
   ["boundingbox"]={ -8, 0, 559, 653 },
   ["index"]=454,
   ["math"]={
    ["accent"]=267,
    ["italic"]=31,
   },
   ["unicode"]=119871,
   ["width"]=556,
  [119884]={ -- Y
   ["boundingbox"]={ 78, 0, 633, 653 },
   ["index"]=467,
   ["math"]={
    ["accent"]=362,
    ["italic"]=105,
   },
   ["unicode"]=119884,
   ["width"]=556,
  },
  [119885]={ -- Z
   ["boundingbox"]={ -6, 0, 606, 653 },
   ["index"]=468,
   ["math"]={
    ["accent"]=362,
    ["italic"]=78,
   },
  • (前进) 宽度确实相等。
  • 显示的边界框为{xbottomleft, ybottomleft, xtopright, ytopright}。第一个槽中的 L 和 Z 负值表示它们向左突出。第三个槽中的值表示它们实际上都向右突出(L 非常小)。
  • 我们注意到字符的斜体校正量不同。

在这里我认为答案是完整的,但由于其他答案写了 luatex 和 xetex 做事的方式不同,让我补充一些关于数学中的斜体校正的内容。在 luatex 中,您也可以添加斜体校正(通过设置\mathitalicsmode认为可以通过设置为 1 或 2)。我认为默认情况下不添加它的原因是,如果一个人读到模糊的规格似乎不应该总是添加它。目前的情况是,有些数学字体,如 cambria、garamond-math 和 lucida(可能还有其他一些)以某种方式遵循规范并且不依赖于斜体校正(但依赖于字距),然后是其他字体(如 Termes)依赖于旧的 TeX 方式和斜体校正。

在过去几周里,我与 Hans Hagen 就较新的 luametatex 引擎(双关语)进行过多次讨论。我们的目标是拥有一个既适用于旧 TeX 类字体又适用于较新字体的间距模型。如果我们使用斜体校正,公式看起来会像这样(斜体校正用蓝色标记):

带斜体更正的公式

可以看出,斜体校正总是被添加,如果有下标,则被删除。由于 opentype math 中的斜体校正并不是真正的斜体校正,我们认为也许我们可以将其完全删除,并用角字距替换它。然后它看起来会像这样:

带角形紧邻的公式

输出(希望)相同。请注意,带有 Z 的橙色框的宽度已更改,并且添加了两个角字距(一个在右下角用于下标,一个在左上角用于前标)。

之所以将橙色框向左放大,是为了找到一种同样适用于难读字符的方法,例如小写斜体 f,在某些字体中,它从橙色框的左侧和右侧突出很多。将以下内容与示例进行比较,您就会明白为什么。

S(f) 带斜体更正

带核函数的 S(f)

答案3

您测量的不是字符的宽度,而是一些数学公式的宽度。LuaLaTeX 和 XeLaTeX 对数学公式的处理方式不同,因为前者不添加尾部斜体校正。

如果您使用 XeLaTeX 编译以下内容,您会发现字符确实具有相同的宽度,即 5.56pt。

\documentclass{article}
\usepackage{unicode-math}

\setmathfont{TeX Gyre Termes Math}

\frenchspacing

\begin{document}

$x$

\the\fontcharwd\textfont0 `

相关内容