
É possível ter algo parecido
\def\fiveorsix{5,6 OR 6,5}
Para que funcione o seguinte:
\documentclass{standalone}
\def\fiveorsix{5,6 OR 6,5}
\makeatletter
\newcommand{\test}[1][]{
\def\test@a{#1}
\ifx\test@a\fiveorsix
the optional argument is 5,6 or 6,5
\else
the optional argument is not 5,6 or 6,5
\fi}
\makeatother
\begin{document}
\test[5,6]
\end{document}
(obviamente isso não funciona)
Ou existe uma abordagem melhor para atingir meu objetivo?
editar: tive que atualizar o MnWE porque a primeira versão era muito mínima.
Responder1
\documentclass{article}
\usepackage{expl3}[2013/07/24]
\ExplSyntaxOn
\newcommand{\test}[1][]{
\str_case:nnTF {#1}
{
{ 5,6 } { } % within those braces you could put code specific to the 5,6 case
{ 6,5 } { } % within those braces you could put code specific to the 6,5 case
}
{ the~argument~is~5,6~or~6,5 }
{ the~argument~is~neither~5,6~nor~6,5 }
}
\ExplSyntaxOff
\begin{document}
\test[123]
\test[5,6]
\test[6,5]
\end{document}
Dados os comentários sobre sua pergunta, parece que se espera que o argumento opcional seja um par de itens separados por vírgula. Você pode considerar o uso de xparse
's \SplitArgument
, que pode dividir um argumento em um determinado delimitador, com relatório de erros se o número de delimitadores não for o esperado. Também remove espaços ao redor de cada item.
Responder2
Você poderia usar oetoolbox
(precisa e-TeX
):
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\test}[1][]{%
\ifboolexpr{
test{\ifstrequal{#1}{5,6}} or
test{\ifstrequal{#1}{6,5}
}
}
{the optional argument is 5,6 or 6,5}
{the optional argument is not 5,6 or 6,5}}
\begin{document}
\test[3,2]
\test[5,6]
\end{document}
Resulta em:
o argumento opcional não é 5,6 ou 6,5
o argumento opcional é 5,6 ou 6,5
Você pode usar outros testes como \ifnumcomp
. Para obter detalhes, consulte o etoolboxmanual.
Responder3
Não exatamente como exigido, mas a ideia deve ser clara:
\documentclass{article}
\begin{document}
\def\fivesix#1{\ifcase#1 the argument is not 5 or 6
\or the argument is not 5 or 6
\or the argument is not 5 or 6
\or the argument is not 5 or 6
\or the argument is not 5 or 6
\or the argument IS 5 or 6
\or the argument IS 5 or 6
\else the argument is not 5 or 6\fi}
\fivesix{1}
\fivesix{5}
\end{document}
Responder4
Considerando que você perguntou sobre a definição e não sobre a comparação, a resposta exata à sua pergunta deveria ser que não é possível (no TeX). A expansão macro tem que ser única. Para conseguir isso você deve especificar na definição sob quais circunstâncias a \fiveorsix
macro deve expandir para '5,6' ou '6,5'.
Tanto quanto você perguntou sobre abordagens alternativas para testar se o argumento macro se expande para '5,6' ou '6,5' - e já recebi um monte de respostas - adiciono esta solução genérica para completar:
\documentclass{article}
\def\fivsix{5,6}
\def\sixfiv{6,5}
\makeatletter
\newcommand{\test}[1][]{%
\def\test@a{#1}
\ifnum
\ifx\test@a\fivsix 1\else\ifx\test@a\sixfiv 1\else 0\fi\fi
=1
the optional argument is 5,6 or 6,5
\else
the optional argument is not 5,6 and not 6,5
\fi}
\makeatother
\begin{document}
\test[4,5]\par
\test[5,6]\par
\test[6,5]
\end{document}