LaTeX „Variablen“ – \@varname

LaTeX „Variablen“ – \@varname

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, \educationder, 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 \@variableVariablen 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 \@variableDefinitionen 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 \@datesattendeddefiniert 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 \ifdefinedein (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 \ifdefsein 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

verwandte Informationen