也许我的问题太宽泛了,但我真的很想知道:在xparse
命令定义(例如\NewDocumentCommand
)和 LaTeX“标准”定义(例如)之间最好使用什么(以及为什么\newcommand
)?
当我开始使用 LaTeX 时,我了解到 LaTeX 定义比 TeX 纯定义(例如\def
)更方便,原因有很多(例如,不存在无意中覆盖某些现有命令的风险等)。
我想知道新的xparse
定义是否更好;例如有时我发现定义命令的语法更清晰(对我来说)并且看起来非常强大。
有什么缺点吗?谢谢
答案1
注意:前方基于观点的回答 ;-)
命令参数规范是xparse
其\NewDocumentCommand
(以及其他的,如\DeclareDocumentCommand
等)宏的一个非常强大的特性。(\NewDocumentCommand
这里代表这类命令的整个包!)
它们是否比定义的宏更好(更安全?)这个问题\newcommand
很难回答,并且基于观点。
\IfValueTF
使用etc.可以更轻松地处理多个可选参数。提供其他类型的可选参数等更加容易
关于未限定的参数功能
\NewDocumentCommand
肯定比\def
普通的 TeX 更\newcommand
- 由于也进行了命令定义检查,因此与宏的重新定义
xparse
相比,命令更安全。\def
- 命令定义的宏
xparse
允许带星号的版本,这对于重新定义\section*
等非常方便。 - 此外:由定义的环境
\NewDocumentEnvironment
甚至可以在代码末尾部分使用参数,这与\newenvironment
但是,使用 定义的命令\NewDocumentCommand
不是完全可展开的,并且一旦涉及可选参数,就无法在需要完全展开的地方使用,因此这可能是一个缺点。但在很多情况下,可以回退到\newcommand
没有可选参数的简单命令。
对于这种情况,\DeclareExpandableDocumentCommand
必须使用。
我\def
很久以前就开始使用它,然后逐渐改进,\newcommand
现在它\NewDocumentCommand
用于我的大部分个人文件,当然也用于这里的答案。
与之结合expl3
xparse
(当然,实际上是一个expl3
应用程序包)非常强大,值得推荐。