一般情况下,如果要实现类似的需求,是交换 1、2 个参数的顺序,或者用不同类型的定界符([]
()
<>
等)。
也可以用一个特殊的值表示默认值,遇到这个特殊值的时候把它替换为默认值。
\ExplSyntaxOn
\cs_new_protected:Npn \__my_make_default:nnn #1#2#3
{
\tl_if_eq:nnTF {#3} {#1}
{ \tl_set:Nn \ProcessedArgument {#2} }
{ \tl_set:Nn \ProcessedArgument {#3} }
}
\cs_new_eq:NN \TrueDefault \__my_make_default:nnn
\ExplSyntaxOff
\NewDocumentCommand{\cmdt}{
>{\TrueDefault{?}{default1}} O{?} % 如果参数为 ? 就替换为 default1
>{\TrueDefault{?}{default2}} O{?}
m
}{%
\textbf{The result of \texttt{\string\cmdt}:} \par
optional param1: #1 \par
optional param2: #2 \par
mandattory param: #3 \par
}
\cmdt{Explorer}
\cmdt[anaconda][python]{Explorer}
\cmdt[anaconda]{Explorer}
\cmdt[?][python]{Explorer}
问 xparse处理多个连续的optional arguments