我想在 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 评论中的想法可能确实有效,但它们可能只针对一种环境,并且如果发生任何相关变化,它们可能会失效。我正在寻找一个更通用的解决方案。
存在两个问题:
- 正如 egreg 指出的那样,每一行都是一个隐式组,因此所有本地定义都会在下一行之前被删除。
- 每个 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}
在序言中。