同时使用 unicode-math 和 newtx 构建失败

同时使用 unicode-math 和 newtx 构建失败

当我尝试构建以下最小文档时,我看到构建失败:

\documentclass{article}

\usepackage{newtxmath}
\usepackage{unicode-math}

\begin{document}
abc
\end{document}

运行xelatex -halt-on-error min.tex出现如下错误:

! LaTeX error: "kernel/command-already-defined"
!
! Control sequence \not= already defined.

我附上了完整的日志这里而不是问题中的,因为它有点长。有趣的是,颠倒两个包的顺序会显示不同的错误消息:

! LaTeX Error: Command `\arrowvert' already defined.

我正在使用全新安装的 MacTex 2018。如能得到任何帮助我将不胜感激!

答案1

您不应同时加载unicode-math和传统 (NFSS) 数学字体。如果您想要 的外观newtxmath\setmathfont[Scale=MatchLowercase]{TeX Gyre Termes Math}。还有一个 Times 变体,经过调整后看起来更像newtx,但您可能想要\setmainfont{TeX Gyre Termes}

TeX Gyre Termes 应该包含您需要的任何符号newtxmath。如果缺少某个符号,您可以使用类似 的字体(如 XITS)导入它\setmathfont[range="220E, Scale=MatchUppercase]{XITS Math}

要在数学模式下将 OpenType 或 TrueType 文本字体与旧式数学符号一起使用,请使用mathspec。要在数学模式下将旧式文本字体与 Unicode 数学字体一起使用,请使用mathastext

答案2

没有必要同时加载newtxmathunicode-math。前者在旧版 TeX 引擎 (pdftex) 中实现了 Times 兼容数学字体,后者使用 Unicode 数学字体。因此这两个包在很大程度上是不兼容的。

如果你想要基于 Times 的数学字体,你可以这样做

\usepackage{unicode-math}

\setmathfont{STIX Two Math}

或者

\usepackage{unicode-math}

\setmathfont{TeX Gyre Termes Math}

选择字体的精确语法可能因 TeX 发行版和操作系统设置而异。可能

\setmathfont{STIX2Math.otf}

或者

\setmathfont{texgyretermes-math.otf}

是需要的。

答案3

我假设您希望加载该newtxmath包,因为它提供了其他数学字体包未提供的一些数学模式字形。

newtx这对软件包的用户指南的第 10 页(texdoc newtx在命令提示符下输入以调出此文档)解释了如何使用LuaLaTeX 和 XeLaTeX 下的newtxtextand/ornewtxmath软件包。用户指南摘录如下:

据我所知,newtxmath它适用于 [XeLaTeX 和 LuaLaTeX],但需要非常具体的加载顺序和选项选择。简而言之,... 在加载和使用之前,必须先加载所有数学选项fontspec

例如,下面的代码应该对你有用。请注意,该fontspec包,但不是使用 时应加载该unicode-math包(顺便说一下,它会自动加载) 。此外,请注意,应使用 选项加载该包。fontspecnewtxmathfontspecno-math

...
\usepackage[T1]{fontenc}
\usepackage{newtxmath}
\usepackage[no-math]{fontspec}
% load a suitable text font
...

或者——egreg 的回答中已经指出了一个想法——继续加载包,unicode-math但放弃newtxmath包。相反,考虑使用 Times Roman 克隆数学字体,例如Stix Two Math(可以Stix Two Text从 中下载,与 一起下载)http://stixfonts.org/


这是一个完整的 MWE(最小工作示例):

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{newtxmath}
\usepackage[no-math]{fontspec}
\usepackage{newtxtext}

\begin{document}
$abc$def\emph{ghi}
\end{document}

答案4

也许你需要覆盖newtxmath 与 unicode-math 结合使用,例如,因为您正在使用无条件加载 newtxmath 的日志类文件。此咒语将完成此工作:

\usepackage{expl3}  % if necessary
\ExplSyntaxOn
\makeatletter
\@ifpackageloaded{unicode-math}{}{%else
  % both newtxmath and unicodemath try to define these, producing
  % multiple definition errors
  \cs_undefine:c { not= }
  \cs_undefine:c { not> }
  \cs_undefine:c { not< }

  % tweak as you see fit
  \usepackage{unicode-math}
  \setmathfont[Scale=MatchLowercase]{TeX Gyre Termes Math}
}
\makeatother
\ExplSyntaxOff

我在这里严格使用 expl3 \cs_undefine:c,它比 2e 等效项(我认为类似于\expandafter\let\csname ... \endcsname\@undefined— 未经测试)更容易输入。\@ifpackageloaded用于面向未来:如果类文件的未来版本加载 unicode-math 本身,则该块将自行关闭。

相关内容