É possível adicionar uma condição "ou" a um \def?

É possível adicionar uma condição "ou" a um \def?

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

orcond

informação relacionada