为什么会发生这种情况

为什么会发生这种情况

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,因此它可以覆盖命令。但这又破坏了它,这真的让我很困惑。

有没有合理的方法将fontspecamsmath一起使用?我遗漏了什么吗?

答案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 中没有字形的插槽。flffi

那么小写希腊字母呢?它确实有效吗?再次检查编码表,它们不在 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\)}

相关内容