Tenho um novo comando que possui parâmetros opcionais: dependendo se o parâmetro está vazio ou não, gostaria que a exibição fosse diferente. Quando há apenas um teste, consigo sem problemas, mas quando há vários testes, não encontro como proceder.
com os 3 parâmetros: display H(1)(2)(3) com 2 parâmetros (o 3º está vazio): display (1)(2) com um único parâmetro (o 2 e 3 estão vazios): display H(1 )
Responder1
Espero que isso ajude você.
O ifthen
pacote pode criar instruções condicionais em LaTeX. Dê uma olhada no exemplo a seguir, onde você pode ver como definir um comando com três argumentos opcionais que exibem saídas diferentes dependendo de quais argumentos estão vazios:
\usepackage{ifthen}
\newcommand{\mycommand}[3][]{%
\ifthenelse{\equal{#1}{}}{}{H}%
\ifthenelse{\equal{#1}{}}{}{(#1)}%
\ifthenelse{\equal{#2}{}}{}{(#2)}%
\ifthenelse{\equal{#3}{}}{}{(#3)}%
}
Este comando exibirá H(#1)(#2)(#3) se todos os três argumentos forem fornecidos, (#1)(#2) se apenas os dois primeiros argumentos forem fornecidos e H(#1) se apenas o primeiro argumento é fornecido. Era isso que você estava procurando?
Responder2
Talvez você queira fazer isso:
\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
Responder3
Parece um tanto supérfluo usar vários argumentos opcionais, já que sua opcionalidade passa a ser obrigatória quando você precisa usar mais. A menos, é claro, que você altere a sintaxe.
A interface LaTeX3 para macros \NewDocumentCommand
permite negociar facilmente (múltiplos) argumentos opcionais usando argumentos o
for []
(ou d<token><token>
para um par específico <token><token>
). O teste é feito usando \IfValueTF{<arg>}{<true>}{<false>}
(ou mais simplesmente se nada precisar ser feito quando nada for fornecido \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}