要实现一个宏,该宏可以采用一个或多个可选参数,而这些参数不必放在第一个位置,xargs
可以使用 以及xparse
。后者似乎有更新的版本,而前者在内部使用了众所周知的 keyval。
除了这些和它们的语法之外,它们还有哪些不同?它们中是否有一个可以被视为更高级的或被弃用的?在新文档中是否有使用哪个的指南?
答案1
由于xargs
您只能将默认值传递给可选参数,因此很难区分参数是否缺失。相反,仅针对这种情况xparse
提供。\IFNoValueTF
例如,可以说
\NewDocumentCommand{\foo}{o}{%
\IfNoValueTF{#1}
{foo without optional argument}
{foo with optional argument #1}%
}
您xparse
还可以使用*
-variant 定义命令,以及以各种方式分隔参数的命令。参数可以单独为“长”,而 可以xargs
全部为“长”,也可以全部为“长”。*
-variant 的一个示例是以下命令,其语法与 相同\section
:
\NewDocumentCommand{\foo}{ s o m }
{
\IfBooleanTF{#1}
{*-variant called, do something with #3}
{%
\IfNoValueTF{#2}
{normal foo without optional argument, do something with #3}
{normal foo with optional argument, do something with #2 and #3}%
}%
}
因此\foo*{Xyz}
,\foo{Xyz}
或\foo[Abc]{Xyz}
是可能的调用。实际上也是\foo*[Abc]{Xyz}
允许的,但使用上面的代码,参数#2
将被忽略。