¿Es posible agregar una condición "o" a \def?

¿Es posible agregar una condición "o" a \def?

¿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 \fiveorsixmacro 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}

orcondón

información relacionada