我想创建一个抓取单个参数的命令如果有的话,成功处理,否则失败。因此类似于:
\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
接受参数。这必然导致构造不可扩展。