Unicode-math 吞下了我的反斜杠

Unicode-math 吞下了我的反斜杠

我有一个希腊键盘,喜欢用该unicode-math包直接在数学模式中输入希腊字母。然而,不幸的是,似乎至少有一个符号无法在所述包中包含,而这个符号就是\setminus;只要包含所述包,它就会消失。

我正在使用 XeLaTeX 来编译我的文档。

编辑:根据评论者的要求:

\documentclass[10pt,a4paper]{article}

\usepackage{amssymb}

\usepackage{fontspec}
\usepackage{xunicode}
\usepackage{polyglossia}
\usepackage{xecyr}
\usepackage{unicode-math}

\setdefaultlanguage{english}

\setmainfont{GentiumPlus}

\usepackage{amsmath}
\usepackage{amsfonts}
\title{Error demonstration}



\begin{document}
\begin{equation*}
A \setminus B
\end{equation*}
\end{document}

答案1

您收到的错误与希腊语完全无关。这是字体问题。默认数学字体 Latin Modern Math 没有符号\setminus。TeX 的默认行为是将警告消息默默地记录到.log文件中。

您至少可以通过添加命令来让它打印警告消息\tracinglostchars=2。您应该认真考虑始终这样做。这会告诉您哪里出了问题:

 Missing character: There is no ⧵ (U+29F5) in font LatinModernMath:mode=base;script=math;language=dflt;!

有几种解决方法。

加载具有 U+29F5 的数学字体

\tracinglostchars=2 % Print a warning if a glyph is missing
\documentclass[10pt,a4paper]{article}

\usepackage{polyglossia}
\usepackage{unicode-math}

\setdefaultlanguage{english}

\defaultfontfeatures{Scale = MatchLowercase}
\setmainfont{GentiumPlus}[Scale = 1.0]
\setmathfont{Libertinus Math}

\begin{document}
\begin{equation*}
A \setminus B
\end{equation*}
\end{document}

Gentium+Libertinus 数学样本

如果您宁愿对其他所有内容使用默认符号,则可以使用以下命令仅加载该符号:

\setmathfont{Latin Modern Math} % Or your math font of choice.
\setmathfont[range=\setminus]{Libertinus Math}

使用不同的符号

拉丁现代数学确实有\smallsetminusU+2216 的别名,因此您可以用\setminus它替换。您也可以重新声明\setminus\smallsetminus

\tracinglostchars=2 % Print a warning if a glyph is missing
\documentclass[10pt,a4paper]{article}

\usepackage{polyglossia}
\usepackage{unicode-math}

\setdefaultlanguage{english}

\AtBeginDocument{\renewcommand\setminus{\smallsetminus}}

\begin{document}
\begin{equation*}
A \setminus B
\end{equation*}
\end{document}

拉丁现代数学样本

您需要修补unicode-math符号定义\AtBeginDocument。它故意将它们延迟到完成加载包之后。您的 MWE 就是一个很好的例子:如果它不这样做,\amssymb之后加载的每个文档unicode-math都会损坏。

后记

虽然这与您的问题完全无关,但您将一些旧软件包复制粘贴到模板中,这些软件包是多余的,甚至是有害的。以下是我清理的内容:

  • 文档指出xecyr,自 2010 年起“xecyr 不再需要”。
  • xunicode包也已过时。
  • unicode-math包会为您加载fontspecamsmath如果您需要更改加载顺序或选项,则只需手动加载其中一个即可。
  • amssymb和等传统数学包amsfonts被取代unicode-math

如果清除这些包会产生任何错误,我想知道您正在做什么而需要它们。

为什么会发生这种情况?

与另一个答案相反,这不是一个错误在 中unicode-math,但使用 Latin Modern Math 字体。它正确地遵循了参考实现。(感谢 @egreg 提供讨论链接!)

然而,2011 年没有添加重新映射选项的唯一原因\setminus是设计师认为 GUST 很快就会修复他们的字体。

答案2

我尝试将您的 LaTeX 代码与 Unicode 数学进行比较。它\show\setminus说:

\setminus=\mathchar"226E.
or in math environment:
\setminus=the character ⧵.

它看起来不像 Unicode 数学,所以这可能是 LaTeX 的一个错误。我在我的 OpTeX 中进行了比较,它也支持 Unicode 数学:

\fontfam[lmfonts]

test $A \setminus B$

\bye

作品\setminus。并\show\setminus说:

\setminus=\Umathchar"2"01"002216.

这似乎是真正的 Unicode 数学。恕我直言,您的问题显示了 LaTeX 的 Unicode 数学错误。请注意,我从您的示例中注释掉了许多 LaTeX 包:、、、和amsymbb主字体。因此只使用了 Latin Modern Math 字体。LaTeX 错误(非 Unicode )仍然存在。xunicodexeyrmasmathamsfontsGentiumPlus\setminus

编辑 问题是unicode-mathLaTeX 软件包将\setminusU+29F5 反向固相线运算符 Unicode 字符声明为 U+29F5,但 Latin Modern Unicode Math 包含字符 U+2216 设置减号 Unicode 字符。Latin Modern Math 将字符设置在正确的位置,但 LaTeX 包含错误,因为它期望字符位于非数学位置。

相关内容