\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
之间的间距太小。T
P
V
|
)
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}