为什么带有可选参数的 \renewcommand 无法编译?

为什么带有可选参数的 \renewcommand 无法编译?

这段代码有什么问题:

\documentclass{article}
\begin{document}
\let\first\section
\renewcommand\section[1]{\first{#1}}
\let\second\section
\renewcommand\section[2][]{\second{#1}} % works till this line
\let\third\section
\renewcommand\section[2][]{\third[#1]{#2}}
\section[foo]{Hello}
\end{document}

它无法编译。

答案1

你应该绝不用于\let带有可选参数的命令。

让我们看看在这种情况下会发生什么,考虑到

\renewcommand\section[2][]{\second{#1}}

实际上定义命令:一个是\section不带参数的,另一个是\\section(名称中带有反斜杠)。

(重新定义的) 的工作\section是检查是否有后续内容[,并使用适当的两个参数进行调用,如果没有后续内容\\section,则第一个参数是默认值。[\section

现在您要做的\let\third\second就是\renewcommand\section[2][]{\third[#1]{#2}基本上\\section根据其自身重新定义,从而导致无限循环。

如果您使用\NewCommandCopy而不是\let(或者如果您有旧版 LaTeX\LetLtxMacro则使用letltxmacro),则不会出现无限循环。

相关内容