Eu costumava ter uma definição como a seguinte para verificar se todos os argumentos opcionais estavam faltando:
\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>
}
}
Mas isso quebrou com a xparse
atualização mais recente. Agora parece haver apenas a \IfNoValueTF{}{}{}
macro, mas depois tenho que repetir uma das DO STUFF x
coisas. Eu li o xparse.sty
mas parece não haver mais uma solução tão fácil devido ao QNoValue-
"hack".
Alguma ideia?
Responder1
Editar:Como os valores em branco não são “sem valores”, é suficiente verificar se a primeira opção é fornecida:
\ExplSyntaxOn
\NewDocumentCommand \question { o o o m } {
\IfNoValueTF { #1 } {
<DO STUFF 1>
} {
<DO STUFF 2>
}
}
\ExplSyntaxOff
Dependendo do tipo de entrada esperada, uma sintaxe geral diferente pode ser uma maneira melhor. Três argumentos opcionais tornam um comando desnecessário e complicado na maioria dos casos. Talvez um argumento opcional esperando uma entrada semelhante a um keyval seria uma escolha melhor?
Resposta antiga:
Aqui está uma ideia:
\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}