Раньше я использовал следующее определение, чтобы проверить, все ли необязательные аргументы отсутствуют:
\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}