![xparse - 标记类型参数的顺序](https://linux22.com/image/441887/xparse%20-%20%E6%A0%87%E8%AE%B0%E7%B1%BB%E5%9E%8B%E5%8F%82%E6%95%B0%E7%9A%84%E9%A1%BA%E5%BA%8F.png)
我很好奇,xparse 的 token 类型参数必须遵循正确的顺序是否有技术原因?
平均能量损失
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\foo}{s t+}{---
\IfBooleanT{#1}{star }
\IfBooleanT{#2}{plus }---\par}
\begin{document}
\foo \foo* \foo+ \foo*+ \foo+*
% swapping order doesn't work
\end{document}
答案1
你要求一个可选项*
,后面可以跟一个可选项。定义中没有设想+
这种组合,因此+*
\foo+*
该命令\IfBooleanT{#1}
返回 false (因此没有任何内容)。
你想允许任意组合吗?那你就得更加努力了。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\foo}{}
{
\peek_regex_replace_once:nn
{% at most two characters among * and +
(\*|\+){0,2}
}
{% replace with
\c{veget_foo:n}\{\0\}
}
}
\cs_new_protected:Nn \veget_foo:n
{
\str_case:nn { #1 }
{
{}{nothing}
{*}{star}
{+}{plus}
{*+}{star~and~plus}
{+*}{star~and~plus}
{**}{star*}
{++}{plus+}
}
}
\ExplSyntaxOff
\begin{document}
\foo
\foo+
\foo*
\foo+*
\foo*+
\foo++
\foo**
\foo*+*
\foo++*
\end{document}