xelatex 中的 mathtools 和 unicode-math 不兼容?

xelatex 中的 mathtools 和 unicode-math 不兼容?

我发现将 mathtools 与 unicode-math 结合使用时会出现意外行为,如果使用“range”命令就会出现这种情况。之前已经注意到一些不兼容性,所以也许这是相关的。但是,它只在 Texlive2016 中出现;以前的版本按预期工作。在下面的例子中,我希望从与主要数学字体不同的集合中绘制书法字体,并且缺少一些书法符号和常规斜体粗体数学。

\documentclass{article}
\usepackage{mathtools} 
\usepackage{fontspec}
\usepackage{unicode-math}
\unimathsetup{math-style=ISO,bold-style=ISO,sans-style=italic}
\setmainfont{xits-regular.otf}
\setmathfont{xits-math.otf}
\setmathfont[range={\mathcal,\mathbfcal}]{latinmodern-math.otf}
%\setmathfont[range={}]{xits-math.otf} % Try with and without this line
%
\begin{document}
Test
$a+b = \mathcal{C H G}C \mathscr{D}$
$$-\frac{a}{b} \mathcal{O} . $$
\begin{equation}
    \mathrm{d} = \mathcal G(\varphi,x,y,z,t) , 
\end{equation}
The symbol $\mathcal{G}$ is missing.

The following equation is wrong if I include the line  ``setmathfont[range=\{\}] \{xits-math.otf\}''
\begin{equation}
    \mathup{d} = \symbf{u}(\varphi,x,y,z,t) , 
\end{equation}
The glyph $\symbf{u}$ is missing.
\end{document}

如果在 unicode-math 之后调用 mmathtools,则不会出现问题,但 unicode-math 开发人员不建议这种顺序。

我的具体问题是,这是一个错误还是我做错了什么?

答案1

更新:

github 问题与此相关并由@UlrikeFischer 打开的 unicode-math 前段时间已经关闭v0.8e,目前 unicode-math 位于v0.8m。因此,请不要使用下面的 hack。



更新。这是解决该问题的尝试。我们在加载过程中\newfam暂时使innocent (我检查过它只被使用过一次;因为它在修补期间使用,必须在之前加载)。然后我们自己修补mathtools宏。为此,我使用数学系列编号255而不是创建一个新的。文档使用256个数学系列的可能性不大。可以使用使其更内在,但我不知道如何在expl3 lingua中减去1。警告:几乎没有测试过。\newfamunicode-mathmathtoolsmathtoolsunicode-math\e@mathgroup@top - 1

这仅解决了两个问题中的一个。这里不处理空范围的影响问题。

\documentclass{article}
\usepackage{fontspec}

% *must* be before unicode-math
\usepackage{mathtools} 

\makeatletter
\let\ORInewfam\newfam
\def\newfam #1{\typeout{message from \string\newfam: killing myself}}
\usepackage{unicode-math}
\let\newfam\ORInewfam
\makeatother


\unimathsetup{math-style=ISO,bold-style=ISO,sans-style=italic}
\setmainfont{xits-regular.otf}
\setmathfont{xits-math.otf}
\setmathfont[range={\mathcal,\mathbfcal}]{latinmodern-math.otf}
%\setmathfont[range={}]{xits-math.otf} % Try with and without this line

\ExplSyntaxOn
\makeatletter
\def\MT_cramped_internal:Nn #1#2
     {
      \hbox_set:Nn \l_tmpa_box
       {
        \color@setgroup
        \c_math_toggle_token
        \m@th
        #1
        \dim_zero:N \nulldelimiterspace
        \XeTeXradical \c_two_hundred_fifty_five \c_zero { #2 }
        \c_math_toggle_token
        \color@endgroup
       }
      \box_set_ht:Nn \l_tmpa_box
       {
        \box_ht:N \l_tmpa_box
        - \__um_radical_vgap:N #1
       }
      \box_use_drop:N \l_tmpa_box
     }
\makeatother
\ExplSyntaxOff

\begin{document}

Test
$a+b = \mathcal{C H G}C \mathscr{D}$
$$-\frac{a}{b} \mathcal{O} . $$
\begin{equation}
    \mathrm{d} = \mathcal{G}(\varphi,x,y,z,t) , 
\end{equation}
% The symbol $\mathcal{G}$ is NOT missing.

% The following equation is wrong if I include the line  ``setmathfont[range=\{\}] \{xits-math.otf\}''
\begin{equation}
    \mathup{d} = \symbf{u}(\varphi,x,y,z,t) , 
\end{equation}
% The glyph $\symbf{u}$ is NOT missing.

Example from mathtools manual

\[
\cramped{x^2} \leftrightarrow x^2 \quad
\cramped[\scriptstyle]{x^2} \leftrightarrow {\scriptstyle x^2}
\]

\end{document}

代码于 2018/12/28 更新,根据 @egreg 注释“\box_use_clear:N自 2018-12-31 起已弃用;正确的使用函数是\box_use_drop:N

在此处输入图片描述

请不要对此点赞,除非它得到有能力的人的确认。确实,从 unicode-math-xetex.sty 中删除一些代码可以使它工作,但 OP 的代码可能不是对 unicode-math 的正确使用:因为我不熟悉它,所以我无法判断。

请开始大力支持这个答案,因为我已经足够有能力确定问题的根源(见底部)

好的,你可以停止投票了开始将您的投票转给 Ulrike 的答案因为她已经开了很长时间的票https://github.com/wspr/unicode-math/issues/345提到由于裸露使用数学字母而引起的扰动\newfam,从而预期找到unicode-math中的哪条代码行最终导致了字形消失,就像OP的问题中的那样。

第一部分

我已在文件中找到了问题的根源unicode-math-xetex.sty

重现步骤:

kpsewhich unicode-math-xetex.sty
copy the file to your working repertory
comment out lines #L2040 to #L2091 inclusive

然后,您的文档就可以使用 mathtools 和您的  \setmathfont[range={}]{xits-math.otf}

注意:unicode-math 的代码看起来很奇怪,因为它\AtEndOfPackageFile * { mathtools }嵌套在另一个代码中……但我检查了括号的平衡。因此,第 2038 行和第 2039 行必须保持非注释状态。

注释掉的代码中最重要的部分可能是它确实\newfam \g__um_empty_fam创建了一个新的\mathgroup。这可能会导致编号问题?

由于不熟悉 unicode-math,我无法发表更多评论。但它看起来更像是一个问题unicode-mathmathtools据我所知)。

额外信息:我已经检查过\mv@normal在两种情况下具有完全相同的含义,确认在侧面的数学家族编号可能存在​​偏移unicode-math

显示它确实有效的图像:(由于的影响,数学书法来自 XITS 而不是拉丁现代range={}

在此处输入图片描述

第二部分

这是一个最小的例子来说明错误所在unicode-math(有关更多背景信息,请参阅此答案下方的各种评论)。

\documentclass{article}

\usepackage{unicode-math}

\newfam\MyFam  % comment this to get correct glyph rather than invisible one

\setmainfont{lmroman10-regular.otf}
\setmathfont[range={cal}]{latinmodern-math.otf}

\begin{document}

$\mathrm{d} = \mathcal{G}$

\showoutput
\end{document}

%%% Local Variables:
%%% TeX-engine: xetex
%%% End:

使用\newfambefore \setmainfont/\setmathfont(后者使用 而cal不是 deprecated range={\mathcal})足以产生问题:在此处输入图片描述.没有\newfam我们得到在此处输入图片描述

如果因为拉丁现代是默认使用而产生疑问

\setmathfont[range={cal}]{texgyretermes-math.otf}

我已经在 开过票https://github.com/wspr/unicode-math/issues/368

重点是单身的(直接)使用\newfamunicode-math 代码位于以下行中

    \newfam \g__um_empty_fam

这是在它的补丁开始时遇到的mathtools第一部分我建议注释掉。如果在序言中过早执行此补丁,则在使用\math..字母宏时会出现问题:使用了错误的字体。这可能与修补方式有关,但unicode-math\use@mathgroup我没有进一步研究,因为数学字体的 LaTeX 代码非常复杂,每当我几个月不看它时,我就会完全忘记它,而且不可挽回,我需要付出相当大的努力才能重新沉浸其中,更不用说我还需要阅读unicode-math代码。

答案2

我不太明白你为什么使用空范围,但我认为你的语法是错误的。你仍然在很多地方使用应该使用的\mathXX命令\symXX,并且在范围命令中你应该使用块的名称而不是命令。这在 texlive 2016 上对我来说很好用:

\documentclass{article}
\usepackage{mathtools}
\usepackage{fontspec}
\usepackage{unicode-math}
\unimathsetup{math-style=ISO,bold-style=ISO,sans-style=italic}
\setmainfont{xits-regular.otf}
\setmathfont{xits-math.otf}
\setmathfont[range={cal,bfcal}]{latinmodern-math.otf}
\setmathfont[range={}]{xits-math.otf} % Try with and without this line
%
\begin{document}
Test
$a+b = \symcal{C H G}C \symscr{D}$
$$-\frac{a}{b} \symcal{O} . $$
\begin{equation}
    \symrm{d} = \symcal G(\varphi,x,y,z,t) ,
\end{equation}
The symbol $\symcal{G}$ is missing.

The following equation is wrong if I include the line  ``setmathfont[range=\{\}] \{xits-math.otf\}''
\begin{equation}
    \symup{d} = \symbf{u}(\varphi,x,y,z,t) ,
\end{equation}
The glyph $\symbf{u}$ is missing.
\end{document}

在此处输入图片描述

相关内容