我发现将 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。警告:几乎没有测试过。\newfam
unicode-math
mathtools
mathtools
unicode-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-math
(mathtools
据我所知)。
额外信息:我已经检查过\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:
使用\newfam
before \setmainfont/\setmathfont
(后者使用 而cal
不是 deprecated range={\mathcal}
)足以产生问题:.没有\newfam
我们得到。
如果因为拉丁现代是默认使用而产生疑问
\setmathfont[range={cal}]{texgyretermes-math.otf}
我已经在 开过票https://github.com/wspr/unicode-math/issues/368。
重点是单身的(直接)使用\newfam
unicode-math 代码位于以下行中
\newfam \g__um_empty_fam
这是在它的补丁开始时遇到的mathtools
在第一部分我建议注释掉。如果在序言中过早执行此补丁,则在使用\math..
字母宏时会出现问题:使用了错误的字体。这可能与修补方式有关,但我没有进一步研究,因为数学字体的 LaTeX 代码非常复杂,每当我几个月不看它时,我就会完全忘记它,而且不可挽回,我需要付出相当大的努力才能重新沉浸其中,更不用说我还需要阅读unicode-math
\use@mathgroup
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}