裸露可选参数

裸露可选参数

我想创建一个抓取单个参数的命令如果有的话,成功处理,否则失败。因此类似于:

\NewDocumentCommand\grab{m}{
    \IfValueTF{#1}{
        \handlesuccess{#1}}{
        \handlefailure} 
}

当有一个参数时这很好:\grab abcd将扩展为\handlesuccess{a}bcd

但显然,如果没有参数(“m”的意思是强制参数)例如,我想ab{grab}cd扩展到ab\handlefailure cd

xparse似乎没有提供“裸可选”类型的参数。有“g”,但它只接受带括号的参数。那么我该如何实现呢?

我几乎毫无头绪。我实现该行为的唯一想法是尝试检测没有​​进一步输入,也许可以使用类似\@ifnextchar\EOF但目前尚未发现此类特殊符号\EOF

\NewDocumentCommand\graborfail{}{
    \@ifnextchar\EOF{ % does not work, be it {}, \relax, or anything I tried
        \handlefailure}{
        \grab}
}

答案1

}(或 catcode 2 的另一个标记)本质上是唯一不会被接受的东西,#1因此您可以将命令定义为

\@ifnextchar\egroup{\failcommand}{\grab}

您的命令在哪里\grab接受参数。这必然导致构造不可扩展。

相关内容