我有一个希腊键盘,喜欢用该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}
如果您宁愿对其他所有内容使用默认符号,则可以使用以下命令仅加载该符号:
\setmathfont{Latin Modern Math} % Or your math font of choice.
\setmathfont[range=\setminus]{Libertinus Math}
使用不同的符号
拉丁现代数学确实有\smallsetminus
U+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
包会为您加载fontspec
。amsmath
如果您需要更改加载顺序或选项,则只需手动加载其中一个即可。 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 )仍然存在。xunicode
xeyr
masmath
amsfonts
GentiumPlus
\setminus
编辑
问题是unicode-math
LaTeX 软件包将\setminus
U+29F5 反向固相线运算符 Unicode 字符声明为 U+29F5,但 Latin Modern Unicode Math 包含字符 U+2216 设置减号 Unicode 字符。Latin Modern Math 将字符设置在正确的位置,但 LaTeX 包含错误,因为它期望字符位于非数学位置。