以下代码产生错误的输出:
\documentclass{article}
\usepackage{amsmath, esint, kpfonts}
\begin{document}
\[\int_a^b f(x) dx \]
\end{document}
如果我改变包的加载顺序,一切都会正常:
\usepackage{kpfonts,esint}
为什么会发生这种情况?这似乎是一个简单的案例。
答案1
它是一个简单的案例(或者看起来是,见下文)。该esint
包会覆盖积分符号;但也会kpfonts
更改默认数学字体;因此您要覆盖kpfonts
,而不是默认数学字体和顺序必须是
\usepackage{kpfonts}
\usepackage{esint}
可悲的事实是,这两个包是不兼容的,因为它们都定义了一个具有相同名称的数学符号字体(这解释了使用错误的加载顺序时得到的奇怪符号):它们都使用相同的标识符largesymbolsA
。
事情是这样的。
如果您先加载
esint
,然后加载kpfonts
,则声明的数学符号字体将覆盖同名kpfonts
声明的数学符号字体。此字体与 的符号不同;由于不重新定义(负责打印积分符号的命令),LaTeX 将选择声明的字体中的相应插槽,而该插槽恰好包含那个奇怪的符号。esint
esint
kpfonts
\intop
kpfonts
如果您先加载
kpfonts
然后esint
,largesymbolsA
则定义的字体kpfonts
将被覆盖,因此依赖它的命令将打印随机符号。
在这两种情况下,你都会失去一些东西。
这是一个解决方法,但实际上esint
应该更改其符号字体的标识符。也许还kpfonts
应该避免使用太通用的名称。
\documentclass{article}
\usepackage{amsmath}
\usepackage{kpfonts}
\makeatletter
\let\ORG@DeclareSymbolFont\DeclareSymbolFont
\def\DeclareSymbolFont#1#2#3#4#5{%
\ORG@DeclareSymbolFont{largesymbolsesint}{#2}{#3}{#4}{#5}
\def\re@DeclareMathSymbol##1##2##3##4{%
\let##1=\undefined
\DeclareMathSymbol{##1}{##2}{largesymbolsesint}{##4}}%
}
\makeatother
\usepackage{esint}
\makeatletter
\let\DeclareSymbolFont\ORG@DeclareSymbolFont
\makeatother
\begin{document}
\[\int_a^b f(x) dx \]
\end{document}