xelatex + unicode-math + xits + \vphantom 中存在错误?

xelatex + unicode-math + xits + \vphantom 中存在错误?

编译文件

\documentclass{article}
\usepackage{unicode-math}
\setmathfont[
  Extension=.otf,
  range={\smallblacktriangleright},
  BoldFont = *bold
]{xits-math}
\begin{document}
\[\vphantom{\smallblacktriangleright}^a\smallblacktriangleright^a\]
\end{document}

在 lualatex 下,会在相同高度生成两个“a”的副本(这是我所期望的),但在 xelatex 下会降低第一个“a”(我认为这是错误的):

使用 xelatex 编译的结果

关于使用 xelatex 编译时如何将第一个“a”放在正确的高度,有什么提示吗?

答案1

在这种情况下,xelatex 似乎使用了狭窄的样式。您可以使用附加框来避免这种情况:

\documentclass{article}
\usepackage{unicode-math}
\setmathfont[
  Extension=.otf,
  range={\smallblacktriangleright},
  BoldFont = *bold
]{xits-math}


\begin{document}

\[\mbox{\vphantom{$\smallblacktriangleright$}}^a \smallblacktriangleright^a\]
\end{document}

在此处输入图片描述

答案2

我认为其中存在几个错误。

首先,\vphantom{something}^a在 TeX 中执行 应该与说 完全相同{}^a,因为\vphantom 永远不可能成为数学原子的核心。因此,当 TeX 扫描 时^,它会添加一个空子公式作为应该上标的数学原子的核心。

我将使用 来简化设置,{>}\smallblacktriangleright不是与此无关的内容。下面是一个例子,首先使用 legacy 进行编译pdflatex,然后使用 LuaLaTeX 进行编译,最后使用 XeLaTeX 进行编译。

表示\hrule方框的顶部,而首字母x 表示基线。底部的分数将在后面解释。

示例代码

\documentclass{article}
\usepackage{ifxetex,ifluatex}

\ifx\ifxetex\ifluatex
\else
\usepackage{unicode-math}
\setmathfont{latinmodern-math.otf}
\fi

\begin{document}

\hrule height 0.1pt
x\(\displaystyle{}^a{>}^a\)

\hrule height 0.1pt
x\(\displaystyle\vphantom{>}^a{>}^a\)

\hrule height 0.1pt
x\(\displaystyle{\vphantom{>}}^a{>}^a\)

\hrule height 0.1pt
x\(\displaystyle{}^a{\sum}^a\)

\hrule height 0.1pt
x\(\displaystyle\vphantom{{\sum}}^a{\sum}^a\)

\hrule height 0.1pt
x\(\displaystyle{\vphantom{{\sum}}}^a{\sum}^a\)

\hrule height 0.1pt
\(\displaystyle\frac{\scriptstyle a}{\scriptstyle b}\frac{a}{b}\)

\end{document}

输出pdflatex

在此处输入图片描述

可以清楚地看到,使用{}或时,左上标的位置没有区别\vphantom{>}。第三行也没有区别,{\vphantom{>}} 接收上标的数学原子的原子核。

\sum类似地,当使用 代替时,前两行没有区别>,但区别出现在第三行。

使用 LuaLaTeX 输出

在此处输入图片描述

这和以前本质上是一样的。

使用 XeLaTeX 输出

在此处输入图片描述

出现了一些差异。前三行彼此不同。对于第一行和第三行,这可能与 XeTeX 如何处理来自 OpenType 字体的信息有关,以便将其转换为适当的参数,\fontdimen并且应该进行修复以匹配旧版排版。

第二行明显是错的。似乎当\vphantom涉及到涉及时\mathchoice,用于将上标设置为添加的空核的尺寸是相对于scriptscriptstyle字体的。

这可能与 XeTeX 的另一个已知错误有关,该错误会显示分数。如果比较前两幅图中的分数,分数线处于同一水平;在 XeLaTeX 输出中,带有脚本样式分子和分母的分数的分数线较低且较粗。

这种联系似乎很有可能,因为分数和\mathchoice(以其为\vphantom基础构建的)使用非常相似的机制。

解决方案?

没有一个可以像人们希望的那样被视为普遍的。使用适当的

{\vphantom{?}}^a

其中?是某个符号,其高度使得上标的高度与所需的高度相匹配。

相关内容