\renewcommand 只有一个参数,在 \newcommand 里面 - 为什么这样做有效?

\renewcommand 只有一个参数,在 \newcommand 里面 - 为什么这样做有效?

我在类文件(我们内部使用)中看到了以下定义:

\newcommand{\@TitleBackground}{default}
\newcommand{\titlebackground}{\renewcommand{\@TitleBackground}}

这提供了\titlebackground更改的命令\@TitleBackground,但它是如何/为什么工作的?如果第二行是

\newcommand{\titlebackground}[1]{\renewcommand{\@TitleBackground}{#1}}

但是为什么它在没有参数的情况下也可以工作,即\renewcommand只有一个参数?

较短版本与较长版本相比有哪些优点或缺点?

答案1

使用时,处理 \newcommand{\titlebackground}{\renewcommand{\@TitleBackground}}时会发生以下情况:被其扩展替换,因此 TeX 将从 重新启动\titlebackground{whatever}\titlebackground

\renewcommand{\@TitleBackground}{whatever}

并最终做到了\def\@TitleBackground

使用\newcommand{\titlebackground}[1]{\renewcommand{\@TitleBackground}{#1}},在找到 后,\titlebackground{whatever}TeX 将开始扩展\titlebackground;由于现在这是一个带有参数的宏,TeX 会吸收它并\titlebackground{whatever}用替换文本替换整个内容,从而得到

\renewcommand{\@TitleBackground}{whatever}

和以前一样。所以不同之处在于,在第二种情况下,{whatever}与第一种版本相比,它更多地被视为一个参数。

差别可以忽略不计。在我的计算机上,执行第二种情况中的作业一百万次所需的时间比第一种方式长 1/100 秒。

相关内容