
Ich bin gerade dabei, meine erste Dokumentklassendatei (eine personalisierte Lebenslaufklasse) zu schreiben, und ich möchte besser verstehen, was ich genau mache. Ich richte also gerade Befehle ein, mit denen Variablen (ich bin nicht sicher, ob das wirklich das richtige Wort ist) Werte zugewiesen werden können, und zwar über eine Struktur wie diese:
\newcommand{\institution}[1]{\def\@institution{#1}}
\newcommand{\datesattended}[1]{\def\@datesattended{#1}}
\newcommand{\degree}[1]{\def\@degree{#1}}
Der Benutzer kann also in der .tex-Datei mit dem Befehl \institution{University of Whatever}
den String „University of Whatever“ unter speichern \@institution
, der dann später innerhalb der Klassendatei von einem anderen Befehl aufgerufen wird.
All dies funktioniert wie gewünscht, aber jetzt möchte ich einige bedingte Ausdrücke erstellen, um die Ausgabe zu steuern. Ich habe beispielsweise einen Befehl, \education
der, wenn er im Dokument aufgerufen wird, einen Abschnitt über die Ausbildung für einen Lebenslauf formatiert, wobei der Name der Bildungseinrichtung, die besuchten Daten, Informationen zum Abschluss usw. angegeben werden, die der Benutzer bereits eingegeben hat. Ich möchte es in der Klassendatei einrichten können, um zu prüfen, ob diese \@variable
Variablen definiert wurden, und dann die Ausgabe unterschiedlich zu formatieren, je nachdem, welche definiert sind und welche leer sind.
Hauptsächlich liegt mein Problem wohl darin, dass ich die \@variable
Definitionen nicht wirklich verstehe und auch nicht, was ich damit machen kann.
Ein vollständiges Beispiel meines Ziels würde etwa so aussehen (in LaTeX/Pseudo):
\newcommand{\showeducation}{%
\@institutionname -- \@degree
if \@datesattended is defined:
\newline \@datesattended
clear \@institutionname, \@datesattended, \@degree
}
Wenn also \@datesattended
definiert wäre, würde die Formatierung entsprechend geändert. Andernfalls würde der Befehl es einfach übergehen und die angegebenen Informationen drucken.
Antwort1
Befehle sind nichts Besonderes \@variable
. Sie sind nur Makros, die Inhalte speichern und nicht andere Operationen ausführen. Daher ist es möglich, die Definition zu testen, indem man \ifdefined
ein (e-TeX-)Primitiv verwendet.
\documentclass[11pt,a4paper]{article}
\makeatletter
\newcommand{\@institutionname}{Ministry of Silly Walks}
\newcommand{\@degree}{Minster of Silly Walks}
%\newcommand{\@datesattended}{1969}
\newcommand{\showeducation}{%
\@institutionname\ -- \@degree
\ifdefined\@datesattended
\newline \@datesattended % Please use some 'better' setup here
\else
\let\@institutionname\relax
\let\@datesattended\relax
\let\@degree\relax
\fi
}
\makeatother
\begin{document}
\showeducation % Date should not be printed
\makeatletter
\newcommand{\@datesattended}{1969}
\makeatother
\showeducation % Now it should be printed, but the rest is \relax`ed
\end{document}
BearbeitenDasselbe sollte auch mit dem Paket „from“ möglich \ifdef
sein etoolbox
.
Antwort2
Vielleicht besser als \newcommand[1]...
die Verwendung von Token-Registern:
\newtoks\institution \newtoks\datesattended \newtoks\degree
Wenn der Benutzer sagt
\institution{Ministry of Silly Walks}
dann können Sie diesen Wert in Ihren Makros wie folgt verwenden:
\the\institution
Wenn Sie testen müssen, ob der Wert der „Variable“ bereits festgelegt wurde, können Sie Folgendes tun:
\if\relax\the\degree\relax The degree isn't set.\else The degree is set.\fi