我在追逐的过程中发现了可能是 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 的遗产。\fontdimen
OpenType 字体的数学表。
附录\fontdimens
B 和 C 列出了包的文档unicode-math
。
因此,如果看到第一个 OpenType 数学字体,XeTeX 似乎会从传统系统切换到 OpenType 系统。我建议在XeTeX 邮件列表更多细节。
答案2
这基本上是一个错误。
查询数学尺寸时,我们会检查当前字体是否为 OpenType 数学字体,然后使用当前字体的 OpenType 数学尺寸或来自或的传统数学尺寸\fam1
。在排版第一个分数时,当前字体为,由于这不是 OpenType 数学字体,因此我们最终使用传统数学尺寸,对于其他分数,当前字体是 OpenType 数学字体,因此使用不同的尺寸集。\fam2
\fam3
\nullfont
看来对当前字体的检查是假的,因为不能保证它是分数将要设置的字体(我自己对 TeX 内部工作原理的无知),所以需要以更好的方式处理它,但我还不知道。