我曾经有如下定义来检查是否缺少所有可选参数:
\NewDocumentCommand \question {o o o m} {
\bool_if:nTF {
\str_if_eq_p:nn { \NoValue } { #1 } &&
\str_if_eq_p:nn { \NoValue } { #2 } &&
\str_if_eq_p:nn { \NoValue } { #3 }
} {
<DO STUFF 1>
} {
<DO STUFF 2>
}
}
但最新xparse
更新打破了这一局面。现在似乎只有宏\IfNoValueTF{}{}{}
,但我不得不重复其中一件事DO STUFF x
。我读过,但由于“黑客”,xparse.sty
似乎不再有这样简单的解决方案了。QNoValue-
有任何想法吗?
答案1
编辑:由于空白值不是“无值”,因此只需检查是否给出了第一个选项:
\ExplSyntaxOn
\NewDocumentCommand \question { o o o m } {
\IfNoValueTF { #1 } {
<DO STUFF 1>
} {
<DO STUFF 2>
}
}
\ExplSyntaxOff
不过,根据预期输入的类型,整体不同的语法可能是更好的方法。在大多数情况下,三个可选参数会使命令变得不必要地复杂。也许一个期望 keyval 类输入的可选参数会是更好的选择?
旧答案:
这是一个想法:
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand \question {O{\NoValue} O{\NoValue} O{\NoValue} m} {
\bool_if:nTF {
\str_if_eq_p:nn { \NoValue } { #1 } &&
\str_if_eq_p:nn { \NoValue } { #2 } &&
\str_if_eq_p:nn { \NoValue } { #3 }
} {
<DO STUFF 1>
} {
<DO STUFF 2>
}
}
\ExplSyntaxOff
\begin{document}
\question{}
\question[]{}
\question[][]{}
\question[][][]{}
\end{document}