Можно ли добавить условие «или» к \def?

Можно ли добавить условие «или» к \def?

Возможно ли что-то вроде

\def\fiveorsix{5,6 OR 6,5}

Итак, чтобы работало следующее:

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

(очевидно, это не работает)

Или есть лучший подход к достижению моей цели?

правка: Мне пришлось обновить MnWE, потому что первая версия была на самом деле слишком минималистичной.

решение1

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

Учитывая комментарии к вашему вопросу, похоже, что необязательный аргумент должен быть парой элементов, разделенных запятой. Вы можете рассмотреть возможность использования xparse's \SplitArgument, который может разделить аргумент по заданному разделителю, с сообщением об ошибке, если количество разделителей не соответствует ожидаемому. Он также удаляет пробелы вокруг каждого элемента.

решение2

Вы могли бы использоватьetoolbox(нужно 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}

Результаты в:

необязательный аргумент не равен 5,6 или 6,5
необязательный аргумент равен 5,6 или 6,5

Вы можете использовать другие тесты, например \ifnumcomp. Подробности смотрите на etoolboxруководство.

решение3

Не совсем так, как требуется, но идея должна быть ясна:

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

решение4

Учитывая, что вы спросили об определении, а не о сравнении, точный ответ на ваш вопрос должен быть таким: это невозможно (в TeX). Расширение макроса должно быть уникальным. Чтобы этого добиться, вам нужно указать в определении, при каких обстоятельствах макрос \fiveorsixдолжен расширяться до '5,6' или '6,5'.

Поскольку вы спрашивали об альтернативных подходах к проверке того, расширяется ли аргумент макроса до «5,6» или «6,5» (и уже получили кучу ответов), я добавляю это общее решение для полноты картины:

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

орконд

Связанный контент