我正在使用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 界面,可能会造成混淆:请在采用这种语法之前仔细考虑。