У меня есть новая команда с необязательными параметрами: в зависимости от того, пуст параметр или нет, я хотел бы, чтобы отображение было разным. Когда есть только один тест, я справляюсь без проблем, но когда есть несколько тестов, я не нахожу, как действовать дальше.
с 3 параметрами: отобразить H(1)(2)(3) с 2 параметрами (3-й пустой): отобразить (1)(2) с одним параметром (2 и 3 пустые): отобразить H(1)
решение1
Я надеюсь, это поможет вам.
Пакет ifthen
может создавать условные операторы в LaTeX. Взгляните на следующий пример, где вы можете увидеть, как определить команду с тремя необязательными аргументами, которые отображают разные выходные данные в зависимости от того, какие аргументы пусты:
\usepackage{ifthen}
\newcommand{\mycommand}[3][]{%
\ifthenelse{\equal{#1}{}}{}{H}%
\ifthenelse{\equal{#1}{}}{}{(#1)}%
\ifthenelse{\equal{#2}{}}{}{(#2)}%
\ifthenelse{\equal{#3}{}}{}{(#3)}%
}
Эта команда отобразит H(#1)(#2)(#3), если указаны все три аргумента, (#1)(#2), если указаны только первые два аргумента, и H(#1), если указан только первый аргумент. Это то, что вы искали?
решение2
Возможно, вы захотите сделать это:
\def\H#1#2#3{H\ifx&\else (#1)\ifx&\else (#2)\ifx&\else (#3)\fi\fi\fi}
\H{a}{}{} % prints H(a)
\H{a}{b}{} % prints H(a)(b)
\H{a}{b}{c} % prints H(a)(b)(c)
\bye
решение3
Кажется, что использование нескольких необязательных аргументов несколько излишне, поскольку их необязательность становится обязательной, как только вам нужно использовать больше. Если, конечно, вы не измените синтаксис.
Интерфейс LaTeX3 для макросов using \NewDocumentCommand
позволяет легко согласовывать (несколько) необязательных аргументов, используя o
for []
аргументы (или d<token><token>
для определенной <token><token>
пары). Тестирование выполняется с помощью \IfValueTF{<arg>}{<true>}{<false>}
(или проще, если ничего не нужно делать, когда ничего не предоставлено, \IfValueT{<arg>}{<true>}
).
\documentclass{article}
% \mycommandA uses the default [] for optional arguments
\NewDocumentCommand{\mycommandA}{ o o o }{%
\mathrm{H}
\IfValueT{#1}{(#1)
\IfValueT{#2}{(#2)
\IfValueT{#3}{(#3)}}}
}
% \mycommandB uses () for optional arguments
\NewDocumentCommand{\mycommandB}{ d() d() d() }{%
\mathrm{H}
\IfValueT{#1}{(#1)
\IfValueT{#2}{(#2)
\IfValueT{#3}{(#3)}}}
}
\begin{document}
$\mycommandA[a]$
$\mycommandA[a][b]$
$\mycommandA[a][b][c]$
$\mycommandB(a)$
$\mycommandB(a)(b)$
$\mycommandB(a)(b)(c)$
\end{document}