itemize

Der Aufzählungspunkt, den itemize in LaTeX an den Zeilenanfang setzt, neigte sich früher mit, sobald er in kursivem Text stand – das Zeichen übernahm einfach die gerade gültige Schrift. Erst die Release vom 2020-02-02 brachte den Befehl \labelitemfont und beendete dieses Verhalten. Der Punkt einer Aufzählung ist also kein Ornament, sondern ein Zeichen, das wie jedes andere gesetzt wird. Diese Seite nähert sich itemize aus drei Richtungen: wo diese Markierungen definiert sind, was beim Ersetzen einer einzelnen Markierung durch \item[...] geschieht und welche zwei Längen den Abstand zwischen den Einträgen bestimmen.

Wo der Aufzählungspunkt definiert ist: \labelitemi bis \labelitemiv

Die Markierungen stecken gar nicht in der Umgebung itemize, sondern in der Dokumentklasse. In article.cls stehen vier Befehle nebeneinander, \labelitemi bis \labelitemiv, die der Reihe nach \textbullet (•), ein fettes \textendash (–), \textasteriskcentered (*) und \textperiodcentered (·) enthalten. itemize selbst zählt lediglich die aktuelle Tiefe, setzt daraus den Namen \labelitem plus römische Ziffer zusammen und ruft auf, was dieser Name enthält. Eine Markierung zu ändern heißt deshalb nie, an der Umgebung zu arbeiten – man ersetzt den Befehl. Und dass nach der vierten Ebene nichts mehr kommt, hat denselben schlichten Grund: Ein fünfter Name wurde nie definiert.

BefehlEbeneMarkierungInhalt in article.cls
\labelitemi1\labelitemfont \textbullet
\labelitemii2\labelitemfont \bfseries \textendash (fett)
\labelitemiii3*\labelitemfont \textasteriskcentered
\labelitemiv4·\labelitemfont \textperiodcentered
\labelitemfont\normalfont; trennt die Markierung von der umgebenden Schrift

Die letzte Zeile, \labelitemfont, ist die eingangs erwähnte Korrektur von 2020. Alle vier Markierungen werden mit ihr davor aufgerufen, sodass eine Liste innerhalb eines kursiven oder fetten Blocks ihre Markierung heute aufrecht behält. Das lässt sich auch ausnutzen, um die Markierungen in einer ganz anderen Schrift zu setzen: \renewcommand{\labelitemfont}{\normalfont\sffamily} lässt den Fließtext serif und die Markierungen serifenlos erscheinen. Um die Markierung einer ganzen Ebene auszutauschen, wird das passende \labelitem… mit \renewcommand überschrieben. In der Präambel wirkt das im ganzen Dokument, innerhalb einer Umgebung oder Gruppe nur dort.

latex
% swap the first-level marker for the whole document
\renewcommand{\labelitemi}{$\diamond$}

\begin{itemize}
  \item this level now uses a diamond
  \item so does this one
\end{itemize}

Die Markierung eines einzelnen Eintrags mit \item[...] ersetzen

Erhält \item ein Argument in eckigen Klammern, bekommt genau dieser Eintrag den Klammerinhalt als Markierung. \item[$\star$] ergibt einen Stern, \item[--] einen Strich, \item[Note] das Wort „Note“ an der Stelle des Aufzählungspunkts. Ein verbreiteter Irrtum sei hier korrigiert: eine Klammerbeschriftung in itemize wird nicht fett gesetzt. Fett wird sie in der Umgebung description, deren \descriptionlabel tatsächlich ein \bfseries enthält. Die Beschriftungsroutine von itemize besteht nur aus \hss\llap{…} – sie richtet rechtsbündig aus und rührt die Schrift nicht an.

latex
\begin{itemize}
  \item the default marker
  \item[$\star$] a star for this one entry
  \item[Note] a whole word in the marker slot
\end{itemize}

Dieses \llap schafft zugleich eine Falle. Die Beschriftung wird rechtsbündig in eine Box der Breite \labelwidth gesetzt, und \llap läuft lautlos über. \item[Note] passt bequem, doch ein langes Wort wie \item[Prerequisite] schiebt sich nach links über den Satzspiegel hinaus und im schlimmen Fall ganz aus dem bedruckten Bereich. Der Zeilenfall bleibt heil, eine Warnung Overfull \hbox erscheint nicht – nichts weist darauf hin, bis das PDF vor einem liegt. Wer Wörter als Beschriftung braucht, ist bei description richtig und nicht bei itemize; mit enumitem lässt sich über labelwidth= und leftmargin= Platz reservieren.

Wenn die Einträge zu weit auseinanderstehen: \itemsep und \parsep

Der Abstand zwischen zwei Einträgen ist nicht eine Länge, sondern die Summe zweier. Vor dem nächsten Eintrag fügt \item zunächst \itemsep ein; unmittelbar danach beginnt ein neuer Absatz, der zusätzlich \parskip beisteuert – und innerhalb einer Liste ist \parskip auf \parsep gesetzt. Der tatsächliche Abstand beträgt also \itemsep + \parsep. In einem article mit 10pt sind beide auf Ebene 1 gleich 4pt, zusammen 8pt; bei einem Zeilenabstand von 12pt entspricht das zwei Dritteln einer Zeile Luft zwischen den Einträgen. Genau das sieht man meist, wenn eine Liste „auseinandergezogen“ wirkt, und darum schließt das Nullsetzen von \itemsep allein nur die halbe Lücke.

LängeStandardwert Ebene 1 (article, 10pt)Wirkungsort
\itemsep4pt plus 2pt minus 1ptder Abstand, den \item vor dem nächsten Eintrag einfügt
\parsep4pt plus 2pt minus 1ptzwischen Absätzen eines Eintrags; wird zugleich zu \parskip und wirkt so auch zwischen Einträgen
\topsep8pt plus 2pt minus 4ptder Abstand ober- und unterhalb der ganzen Liste
\partopsep2pt plus 1pt minus 1ptkommt nur dann zu \topsep hinzu, wenn eine Leerzeile vorausgeht

Die letzte Zeile beschreibt ein Verhalten, über das jede und jeder mindestens einmal stolpert. Ob vor \begin{itemize} eine Leerzeile steht oder nicht, ändert den Abstand über der Liste von 8pt auf 10pt: Eine Leerzeile lässt die Liste im vertikalen Modus beginnen, und genau dann wird \partopsep addiert. Wer eine Quelldatei nur neu umbricht und danach ein verschobenes Seitenbild vorfindet, ist meist hier gelandet. Auch die Zahlen selbst haben einen Haken – es sind Gummilängen mit plus- und minus-Anteil, die beim Seitenumbruch auf 6pt schrumpfen oder auf 12pt wachsen können. Die notierten Werte erscheinen nicht unverändert auf dem Papier. Tiefere Ebenen werden zudem automatisch enger: Auf Ebene 2 betragen \itemsep und \parsep je 2pt, auf Ebene 3 fällt \parsep auf 0pt. Dass verschachtelte Listen kompakter wirken, ist so gewollt.

latex
% tighten one list by hand: inside the body it is \parskip,
% not \parsep, that still carries the second half of the gap
\begin{itemize}
  \setlength{\itemsep}{0pt}
  \setlength{\parskip}{0pt}
  \item first
  \item second
  \item third
\end{itemize}

Zu beachten ist, dass dort \parskip auf null gesetzt wird und nicht \parsep. Die Kopie von \parsep nach \parskip ist bereits erfolgt, wenn \begin{itemize} zurückkehrt; wer \parsep erst im Rumpf ändert, lässt die zweiten 4pt stehen. Messbar auf der Seite: Die voreingestellten 19,93pt von einem Eintrag zum nächsten sinken beim Nullsetzen von \parsep nur auf 15,94pt und erreichen erst mit \parskip gleich null die 11,96pt – genau eine Zeile. Statt das jedes Mal zu wiederholen, lädt man besser enumitem und übergibt [noitemsep] (setzt \itemsep und \parsep auf null) oder [nosep] (zusätzlich \topsep und \partopsep); mit \setlist wird daraus die dokumentweite Voreinstellung. Verwandt ist die Klage, Listen brächen an unpassenden Stellen um. Das ist Absicht, kein Zufall: Die Klasse article setzt \@itempenalty auf −51. Eine negative Penalty sagt nicht „hier darf umbrochen werden“, sondern „hier soll umbrochen werden“ – LaTeX behandelt die Naht zwischen zwei Einträgen also aktiv als guten Seitenschluss. Eine Liste, die zusammenbleiben muss, ist ausdrücklich festzuhalten: in eine minipage gepackt oder mit \samepage zusammengebunden.

Die zwei Fehler rund um \item

Ein itemize darf nicht leer sein. Wird \begin{itemize}\end{itemize} ohne ein einziges \item geschlossen, bricht der Lauf mit ! LaTeX Error: Something's wrong--perhaps a missing \item. ab. In der Praxis erscheint die Meldung seltener wegen eines vergessenen \item als deshalb, weil Fließtext oder ein Bild direkt an den Listenanfang geraten ist. Die Stelle unmittelbar nach dem Öffnen gilt als reserviert: Dorthin gehört nur ein \item oder eine Einstellung von Abständen und Längen. Auch der umgekehrte Fehler existiert. Ein \item außerhalb jeder Liste ergibt ! LaTeX Error: Lonely \item--perhaps a missing list environment. – meist nach einem \end{itemize} zu viel oder nach dem Kopieren eines Blocks mit \item, dessen \begin zurückblieb. Beide Meldungen benennen die Ursache direkt; es genügt, über die Zeilennummer zu prüfen, ob die umgebenden \begin und \end noch zusammenpassen.

Wann eine Aufzählung berechtigt ist – und wann nicht

itemize ist keine Prosa ohne Bindewörter, sondern ein Mittel, Einträge nebeneinander vergleichbar zu machen. Das Fehlen von Nummern ist selbst eine Aussage an die Lesenden: Diese vier Dinge haben weder Reihenfolge noch Rangfolge. Stehen dort Einträge, die sich in Umfang, Tonfall und Länge stark unterscheiden, sucht das Auge nach einer Vergleichsachse, die es nicht gibt. Umgekehrt gehört die Liste in dem Moment zu enumerate, in dem Reihenfolge oder Priorität Bedeutung gewinnen; eine Reihe von Punkten, die insgeheim eine Abfolge kodiert, liest sich am schwersten. Es folgt eine Checkliste für das erneute Lesen des eigenen Entwurfs.

  • Die Grammatik parallel halten. Ist der erste Eintrag eine Nominalphrase, sollen es alle sein; steht einer im Imperativ, dann alle.
  • Zu Absätzen zurückkehren, wenn die Einträge wachsen. Läuft jeder über drei Sätze hinaus, ist das Fließtext mit Zwischenüberschriften und keine Liste.
  • Höchstens zwei Ebenen verschachteln. LaTeX erlaubt vier, doch Lesende folgen meist nur zweien.
  • Zu enumerate wechseln, sobald die Reihenfolge zählt. Der Wunsch, „zuerst“ und „dann“ zu schreiben, ist das Signal für eine nummerierte Liste.
  • Eine Markierung nur ändern, wenn sie etwas bedeutet. \item[$\star$] hebt einen Eintrag hervor, es schmückt ihn nicht.