Besucher: 386356

Inhalt

Hintergrund

Als ich mit LaTeX angefangen habe meine Doktorarbeit zu schreiben, war mir zwar bekannt, daß man eigene Befehle definieren kann, doch habe ich damals noch die Meinung vertreten: Warum eigene Befehle? LaTeX hat doch schon für alles Befehle? Allerdings war mir damals noch nicht bewußt, wie sehr man sich die Arbeit an großen Dokumenten (wie z. B. die Doktorarbeit) durch die Verwendung von eigenen Befehlen erleichtern kann.

Im Abschnitt Abbildungen habe ich beschrieben, wie man Bilder in das LaTeX-Dokument einbaut. Wieviel Arbeit macht es, das Erscheinungsbild dieser Abbildungen zu ändern, wenn man z. B. die Größe der Bildunterschrift von "small" auf "scriptsize" ändern will? Hat man nur einige wenige Bilder im Dokument eingebaut, ist eine Änderung kein Problem. Aber wie sieht es aus, wenn man z. B. 100 Bilder im Dokument verteilt hat? Sicher, durch "kopieren & einfügen" kann man sich die Arbeit erleichtern. Aber das geht nur dann recht schnell, wenn im restlichen Dokument keine "small"-Befehle verwendet wurden, denn dann kann man den Text-Editor nicht automatisch alle "small" ersetzen lassen, dann muß man von Fall zu Fall prüfen, ob der aktuelle "small"-Befehl ersetzt werden soll oder nicht.

Noch umständlicher wird es, wenn man z. B. in Tabellen ganze Spalten miteinander vertauschen möchte. Die Inhalte einzelner Zellen sind i. d. R. nicht identisch und durch "suchen & ersetzen" kommt man in diesem Fall nicht weit: Man muß die einzelnen Inhalte von Hand tauschen.

Diese Probleme kann man durch die Definition eines eigenen Befehls umgehen. Eigene Befehle werden im Kopfteil definiert, also bevor das eigentliche Dokument mit "\begin{document}" eingeleitet wird. Werden also Abbildungen durch einen eigenen Befehl in das Dokument eingebaut, so müssen z. B. Größenänderungen der Bildunterschriften nicht mehr im gesamten Dokument erfolgen, in diesem Fall erfolgt die Größenänderung lediglich an einer einzigen Stelle: Im selbstdefinierten Befehl (Beispiel 1).

Um auf das Tabellenbeispiel zurückzukommen: Hat man die Inhalte der Tabelle mit einem eigenen (geschickt definierten) Befehl eingebaut, ist eine Änderung kein Problem: Man ändert im Dokument nicht die eigentliche Tabelle - man ändert lediglich bei der Befehlsdefinition die Reihenfolge, in der die einzelnen Zellen ausgegeben werden (Beispiel 2).

Nach oben

Definition

Notwendiges Paket:

-

Definition:

\newcommand{\abkürzung}[argumente]{anweisungen}

Erklärung:

\newcommand{\abkürzung}

Hiermit wird im Kopfteil des LaTeX-Dokuments (also bevor der eigentliche Inhalt des Dokuments durch die \begin{document}-Anweisung markiert ist) ein neuer Befehl mit dem Namen "abkürzung" festgelegt. Wann immer im Dokument der Befehl "\abkürzung" Verwendung findet, "springt" der Compiler zurück zur Befehlsdefinition und überprüft, welche Anweisungen auszuführen sind.

[argumente]

Hiermit wird die Anzahl der Argumente für den Befehl bestimmt, "argumente" ist einfach eine Zahl.

{anweisungen}

In diese Klammer werden alle Anweisungen geschrieben die LaTeX ausführen soll, wenn der Befehl "abkürzung" im Dokument verwendet wird. Um die Argumente einzubauen, finden die Platzhalter #1, #2, #3... Verwendung. Intern ersetzt LaTeX bei der Kompilierung einfach den eigenen Befehl durch die hier angegebenen Anweisungen und ersetzt die Platzhalter durch die beim Befehl angegebenen Informationen.

Nach oben

Beispiel 1

Um das Erscheinungsbild der Abbildungen im Dokument leicht ändern zu können, empfiehlt sich die Definition eines eigenen Befehls.

Definition:

\newcommand{\bild}[3]
{
\begin{figure}[htbp]
\centering
\includegraphics[width=0.75\textwidth]{#1}
\caption{\small{#2}}
\label{#3}
\end{figure}
}

Erklärung:

\newcommand{\bild}

Wir definieren einen Befehl mit dem Namen "bild".

[3]

Um eine Abbildung im Dokument zu platzieren, müssen LaTeX normalerweise 3 Angaben gemacht werden:
1) Der Speicherpfad (also wo das Bild zu finden ist)
2) Die Bildunterschrift
3) Der Anker (damit wir im Text auf die Abbildung verweisen können)
Diese drei Angaben wollen (müssen) wir jeweils angeben können, deshalb legen wir genau dies mit der Anweisung [3] fest: 3 Argumente werden übergeben.

{
\begin{figure}[htbp]
\centering
\includegraphics[width=0.75\textwidth]{#1}

Mit dem Platzhalter #1 sagen wir LaTeX, daß das erste der drei übergebenen Argumente der Speicherpfad des Bildes ist und dementsprechend dem Befehl "includegraphics" übergeben werden soll.

\caption{\small{#2}}

Mit dem Platzhalter #2 sagen wir LaTeX, daß das zweite der drei übergebenen Argumente die Bildunterschrift ist und dementsprechend dem Befehl "caption" übergeben werden soll.

\label{#3}
\end{figure}
}

Mit dem Platzhalter #3 sagen wir LaTeX, daß das dritte der drei übergebenen Argumente der Anker ist und dementsprechend dem Befehl "label" übergeben werden soll.

Anwendung:

Durch "\bild" wird der Befehl aufgerufen und da wir 3 Argumente definiert haben ("[3]"), müssen diese auch angegeben werden, jedes für sich in geschweiften Klammern:

\bild{bilder/bild.eps}{Die Abbildung zeigt ein Beispielbild}{anker1}

Zur Erinnerung: das erste Argument {bilder/bild.eps} findet als Speicherpfad des Bildes Verwendung, das zweite Argument {Die Abbildung zeigt ein Beispielbild} wird zur Bildunterschrift, das dritte Argument {anker1} ist der Anker, damit wir aus dem Text auf das Bild "bild.eps" verweisen können.

Wie man sehen kann: Auf diese Weise können Bilder viel einfacher in den Text eingebaut werden (man sieht auf einen Blick sowohl den Speicherpfad, die Bildunterschrift und den Namen des Ankers) und um z. B. die Erscheinung der Bildunterschrift zu ändern, muß man lediglich in der Befehlsdefinition den Platzhalter #2 in der Anweisung "caption" in entsprechende Befehle einbetten. Aber auch allgemeine Angaben (wie z. B. die Bildgröße "[width=0.75\textwidth]") lassen sich auf diese Weise beeinflußen.

Nach oben

Beispiel 2

Um bei der Tabellenformatierung genügend Freiheiten (bei geringem Aufwand) zu haben, ist auch hierbei die Verwendung eines eigenen Befehls naheliegend. Auf Tabellen gehe ich genauer im Abschnitt Tabellen ein, an dieser Stelle sei lediglich kurz die Syntax einer Tabellenzeile gezeigt:

zelle 1 & zelle 2 & zelle 3 & ... & zelle X \\

Die einzelnen Zellen werden durch die Symbole "&" von einander getrennt, mit dem "\\" wird eine Tabellenzeile abgeschlossen. Wenn man z. B. die Daten seiner Freunde tabellarisch zusammenfassen will, könnte eine Tabellenzeile so aussehen:

Vorname & Nachname & E-Mail & Telefon & Wohnort \\

Hat man alle seine Freunde auf diese Weise aufgeführt, hat man ein Problem wenn man nun 2 Spalten vertauschen möchte, wenn man z. B. zuerst den Nachnamen und dann den Vornamen auflisten möchte: Da alle Freunde unterschiedlich heißen, kann man dies nicht vom Text-Editor automatisch durch "kopieren & ersetzen" (suche "Vorname & Nachname" und ersetze diesen Ausdruck durch "Nachname & Vorname") machen lassen . In diesem Fall muß man jede Tabellenzeile von Hand anpassen.

Diese Arbeit hätte man sich sparen können, wenn man eine Tabellenzeile von Anfang an durch einen eigenen Befehl aufgebaut hätte.

Definition:

\newcommand{\tabellenzeile}[5]{#1 & #2 & #3 & #4 & #5 \\}

Erklärung:

\newcommand{\tabellenzeile}

Wir definieren den neuen Befehl "tabellenzeile".

[5]

Für die Angaben Vorname, Nachname, E-Mail, Telefon und Wohnort müssen wir LaTeX 5 Argumente übergeben.

\newcommand{\tabellenzeile}[5]{#1 & #2 & #3 & #4 & #5 \\}

Da wir mit dem Befehl "\tabellenzeile" innerhalb einer Tabellen-Umgebung immer eine komplette Zeile definieren wollen und die 5 Argumente jeweils in einer Tabellenzelle stehen sollen, muß LaTeX diese entsprechend anordnen. Deshalb werden die Platzhalter #1, #2, #3, #4 und #5 durch die Symbole "&" voneinander getrennt und zur Kennzeichnung des Zeilenendes ein Doppelschrägstrich "\\" eingefügt.

Anwendung:

Durch "\tabellenzeile" wird der Befehl aufgerufen und da wir 5 Argumente definiert haben ("[5]"), müssen diese auch angegeben werden, jedes für sich in geschweiften Klammern:

\tabellenzeile{Vorname}{Nachname}{E-Mail}{Telefon}{Wohnort}

An dieser Stelle sei daran erinnert, daß LaTeX immer dann, wenn (wie im Beispiel) der Befehl "\tabellenzeile" im Dokument Verwendung findet, im ersten Schritt die 5 Platzhalter mit den 5 Argumenten ersetzt und im zweiten Schritt die beim Befehl angegebenen Anweisungen ausführt. Für uns (den Anwender) steht im Dokument der obige Befehl, während es für LaTeX intern so ist, als ob man direkt die Anweisung gegeben hätte:

Vorname & Nachname & E-Mail & Telefon & Wohnort \\

Der Vorteil, den wir durch den Befehl "\tabellenzeile" haben, ist nun, daß wir ganz einfach Tabellenspalten tauschen können. Um also in der ersten Tabellenspalte den Nachnamen stehen zu haben und in der zweiten Spalte den Vornamen, tauschen wir in der Befehlsdefinition einfach #1 mit #2:

\newcommand{\tabellenzeile}[5]{#2 & #1 & #3 & #4 & #5 \\}

Dies ist möglich, da wir bei der Anwendung des Befehls im Dokument die Argumente immer in der Reihenfolge {Vorname}, {Nachname}, {E-Mail}, {Telefon} und {Wohnort} angeben. Dies bedeutet, daß LaTeX intern den Platzhalter #1 immer mit der Angabe "Vorname", #2 mit "Nachname", #3 mit "E-Mail", #4 mit "Telefon" und #5 mit "Wohnort" ersetzt, ungeachtet der Reihenfolge, mit der die Platzhalter bei den Befehls-Anweisungen Verwendung finden.

Nach oben

Fazit

Durch die Definition eigener Befehle läßt sich bei großen Dokumenten sehr viel Arbeit und Zeit sparen. Gerade bei sich wiederholenden Elementen (Bilder, Tabellenzeilen, etc.) sollte man eigene Befehle auf die Art definieren, daß zu ändernde Parameter nicht mehr im eigentlichen Dokument erscheinen. Die Anweisungen, die durch einen eigenen Befehl ausgeführt werden sollen, können dabei beliebig kompliziert bzw. umfangreich sein.

Nach oben

Stand: 19.12.2014