\newcommand、\NewDocumentCommand 和 \DeclareRobustCommand 之间的区别

\newcommand、\NewDocumentCommand 和 \DeclareRobustCommand 之间的区别

和之间\newcommand的主要区别是什么?您能给出详尽的例子来回答我吗?\NewDocumentCommand\DeclareRobustCommand

我已经读过了,但我想知道更多。

答案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的不同组合来定义命令,命令的星号版本(),长(mrdos+) 和短参数。它还允许您在将参数传递给命令之前对其进行预处理(使用>)。

不同于\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\RenewDocumentCommandprovide\DeclareDocumentCommand\declarecommand

相关内容