
¿Es posible tener algo como
\def\fiveorsix{5,6 OR 6,5}
Para que funcione lo siguiente:
\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 esto no funciona)
¿O existe un mejor enfoque para lograr mi objetivo?
Editar: Tuve que actualizar MnWE porque la primera versión era demasiado mínima.
Respuesta1
\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 los comentarios sobre su pregunta, parece que se espera que el argumento opcional sea un par de elementos separados por una coma. Es posible que desee considerar el uso de xparse
's \SplitArgument
, que puede dividir un argumento en un delimitador determinado, con informes de error si la cantidad de delimitadores no es la esperada. También elimina espacios alrededor de cada elemento.
Respuesta2
Podrías usar eletoolbox
(necesidades 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}
Resultados en:
el argumento opcional no es 5,6 o 6,5
el argumento opcional es 5,6 o 6,5
Puede utilizar otras pruebas como \ifnumcomp
. Para más detalles mira la etoolboxmanual.
Respuesta3
No exactamente como se requiere, pero la idea debe 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}
Respuesta4
Teniendo en cuenta que preguntaste sobre la definición y no sobre la comparación, la respuesta exacta a tu pregunta debería ser que no es posible (en TeX). La macro expansión tiene que ser única. Para lograr esto, debe especificar en la definición bajo qué circunstancias la \fiveorsix
macro debe expandirse a '5,6' o '6,5'.
En lo que respecta a los enfoques alternativos para probar si el argumento macro se expande a '5,6' o '6,5', y ya obtuve un montón de respuestas, agrego esta solución 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}