Konditionale in LaTeX: try/catch und „not \equal“

Konditionale in LaTeX: try/catch und „not \equal“

Ich habe ein Problem mit der Überprüfung einiger Variablen: Ich biete dem Benutzer eine Option in der Schnittstelle einer Dokumentklasse an. Wenn die Option nicht bereitgestellt wird, schlägt mein Code fehl. Daher möchte ich überprüfen, ob die Option bereitgestellt wurde oder nicht. In anderen Programmierumgebungen würde ich dies mit TRY/CATCH of "!=" not equal tun. Wie mache ich dies in LaTeX?

Ein Minimalbeispiel sieht so aus:

1) Dokumentklasse minimalExample.cls:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]

\LoadClass[a4paper,11pt]{report}

\RequirePackage{ifthen}
\RequirePackage{xkeyval}

\providecommand{\theVariable}[1]{\@empty}
\DeclareOptionX{docoption}{%
    \def\theVariable{#1}%
}

\ProcessOptionsX

% pre-defined document types
\ifdefined\theVariable
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
    \providecommand\fcd@type@xx{some text}%
}{}
\fi

2) Arbeiten minimalExample.tex:

\documentclass[docoption=a]{minimalExample}
\begin{document}
test
\end{document}

3) Absturz minimalExample.tex:

\documentclass[]{minimalExample}
\begin{document}
test
\end{document}

Ich möchte prüfen, ob die Variable \theVariableeinen Wert hat, wenn sie nicht angegeben ist, und den abstürzenden Code umgehen, wenn dies nicht der Fall ist. Irgendwelche Ideen?

Antwort1

Entfernen Sie einfach die \providecommand{\theVariable}Zeile: Sie prüfen später mit , ob sie vorhanden ist \ifdefined, nicht wahr?

Wenn Sie jedoch später prüfen müssen, ob es gleich ist \@empty, gehen Sie wie folgt vor:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]

\LoadClass[a4paper,11pt]{report}

\RequirePackage{ifthen}
\RequirePackage{xkeyval}

\newcommand*{\theVariable}{}
\DeclareOptionX{docoption}{%
    \def\theVariable{#1}%
}

\ProcessOptionsX

% pre-defined document types
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
    \providecommand\fcd@type@xx{some text}%
}{}

Beachten Sie \newcommand*anstelle von \providecommand(und kein Argument); beachten Sie auch, dass ich \theVariablestandardmäßig leer definiere, also eine Überprüfung

\ifx\theVariable\@empty

würde erfolgreich sein. Wenn Sie dies tun, wäre dies nicht der Fall \newcommand*{\theVariable}{\@empty}, da in diesem Fall der Ersetzungstext von \theVariablenicht leer ist: Eine Box, die eine leere Box enthält, ist nicht leer, oder?

Antwort2

Die Antwort darauf ist ziemlich einfach. Ihre Standarddefinition \theVariableerfordert ein Argument, während die Definition, die Sie bei Verwendung der Option definieren, dies nicht tut. Sie haben also je nach Verwendung der Option zwei verschiedene Definitionen. Der Code schlägt fehl, weil Sie kein Argument angeben, \theVariableobwohl er eines anfordert.

Um dies zu beheben, verwenden Sie einfach \providecommand*{\theVariable}{\@empty}. Beachten Sie, dass ich das hinzugefügt habe, *weil es nicht \theVariablelang sein muss, da es sowieso keine Argumente akzeptiert.

Ihre .cls-Datei sollte also folgendermaßen aussehen:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]

\LoadClass[a4paper,11pt]{report}

\RequirePackage{ifthen}
\RequirePackage{xkeyval}

\providecommand*{\theVariable}{\@empty}
\DeclareOptionX{docoption}{%
    \def\theVariable{#1}%
}

\ProcessOptionsX\relax

% pre-defined document types
\ifdefined\theVariable
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
    \providecommand\fcd@type@xx{some text}%
}{}
\fi

Antwort3

Ich habe die Ansätze von egreg und Skillmon ausprobiert, konnte den Code aber nicht zum Laufen bringen. Schließlich konnte ich mein eigentliches Problem mit der folgenden Klassendefinition lösen:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]

\LoadClass[a4paper,11pt]{report}

\RequirePackage{ifthen}
\RequirePackage{xkeyval}

%\providecommand{\theVariable}[1]{\@empty} <-- Do not defined this variable
\DeclareOptionX{docoption}{%
    \def\theVariable{#1}%
}

\ProcessOptionsX

% pre-defined document types
\ifdefined\theVariable
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
    \providecommand\fcd@type@xx{some text}%
}{}
\else
   \def\documentLanguage{xx} <-- set some special value for later use
\fi

Meine größere Frage zu try/catch ist immer noch nicht beantwortet, aber ich werde das Problem als "gelöst" schließen - mein Code funktioniert jetzt

verwandte Informationen