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 \theVariable
einen 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 \theVariable
standardmäß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 \theVariable
nicht leer ist: Eine Box, die eine leere Box enthält, ist nicht leer, oder?
Antwort2
Die Antwort darauf ist ziemlich einfach. Ihre Standarddefinition \theVariable
erfordert 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, \theVariable
obwohl er eines anfordert.
Um dies zu beheben, verwenden Sie einfach \providecommand*{\theVariable}{\@empty}
. Beachten Sie, dass ich das hinzugefügt habe, *
weil es nicht \theVariable
lang 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