Eine LaTeX-Liste endet nach vier Ebenen. easylist umgeht diese Mauer, indem es auf verschachtelte Umgebungen ganz verzichtet: Innerhalb von \begin{easylist} ist die Anzahl der #-Zeichen die Tiefe, ### steht also für Ebene drei und ##### für Ebene fünf. Kein \item, kein verschachteltes \begin. Das Paket bringt außerdem eine Voreinstellung namens tractatus mit, die die Nummerierung von Wittgensteins Tractatus Logico-Philosophicus exakt nachbildet. Diese Seite behandelt die Schreibweise, die tatsächliche Obergrenze (zehn Ebenen, samt der Fehlermeldung dort) und die Frage, wann easylist enumitem schlägt und wann nicht – alles auf TeX Live 2024 gesetzt und nachgemessen.
So funktioniert easylist: die Zahl der # ist die Ebene
Eingebunden wird es mit \usepackage[sharp]{easylist}; innerhalb der easylist-Umgebung beginnt jede Zeile mit einer Folge von #. Ein # ist Ebene 1, ## ist Ebene 2. Nach der Markierungsfolge steht immer genau ein Leerzeichen. \item wird nie geschrieben – es gäbe auch keinen Platz dafür. Da easylist keine verschachtelten Umgebungen aufbaut, hängt die Tiefe nicht davon ab, wie viele \begin offen sind, sondern allein davon, wie viele # diese eine Zeile trägt. Daher heißt es, die Tiefe sei unbegrenzt, und daher lässt sich an jeder Stelle der Liste beliebig zwischen den Ebenen wechseln.
\documentclass{article}
\usepackage[sharp]{easylist}
\begin{document}
\begin{easylist}
# First proposition.
## Interesting comment.
### A note on the comment.
### Another note.
#### By the way...
# Let's start something new.
\end{easylist}
\end{document}Auf TeX Live 2024 gesetzt ergibt das die Nummern 1. 1.1. 1.1.1. 1.1.2. 1.1.2.1. 2. – die Ebenenzähler durch Punkte verbunden, mit einem Punkt auch nach dem letzten. Dieser abschließende Punkt ist FinalMark und lässt sich entfernen. Wird eine Ebene übersprungen, zählt sie als null: ### direkt nach einem Element der Ebene 1 ergibt 1.0.1., ohne Fehlermeldung. Fehlt dagegen das Leerzeichen nach den Markierungen, bricht es lautlos. #With no space. druckte das Element ganz ohne Nummer, und die folgende Zeile ## erschien anschließend als 0.0.1. – nicht nur eine fehlende Marke, sondern ein verschobener Zähler für alles Weitere.
Die tatsächliche Grenze liegt bei zehn Ebenen: der Too many-Fehler
„Keine Tiefenbeschränkung“ stimmt so nicht. Standardmäßig werden zehn Ebenen von Zählern angelegt, und eine elfte bricht den Lauf ab. Eine vierzehnstufige Liste durch TeX Live 2024 geschickt ergab ! Package easylist Error:, gefolgt von drei Zeilen, die mit ==> Too many beginnen und besagen, dass sich nicht mehr als zehn Markierungen verwenden lassen, sofern man es beim Laden des Pakets nicht angibt. Und im dennoch geschriebenen PDF trug jedes Element ab Ebene elf den wörtlichen Text !!! an der Stelle seiner Nummer. Wer den Fehler im Log übersieht, druckt eine Liste voller dreifacher Ausrufezeichen.
Die Lösung nennt die Fehlermeldung selbst: die Ebenenzahl als numerische Paketoption übergeben. \usepackage[sharp,14]{easylist} brachte dieselbe Quelle sauber durch und setzte bis 1.1.1.1.1.1.1.1.1.1.1.1.1.1. ohne Fehler. Jede Zahl ist erlaubt, doch die Zähler werden beim Laden angelegt, weshalb es sich gehört, nur so viele anzufordern wie nötig. Und wer tatsächlich eine Liste mit mehr als zehn Ebenen schreibt, darf sich den naheliegenden Rat gefallen lassen: Vermutlich gehört die Struktur des Dokuments hinterfragt.
Von tractatus bis itemize: die sechs eingebauten Voreinstellungen
easylist liefert sechs Voreinstellungen mit, benannt im optionalen Argument der Umgebung als \begin{easylist}[tractatus]. Es sind tractatus, checklist, booktoc, articletoc, enumerate und itemize, definiert um Zeile 820 von easylist.sty. Die erste ist, wie der Name sagt, das Nummerierungssystem von Wittgensteins *Tractatus Logico-Philosophicus*. Gesetzt ergibt sie 1. 1.1 1.11 1.2 2.: ein Punkt nur nach der ersten Ebene, darunter laufen die Ziffern einfach weiter. Das Inhaltsverzeichnis jenes Buchs von 1921 kehrt aus einem einzigen Optionswort zurück.
| Voreinstellung | Was gesetzt wird | Wofür geeignet |
|---|---|---|
tractatus | 1. 1.1 1.11 1.2 2. | Philosophie und Logik mit verschachtelten Thesen |
checklist | Blendet die Nummern aus und setzt ein leeres Kästchen vor jedes Element | Checklisten zum Abhaken |
booktoc | Ebene 1 groß und fett mit römischen Großzahlen, tiefere Ebenen eingerückt | Handgesetzte Inhaltsverzeichnisse |
articletoc | Ein leichteres booktoc: Ebene 1 fett, kein Punkt nach der Nummer | Inhaltsverzeichnisse im Aufsatzumfang |
enumerate | 1., dann (a), dann i., dann A. | Tiefer gehen bei gleichem Aussehen wie enumerate |
itemize | •, dann –, dann ∗, dann · | Unnummerierte Punkte, den Standardmarken nachempfunden |
Zwei davon, enumerate und itemize, ahmen bewusst das Aussehen der Standardlisten nach. Gemessen druckt die erste 1. (a) i. A. und die zweite • – ∗ ·. Die Voreinstellung itemize verwendet allerdings nicht die echten Marken-Befehle wie \labelitemi, sondern baut Näherungen aus \textbullet, --, $\ast$ und $\cdot$ (Zeilen 858–864 von easylist.sty). Wie die Standardmarken tatsächlich definiert sind, misst die Seite custom-labels; dort gehört hin, wer die Marken selbst ändern will. Der Wert von easylist liegt darin, dieses Aussehen zu behalten und trotzdem in Ebene fünf und sechs weiterzugehen.
Nummern und Einzüge mit \ListProperties festlegen
Wo eine Voreinstellung nicht reicht, hilft \ListProperties(...). In den runden Klammern stehen durch Kommas getrennte key=value-Paare, und die Einstellungen wirken auf alle folgenden Elemente und Listen. Viele Schlüssel haben eine Form pro Ebene, gebildet durch Anhängen der Ebenennummer: Numbers für alle Ebenen, Numbers3 nur für Ebene 3. \NewList stellt alles auf die Vorgaben zurück. Zu beachten: \ListProperties ist nicht erforderlich – easylist funktioniert ganz ohne, wie das erste Beispiel dieser Seite zeigt. Einstellungen braucht nur, wer das Aussehen ändern will.
| Schlüssel | Wirkung | Beispiel |
|---|---|---|
Numbers | Nummernart: a arabisch (Standard), r/R klein/groß römisch, l/L klein/groß Buchstaben, z Zapf Dingbats | Numbers2=R, Numbers3=l |
Mark / FinalMark | Trennzeichen zwischen den Zählern (Vorgabe: Punkt) und die Marke nach dem letzten | FinalMark= entfernt den Schlusspunkt |
Style | Schriftschnitt; * betrifft nur die Nummer, ** nur den Text | Style1*=\bfseries setzt nur die Nummern der Ebene 1 fett; \color{blue} geht ebenso |
Hide | Die ersten n Zähler ausblenden – so entsteht eine unnummerierte Liste | Hide=10000 blendet die Nummern aller Ebenen aus |
Start | Startwert des Zählers; die *-Form koppelt ihn an einen externen Zähler | Start1*=\thesection folgt der Abschnittsnummer |
Progressive | Der linke Rand wächst mit der Tiefe; die *-Form belässt Ebene 1 am aktuellen Rand | Progressive=1.5em |
Space | Vertikaler Abstand zwischen Elementen; die *-Form zwischen Elementen derselben Ebene. Negative Werte verdichten | Space*=2pt |
\documentclass{article}
\usepackage[sharp]{easylist}
\begin{document}
\ListProperties(Style1*=\bfseries, Numbers2=R, Numbers3=l,
Progressive=1.5em, Space*=2pt)
\begin{easylist}
# Agreement.
## Definitions.
### Party means a signatory hereto.
### Effective Date means the date of last signature.
## Term and termination.
### This Agreement begins on the Effective Date.
#### Either party may terminate on 30 days notice.
##### Notice must be given in writing.
# Miscellaneous.
\end{easylist}
\end{document}Hier druckt Ebene 1 fette arabische Ziffern, Ebene 2 große römische und Ebene 3 Kleinbuchstaben, zusammengesetzt zu 1.I.a.. Ebene 4 und 5 erscheinen allein durch #### und ##### , jeweils um weitere 1,5em von Progressive eingerückt. Weitere Schlüssel erledigen die Feinheiten: Hang (Text an der Nummer hängen lassen), Align (Elemente derselben Ebene ausrichten), Margin und Indent (linker Rand und Absatzeinzug), FinalSpace (Abstand zwischen Nummer und Text, Vorgabe .3em) und CtrCom (die ganze Nummer in etwa \fbox einschließen). Für ein wörtliches Komma oder eine schließende Klammer im Wert setzt man geschweifte Klammern: \ListProperties(FinalMark={)}).
#, @ oder &: welche Markierung wählen – und welche Tabellen zerstört
Die Markierung wählt eine Paketoption: ohne Angabe das Abschnittszeichen §, [pilcrow] ergibt ¶, [sharp] ergibt #, [at] ergibt @, [ampersand] ergibt &. Das eine gewählte Zeichen wird zwischen \begin{easylist} und \end{easylist} zum aktiven Zeichen und ist außerhalb wieder gewöhnlich. Der oft wiederholte Rat – # sei LaTeXs Parameterzeichen und kollidiere daher in Tabellen, sicherer sei ein Wechsel zu & – erwies sich in der Messung als genau umgekehrt.
Ein tabular innerhalb einer easylist-Umgebung ging auf TeX Live 2024 mit [sharp] anstandslos durch; ein außerhalb definiertes Makro lässt sich darin auch wie gewohnt aufrufen. Dasselbe mit [ampersand] – und das & wird als Elementmarkierung statt als Spaltentrenner geschluckt: ! Missing } inserted., ! Missing \cr inserted. und ! Missing { inserted. folgen aufeinander, und die Tabellenzellen werden zu den Listenelementen zwei, drei und vier. Für eine Liste mit Tabellen ist & die schlechteste Wahl. Was # wirklich bricht, ist das Definieren eines neuen Makros innerhalb der Umgebung. Steht \newcommand\inside[1]{[#1]} direkt vor # \inside{boom}, wird #1 als Markierung gelesen, die Definition kommt nie zustande, und es erscheint ! Undefined control sequence. Makros gehören außerhalb der Umgebung definiert, oder man schaltet die Markierung in der Liste mit \Activate und \Deactivate kurz ab.
| Option | Markierung | Gemessenes Verhalten |
|---|---|---|
(none) | § (Abschnittszeichen, Vorgabe) | Schwer zu tippen; das ist der einzige echte Nachteil |
pilcrow | ¶ (Absatzzeichen) | Verhält sich wie § und ist ebenso schwer zu tippen |
sharp | # | Übersteht tabular, aber keine Makrodefinitionen in der Umgebung. \# druckt weiterhin ein wörtliches Zeichen |
at | @ | In einem beamer-Frame wurde das @ wörtlich gedruckt, ohne Nummerierung. In Texten mit @ im Fließtext meiden |
ampersand | & | Katastrophal in einer Liste mit tabular: ! Missing \cr inserted., und die Tabelle wird zu Listenelementen |
In beamer verschwinden die Nummern: ohne [fragile]
Für easylist auf einer beamer-Folie muss der Frame [fragile] tragen. Damit nummerierten sowohl [sharp] als auch [at] wie erwartet. Ohne die Option scheitern die beiden Markierungen völlig unterschiedlich. [sharp] scheitert laut, mit ! Illegal parameter number in definition of \iterate. und einem ! You can't use ..., das bemängelt, dass das Makro-Parameterzeichen im internen vertikalen Modus nicht erlaubt ist, während die Elemente in eine Zeile zusammenfallen. [at] ist der heiklere Fall: Rückgabewert 0, kein einziger Fehler – und im PDF steht dennoch @ One. @@ Two. mit den Markierungen als gewöhnlichem Text. Das lautlose Scheitern rächt sich später.
\documentclass{beamer}
\usepackage[sharp]{easylist}
\begin{document}
% [fragile] is required: without it the markers are tokenised before
% easylist has a chance to make them active.
\begin{frame}[fragile]{Nested points}
\begin{easylist}
# First point.
## Supporting detail.
\end{easylist}
\end{frame}
\end{document}Die andere häufige Sorge gilt einem Konflikt mit enumitem. Es gibt keinen. Auf TeX Live 2024 kompilierten beide Ladereihenfolgen ohne einen einzigen Fehler, und eine easylist-Liste stand im selben Dokument problemlos neben \begin{itemize}[label=\textbullet]. Ihre Aufgaben überschneiden sich nicht: enumitem formt über Schlüssel-Wert-Optionen das Aussehen von itemize und enumerate um, easylist stellt daneben eine eigene Umgebung. Beide zu laden macht keine Probleme, jedenfalls nicht beim Laden.
easylist oder enumitem: wozu greifen
Eine Frage entscheidet: Gehört die Tiefe zur Struktur des Dokuments, oder ist sie bloß eine Frage des Aussehens? Für Vertragsklauseln, Normen, Gesetzestexte und fein verzweigte Gliederungen – Texte, in denen fünf und sechs Ebenen Bedeutung tragen – ist easylist die Antwort. Ein zusätzliches # geht eine Ebene tiefer, und nicht im Kopf \begin und \end abzählen zu müssen, ist beim Tippen langer Klauselwerke eine echte Erleichterung. Enden die Listen dagegen nach zwei oder drei Ebenen und geht es um genaue Kontrolle über Nummernformate, Abstände, Inline-Listen und Ersatzmarken, gehört das zu enumitem. Dort liegt der Ansatz aus Schlüsseln und Werten, und \ListProperties ersetzt ihn nicht.
Ein letzter Punkt. Standard-itemize und -enumerate führen getrennte Tiefenzähler, sodass abwechselnde Verschachtelung sechs Ebenen erreicht – gemessen auf der Seite custom-labels. Die berühmte Vier-Ebenen-Mauer ist also niedriger, als sie aussieht. easylist verdient sich seinen Platz jenseits der sechsten Ebene, oder an dem Tag, an dem das Abzählen von Umgebungspaaren nervt. Es stammt von Paul Isambert; die Fassung in TeX Live 2024 ist v1.4 vom 11. Januar 2014, unter der LPPL. Ein Paket, das sich seit einem Jahrzehnt nicht bewegt hat – das aber so wenig tut, dass wenig kaputtgehen kann.