lualatex 和 xelatex 在显示数学垂直间距方面的差异

lualatex 和 xelatex 在显示数学垂直间距方面的差异

考虑一下

\documentclass[a4paper]{article}
\usepackage[left=0cm,right=12cm]{geometry}
\usepackage{unicode-math}
\setmathfont{Libertinus Math}
\usepackage[grid]{eso-pic}
\begin{document}
Before
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
After
\end{document}

左边是 xelatex 的结果,右边是 lualatex 的结果:

在此处输入图片描述在此处输入图片描述

测试使用 TL2018(更新的预测试)完成。在心理上将右图略微向上移动,使其与左图完美对齐。重点是 xetex 输出在垂直方向上分布更广。在现实生活中,这意味着文档在分页方面很容易有所不同。

评论中指出,由于 LuaTeX 扩展了连字算法,因此已经存在这种情况,而 XeTeX 仍坚持使用传统算法

这次测试来自\underbrace 和 Libertinus Math 的问题

使用默认字体,没有差异。

对不起,编辑也存在差异注释掉\setmainfont{Libertinus Math}并仅保留unicode-math

\documentclass[a4paper]{article}
\usepackage[left=0cm,right=12cm]{geometry}
\usepackage{unicode-math}
\usepackage[grid]{eso-pic}
\begin{document}
Before
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
\[ \underbrace{AAA}_{B}\]
After
\end{document}

编辑问题标题以删除对 Libertinus Math 的引用。

使用 onlyfontspec但 notunicode-math输出是相同的。使用fontspecand unicode-math(或仅后者加载前者)即使没有额外的字体设置,输出也会有所不同。

例如使用时也存在同样的问题\setmathfont{TeX Gyre Pagella Math}


这不是一个问题,unicode-math而是一个引擎“问题”,可以使用这个 Plain TeX 示例进行显示:

\nopagenumbers
\ifdefined\directlua
  \input luaotfload.sty
\fi

% Load any Unicode math font (we don't need scriptscript here)
\font\mathfont="TeX Gyre Pagella Math:script=math" at 10pt
\textfont0=\mathfont
\font\mathfonts="TeX Gyre Pagella Math:script=math;+ssty=0" at 7pt
\scriptfont0=\mathfonts

% Define the relevant symbols
\Umathcodenum`A="1D434
\Umathcodenum`B="1D435
\def\underbrace#1{\mathop{\Umathaccent bottom 0 0 "23DF {#1}}}

$$ \hbox{Before} $$
$$ \underbrace{AAA}_{B} $$
$$ \underbrace{AAA}_{B} $$
$$ \underbrace{AAA}_{B} $$
$$ \underbrace{AAA}_{B} $$
$$ \underbrace{AAA}_{B} $$
$$ \underbrace{AAA}_{B} $$
$$ \underbrace{AAA}_{B} $$
$$ \underbrace{AAA}_{B} $$
$$ \hbox{After} $$
\bye

左边是LuaTeX,右边是XeTeX:

LuaTeX特克斯

答案1

这不是一个答案,而是一个太长而无法评论的反问句。

在没有 Unicode 数学字体的情况下,XeTeX 和 LuaTeX 都会模拟传统的 TeX 数学排版行为。我们可以利用这一点来并排比较有和没有 Unicode 数学字体的输出。

\nopagenumbers
\ifdefined\directlua
  \input luaotfload.sty
  Lua%
\else
  Xe%
\fi
\TeX

\hbox{
  \vbox{\hsize=50pt
    $$ \hbox{Traditional} $$
    $$ \underbrace{AAA}_{B} $$
    $$ \underbrace{AAA}_{B} $$
    $$ \underbrace{AAA}_{B} $$
    $$ \underbrace{AAA}_{B} $$
    $$ \underbrace{AAA}_{B} $$
    $$ \hbox{After} $$
  }

  \font\mathfont="Latin Modern Math:script=math" at 10pt
  \textfont0=\mathfont
  \font\mathfonts="Latin Modern Math:script=math;+ssty=0" at 7pt
  \scriptfont0=\mathfonts

  \Umathcodenum`A="1D434
  \Umathcodenum`B="1D435
  \def\underbrace#1{\mathop{\Umathaccent bottom 0 0 "23DF {#1}}}

  \vbox{\hsize=50pt
    $$ \hbox{Unicode} $$
    $$ \underbrace{AAA}_{B} $$
    $$ \underbrace{AAA}_{B} $$
    $$ \underbrace{AAA}_{B} $$
    $$ \underbrace{AAA}_{B} $$
    $$ \underbrace{AAA}_{B} $$
    $$ \hbox{After} $$
  }
}
\bye

LuaTeX 特克斯

在这里我们开始遇到一些严重的麻烦,因为这两个引擎都不符合传统的 TeX 输出。部分原因是度量标准略有不同,下括号重音的形状也截然不同。但与此同时这种差异使得我们无法说出哪个引擎是“正确的”。

此时唯一能做的就是要求两个引擎的开发人员检查他们的代码,看看是否有任何错误的缩放比例,但对我来说这似乎有点毫无意义,因为我们并不清楚我们在寻找什么。因为 XeTeX 有这样的历史破碎的 数学,我怀疑是他们的错误,但这纯粹是猜测,也可能是诬告。

相关内容