-FAQ

Diese FAQ dienen als begleitende und ergänzende Informationen zu den -Beispielen des Monats.

1. Welche Struktur hat ein -Dokument?

Grundsätzlich besteht ein -Dokument aus zwei Teilen:

  1. Der Präambel, in der mindestens die Dokumentklasse geladen wird und in der Regel auch weitere Pakete. Außerdem sollten globale Einstellungen und (Befehls‑)Definitionen hier vorgenommen werden. Sie beginnt mit \documentclass{klasse} und endet vor \begin{document}.
  2. Dem Dokumentkörper oder Dokumentinhalt, in dem der eigentliche Textinhalt des Dokumentes steht. Er beginnt mit \begin{document} und endet mit \end{document}.

Alles, was nach \end{document} steht wird vollständig ignoriert.

2. Welche Dokumentklasse soll ich verwenden?

Die Wahl der Dokumentklasse hängt davon ab, welche Inhalte das Dokument haben soll. Für die meisten Anforderungen gibt es bereits Standardklassen, wobei ich empfehle, den KOMA-Script-Klassen den Vorzug zu geben, weil diese wesentlich mehr Möglichkeiten bieten. Man erkennt die KOMA-Script-Klassen am scr zu Beginn des Namens.

Es gibt natürlich noch weit mehr Klassen, die beispielsweise von Hochschulen oder Verlagen zur Verfügung gestellt werden.

3. Wozu brauche ich inputenc und fontenc?

Das Paket inputenc sorgt dafür, dass die Kodierung der Datei – das ist die Art, wie einzelne Zeichen in der Datei gespeichert werden – kennt und richtig interpretiert. Dabei sollte die dem Paket angegebene Kodierung natürlich mit der im Texteditor beim Speichern des Dokuments eingestellten übereinstimmen. Heute können Dokumente problemlos im Unicode (UTF-8) gespeichert werden, was mit der Option utf8 angeben wird. Eine etwas ältere Alternative ist Latin 1 (ISO 8859-1), die mit latin1 angegeben wird.

Das Paket fontenc ist notwendig, um auf eine Schriftkodierung – das ist die Angabe darüber, wie die einzelnen Buchstaben in einer Schriftdatei gespeichert sind – umzuschalten, die zum Beispiel auch Umlaute unterstützt. Für unseren Sprachraum ist die korrekte Kodierung T1.

Diese beiden Pakete ermöglichen also die einfache Verwendung von Umlauten und Co, so dass die umständliche Eingabe von Umlauten mit \"a oder ähnlichen Konstrukten, die man vielerorts noch liest und leider auch vorgeschlagen bekommt, heute nicht mehr nötig ist.

Siehe auch den Artikel „Mythos Eingabecodierung“ von Markus Kohm.

4. Was macht das Paket lmodern?

Das Paket lmodern lädt die Schriften der Latin Modern-Sammlung, die eine leichte Überarbeitung und Verbesserung der Standardschriften Computer Modern sind. Sofern keine andere Schrift gewünscht ist, sollte dieses Paket immer geladen werden.

5. Wozu dient das Paket babel?

Das Paket babel dient zum einen dazu, die zur Dokumentsprache gehörigen Silbentrennmuster zu laden, und sorgt außerdem dafür, das Textvariablen wie die Überschrift des Inhaltsverzeichnis in der richtigen Sprache ausgegeben werden. Die gewünschte Sprache wird in der Regel nicht direkt als Paketoption, sondern als Klassenoption angegeben, damit sie ggf. auch von anderen Paketen erfasst werden kann.

Für deutsche Texte (mit Silbentrennung nach neuer Rechtschreibung) verwendet man die Option ngerman. Darüber hinaus stellt babel für mache Sprachen Shortcuts, etwa für Anführungszeichen, zur Verfügung.

6. Warum werden Zeilenenden mit % geschrieben?

In Befehlsdefinitionen sieht man häufig, dass Zeilenenden auskommentiert werden, eine Zeile also mit % endet. Das ist notwendig, um unerwünschte Leerzeichen zu vermeiden. Normalerweise fasst mehrfache Leerzeichen und Zeilenenden zu einem einzigen Leerzeichen zusammen; dieser Mechanismus kann aber nicht greifen, wenn diese in einer Befehlsdefinition „versteckt“ sind, weshalb man Zeilenenden hier explizit auskommentiert.

7. Was ist eine Gruppe?

Eine Gruppe ist ein Gültigkeitsbereich für verschiedene Änderungen, die man in einem Dokument vornehmen kann. Beispielsweise schaltet der Befehl \itshape auf kursive Schrift um. Diese Änderung gilt bis zum Ende des Dokumentes oder eben bis zum Ende der aktuellen Gruppe.

Eine Gruppe kann einfach durch geschweifte Klammern erzeugt werden, sofern diese Klammern nicht das Argument eines Befehls sind, in dem Fall bräuchte man doppelte Klammern:

In diesem Text steht {\itshape eine} Gruppe.
\newcommand{\befehl}{{\itshape mit Gruppe}}

Außerdem sind alle Umgebungen automatisch Gruppen.

Anmerkung: Statt {\itshape Text} sollte man \textit{Text} oder \emph{Text} verwenden, wenn man nur kurze Passagen auszeichnen will.

8. Wie kann ich die Schriftgröße ändern?

Die Grundschriftgröße des Dokumentes stellt man bei KOMA-Script-Klassen mit der Option fontsize ein, z. B. \documentclass[fontsize=10.5pt]{scrbook}.

Im Dokument wird die Schriftgröße normalerweise implizit durch die Verwendung von Befehlen wie \chapter etc. geändert. Für eine manuelle Änderung gibt es verschiedene Größenschalter: \tiny, \scriptsize, \footnotesize, \small, \normalsize, \large, \Large, \LARGE, \huge und \Huge. Welche davon tatsächlich definiert sind und wie die Größen sich zueinander verhalten, hängt von der Dokumentklasse ab. Übrigens gibt es keine Umgebungen wie {large} o. ä. und auch \small{Text} ist Quatsch!

Bei einem manuellen Wechsel der Schriftgröße ist darauf zu achten, dass der Abstz immer beendet wird, solange die Größe noch gilt, da andernfalls die falsche Größe zur Bestimmung des Zeilenabstandes heranzieht. In der Praxis bedeutet dies, dass, wenn ein Schalter in einer Gruppe steht, selbige das Absatzende (Leerzeile oder \par) beinhalten muss; z. B.

{\Huge Hier steht großer Text.\par}

Ein ausführliches Beispiel können Sie hier herunterladen: fontsize-in-tex.zip. Darin wird auch erklärt, wie man eigene Schriftgrößenschalter definiert und wie man die Schriftgröße als Zahl eingeben kann.

9. Was macht \makeatletter?

Grundsätzlich können wir zwei Ebenen von Befehlen unterscheiden: 1. Die Benutzerbefehle, die für alle Anwender im ganzen Dokument verfügbar sind, und 2. den „internen“ Befehlen, die nur Klassen- und Paketentwicklern zur Verfügung stehen sollen. Diese Unterscheidung stellt gewissermaßen einen Schutz dar.

Technisch wird diese Unterscheidung umgesetzt, in dem interne Befehle ein @ im Namen tragen, während Benutzerbefehle dies nicht drüfen. Versucht man in einem normalen Dokument beispielsweise den Befehl \internes@komando aufzurufen, wird dieser als der Befehl \internes gefolgt von normalen Buchstaben @komando interpretiert und folglich eine Fehlermeldung, dass \internes nicht definiert sei, ausgegeben.

Dennoch ist es manchmal nötig (oder sinnvoll), auch in normalen Dokumenten auf interne Befehle zurückgreifen zu können, etwa um sie für eigene Definitionen zu verwenden oder auch auf Dokumentebene die genannte Unterscheidung umsetzen zu können. In diesem Fall kann man mit \makeatletter das @ sozusagen freischalten. Allerdings sollte diese Änderung nach der Verwendung der internen Befehle unbedingt mit \makeatother wieder rückgängig gemacht werden.

10. Wie benutzt man \newcommand?

Mit \newcommand kann man in eigene Befehle definieren. Der Befehl hat die Syntax

\newcommand{Name}[Arg][oArg]{
   Definition
}

Dabei gibt es drei Möglichkeiten für Argumente: Der zu definierende Befehl (im den folgenden Beispielen \test) hat …

  • keine Argumente: Beide optionalen Argumente von \newcommand weglassen, bspw. \newcommand{\test}{Test}.
  • nur obligatorische Argumente: mit dem optionalen Argument von \newcommand die Anzahl der Argumente des zu definierenden Befehls angeben, bspw. \newcommand{\test}[2]{Test: #1 u. #2} für zwei Argumente.
  • ein optionales Argument und evtl. weitere obligatorische: mit dem ersten optionalen Argument von \newcommand die Anzahl der Argumente des zu definierenden Befehls angeben und mit dem zweiten optionalen Argument von \newcommand den Standardwert für das optionale Argument des zu definierenden Befehls, bspw. \newcommand{\test}[1][Standard]{#1-Test} für \test mit nur einem optionalen Argument oder \newcommand{\test}[2][Test]{#2-#1} für \test mit einem optionalen und einem obligatorischen Argument.

Innerhalb der Definition kann mit #n auf die Argumente des zu definierenden Befehls zugegriffen werden und insgesamt sind neun Argumente möglich. Außerdem gibt es die Möglichkeit, die Sternform \newcommand* zu benutzen, dann dürfen die Argumente keine Absätze enthalten.

Neben \newcommand gibt es noch \renewcommand, um einen existierenden Befehl neu zu definieren, und \providecommand, um einen Befehl zu definieren, wenn dieser bisher nicht definiert wurde.

11. Wie benutzt man \NewDocumentCommand?

\NewDocumentCommand dient dazu, neue Befehle zu definieren. Er ist ein alternativer Befehl zu \newcommand und wird durch das Paket xparse zur Verfügung gestellt. Sein Vorteil ist, dass die Syntax zur Definition von Argumenten einfacher und gleichzeitig flexibler ist als bei \newcommand.

\NewDocumentCommand hat drei Argumente, von denen das erste der Name, der zweite die Argumente und das dritte schließlich die eigentliche Definition des neuen Befehls angibt:

\NewDocumentCommand{Name}{Argumente}{
    Definition
}

Dabei werden die Argumente durch Buchstaben angegeben (weitere Argumenttypen sind in der Anleitung beschrieben):

  • m = obligatorisches Argument (engl. mandatory)
  • o = optionales Argument ohne Standardwert
  • O{Wert} = optionales Argument mit Standardwert
  • s = Stern (*)

Dabei dürfen die Argumente grundsätzlich keine Absätze enthalten, es sei denn man stellt dem Buchstaben ein Plus, etwa +m, voran. Im Gegensatz zu \newcommand kann hier also für jedes Argument einzeln entschieden werden.

Ein Befehl mit einem optionalen und zwei obligatorischen Befehlen könnte beispielsweise so definiert werden:

\NewDocumentCommand{\beispiel}{ o m m }{
    Definition
}

Wie bei \newcommand greift man innerhalb der Definition mit #1, #2, … auf die Argumente zurück und es gibt die analogen Befehle \RenewDocumentCommand und \ProvideDocumentCommand.

12. Welche Einheiten kennt ?

  • sp: Skalierter Punkt (Scaled Point; 1 sp = 1/65536 pt)
  • pt: Punkt (1 pt = 1/72,27 in)
  • bp: Großpunkt (Big Point; 1 bp = 1/72 in)
  • dd: Didot-Punkt (1157 dd = 1238 pt)
  • mm: Millimeter
  • pc: Pica (1 pc = 12 pt)
  • cc: Cicero (1 cc = 12 dd)
  • cm: Zentimeter
  • in: Zoll (Inch; 1 in = 2,54 cm)

Des Weiteren gibt es noch drei relative Einheiten, die jweweils von der Schriftart und -größe abhängig sind:

  • em: Geviert (ca. Schriftgröße / Breite des M)
  • ex: x-Höhe (ca. Höhe des x)
  • mu: Matheeinheit (Math Unit; 1 mu = 1/18 em)

Ein Beispiel mit mehr Informationen und einem visuellen Vergleich der verschiedenen Einheiten können sie hier herunterladen: units-in-tex.zip.

13. Was ist eine Länge / ein Längenbefehl?

Eine Länge oder auch ein Längenbefehl/‑register repräsentiert in eine Maßangabe wie 10 mm, 12 pt etc., wobei diese intern immer in Punkt (pt) gespeichert werden.

\newlength{\laenge}

erzeugt eine neue Länge, die den Wert 0 pt hat. Dieser kann auf verschiedene Arten geändert werden:

  • \setlength{\laenge}{10mm} setzt den Wert der Länge
  • \addtolength{\laenge}{10mm} ändert den Wert der Länge (auch negative Werte sind erlaubt)
  • \settowidth{\laenge}{lang} misst die Breite von lang und setzt die Länge
  • \settoheight{\laenge}{lang} misst die Höhe von lang, ab der Grundlinie (also ohne den „Schwanz“ vom g – die Unterlänge) und setzt die Länge
  • \settodepth{\laenge}{lang} misst die Tiefe von lang unter der Grundlinie (also nur die Unterlänge) und setzt die Länge

Dabei versteht Längenangaben unter anderem in den ihm bekannten Einheiten sowie in der Form von 2.3\laenge oder -\laenge. Für komplexere Berechnungen kann das Paket calc benutzt werden.

Neben den normalen, gibt es auch noch flexible Längen (im engl. Glue), die in einem definierten Rahmen gedehnt oder gestaucht werden können, beispielsweise, um eine Zeile im Blocksatz zu füllen. Diesen Rahmen gibt man durch die Schlüsselwörter plus und/oder minus an:

\setlength{\laenge}{10mm plus 20mm minus 5mm}

Ein Abstand, der die \laenge zugewiesen bekommt, ist im optimal Fall genau 10 mm lang, kann bei Bedarf aber auf 5 mm schrumpfen bzw. auf 30 mm wachsen.

14. Was macht \newif?

Mit \newif wird eine sogenannte Bool’sche Variable erzeugt, die entweder den Wert wahr (true oder auch 1) oder falsch (false oder 0) haben kann. Man kann damit also eine Fallunterscheidung treffen.

Dem Befehl \newif folgt der Name der anzulegenden Variable, wobei es üblich, aber nicht zwingend ist, diesen mit if zu beginnen. Gleichzeitig werden damit auch zwei Befehle definiert, um den Status der Variable zu ändern. Beispielsweise erzeugt \newif\ifquestion gleichzeitig auch \questiontrue und \questionfalse, mit denen der Zustand der Variable geändert werden kann. Diese beiden Namen werden aus dem Namen des if-Befehls gebildet, wobei die ersten zwei Buchstaben abgeschnitten werden; damit ist auch einleuchtend, warum man in der Regel ein if voranstellt.

Um nun je nach Status der Variable unterschiedlichen Code auszuführen, verwendet man

\ifquestion
   Code für wahr-Fall ...
\else
   Code für falsch-Fall ...
\fi

oder wenn nur im wahr-Fall etwas ausgeführt werden soll

\ifquestion
   Code für wahr-Fall ...
\fi

(Man beachte, dass ein \if… mit dem umgedreht geschriebenen \fi beendet wird.)

Eine neue Variable ist standardmäßig auf falsch gesetzt.

15. Was ist \dimexpr?

Normalerweise kann an Stellen, an denen eine Längenangabe erwartet wird, nur mit absoluten Werten, bspw. 297mm oder 11pt, sowie einem Längenbefehl, bspw. \baselineskip umgehen. Mithilfe von \dimexpr kann man an diesen Stellen aber auch einfache Berechnungen ausführen.

\setlength{\test}{%
   \dimexpr 10pt + 4mm + 3\baselineskip \relax
}

Die Berechnung kann Addition und Subtraktion sowie Faktoren vor Längenbefehlen enthalten, aber keine Division. Es ist ratsam, sie immer mit \relax zu beenden.

16. Was bedeutet Shell Escape bzw. Write 18?

Für manche Aufgaben kann es sinnvoll (oder erforderlich) sein, dass beim Kompilieren weitere (Kommandozeilen-)Programme ausführen darf. Je nach verwendeter Distribution sind die dazu nötigen Optionen etwas anders.

Bei Live heißt die Option -shell-escape. Um pdflatex den Zugriff auf die Kommandozeile zu ermöglichen verwendet man beispielsweise

pdflatex -shell-escape datei.tex

Bei MikTeX heißt die Option -enable-write18. Um pdflatex den Zugriff auf die Kommandozeile zu ermöglichen verwendet man beispielsweise

pdflatex -enable-write18 datei.tex