![newcommand、renewcommand 和 providecommand 的作用是什么?它们有何不同?](https://linux22.com/image/243067/newcommand%E3%80%81renewcommand%20%E5%92%8C%20providecommand%20%E7%9A%84%E4%BD%9C%E7%94%A8%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%E5%AE%83%E4%BB%AC%E6%9C%89%E4%BD%95%E4%B8%8D%E5%90%8C%EF%BC%9F.png)
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
这样做的目的是防止偶然不太了解的用户覆盖命令。
\newcommand
定义一个新命令,如果该命令已经存在,则给出错误。它确实不是覆盖现有命令。\renewcommand
覆盖现有命令,如果命令不符合要求,则给出错误不是已经存在。\providecommand
如果该名称的命令不存在,则定义一个新命令,如果存在,则不执行任何操作。
练习:使用\providecommand
和\renewcommand
定义一个可能存在或不存在的命令。