这段代码有什么问题:
\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
),则不会出现无限循环。