这个问题是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 编译时则不同(我认为这是一个错误)。第二行和第三行表示修复尝试失败。有什么提示吗?
答案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