答案1
\newcommand
是用于在 LaTeX 中定义用户级命令的好命令:它允许您制作长(\newcommand
)或短(\newcommand*
) 命令,并允许您使用带有可选参数的命令并为其提供默认值。
除此之外,您还可以使用\newcommand*
,并且命令将是短宏(如果\par
参数中有一个,它们将会出错)。
如果定义的命令\newcommand
采用可选参数,则它们将是强大的,否则将是可扩展的。
\DeclareRobustCommand
是伴侣\newcommand
:它使每一个用它定义的命令很强大,包括那些不带可选参数的命令。 \newcommand
使带有可选参数的命令变得强大是一个稍微更新的功能(1995年底),并且\DeclareRobustCommand
早于此(1994 年中期添加)。
\DeclareRobustCommand
当您的命令不可扩展且应该用于移动参数(例如章节标题或说明)时,您将使用它。如果您的命令应该是可扩展的,您不能使用\DeclareRobustCommand
。
自 2015 年起,LaTeX 提供\MakeRobust
。这样做的效果与当时\DeclareRobustCommand\foo ...
完全相同。\newcommand\foo ...
\MakeRobust\foo
\NewDocumentCommand
是(连同其可扩展的对应物\NewExpandableDocumentCommand
) 类型的后继者:它们允许您使用强制(和)和可选参数(和)\newcommand
的不同组合来定义命令,命令的星号版本(),长(m
r
d
o
s
+
) 和短参数。它还允许您在将参数传递给命令之前对其进行预处理(使用>
)。
不同于\newcommand
,用 定义的命令\NewDocumentCommand
是总是健壮的,并且定义为\NewExpandableDocumentCommand
为总是可扩展(只要其中的代码也是可扩展的)。
在过去,包作者只需要\newcommand
(和\DeclareRobustCommand
,大致相同)定义用户界面,如果出于某种原因这还不够,那么程序员必须手动进行解析。 \NewDocumentCommand
另一方面,有一个更复杂的解析机制,远的超出了\newcommand
提供的范围,因此建议使用这种方式来创建用户级命令(请参阅这篇博文关于此事)。
如今,建议\newcommand
仅在需要它提供的简单界面,并且您有一个性能至关重要的应用程序(功能是\NewDocumentCommand
有代价的),或者当您使用命令作为简单的文本替换时才使用它(例子)。
从技术角度来看,\newcommand
也与 有很大不同\NewDocumentCommand
。假设我们正在定义一个命令\foo
。\newcommand
只是定义\foo
为查找可选参数,然后\\foo
实际抓取它们(或者\foo
如果没有可选参数),就是这样。当用 定义时\NewDocumentCommand
,\foo
实际上只是一个内部 LaTeX 宏的包装器,它将解析参数,然后将它们传递给存储在 中的命令的实际定义\foo code
。
PS:还请注意,虽然\newcommand
和\NewDocumentCommand
会检查所定义的命令是否已经存在(试图保护您免遭伤害),但\DeclareRobustCommand
不存在,并且会覆盖现有命令。如果您想重新定义某些内容,还有和。还有两者的版本,它们仅在尚无定义时才创建定义(命令的“后备版本”),还有始终创建定义(不推荐),但没有匹配的。\renewcommand
\RenewDocumentCommand
provide
\DeclareDocumentCommand
\declarecommand