Die vier Etiketten – die Markierungen –, die itemize in LaTeX auf den aufeinanderfolgenden Ebenen ausgibt, hat man meist als „•, -, , ·“ im Kopf. Schlägt man jedoch article.cls auf, so sind die letzten drei sämtlich etwas anderes als vermutet. Ebene 2 sind nicht zwei Bindestriche, sondern ein fetter Halbgeviertstrich (\labelitemfont \bfseries \textendash); Ebene 3 ist kein gewöhnliches Sternchen, sondern ein senkrecht zentriertes*, \textasteriskcentered; Ebene 4 ist \textperiodcentered. Etiketten anzupassen beginnt damit, zu wissen, was in diesen Makros wirklich steht. Diese Seite geht der Reihe nach die vier itemize-Markierungen durch, die Arbeitsteilung von \theenumi und \labelenumi in enumerate, die Zählerdarstellungsbefehle von \arabic bis \fnsymbol samt ihren Grenzen und die tatsächliche Obergrenze der Verschachtelung – also, wann ! LaTeX Error: Too deeply nested. wirklich erscheint.
Was die vier Standardmarkierungen von itemize wirklich sind
Die Markierungen von itemize stecken in vier Makros, je eines pro Ebene: \labelitemi, \labelitemii, \labelitemiii, \labelitemiv (die angehängten i / ii / iii / iv sind römische Ziffern für die Ebenen 1 bis 4). Ihre Definitionen in den Standardklassen zeigt die Tabelle unten; alle vier beginnen mit \labelitemfont – einem kleinen Haken, den article.cls als \normalfont definiert und der sicherstellt, dass die Markierung in der Textschrift erscheint, auch wenn der umgebende Text kursiv oder fett ist. Allein Ebene 2 lässt auf \labelitemfont noch ein \bfseries folgen, weshalb ihr Halbgeviertstrich fett gesetzt wird. Daher wirkt er kräftiger als seine Nachbarn.
| Makro | Definition in den Standardklassen | Was gedruckt wird |
|---|---|---|
\labelitemi | \labelitemfont \textbullet | • ein Punkt |
\labelitemii | \labelitemfont \bfseries \textendash | – ein fetter Halbgeviertstrich, keine zwei Bindestriche |
\labelitemiii | \labelitemfont \textasteriskcentered | ∗ ein senkrecht zentriertes Sternchen, eine andere Glyphe als * |
\labelitemiv | \labelitemfont \textperiodcentered | · ein Mittelpunkt |
Um die Markierung einer ganzen Ebene zu ändern, definiert man das zugehörige Makro mit \renewcommand neu und setzt es in die Präambel oder unmittelbar vor den gewünschten Bereich. Dabei ist zu beachten: Diese Makros wechseln nicht in den Mathematikmodus. Ohne selbst geschriebene Dollarzeichen, wie in $\diamond$, ist \diamond im Text unbrauchbar und löst einen Fehler aus. Übliche Alternativen sind $\diamond$ (◇), $\ast$ (∗), $\cdot$ (·) und $\triangleright$ (▷); mit dem Paket pifont kommen Ornamente wie \ding{"6C} hinzu. Man sollte es damit jedoch nicht übertreiben: Zu kunstvolle Markierungen erschweren das Unterscheiden der Ebenen, weshalb es meist ratsam ist, nur Ebene 1 zu ändern.
% the whole of level 1 becomes a diamond -- note the explicit math shift
\renewcommand{\labelitemi}{$\diamond$}
% or, with enumitem, the same thing scoped to one list
\begin{itemize}[label=$\diamond$]
\item this list only
\end{itemize}Das Etikett eines einzelnen Eintrags mit \item[...] ersetzen
Um die Markierung nur eines Eintrags zu ändern, gibt man unmittelbar nach \item ein Etikett in eckigen Klammern an: \item[$\star$] macht daraus einen Stern, \item[--] einen Strich. Und hier ist eine weitverbreitete Annahme zu berichtigen. Ein geklammertes Etikett wird nicht fett gesetzt. Schreibt man \item[Word] innerhalb eines itemize, so bettet das erzeugte PDF nur die Antiqua des Textes ein; eine fette Schrift kommt überhaupt nicht vor. Das \makelabel von itemize und enumerate ist als \hss\llap{...} definiert, das Etikett wird also lediglich rechtsbündig in seiner Box gesetzt und ragt bei Überbreite nach links hinaus – die Schrift bleibt unangetastet. Fett wird es allein in description, und nur weil \descriptionlabel ein \bfseries enthält.
\theenumi gegen \labelenumi: die Zahl und ihre Aufmachung
\theenumi entscheidet, wie die Zahl dargestellt wird – als 1, als I oder als a –, während \labelenumi entscheidet, wie diese Zahl am Zeilenkopf aufgemacht wird, mit umgebenden Klammern oder einem Punkt. enumerate verwendet je Ebene einen Zähler: enumi, enumii, enumiii, enumiv; \theenumi verwandelt dessen Wert in Zeichen, und \labelenumi ruft dies auf und fügt die Satzzeichen hinzu. Es ist ein zweistufiger Aufbau. Die Vorgaben der Standardklassen zeigt die Tabelle unten, und sie sind unsymmetrisch: Allein Ebene 2 erhält Klammern, alle übrigen einen Punkt.
| Zähler | Vorgabe \the… | Vorgabe des Etiketts | Am Zeilenkopf gedruckt |
|---|---|---|---|
enumi | \arabic{enumi} | \theenumi. | 1. 2. 3. … |
enumii | \alph{enumii} | (\theenumii) | (a) (b) (c) … |
enumiii | \roman{enumiii} | \theenumiii. | i. ii. iii. … |
enumiv | \Alph{enumiv} | \theenumiv. | A. B. C. … |
Der zweistufige Aufbau bewährt sich bei Querverweisen. \ref liefert die nackte Darstellung ohne die Aufmachung von \labelenumi, also \theenumi. Definiert man \labelenumi daher als (\theenumi), um am Zeilenkopf (1) zu drucken, gibt \ref weiterhin eine 1 ohne Klammern zurück; für „siehe Schritt (1)“ muss man die Klammern beim Verweis ergänzen oder ref= aus enumitem verwenden. Genauer gesagt baut LaTeX die Verweiszeichenkette, indem es \theenumi ein \p@enumi voranstellt, und die Standardklassen definieren \p@enumii als \theenumi sowie \p@enumiii als \theenumi(\theenumii). Deshalb kommt ein \ref auf einen Eintrag der Ebene 2 als „1a“ zurück und führt die Nummer der Elternebene mit. Wie Zähler überhaupt angelegt und hochgezählt werden, behandelt die Seite über Zähler und Längen.
% change only the representation: the head reads I. II. III. and \ref gives I
\renewcommand{\theenumi}{\Roman{enumi}}
% change only the dressing: the head reads (1) but \ref still gives a bare 1
\renewcommand{\labelenumi}{(\theenumi)}Die Zählerdarstellungsbefehle und ihre Grenzen
Um innerhalb von \theenumi oder \labelenumi das Aussehen einer Zahl zu wählen, dienen die sechs standardmäßigen Zählerdarstellungsbefehle von LaTeX. Jeder nimmt einen Zählernamen als Argument, wie in \Roman{enumi}, und druckt dessen Wert in der gewählten Form. Wesentlich ist, dass drei von ihnen eine Obergrenze haben: \alph und \Alph jenseits von 26 sowie \fnsymbol außerhalb von 1–9 halten mit ! LaTeX Error: Counter too large. an. Eine Liste mit 27 Einträgen und dem Etikett label=\alph* scheitert jedes Mal beim siebenundzwanzigsten.
| Befehl | Druckt | Bereich und Grenzen |
|---|---|---|
\arabic | 1, 2, 3 … (arabische Ziffern) | Keine Obergrenze; negative Werte erscheinen unverändert (−3 ergibt −3) |
\alph | a, b, c … (Kleinbuchstaben) | 1–26; ab 27 folgt Counter too large. Null ergibt stillschweigend nichts |
\Alph | A, B, C … (Großbuchstaben) | 1–26; dieselbe Grenze wie bei \alph |
\roman | i, ii, iii … (kleine römische Zahlen) | Fehlerfrei, doch null und darunter ergeben stillschweigend nichts |
\Roman | I, II, III … (große römische Zahlen) | Keine Obergrenze; 4000 erscheint als MMMM, schlicht durch Wiederholung von M |
\fnsymbol | * † ‡ § ¶ ‖ ** †† ‡‡ (Fußnotenzeichen) | Nur 1–9; ab 10 sowie null und darunter folgt Counter too large |
Heikel ist, dass manche Fälle laut und manche stumm scheitern. \alph{0} und \roman{0} liefern ohne ein Wort der Klage die leere Zeichenkette; ein Verweis auf einen noch bei null stehenden Zähler erzeugt daher eine Liste, deren Etiketten schlicht verschwunden sind, ohne jeden Hinweis auf die Ursache. \alph{27} hält immerhin mit Counter too large an. Die neun Zeichen von \fnsymbol – genau die Folge aus der Definition von \@fnsymbol – sind eine Fußnotenreihe; als Listenetiketten zweckentfremdet, brechen sie beim zehnten Eintrag zusammen. Man hebe sie für kurze Anmerkungslisten auf.
Mit label= aus enumitem schreiben: Etiketten aus Zählern bauen
Makros neu zu definieren ist mächtig, wird aber unhandlich, sobald die Gestaltung von Liste zu Liste verschieden ausfallen soll. Meist liest sich label= aus enumitem besser; man versuche es also zuerst. Innerhalb von label= stehen die Sternformen \arabic*, \alph*, \Alph*, \roman* und \Roman* für den aktuellen Zähler dieser Ebene. Das sternlose \arabic{...} bleibt daneben verwendbar, und die Mischung beider erlaubt es, ein Etikett aus einem anderen Zähler zu bauen: Mit label=\thesection.\arabic* werden die Einträge als „3.1“, „3.2“ nummeriert, mit der Abschnittsnummer davor, die beim Verschieben des Abschnitts von selbst nachzieht.
\usepackage{enumitem}
\setlist[enumerate,1]{label=\Roman*.} % level 1 becomes I. II. III.
\setlist[enumerate,2]{label=(\alph*)} % level 2 becomes (a) (b)
\setlist[itemize,1]{label=$\diamond$} % itemize level 1 becomes a diamond
% a label built from another counter
\begin{enumerate}[label=\thesection.\arabic*, leftmargin=*]
\item numbered 3.1 inside section 3
\end{enumerate}
% label*= accumulates onto the parent label: 1. then 1.1. 1.2.
\begin{enumerate}[label*=\arabic*.]
\item one
\begin{enumerate}[label*=\arabic*.]
\item one-point-one
\end{enumerate}
\end{enumerate}label*= hängt sich an das Etikett der Elternliste an, sodass sich beim Verschachteln 1., 1.1., 1.2. aufbauen – gesetzt und bestätigt. Zu beachten ist jedoch: Diese Verkettung gilt nur für das gedruckte Etikett; zu Querverweisen wird die Elternnummer nicht selbsttätig hinzugefügt. Für einen Verweis wie „1.a“ muss man ihn mit ref= ausschreiben, etwa ref=\theenumi.\alph*. Und wer ein breites Etikett übergibt, denke an leftmargin=*: Die voreingestellte Etikettenbox misst nur 20pt, sodass ein langes Etikett wie \thesection.\arabic* nach links hinausragt. Soll die Gestaltung durchgehend gelten, nennt man Typ und Ebene, wie in \setlist[enumerate,1]{...}.
Lädt man das Paket als \usepackage[shortlabels]{enumitem}, lässt sich zudem das knappe \begin{enumerate}[(1)] des alten Pakets enumerate schreiben. Ein A, a, I, i oder 1 als erstes Element in den Klammern bedeutet dann jeweils \Alph*, \alph*, \Roman*, \roman* oder \arabic*.
Too deeply nested: die tatsächliche Grenze der Verschachtelung
Oft heißt es, LaTeX-Listen ließen sich nur vier Ebenen tief verschachteln. Das ist nur halb richtig. Es gibt zwei getrennte Obergrenzen, und ein Blick in latex.ltx zeigt den Aufbau. itemize führt seine Tiefe in \@itemdepth, enumerate in \@enumdepth – zwei voneinander unabhängige Zähler –, und jede ruft \@toodeep auf, sobald der eigene Zähler 3 übersteigt. Die Vier-Ebenen-Grenze gilt also nur beim Stapeln derselben Umgebung. Darüber hinaus trägt \list selbst ein globales Tor, \ifnum \@listdepth >5, und dieses fragt nicht nach der Art der Listen.
Gesetzt geschieht genau das. Stapelt man fünf itemize-Umgebungen, so löst die fünfte ! LaTeX Error: Too deeply nested. aus; fünf enumerate-Umgebungen ebenso. Wechselt man jedoch itemize und enumerate ab, so erzeugen sechs Ebenen überhaupt keinen Fehler; erst die siebte tut es – und diesmal hält \@listdepth an. Die praktische Obergrenze lautet also: vier Ebenen derselben Art, sechs bei Abwechslung. Man nehme das jedoch als Wissen, nicht als Erlaubnis: Eine sechsfache Verschachtelung ist im Grunde nie lesbar. Wer wirklich so viel Tiefe braucht, greife zu Überschriften wie \subsubsection oder zum Paket easylist statt zu Listen.
Das Unangenehme an diesem Fehler ist, dass er den Satz nicht anhält. Die Tiefenprüfung in der Definition von \itemize hat die Gestalt \ifnum ... \@toodeep \else ... \fi; wird die Grenze überschritten, beginnt LaTeX einfach keine Liste und lässt den Text hindurchlaufen. Daraus folgt eine verwirrende Art des Bruchs: Der Fehler wird einmal protokolliert, das PDF entsteht, und die Einträge jener Ebene erscheinen als gewöhnlicher Fließtext. Findet sich Too deeply nested im Protokoll, so ist die Stelle zu berichtigen, auch wenn ein PDF vorliegt. Eine weitere Folge: Ein \labelitemv für eine fünfte Ebene zu definieren, bewirkt nichts, da die Prüfung die Liste verwirft, bevor diese Ebene überhaupt erreicht wird.