使用 xparse 时不忽略可选参数前的空格

使用 xparse 时不忽略可选参数前的空格

我正在使用xparse.sty来定义一个命令,该命令采用方括号中的可选参数和另一个花括号中的可选参数。

问题在于,用户经常希望在命令后用方括号开始文本,这并不罕见。由于 LaTex 会忽略第一个可选参数前的空格,因此天真地输入\myitem [not an argument]是行不通的,因为“[不是参数]”将被视为参数。MWE:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\myitem}{ o g }{
    \IfValueTF{#1}{%
        []-argument:~#1
    }{
        \IfValueTF{#2}{
            \{\}-argument:~#2
        }{
            no~argument:~
        }
    }
}

\ExplSyntaxOff

\begin{document}
\myitem [Not intended as argument] 
% Will output: []-argument: Not intended as argument

\end{document}

更糟糕的是,因为\myitem也接受一个g参数,所以避免此问题的标准技术(在方括号中的文本之前或周围插入一对括号)将不起作用:

\myitem {}[Not intended as argument]
% Will output {}-argument: [Not intended as argument]

\myitem {[Not intended as argument]}
% Will output {}-argument: [Not intended as argument]

现在唯一的解决方法是\relax在方括号前使用,但我想避免这种情况。

在这种情况下,是否可以让 LaTeX 将空格视为参数列表的终止?即,\myitem [foo]应该输出no argument: foo,而\myitem[foo](仍然)应该输出[]-argument: foo

答案1

根据 TeX 的标准读取规则,即使你输入

\myitem [abc]

因为读入该行时会忽略空格。一种解决方法是

\myitem\relax[abc]

因为\relax将停止扫描可选参数。

当接受可选参数的命令后面跟着 时,这总是一个问题[。请注意,它xparse会尽力平衡]可选参数的 ,但这是一个不同的问题。

\myitem{[not optional]}如果没有可选参数,当然也可以正常工作g

一般情况下,我不推荐使用此参数说明符:之所以添加它,是因为某些用户界面(尤其是beamer)提供了此约定。但是,它违反了标准 LaTeX 界面,可能会造成混淆:请在采用这种语法之前仔细考虑。

相关内容