使用 amsmath 在数学环境中修补换行符 (\\)

使用 amsmath 在数学环境中修补换行符 (\\)

我想在 amsmath 提供的 align 环境中修补换行命令 \\。修补后的版本应执行一些自定义代码并最终调用原始定义,如下例所示。

\documentclass{minimal}
\usepackage{amsmath}
\begin{document}
    \begin{align}
        \let\old\\%
        \def\\{1\old}%
        %
        a\\
        b\\
        c
\end{align}
\end{document}

其结果是: 在此处输入图片描述

因此它只适用于第一次调用(“b”缺少“1”)。为什么会这样?我怎样才能让它适用于所有换行符?

答案1

尽管 Mico 评论中的想法可能确实有效,但它们可能只针对一种环境,并且如果发生任何相关变化,它们可能会失效。我正在寻找一个更通用的解决方案。

存在两个问题:

  1. 正如 egreg 指出的那样,每一行都是一个隐式组,因此所有本地定义都会在下一行之前被删除。
  2. 每个 amsmath 环境都执行两次,首先测量其大小,然后打印。

由于 1.,\global必须使用。由于 2.,相同命令\let的每个直接后跟\def都将导致第二遍无限递归,因为 then\let指向其自身,因此 \gdef 趋向无穷大。

有了这些知识,修复就很简单了。只需在第一遍执行命令即可避免递归。因此,这是解决方案:

\documentclass{minimal}
\usepackage{amsmath}
\usepackage{etoolbox}

\begin{document}
    \begin{align}
        \ifundef{\old}{%
            \global\let\old\\%
            \gdef\\{1\old}%
        }{}
        %
        a\\
        b\\
        c
    \end{align}
\end{document}

结果

答案2

您在评论中提到,您的目标是自动将\notag指令附加到文档中未交叉引用的所有方程式中。为了实现此目标,您可以加载数学工具打包并发出命令

\mathtoolsset{showonlyrefs}

在序言中。

相关内容