newcommand、renewcommand 和 providecommand 的作用是什么?它们有何不同?

newcommand、renewcommand 和 providecommand 的作用是什么?它们有何不同?

newcommand、renewcommand 和 providecommand 的作用是什么?它们有何不同?

我认为\newcommand会覆盖任何先前存在的命令,而\providecommand仅当命令不存在时才创建该命令。是否\renewcommand只对已经存在的命令有效?

答案1

不,这不正确。

\newcommand定义一个新命令,如果已经定义则会出错。

\renewcommand重新定义预定义命令,如果尚未定义则会出错。

\providecommand如果尚未定义,则定义一个新命令。

如果你想定义一个命令,无论是新的还是预定义的,你可以使用\def

\providecommand\foo{}
\renewcommand\foo{...}

答案2

它们的共同点在于定义一个新的命令,但是前提条件和行为略有不同:

  • \renewcommand仅当命令已经定义时才有效:这是一个重新定义

  • \newcommand如果命令已经定义,则不起作用:所以这是一个全新的定义

  • \providecommand工作原理类似\newcommand,但如果命令已定义,则忽略(重新)定义

\renewcommand\newcommand如果条件不满足,则会引发错误,以确保干净的编程,这样您就不会意外覆盖现有命令或尝试重新定义不存在的命令。

\providecommand如果在多个文档中使用相同的代码,则可能会有所帮助。如果您要使用它,您应该知道它可能没有任何效果。但使用它您可以避免编译时错误。

所有命令均有星号版本。若要查看差异,请查看:

如果您确实不想进行错误检查,您可以使用\def,请参阅:

答案3

这样做的目的是防止偶然不太了解的用户覆盖命令。

  1. \newcommand定义一个新命令,如果该命令已经存在,则给出错误。它确实不是覆盖现有命令。

  2. \renewcommand覆盖现有命令,如果命令不符合要求,则给出错误不是已经存在。

  3. \providecommand如果该名称的命令不存在,则定义一个新命令,如果存在,则不执行任何操作。

练习:使用\providecommand\renewcommand定义一个可能存在或不存在的命令。

相关内容