xelatex + unicode+math + vphantom 中的错误

xelatex + unicode+math + vphantom 中的错误

这个问题是XITS Math 的一个稍微复杂一点的问题:考虑以下代码:

\documentclass{article}
\usepackage{unicode-math}
\begin{document}
\(|^a\) \(\vphantom{|}^a\)

\(|^a\) \(\mathord{\vphantom{|}}^a\)

\(|^a\) \(\mbox{\vphantom{$|$}}^a\)
\end{document}

在第一行中,使用 lualatex 编译时,两个出现的“a”的垂直位置相同(这是预期的),但使用 xelatex 编译时则不同(我认为这是一个错误)。第二行和第三行表示修复尝试失败。有什么提示吗?

使用 xelatex 编译的结果

答案1

我之所以将其作为答案,只是因为它不适合放在评论中:看起来 XeTeX“记住”了上次在公式中排版符号时有效的数学样式,并继续将其应用于选择\fontdimen后续公式中的某些参数,只要它们以原子核为空的原子开头(或包含空的数学列表,效果相同)。考虑

\documentclass[a4paper]{article}
\usepackage{unicode-math}


\begin{document}
Just try:
$^a$ $\scriptscriptstyle x$ $^a$ $\mathchoice{}{}{}{}^a$ $x^a$ $^a$
\end{document}

其输出是

代码输出

然而,这种情况只有当unicode 数学程序包已加载。

这个错误似乎是在将数学列表转换为其水平等效项的过程中发生的,就好像 XeTeX 在某些情况下未能初始化“当前样式”,或者更准确地说,未能初始化与\fontdimen排版上标相关的参数选择相关的一些信息。但这只是猜测(毕竟,问题要求“任何提示”)。

那么,问题中描述的行为从何而来?好吧,\vphantom{|}在数学模式下使用时,会调用 TeX 的一个原始命令\mathchoice,该命令 - 简单地说 - 在所有四种数学样式(\displaystyle,,,和)中排版“|”字符,以确定幻影在四种样式中的每一种应该有多高。因此,最后一件事是排版,当感知到闭合时 ,该公式将转换为水平列表(\textstyle并保存到临时框中,但这在这里并不重要);如果我们的猜测是正确的,那么这会在某个地方留下信息,即应该为等于的“当前样式”选择参数。然后,(Xe)TeX 返回到它在看到时构建的(仍然为空的)数学列表,并向其附加一个“四向选择”节点,其中包含幻影的四个版本,每个版本的可能样式一个。\scriptstyle\scriptscriptstyle\vphantom{|}$\scriptscriptstyle |$$\fontdimen\scriptscriptstyle\vphantom{|}

接下来是^a。现在,一个似乎很容易被遗忘的事实是,数学列表可以包含几种类型的节点(TeXbook在第 157 页的底部列出了所有这些内容),但只有原子可以携带下标/上标;“四向选择”节点不能,因此(第 291 页,“上标”命令的描述)将一个具有空核的 Ord 原子附加到列表中,并且“A” 成为其上标。此时数学列表如下所示:

\mathchoice
D\mathord
D.\hbox(7.5+2.5)x0.0
T\mathord
T.\hbox(7.5+2.5)x0.0
S\mathord
S.\hbox(5.24998+1.75)x0.0
s\mathord
s.\hbox(3.75+1.25)x0.0
\mathord
^\fam0 

相关内容