fontspec
与 一起使用amsmath
会破坏 中大写希腊字母的使用\DeclareMathOperator
。相反,希腊字母会被省略。
这是一个最小的工作示例:
%! TEX program = xelatex
\documentclass{article}
\usepackage{fontspec}
\usepackage{amsmath}
\DeclareMathOperator{\exterior}{\Lambda}
\begin{document}
\begin{align*}
\exterior^k V \\
\Lambda^k V
\end{align*}
\end{document}
这是输出:
删除后\usepackage{fontspec}
Lambda 就会出现。
有趣的是,如果还添加unicode-math
一些内容,即
\usepackage{fontspec}
\usepackage{unicode-math}
\usepackage{amsmath}
它有效。但unicode-math
建议加载它后 amsmath
,因此它可以覆盖命令。但这又破坏了它,这真的让我很困惑。
有没有合理的方法将fontspec
和amsmath
一起使用?我遗漏了什么吗?
答案1
\DeclareMathOperator 在内部使用运算符字体,而这由 fontspec 更改。为什么新字体有 Lambda,它不在同一个字形槽中。
您可以使用选项加载 fontspec [no-math]
,或者使用真实的字形:
\documentclass{article}
\usepackage{amsmath}
\usepackage{fontspec}
\DeclareMathOperator{\exterior}{Λ}
\begin{document}
\begin{align*}
\exterior^k V\\
\Lambda^k V
\end{align*}
\end{document}
答案2
的定义\Lambda
是\mathchar"7003
,当\operator@font
生效时,将使用该字体中插槽 3 中的字形,但该字形并不存在。
你可以用一个技巧来避免它:
\documentclass{article}
\usepackage{fontspec}
\usepackage{amsmath}
\newcommand{\opgreek}[1]{\begingroup\mathgroup-1 #1\endgroup}
\DeclareMathOperator{\exterior}{\opgreek{\Lambda}}
\begin{document}
\begin{align*}
\exterior^k V \\
\Lambda^k V
\end{align*}
\end{document}
否则
\newcommand{\exterior}{\mathop{\kern0pt\Lambda}}
答案3
为什么会发生这种情况
有两个很好的答案,但既然你要求我给你提供更多信息,为什么发生这种情况时,我愿意帮忙。我特别要感谢 Ulrike Fischer 纠正我的错误并教我一些关于 LaTeX 的知识。
为了了解发生了什么,让我们稍微扩展一下你的例子:
\documentclass[varwidth]{standalone}
\usepackage{fontspec}
\usepackage{amsmath}
\DeclareMathOperator{\exterior}{\lambda\Lambda\phi\Phi\omega\Omega}
\begin{document}
\(
\exterior^k V
\)
\end{document}
似乎所有希腊大写字母都无法显示,但小写字母可以正常显示。这是为什么?
正如 Egreg 所说,“ 的定义\Lambda
是\mathchar"7003
,当\operator@font
生效时,将使用该字体中插槽 3 中的字形,但该字形并不存在。” 它是如何工作的?
如果你检查LaTeX 字体编码指南,您会看到 OT1 编码的字符槽 3 是 Λ,并且前 11 个槽是直立的大写希腊字母,与拉丁字母看起来不一样。(其余的在经典 LaTeX 中不存在;\Alpha
内核中没有宏,您只需使用字形 A。在 7 位编码时代,DEK 认为这不是对宝贵的 128 个槽之一的良好利用。)
理论上,每个 LaTeX 文本编码都必须支持与 ASCII 相同的位置中的一组最小字符。实际上,有些(例如 LGR)并不支持,但所有字体包都会避免破坏诸如\sin
、\lim
和 之类的命令\log
。因此,即使您将文本字体编码更改为 T1 之类的编码,\DeclareMathOperator
仍会尝试从 OT1 数学字母表中加载\Lambda
。不过,正如您所见,一些字体包将要打破你的例子,因为这是命令的非传统用法。
它有什么fontspec
作用?它将文本字体更改为 Unicode 编码字体。如果您检查 Unicode 代码表,OT1 中的希腊字母全部映射到 ASCII 和 Unicode 中的非图形控制字符。这也是为什么您有时会看到旧的 PDF 将“efficient flow”拼写错误为“e cient ow”。经典的 OT1 编码也将连字(例如、ff
和)fi
映射到 ASCII 中没有字形的插槽。fl
ffi
那么小写希腊字母呢?它确实有效吗?再次检查编码表,它们不在 OT1 中,而是另一种字体编码 OML。更改操作员字体不会弄乱它。
那么,如何解决这个问题?
完全切换到 Unicode
如果可以的话,这始终是我的首选。该unicode-math
包无法修复\Lambda
此上下文,但它确实提供了数学模式命令\upLambda
和\mupLambda
,以及字母表\symup\Lambda
。即使您的文本字体不包含希腊字母,这也具有工作的优点。
\documentclass[varwidth]{standalone}
\usepackage{amsmath}
\usepackage{unicode-math}
\DeclareMathOperator{\exterior}{\mupLambda}
\begin{document}
\(
\operatorname{Cl} \exterior^k V
\)
\end{document}
Ulrike Fischer 的答案通过使用文字字形 Λ 来实现这一点。 \DeclareMathOperator{\exterior}{^^^^039b}
是等效的,并且\char"039B
或\symbol{"039B}
也可以工作。这些从 Unicode 编码的运算符字体加载字形 Λ (U+039B)。默认情况下,这是具有它的 Latin Modern Roman。
使用更简单的命令
如果您想要的是带有运算符间距的直立 Λ 符号,则无需更改字体。而且fontspec
不会破坏它。Egreg 的一个想法的简化:
\documentclass[varwidth]{standalone}
\usepackage{fontspec}
\usepackage{amsmath}
\DeclareRobustCommand\exterior{\mathop{\Lambda}}
\begin{document}
\(
\operatorname{Cl} \exterior^k V
\)
\end{document}
使用不同的 Λ
任何来自不同于运算符字体的数学字母表的内容都可以使用,包括\Uplambda
来自upgreek
包的、来自纯 LaTeX 的倾斜的\mathnormal\Lambda
、从的数学模式中加载的任何 LGR 字体mathastext
、或者中的希腊字母isomath
。
更改字体
这就是 Egreg 的答案所做的,通过在运算符环境中启动一个新的数学组。 您也可以使用类似的东西\mbox{\(\Lambda\)}
。