mathtools 和 unicode-math 之间的冲突

mathtools 和 unicode-math 之间的冲突

最近我开始研究 LuaTeX,不得不说,随着我发现的每一个功能,我越来越喜欢它。所以我决定将我的 pdfTeX 前言转移到 LuaTex,检查哪些包仍然有效,哪些包需要替换。

我使用mathtools带有 pdfTeX 的软件包,因为它具有centercolon\smashoperator功能。不幸的是,它似乎与unicode-mathLuaTeX 下的软件包发生冲突。归结为:

\documentclass{minimal}
\usepackage{mathtools}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math}
\mathtoolsset{centercolon}
\begin{document}
\[:=\coloneq\coloneqq\eqcolon\eqqcolon:=\]
\end{document}

结果是

! Invalid math code.
<to be read again> 
                   \let 
l.5 \mathtoolsset{centercolon}

使用 MiKTeX 2.9 下的 LuaTex beta-0.70.1。它似乎unicode-math知道这个mathtools包,因为它在日志文件中警告说一些命令已被重新定义。


编辑:如上所述,我没有在处理真正的文档,只是在进行序言转换工作。因此,正如 egreg 指出的那样,随机选择拉丁现代数学是一个糟糕的选择。部分答案是新的 OpenMath OpenType 字体使centercolon该包的功能mathtools过时了。我不知道这一点。在少数可用的 OpenMath 兼容字体中,Neo Euler 似乎是唯一:=不对称的字体。我暂时无法检查 Minion Math。考虑到 egregs 的答案并coloneq在尝试使用mathtoolsNeo Euler 调整时避免使用:=,但会出现与上述相同的错误:

\documentclass{minimal}
\usepackage{mathtools}
\usepackage{unicode-math}
\setmathfont[version=Asana]{Asana-Math.otf}% Asana Math
\setmathfont[version=Cambria]{Cambria Math}
\setmathfont[version=LatinModern]{Latin Modern Math}
%\setmathfont[version=Minion]{Minion Math}
\setmathfont[version=XITS]{xits-math.otf}% XITS Math
\setmathfont[version=NeoEuler]{Neo Euler}
\begin{document}
\mathversion{Asana} Asana \(:=:=\) 
\mathversion{Cambria} Cambria \(:=:=\) 
\mathversion{LatinModern} LatinModern \(:=:=\) 
\mathversion{XITS} XITS \(:=:=\)
\mathtoolsset{centercolon}
\mathversion{NeoEuler} Neo Euler \(:=:=\)
\end{document}

答案1

主要问题是\coloneq拉丁现代数学中缺少该字符:

Missing character: There is no ≔ (U+2254) in font name:LatinModernMath:mode=base;script=math;language=DFLT;!
Missing character: There is no ≔ (U+2254) in font name:LatinModernMath:mode=base;script=math;language=DFLT;!
Missing character: There is no ≕ (U+2255) in font name:LatinModernMath:mode=base;script=math;language=DFLT;!
Missing character: There is no ≕ (U+2255) in font name:LatinModernMath:mode=base;script=math;language=DFLT;!

信息重复是由于重新unicode-math定义\coloneqq\coloneq\eqqcolon\eqcolon

但是,没有必要做任何特殊的事情,因为 Latin Modern Math 和大多数其他数学 OpenType 字体中的数学模式冒号相对于等号对称,所以:=可以按你的意愿工作。如果你真的想使用控制序列,那么

\AtBeginDocument{%
  \renewcommand{\coloneq}{:=}%
  \renewcommand{\eqcolon}{=:}%
}

就是您所需要的。

对于 NeoEuler 字体,冒号相对于 不对称,您可以通过在序言中写入以下代码=来模拟 的行为:mathtools

\newcommand{\centercolon}{\mathcode`:="8000 }
\begingroup\catcode`\~=\active \lccode`~=`:
  \lowercase{\endgroup\def~}{\mathrel{\mathop\normalcolonchar}}
\AtBeginDocument{
  \edef\normalcolonchar{\Umathcharnum\the\Umathcodenum`: }
  \edef\normalcolon{\Umathcodenum`:=\the\Umathcodenum`: }
}

然后,声明\centercolon将从那时起将冒号相对于数学轴置于中心;声明\normalcolon是相反的(因此\centercolon类似于\mathtoolsset{centercolon})。

在此处输入图片描述

相关内容