当我尝试使用上述两个软件包构建目录时,我遇到了一个奇怪的错误。这个错误只在我使用 pdfLaTeX 排版两次后才会发生,并且禁止我构建目录。
编辑:根据 cfr 的评论和回答,我在这里发布了一个更好的 MWE,它表明问题实际上来自于构建 TOC 和使用某些特定选项时 amsart 和 mathalfa 之间的冲突……我真的希望有人能找到一种方法来纠正这个冲突……
\documentclass{amsart}
\usepackage[frak=boondox]{mathalfa}
\begin{document}
\tableofcontents
\scriptsize $u$
\section{$\mathfrak{m}$}
\end{document}
下面是我在控制台窗口上看到的消息的摘录。
Use of \reserved@a doesn't match its definition. \reserved@b ->\relax \ifmmode \else \non@alpherr \mathfrak \fi \use@mathgro...
编辑2:有人知道这个错误是否以及何时可以纠正?(在 Latex 中还是在 mathalfa 包中?)
答案1
恐怕这是 LaTeX 的一个“特性”。
由于amsart
自动加载了amsfonts
定义\mathfrak
;看来,\DeclareMathAlphabet
使用当前内核无法重新定义用定义的命令。问题出现在一个非常小的文档中:
\documentclass{amsart}
\usepackage[frak=boondox]{mathalfa}
\begin{document}
{\small $\mathfrak{m}$}
$\mathfrak{m}$
\end{document}
因为字体更改命令会导致\mathfrak
进行一些全局分配,从某种意义上说,这“复活”了之前\mathfrak
让系统处于不稳定状态的定义。
如果您不需要全部力量,请采用以下解决方法amsfonts
:
% pretend that amsfonts.sty has already been loaded
\expandafter\def\csname [email protected]\endcsname{3000/12/31}
% load the msb symbol font that's needed for \dh
\DeclareSymbolFont{AMSb}{U}{msb}{m}{n}
% end of the hack
\documentclass{amsart}
\usepackage[frak=boondox]{mathalfa}
\begin{document}
{\small $\mathfrak{m}$}
$\mathfrak{m}$
\end{document}
实际上,可能有更好的方法来解决这个问题,通过重新定义\mathfrak
使用\DeclareSymbolFontAlphabet
不应该恢复旧的定义,因为用定义的数学字体\DeclareMathAlphabet
使用不同的机制,如果文档中没有使用字母表,则可以避免浪费数学系列;因为你将使用 Fraktur,所以这并不重要。
诀窍是手动完成mathalfa
自动执行的操作,但使用\DeclareSymbolFont
。
\documentclass{amsart}
\makeatletter
\def\mathalfa@frakscaled{s*[1]}
\makeatother
\DeclareFontFamily{U}{BOONDOX-frak}{\skewchar \font =45}
\DeclareFontShape{U}{BOONDOX-frak}{m}{n}{
<-> \mathalfa@frakscaled BOONDOX-r-frak}{}
\DeclareFontShape{U}{BOONDOX-frak}{b}{n}{
<-> \mathalfa@frakscaled BOONDOX-b-frak}{}
\DeclareSymbolFont{boondoxfrak}{U}{BOONDOX-frak}{m}{n}
\SetSymbolFont{boondoxfrak}{bold}{U}{BOONDOX-frak}{b}{n}
\DeclareSymbolFontAlphabet{\mathfrak}{boondoxfrak}
\begin{document}
{\small $\mathfrak{m}$}
$\mathfrak{m}$
\end{document}
答案2
该错误与 TikZ 无关。它似乎是mathalfa
、amsart
、\scriptsize $something$
... 之间的不兼容性。这不是完整的诊断,但它缩小了一点范围。(至少我们可以排除 TikZ。)
我可以得到的重现错误的最小示例:
\documentclass{amsart}% substitute article for working code
\usepackage
[
frak=boondox
]{mathalfa}% remove frak option for working code
\begin{document}
\tableofcontents% remove for working code
{\scriptsize% remove \scriptsize for working code
abc $a$ }% remove $a$ for working code
\section{$\mathfrak{m}$}% use text or non-frak maths here for working code
\end{document}
编辑
\mathfrak
昨天,我确定从中复制相关行到配置mathalfa.sty
允许代码进行编译。
\documentclass{amsart}% substitute article for working code
\makeatletter
\def\mathalfa@frakscaled{s*[1.0]}
\DeclareFontFamily{U}{BOONDOX-frak}{\skewchar \font =45}
\DeclareFontShape{U}{BOONDOX-frak}{m}{n}{
<-> \mathalfa@frakscaled BOONDOX-r-frak}{}
\DeclareFontShape{U}{BOONDOX-frak}{b}{n}{
<-> \mathalfa@frakscaled BOONDOX-b-frak}{}
\DeclareMathAlphabet{\mathfrak}{U}{BOONDOX-frak}{m}{n}
\SetMathAlphabet{\mathfrak}{bold}{U}{BOONDOX-frak}{b}{n}
\DeclareMathAlphabet{\mathbfrak} {U}{BOONDOX-frak}{b}{n}
\makeatother
\begin{document}
\tableofcontents% remove for working code
{\scriptsize% remove \scriptsize for working code
abc $a$ }% remove $a$ for working code
\section{$\mathfrak{m}$}% use text or non-frak maths here for working code
\end{document}
上面的代码运行良好。但请注意,我使用的是正是来自的命令mathalfa.sty
。也就是说,我正在使用\DeclareMathAlphabet
。因此,它不出现有必要\DeclareSymbolFontAlphabet
替代埃格勒确实。
昨天让我困惑不解的是——现在仍然让我困惑——复制这段代码不是请允许我重现该错误。所以我认为不兼容性一定出在其他地方。
编辑 编辑
上面的代码还允许mathalfa
使用其他选项加载包,例如cal=boondox
除了 的定义之外\mathbfrak
。为了使用该行,您需要先撤消现有定义:
\usepackage[cal=boondox]{mathalfa}
\makeatletter
\def\mathalfa@frakscaled{s*[1.0]}
\DeclareFontFamily{U}{BOONDOX-frak}{\skewchar \font =45}
\DeclareFontShape{U}{BOONDOX-frak}{m}{n}{
<-> \mathalfa@frakscaled BOONDOX-r-frak}{}
\DeclareFontShape{U}{BOONDOX-frak}{b}{n}{
<-> \mathalfa@frakscaled BOONDOX-b-frak}{}
\DeclareMathAlphabet{\mathfrak}{U}{BOONDOX-frak}{m}{n}
\SetMathAlphabet{\mathfrak}{bold}{U}{BOONDOX-frak}{b}{n}
\let\mathbfrak\relax
\DeclareMathAlphabet{\mathbfrak} {U}{BOONDOX-frak}{b}{n}
\makeatother
但我根本不确定这一切是否应该以这种方式工作 — — 无论是有效的部分还是无效的部分!