编辑

编辑

当我尝试使用上述两个软件包构建目录时,我遇到了一个奇怪的错误。这个错误只在我使用 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 无关。它似乎是mathalfaamsart\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

但我根本不确定这一切是否应该以这种方式工作 — — 无论是有效的部分还是无效的部分!

相关内容