xparse - 标记类型参数的顺序

xparse - 标记类型参数的顺序

我很好奇,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}

在此处输入图片描述

相关内容