Wird eine Liste in eine andere verschachtelt, wechselt LaTeX die Marke am Zeilenanfang je nach Ebene. Ein enumerate innerhalb eines itemize-Eintrags – optisch die zweite Ebene – beginnt jedoch mit „1.“ und nicht mit „(a)“. Denn LaTeX zählt nicht die Tiefe auf dem Papier, sondern wie viele Listen derselben Art einen umschließen. Wer verschachtelte Listen ohne diese eine Tatsache schreibt, wundert sich beim Blick auf die Ausgabe. Diese Seite behandelt, wie die Marke gewählt wird, warum bei der vierten Ebene eine Wand namens Too deeply nested steht, welche zweite Obergrenze sich alle Listenumgebungen teilen und wie viel Zeilenbreite mit jeder weiteren Ebene unwiederbringlich verloren geht.
Die Marke richtet sich nach der Zahl gleichartiger Listen, nicht nach der Tiefe auf der Seite
LaTeX zählt die Tiefe mit zwei getrennten Zählern. In latex.ltx erhöht itemize den Zähler \@itemdepth, enumerate den Zähler \@enumdepth; jeder baut aus seinem eigenen Wert einen Befehlsnamen – \labelitem oder \labelenum plus römische Ziffer – und ruft ihn auf. Die beiden sehen einander nie, also steht ein enumerate innerhalb eines itemize bei \@enumdepth 1: Es greift \labelenumi, und die Nummerierung beginnt bei „1.“. Die oft wiederholte Behauptung, die Marke ergebe sich unabhängig vom Typ aus der Verschachtelungstiefe, ist falsch. Ein einziger Satzdurchlauf klärt das.
\begin{enumerate}
\item Make the dough
\begin{itemize}
\item Flour
\item Water
\begin{enumerate}
\item Add half
\item Add the rest
\end{enumerate}
\end{itemize}
\item Let it rest
\end{enumerate}So sieht die Ausgabe dieser drei Ebenen wirklich aus: Das äußere enumerate liefert „1.“ und „2.“; das darin liegende itemize erhält den Aufzählungspunkt • der ersten Ebene, nicht den Strich – der zweiten; und das innerste enumerate erhält das (a) der zweiten Ebene, nicht das römische i. der dritten. Aus Sicht des itemize ist dies das erste itemize ringsum; aus Sicht des inneren enumerate liegt genau ein enumerate außen herum. Wechseln sich die Typen nach unten hin ab, arbeitet jeder Typ seine eigene Markenfolge unabhängig ab.
| Tiefe | Umgebung | Ebene innerhalb des Typs | Erzeugte Marke |
|---|---|---|---|
1 | itemize | 1 | • (\labelitemi) |
2 | enumerate | 1 | 1. (\labelenumi) |
3 | itemize | 2 | – (\labelitemii) |
4 | enumerate | 2 | (a) (\labelenumii) |
5 | itemize | 3 | * (\labelitemiii) |
6 | enumerate | 3 | i. (\labelenumiii) |
Die Wand bei der vierten Ebene: ! LaTeX Error: Too deeply nested.
Werden fünf Listen desselben Typs verschachtelt, bricht der Lauf mit ! LaTeX Error: Too deeply nested. ab. Die Meldung nennt die Tiefe nicht – sie besteht nur aus diesen drei Wörtern, das Abzählen, welches \begin das fünfte ist, bleibt einem selbst überlassen; die gemeldete Zeilennummer gehört zu dem \begin{itemize}, das es geöffnet hat. Der Grund ist kein typografisches Verbot, sondern schlichter Namensmangel: Der Test in latex.ltx lautet lediglich \ifnum \@itemdepth >\thr@@, also „größer als drei“. Markenbefehle existieren für vier Ebenen, für die fünfte gibt es keinen Namen, also endet es dort. Das heißt zugleich: Das bloße Laden von enumitem beseitigt die Wand nicht. Wer ohne weitere Konfiguration eine fünfte Ebene öffnet, erhält denselben Fehler auf dieselbe Weise.
% raising the ceiling really does take all four lines
\usepackage{enumitem}
\setlistdepth{9}
\renewlist{itemize}{itemize}{9}
\setlist[itemize]{label=$\cdot$}
\setlist[itemize,1]{label=$\bullet$}Die Wand wirklich zu beseitigen, verlangt mehr als \setlistdepth aus enumitem allein. \setlistdepth{9} hebt nur die allgemeine Listenobergrenze; itemize selbst hält weiterhin bei vier. Erst wird die Umgebung mit \renewlist{itemize}{itemize}{9} für neun Ebenen neu gebaut, dann werden mit \setlist[itemize]{label=…} Marken für die neuen Ebenen bereitgestellt. Wird eine fünfte Ebene ohne Marke geöffnet, wechselt der Fehler lediglich zu ! Package enumitem Error: Undefined label. Wer eine tiefe nummerierte Hierarchie braucht, greift ehrlicher zu einem Paket wie easylist, das von vornherein für beliebige Tiefe entworfen ist. Vorher lohnt jedoch ein Moment des Innehaltens: Fünf Verschachtelungsebenen kann kaum jemand lesen. So tiefe Verschachtelung ist meist ein Hinweis darauf, dass die Struktur besser zu Abschnittsüberschriften wird.
Eine zweite Obergrenze: das Sechs-Ebenen-Budget aller Listenumgebungen
Über der Grenze von vier je Typ liegt eine zweite Obergrenze von sechs Ebenen, die sich alle Listen teilen. Sowohl itemize als auch enumerate beruhen auf derselben zugrunde liegenden Umgebung list, und list trägt einen eigenen Test: \ifnum \@listdepth >5. Abwechselndes Schachteln von itemize und enumerate kommt daher bis Ebene sechs, die siebte scheitert ebenso an Too deeply nested. Unangenehm ist, dass nicht nur Listen aus diesem Budget zehren. In article.cls beruhen auch quote, quotation, verse, description und sogar thebibliography auf \list. Zwei verschachtelte Zitatblöcke in einer tief verschachtelten Aufzählung können den Rest allein aufbrauchen. Weil der Verursacher nicht nach einer Liste aussieht, ist das die am schwersten aufzuspürende Variante des Fehlers.
Einzüge summieren sich: Auf Ebene vier ist ein Viertel der Zeilenbreite weg
Die eigentlichen Kosten der Verschachtelung zeigen sich nicht bei den Marken, sondern bei der Zeilenbreite. Jedes Mal, wenn eine list-Umgebung öffnet, addiert sie ihren \leftmargin zur laufenden Summe links, sodass sich der Einzug Ebene für Ebene aufbaut. In einem einspaltigen article mit 10pt beträgt \leftmargini 25,0pt, \leftmarginii 22,0pt, \leftmarginiii 18,7pt und \leftmarginiv 17,0pt. Auf der vierten Ebene summieren sich die linken Ränder auf 82,7pt – etwa ein Viertel der Textbreite von 345pt – und lassen 262,3pt Zeile zum Schreiben. Dass die Werte je Ebene etwas kleiner werden, bremst diese Anhäufung bewusst ab; vier Ebenen kosten trotzdem so viel.
| Länge | Wert | Laufende Summe | Verbleibende Zeilenbreite (textwidth 345pt) |
|---|---|---|---|
\leftmargini | 25,0pt (2,5em) | 25,0pt | 320,0pt |
\leftmarginii | 22,0pt (2,2em) | 47,0pt | 298,0pt |
\leftmarginiii | 18,7pt (1,87em) | 65,7pt | 279,3pt |
\leftmarginiv | 17,0pt (1,7em) | 82,7pt | 262,3pt |
In Zahlen ausgedrückt wird greifbar, warum tiefe Verschachtelung schlecht liest. Eine Zeilenbreite von 262pt kommt einer Spalte im Zweispaltensatz nahe; lange Sätze hineingegossen, bleibt dem Umbruchalgorithmus weniger Spielraum, die Wortabstände reißen unnatürlich auf und die Warnungen Overfull \hbox häufen sich. Im Zweispaltensatz ist \leftmargini ohnehin auf 2em verkleinert – je schmaler der Satzspiegel, desto weniger Luft für Verschachtelung. Muss der linke Rand enger werden, ist leftmargin= je Ebene mit enumitem der praktische Weg. Meist geht es allerdings schneller, die Struktur zu überdenken: Einträge unterhalb der dritten Ebene lassen sich in der Regel als Prosa in den Elterneintrag zurückfalten.
Wo mit dem Verschachteln aufzuhören ist
LaTeX erlaubt vier Ebenen, doch das heißt nicht, dass vier Ebenen lesbar sind. Tiefe Verschachtelung vermittelt Hierarchie, und die Lesenden müssen diese Hierarchie allein aus der Form der Marke und der Position des linken Rands rekonstruieren. Das Sternchen der dritten und der zentrierte Punkt der vierten Ebene sehen einander ähnlich, und nur 17pt Einzug trennen sie. Auf der vierten Ebene bleibt also kaum ein Anhaltspunkt übrig. Es folgt eine Checkliste für die Durchsicht fertiger Verschachtelungen.
- Prüfen, ob zwei Ebenen genügen. Was über die dritte hinausgeht, lässt sich meist als Prosa in den Elterneintrag falten.
- Wird die Tiefe wirklich gebraucht, gehören dort Abschnittsüberschriften hin statt einer Liste.
\subsectionund\subsubsectionbringen Inhaltsverzeichnis und Querverweise gleich mit. - Beim Mischen von Typen immer die Ausgabe ansehen. Die Marke hängt davon ab, wie viele Listen desselben Typs umschließen – die erwartete Markierung erscheint womöglich nicht.
quoteundverseaus tiefen Verschachtelungen heraushalten. Sie zehren vom selben Sechs-Ebenen-Budget und erzeugen Fehler, deren Ursache schwer zu erkennen ist.- Bei
Too deeply nesteddie Tiefe neu zählen. Die Meldung nennt die Ebene nie; also von der gemeldeten Zeile aus die\beginzurückverfolgen.