\setbox 包含数学运算,会干扰 XeTeX 中的周围数学模式

\setbox 包含数学运算,会干扰 XeTeX 中的周围数学模式

我在追逐的过程中发现了可能是 XeTeX 的一个错误(但我很高兴被证明是错的)bytefield、unicode-math 和 mathtools 之间的奇怪交互

一般来说,\setbox\mybox\hbox{...}只要该框\mybox未在其他任何地方使用,并且...不执行全局赋值,我不希望表单的构造影响周围的代码。因此,我希望\ignore示例中的宏能够排版其参数,而不对其执行任何操作。考虑到我输入的内容(简单字符,\mathchar),不应执行任何赋值:\everymath\everhbox为空;此外,\tracingall证实了没有赋值。尽管如此,周围的数学模式(不包含任何字符……这可能是一个线索)的间距受到影响,可以通过检查终端上的框来看到。

\global\font\xxx"[latinmodern-math.otf]"\relax
\global\textfont 0\xxx
\newbox\mybox
\def\ignore#1{\setbox\mybox\hbox{#1}}
\def\showhbox#1{\setbox0\hbox{#1}\showbox0\relax}
\tracingall
\showhbox{${\ \over\ }\ignore{a}$}
\showhbox{${\ \over\ }\ignore{$\mathchar`a$}$}
\showhbox{${\ \over\ }\ignore{a}$}
\bye

更奇怪的是,盒子有尺寸

\hbox(3.93732+3.44841)x5.73332
\hbox(3.94+3.45)x5.73332
\hbox(3.94+3.45)x5.73332

第三个框的内容与第一个框完全相同,应该具有相同的大小,但实际上并非如此。我还没有检查这个问题是否特定于字体。

我想我的问题分为两部分:(1)当我认为它是一个错误时,我是否正确地解释了我看到的内容?(2)(如何)我可以在 XeTeX 中安全地执行框分配而不影响周围的数学运算?

答案1

从以下讨论我想说,这或多或少是 XeTeX 中未记录的功能。似乎有两个\fontdimen系统:

  • \fontdimen根据《The TeXbook》附录 G 的遗产。
  • \fontdimenOpenType 字体的数学表。

附录\fontdimensB 和 C 列出了包的文档unicode-math

因此,如果看到第一个 OpenType 数学字体,XeTeX 似乎会从传统系统切换到 OpenType 系统。我建议在XeTeX 邮件列表更多细节。

答案2

这基本上是一个错误。

查询数学尺寸时,我们会检查当前字体是否为 OpenType 数学字体,然后使用当前字体的 OpenType 数学尺寸或来自或的传统数学尺寸\fam1。在排版第一个分数时,当前字体为,由于这不是 OpenType 数学字体,因此我们最终使用传统数学尺寸,对于其他分数,当前字体是 OpenType 数学字体,因此使用不同的尺寸集。\fam2\fam3\nullfont

看来对当前字体的检查是假的,因为不能保证它是分数将要设置的字体(我自己对 TeX 内部工作原理的无知),所以需要以更好的方式处理它,但我还不知道。

相关内容