Ist es möglich, einer \def eine „oder“-Bedingung hinzuzufügen?

Ist es möglich, einer \def eine „oder“-Bedingung hinzuzufügen?

Ist es möglich, so etwas zu haben wie

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

Damit folgendes klappt:

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

(das funktioniert offensichtlich nicht)

Oder gibt es einen besseren Ansatz, um mein Ziel zu erreichen?

edit: Ich musste das MnWE aktualisieren, weil die erste Version eigentlich zu minimal war.

Antwort1

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

Aus den Kommentaren zu Ihrer Frage geht hervor, dass das optionale Argument ein Paar von Elementen sein soll, die durch Kommas getrennt sind. Sie sollten die Verwendung von xparse's in Betracht ziehen \SplitArgument, das ein Argument an einem bestimmten Trennzeichen aufteilen kann und eine Fehlermeldung ausgibt, wenn die Anzahl der Trennzeichen nicht der erwarteten entspricht. Außerdem werden Leerzeichen um jedes Element entfernt.

Antwort2

Sie können dieetoolbox(Bedürfnisse 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}

Ergebnisse in:

Das optionale Argument ist nicht 5,6 oder 6,5.
Das optionale Argument ist 5,6 oder 6,5.

Sie können andere Tests verwenden wie \ifnumcomp. Weitere Informationen finden Sie in der etoolboxHandbuch.

Antwort3

Nicht genau wie erforderlich, aber die Idee sollte klar sein:

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

Antwort4

Da Sie eher nach der Definition als nach dem Vergleich gefragt haben, sollte die genaue Antwort auf Ihre Frage sein, dass dies (in TeX) nicht möglich ist. Die Makroerweiterung muss eindeutig sein. Um dies zu erreichen, müssen Sie in der Definition angeben, unter welchen Umständen das \fiveorsixMakro zu „5,6“ oder „6,5“ erweitert werden soll.

Da Sie nach alternativen Ansätzen gefragt haben, um zu testen, ob das Makroargument auf „5,6“ oder „6,5“ erweitert wird – und bereits eine Reihe von Antworten erhalten haben –, füge ich der Vollständigkeit halber diese allgemeine Lösung hinzu:

\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

verwandte Informationen