以前は、すべてのオプション引数が欠落しているかどうかを確認するために、次のような定義を使用していました。
\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{}{}{}
が、その場合は 1 つのことを繰り返さなければなりませんDO STUFF x
。読みましたxparse.sty
が、「ハック」のせいで、そのような簡単な解決策はもうないようですQNoValue-
。
何か案は?
答え1
編集:空白の値は「値なし」ではないため、最初のオプションが指定されているかどうかを確認するだけで十分です。
\ExplSyntaxOn
\NewDocumentCommand \question { o o o m } {
\IfNoValueTF { #1 } {
<DO STUFF 1>
} {
<DO STUFF 2>
}
}
\ExplSyntaxOff
ただし、予想される入力の種類によっては、全体的に異なる構文の方が良い方法になる場合があります。オプションの引数が 3 つあると、ほとんどの場合、コマンドが不必要に複雑になります。keyval のような入力を期待するオプションの引数が 1 つある方がよい選択でしょうか。
古い回答:
ここにアイデアがあります:
\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}