使用 LuaTeX 和 unicode-math 实现 math 与 \right 结束分隔符之间的间距

使用 LuaTeX 和 unicode-math 实现 math 与 \right 结束分隔符之间的间距

\left我注意到,当使用 LuaTeX 和 时,使用 和 的一对分隔符内的数学符号与\right结束分隔符(带有 的分隔符\right)本身之间的间距有时是错误的unicode-math。这个 MWE

\documentclass{article}
\usepackage{amsmath}
\usepackage{unicode-math}
\usepackage{mleftright}
\mleftright

\begin{document}
\begin{align*}
  &\left|T\right| \left(T\right) & &\left|P\right| \left(P\right) & &\left|O\right| \left(O\right) & &\left|A\right| \left(A\right) & &\left|V\right| \left(V\right) \\
       &|T|            (T)       &      &|P|            (P)       &      &|O|            (O)       &      &|A|            (A)       &      &|V|             (V) \\
\end{align*}
\end{document}

产生此输出 在此处输入图片描述 第一行是 和\left|\right|而第二行只有|成对的 。O和都没问题,但第一行中的、或和结束的或A之间的间距太小。TPV|)

mleftright用于校正间距外部分隔符并提供更好的比较,但没有 时,同样的间距问题仍然存在mleftright。我尝试了不同的字体,结果相同。我使用的是 TeXLive 2016,但我手动将 LuaTeX 更新为http://minimals.contextgarden.net/current/bin/luatex/linux-64/bin/(目前是 1.0.3)尝试解决该问题,但没有成功。

使用带有 的 XeTeX 时间距是正确的unicode-math,使用不带有 的 LuaTeX 时间距也是正确的unicode-math

这是unicode-math一个 LuaTeX 错误吗?有什么解决方法吗? 当然,在这种情况下不需要使用\left\right,但我需要它们来定义根据周围的数学缩放分隔符的宏。谢谢!

更简单的测试

\documentclass{article}

\showoutput
\ifx\Umathchar\undefined\else
\usepackage{unicode-math}
\fi


\begin{document}


$\left|T\right|\showlists$

$|T|\showlists$

\end{document}

答案1

下面的纯 TeX 文件显示这是一个引擎(或 luaotfload)问题,使用 pdftex 或 xetex 时即使有,也会使用 T 和 | 之间的字距,但\right在 luatex 中,字距会被删除。

西特克斯 在此处输入图片描述

路特克斯在此处输入图片描述

\tracingonline1

\ifx\directlua\undefined\else
\input{luaotfload.sty}
\font\mmm="[latinmodern-math.otf]:mode=base;script=math;language=DFLT;"
\font\mmms="[latinmodern-math.otf]:mode=base;script=math;language=DFLT;" at 7pt
\font\mmmss="[latinmodern-math.otf]:mode=base;script=math;language=DFLT;" at 5pt

\Umathcode`T= 0 0 "1D447
\Umathcode`|= 0 0 `|
\Udelcode`|= 0 `|
\textfont0=\mmm
\scriptfont0=\mmms
\scriptscriptfont0=\mmmss
\textfont1=\mmm
\scriptfont1=\mmms
\scriptscriptfont1=\mmmss
\textfont2=\mmm
\scriptfont2=\mmms
\scriptscriptfont2=\mmmss

\fi

\ifx\XeTeX\XeTeXcharclass\else
\font\mmm="[latinmodern-math.otf]/OT:script=math;language=DFLT;"
\font\mmms="[latinmodern-math.otf]/OT:script=math;language=DFLT;" at 7pt
\font\mmmss="[latinmodern-math.otf]/OT:script=math;language=DFLT;" at 5pt

\Umathcode`T= 0 0 "1D447
\Umathcode`|= 0 0 `|
\Udelcode`|= 0 `|
\textfont0=\mmm
\scriptfont0=\mmms
\scriptscriptfont0=\mmmss
\textfont1=\mmm
\scriptfont1=\mmms
\scriptscriptfont1=\mmmss
\textfont2=\mmm
\scriptfont2=\mmms
\scriptscriptfont2=\mmmss

\fi





1 $\left|T\right|\showlists$

\ifx\Uleft\undefined\else 2 $\Uleft|T\Uright|\showlists$\fi

3 $|T|\showlists$


\bye

更新

作为本问答讨论的结果,Hans 已将 luatex 的开发版本扩展为一种新模式,用于在这种情况下调整设置。这只是 luatex 1.04 的开发分支,因此在达到稳定版本时可能不是这种形式,但已经在此示例中显示出改进。mode=0 应该与现有行为相匹配,该\mathitalicsmode=1 选项是新的。

在此处输入图片描述

\documentclass{article}
\usepackage{unicode-math}

% , $\left|T\kern\fontcharic\textfont0"1D447 \right|$
\newcommand{\test}[1]{%

{mode=0 \setmathfont{#1}#1: $|T|$,  $\left|T\right|$\par}
{\mathitalicsmode=1 mode=1 \setmathfont{#1}#1: $|T|$, $\left|T\right|$\par}
\medskip
}

\begin{document}
\test{Latin Modern Math}

\test{TeX Gyre Termes Math}

\test{TeX Gyre Pagella Math}

\test{TeX Gyre Bonum Math}

\test{Asana Math}

\test{XITS Math}

\test{STIX2Math.otf}

\test{Cambria Math}

\end{document}

相关内容