description

Die Umgebung description in LaTeX ist die dritte der drei Listenarten, neben itemize und enumerate – doch ihr Entwurf ist ein völlig anderer. Schlägt man die Definition in den Standardklassen auf, so setzt description \labelwidth auf 0pt und \itemindent auf minus \leftmargin. Die Spalte, die den Begriff aufnimmt, hat also gar keine Breite – und das mit Absicht. Diese eine Zeile erklärt zugleich die Stärke von description (ein Begriff beliebiger Länge lässt sich setzen) und sein bekanntestes Ärgernis (ein langer Begriff schiebt die Erklärung zur Seite). Diese Seite betrachtet, wofür die Umgebung eigentlich da ist, woher der Fettdruck stammt und wie style= aus enumitem dieses Schieben in den Griff bekommt.

Wofür description eigentlich da ist

description gibt es, um Paare aus einem Wort und der Erklärung dieses Wortes zu setzen. Während itemize und enumerate die Markierung von sich aus liefern – einen Punkt, eine Zahl –, erwartet description, dass man das Etikett in Worten angibt: Was im optionalen Argument [...] von \item steht, wird zum Begriff. In itemize und enumerate ist dieses [...] eine Nebenfunktion, um die Markierung eines einzelnen Eintrags zu ersetzen; in description ist es der eigentliche Zweck. Glossare, Optionsübersichten, Parameterdokumentation, ein Personenverzeichnis – wo immer die Struktur „ein Name, an dem eine Erklärung hängt“ lautet, ist dies die richtige Umgebung.

latex
\begin{description}
  \item[TeX] The typesetting system Knuth wrote.
  \item[LaTeX] A document language built on top of TeX.
  \item[CTAN] The worldwide archive network that distributes packages.
\end{description}

Diese Struktur entspricht genau der Definitionsliste <dl> / <dt> / <dd> in HTML. description zu wählen bedeutet daher mehr als eine Frage des Aussehens: Man erklärt im Manuskript, dass hier eine Definition steht, und Konvertierungswerkzeuge wie Registergeneratoren können diese Absicht lesen. Setzt man dasselbe von Hand als \textbf{Begriff}\quad Erklärung, mag das Druckbild ähneln – die strukturelle Information ist dahin. Wie bei itemize und enumerate ist mindestens ein Eintrag erforderlich; wird die Umgebung leer geschlossen, erscheint ! LaTeX Error: Something's wrong--perhaps a missing \item.

Woher der Fettdruck stammt (\descriptionlabel)

Ein Begriff erscheint nicht wegen \item[...] fett, sondern wegen eines Befehls, der allein zu description gehört: \descriptionlabel. Seine Definition in den Standardklassen ist die einzige Zeile \hspace\labelsep \normalfont\bfseries #1 – dort steht das \bfseries. Der Unterschied lässt sich prüfen: Schreibt man \item[Word] innerhalb eines itemize, so bettet das entstehende PDF nur die Antiqua des Textes ein; eine fette Schrift kommt gar nicht vor. \item[...] ersetzt lediglich die Markierung und hat keinerlei Macht, etwas fett zu setzen. Der Fettdruck in einer description entsteht erst dadurch, dass die Umgebung \descriptionlabel an \makelabel übergibt.

Wer also nur die Schrift ändern möchte, ohne enumitem, definiert am geradesten \descriptionlabel mit \renewcommand neu; sein Argument #1 ist der Begriff. Die folgende Fassung setzt jeden Begriff in Kapitälchen und behält das führende \hspace{\labelsep} bei, damit der Abstand der ursprünglichen Definition entspricht. Ersetzt man \textsc durch \texttt (dicktengleich) oder \textit (kursiv), ergibt sich ein anderes Bild. Zu beachten ist außerdem: Während itemize seine Markierung und enumerate seine Nummernform mit der Tiefe wechselt, behält description auf jeder Verschachtelungsebene denselben Begriffsstil bei. Es gibt nur ein \descriptionlabel, weshalb diese Neudefinition für alle Ebenen des Dokuments gleichermaßen gilt.

preamble
% the standard-class definition is:
%   \newcommand*\descriptionlabel[1]{\hspace\labelsep \normalfont\bfseries #1}
\renewcommand{\descriptionlabel}[1]{%
  {\hspace{\labelsep}\textsc{#1}}}

Warum ein langer Begriff den Text verschiebt: labelwidth ist null

Ein langer Begriff bricht nicht um, sondern schiebt die erste Zeile der Erklärung um seine eigene Breite nach rechts. Ursache ist eine einzige Verzweigung in latex.ltx: Ist die Etikettenbox breiter als \labelwidth\ifdim \wd\@tempboxa >\labelwidth –, gibt LaTeX die Box fester Breite auf und setzt das Etikett in seiner natürlichen Breite. Und da description \labelwidth auf 0pt setzt, nimmt selbst das kürzeste Wort stets diesen Zweig. Ein Begriff in description steht also überhaupt nie in einer Spalte fester Breite. Gemessen in article: \labelwidth 0pt, \itemindent −25,00003pt (also −\leftmargin), \labelsep 5pt.

Gesetzt und nachgemessen, steht nach dem Begriff stets eine Lücke von 5pt – genau \labelsep –, und sie landet an derselben Stelle, ob man \item[Term]body eng oder \item[Term] body mit Leerzeichen schreibt. Die Lücke erzeugt \labelsep, nicht der Leerraum im Quelltext; enges Schreiben hilft also nicht. Ab der zweiten Zeile fällt der Text auf \leftmargin (25pt) zurück, sodass Begriff und zweite Zeile der Erklärung keine gemeinsame linke Kante haben und der Eintrag treppenförmig wirkt. Treibt man es weit genug – ein Begriff breiter als der Textblock –, läuft er mit einer Overfull \hbox-Warnung in den rechten Rand. Die praktische Regel: Sobald ein Begriff über drei, vier Wörter hinausgeht, ändert man mit dem im Folgenden beschriebenen style= den Satz selbst.

Den Satz mit font= und style= aus enumitem ändern

Mit geladenem enumitem lassen sich Optionen unmittelbar an description übergeben: font= bestimmt die Schrift des Begriffs, style= die Anordnung von Begriff und Text selbst. font=\sffamily\bfseries ergibt fette Grotesk, font=\ttfamily eine dicktengleiche Schrift – kürzer als das Umschreiben von \descriptionlabel und je Liste veränderbar, worin der eigentliche Vorteil liegt. Die mit den anderen Listenarten gemeinsamen Schlüssel wie leftmargin=, labelsep= und itemsep= funktionieren unverändert. Das Schiebeproblem des vorigen Abschnitts löst style=.

Wert von styleVerhalten bei langem Begriff
standardWie in den Standardklassen: Das Etikett steht in einer Box, und was übersteht, schiebt den Text nach rechts
unboxedNahe an standard, doch das Etikett steht in keiner Box; ein langer Begriff wird nicht eingeengt und darf umbrechen
nextlinePasst das Etikett nicht in den Rand, beginnt der Text in der nächsten Zeile; der Text greift nie in den linken Rand
samelineWie nextline, doch wenn das Etikett nicht passt, läuft der Text dennoch in derselben Zeile weiter
multilineBricht den Begriff innerhalb der labelwidth um, trennt notfalls, und hält den Text rechts davon bündig

Setzt man denselben langen Begriff unter allen fünf Werten von style=, treten die Unterschiede klar hervor. Bei nextline fällt der Text nach einem langen Begriff in die folgende Zeile, bei sameline läuft er in derselben weiter. Bei einem kurzen Begriff halten beide den Text in derselben Zeile – der Unterschied zeigt sich also nur, wenn der Begriff nicht passt. Der auffälligste ist multiline: Er bricht einen langen Begriff innerhalb der labelwidth um, trennt notfalls und stapelt ihn senkrecht – nützlich in einem technischen Glossar mit langen Begriffen, wenn der Text eine gerade linke Kante behalten soll. Dann muss labelwidth= allerdings ausdrücklich angegeben werden, sonst fehlt die Breite zum Umbrechen; man gibt sie zusammen mit leftmargin= an.

document.tex
\usepackage{enumitem}
% one list only
\begin{description}[font=\bfseries\sffamily, style=nextline, leftmargin=1.5cm]
  \item[A term long enough to overrun its line]
    the explanation begins on the next line instead of being shoved sideways
  \item[Short] the explanation stays on this line
\end{description}

% or once in the preamble, for every description in the document
\setlist[description]{font=\sffamily\bfseries, style=nextline}

Die Falle der eckigen Klammern und das Weglassen des Etiketts

Da [ und ] das optionale Argument begrenzen, versteckt man sie in geschweiften Klammern, wenn eine Klammer als Zeichen erscheinen soll. Um die Zeichenklasse [a-z] eines regulären Ausdrucks zum Begriff zu machen, schreibt man \item[\texttt{[a-z]}]; eine schließende Klammer verlangt noch mehr Sorgfalt und wird als {]} gesetzt, etwa \item[Schließende Klammer {]}]. Der umgekehrte Fall ist ebenso heikel: Beginnt die Erklärung selbst mit [, so fasst man sie als \item {[}, sonst liest LaTeX dies als Anfang eines Etiketts. In einem Dokument über die Syntax einer Programmiersprache begegnet beides ständig.

latex
\begin{description}
  \item[\texttt{[a-z]}] a character class; brackets in a label need braces
  \item {[}this is how a body starting with a bracket is written
\end{description}

Lässt man das Etikett weg, hat der Eintrag schlicht keines – man erhält einen Eintrag wie einen hängenden Absatz, ohne Markierung und ohne Hinweis auf den Einzug. Da das Etikett der Sinn von description ist, sollte man das nur mit Absicht tun. Eine sinnvolle Vorgabe, auf die LaTeX zurückgreifen könnte, gibt es nicht – das Etikett anzugeben, bleibt also stets Sache der schreibenden Person. Noch eines: Ein Befehl zum Schriftwechsel, der in Deklarationsform in einem Etikett steht, überschreibt den voreingestellten Fettdruck; das Ganze in geschweifte Klammern zu fassen, wie in \item[{\ttfamily label}], ist daher die sichere Gewohnheit.

description oder zweispaltige Tabelle: was wählen

Die praktische Trennlinie lautet: Reichen die Erklärungen über eine Zeile hinaus, nimmt man description; sind die Werte kurz, gleichförmig und zum senkrechten Überfliegen gedacht, eine Tabelle. Zwei Spalten tabular scheinen für Begriff und Erklärung ideal, haben aber drei Schwächen. Erstens können sie nicht über Seiten umbrechen – man muss etwas wie longtable heranziehen. Zweitens muss man die Spaltenbreiten selbst festlegen, und ein festes p{5cm} bricht zusammen, sobald sich die Textbreite ändert. Drittens dehnt sich, je länger die Erklärungen werden, allein die rechte Spalte nach unten, bis die Grenze zwischen den Zeilen verschwindet. description kennt nichts davon: Es fließt natürlich als Absätze, bricht von selbst über Seiten um und richtet sich nach \textwidth.

Umgekehrt gilt: Trägt ein Wert mehrere Merkmale – Typ, Vorgabe, Wertebereich –, so liegt keine Definitionsliste mehr vor, sondern eine Tabelle. description taugt für eine strenge Eins-zu-eins-Zuordnung von Name und Erklärung, mehr nicht. Sobald man sich eine dritte Spalte wünscht, ist der Wechsel zu tabular die richtige Entscheidung; sie als \item[Name (Typ, Vorgabe)] hineinzuzwängen, verlängert nur den Begriff und führt geradewegs zurück zum Schiebeproblem von weiter oben.