Une liste LaTeX s'arrête à quatre niveaux. easylist franchit ce mur en renonçant complètement aux environnements imbriqués : à l'intérieur de \begin{easylist}, le nombre de caractères # donne la profondeur, si bien que ### désigne le niveau trois et ##### le niveau cinq. Ni \item, ni \begin imbriqué. Le package fournit en outre un préréglage nommé tractatus, qui reproduit à l'identique la numérotation du Tractatus Logico-Philosophicus de Wittgenstein. Cette page traite de l'écriture d'easylist, du véritable plafond (dix niveaux, et l'erreur qu'il déclenche) et des cas où il l'emporte sur enumitem — le tout composé et mesuré sur TeX Live 2024.
Comment s'utilise easylist : le nombre de # fait le niveau
Le chargement se fait par \usepackage[sharp]{easylist} ; à l'intérieur de l'environnement easylist, chaque ligne commence par une suite de #. Un # donne le niveau 1, ## le niveau 2. Il faut toujours exactement une espace après la suite de marqueurs. On n'écrit jamais \item — il n'y aurait nulle part où le mettre. Comme easylist ne construit aucun environnement imbriqué, la profondeur ne dépend pas du nombre de \begin ouverts mais uniquement du nombre de # que porte cette ligne. C'est pourquoi on dit la profondeur illimitée, et c'est aussi pourquoi on peut monter et descendre de niveau n'importe où dans la liste.
\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}Composé sur TeX Live 2024, cela donne les numéros 1. 1.1. 1.1.1. 1.1.2. 1.1.2.1. 2. : les compteurs de niveau reliés par des points, avec un point également après le dernier. Ce point final est FinalMark, et il peut être supprimé. Sauter un niveau compte le niveau sauté pour zéro : placez ### juste après un élément de niveau 1 et le numéro devient 1.0.1., sans erreur. En revanche, oubliez l'espace après les marqueurs et tout casse en silence. Écrire #With no space. a imprimé cet élément sans aucun numéro, et la ligne ## suivante est sortie en 0.0.1. — pas seulement une étiquette perdue, mais un compteur décalé pour toute la suite.
Le vrai plafond est de dix niveaux : corriger l'erreur Too many
« Pas de limite de profondeur » n'est pas tout à fait exact. Dix niveaux de compteurs sont créés par défaut, et un onzième interrompt la compilation. Une liste à quatorze niveaux passée par TeX Live 2024 a produit ! Package easylist Error: suivi de trois lignes commençant par ==> Too many, dont le message est qu'on ne peut pas employer plus de dix marqueurs sans le préciser au chargement du package. Et le PDF tout de même écrit montrait, à partir du niveau onze, le texte littéral !!! à la place du numéro. Manquez l'erreur dans le journal et vous imprimez une liste truffée de triples points d'exclamation.
Le remède est celui que l'erreur indique : passer le nombre de niveaux en option numérique du package. \usepackage[sharp,14]{easylist} a fait passer la même source sans encombre, jusqu'à 1.1.1.1.1.1.1.1.1.1.1.1.1.1. sans erreur. N'importe quel nombre convient, mais les compteurs sont alloués au chargement : il est de bon ton de n'en demander que le nécessaire. Et si vous avez réellement une liste de plus de dix niveaux, le conseil évident s'applique aussi : c'est sans doute la structure du document qu'il faut interroger.
De tractatus à itemize : les six préréglages intégrés
easylist fournit six préréglages, désignés dans l'argument optionnel de l'environnement : \begin{easylist}[tractatus]. Ce sont tractatus, checklist, booktoc, articletoc, enumerate et itemize, définis vers la ligne 820 d'easylist.sty. Le premier est, comme son nom l'indique, le système de numérotation du Tractatus Logico-Philosophicus de Wittgenstein. Composé, il donne 1. 1.1 1.11 1.2 2. : un point seulement après le premier niveau, et en dessous les chiffres s'enchaînent simplement. La table des matières de ce livre de 1921 revient d'un seul mot d'option.
| Préréglage | Ce qui est composé | Où il convient |
|---|---|---|
tractatus | 1. 1.1 1.11 1.2 2. | Philosophie et logique, où les propositions s'emboîtent |
checklist | Masque les numéros et place un carré vide devant chaque élément | Listes de contrôle à cocher à la main |
booktoc | Niveau 1 en gros gras avec chiffres romains majuscules, niveaux inférieurs indentés | Tables des matières composées à la main |
articletoc | Un booktoc allégé : niveau 1 en gras, pas de point après le numéro | Sommaires à l'échelle d'un article |
enumerate | 1. puis (a) puis i. puis A. | Aller plus profond tout en ressemblant à enumerate |
itemize | • puis – puis ∗ puis · | Puces sans numéro, imitant les marques standard |
Deux d'entre eux, enumerate et itemize, imitent délibérément l'aspect des listes standard. À la mesure, le premier imprime 1. (a) i. A. et le second • – ∗ ·. Mais le préréglage itemize n'emploie pas les vraies commandes de marque comme \labelitemi : il bricole des approximations à partir de \textbullet, --, $\ast$ et $\cdot$ (lignes 858–864 d'easylist.sty). La façon dont les marques standard sont réellement définies est mesurée sur la page custom-labels, où il faut aller pour modifier les marques elles-mêmes. L'apport d'easylist, c'est de garder cet aspect et de poursuivre jusqu'aux niveaux cinq et six.
Régler numéros et indentation avec \ListProperties
Là où un préréglage ne suffit pas, \ListProperties(...) corrige. On écrit dans les parenthèses des paires key=value séparées par des virgules, et les réglages valent pour tous les éléments et listes qui suivent. Beaucoup de clés ont une forme par niveau obtenue en ajoutant le numéro : Numbers pour tous les niveaux, Numbers3 pour le niveau 3 seul. \NewList rétablit les valeurs par défaut. À noter : \ListProperties n'est pas obligatoire — easylist fonctionne sans, comme le montre le premier exemple de cette page. Les réglages ne servent que si l'on veut changer l'aspect.
| Clé | Effet | Exemple |
|---|---|---|
Numbers | Type de numéro : a arabe (défaut), r/R romain minuscule ou majuscule, l/L lettres minuscules ou majuscules, z Zapf Dingbats | Numbers2=R, Numbers3=l |
Mark / FinalMark | Séparateur entre compteurs (point par défaut) et marque après le dernier | FinalMark= supprime le point final |
Style | Fonte ; * ne vise que le numéro, ** que le texte | Style1*=\bfseries met en gras les seuls numéros de niveau 1 ; \color{blue} fonctionne aussi |
Hide | Masquer les n premiers compteurs, ce qui donne une liste non numérotée | Hide=10000 masque les numéros à tous les niveaux |
Start | Valeur de départ du compteur ; la forme * le lie à un compteur externe | Start1*=\thesection suit le numéro de section |
Progressive | La marge gauche croît avec la profondeur ; la forme * laisse le niveau 1 à la marge courante | Progressive=1.5em |
Space | Espace vertical entre éléments ; la forme * entre éléments de même niveau. Les valeurs négatives resserrent | 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}Ici le niveau 1 imprime des chiffres arabes gras, le niveau 2 des romains majuscules et le niveau 3 des lettres minuscules, composant 1.I.a.. Les niveaux 4 et 5 apparaissent simplement en écrivant #### et ##### , chacun indenté de 1,5em de plus par Progressive. D'autres clés assurent les réglages fins : Hang (faire pendre le texte sous le numéro), Align (aligner les éléments de même niveau), Margin et Indent (marge gauche et retrait de paragraphe), FinalSpace (espace entre numéro et texte, .3em par défaut) et CtrCom (envelopper tout le numéro dans un \fbox par exemple). Pour mettre une virgule ou une parenthèse fermante littérale dans une valeur, entourez-la d'accolades : \ListProperties(FinalMark={)}).
#, @ ou & : quel marqueur choisir, et lequel casse les tableaux
Le marqueur se choisit par option de package : rien donne le signe de section §, [pilcrow] donne ¶, [sharp] donne #, [at] donne @ et [ampersand] donne &. Le caractère choisi devient un caractère actif entre \begin{easylist} et \end{easylist} et redevient ordinaire en dehors. Le conseil largement répété ici — # est le caractère de paramètre de LaTeX, il entre donc en conflit dans les tableaux, mieux vaut passer à & — s'est révélé, à la mesure, exactement inverse.
En plaçant un tabular dans un environnement easylist sur TeX Live 2024, [sharp] est passé sans broncher ; une macro définie hors de l'environnement s'y appelle aussi normalement. Faites de même avec [ampersand] et le & est avalé comme marqueur d'élément et non comme séparateur de colonne : ! Missing } inserted., ! Missing \cr inserted. et ! Missing { inserted. s'enchaînent, et les cellules du tableau deviennent les éléments deux, trois et quatre de la liste. Pour une liste contenant des tableaux, & est le pire choix possible. Ce qui casse vraiment #, c'est définir une nouvelle macro à l'intérieur de l'environnement. Mettez \newcommand\inside[1]{[#1]} juste avant # \inside{boom} et le #1 est lu comme un marqueur, la définition n'a jamais lieu, et vous obtenez ! Undefined control sequence. Définissez les macros hors de l'environnement, ou coupez temporairement le marqueur dans la liste avec \Activate et \Deactivate.
| Option | Marqueur | Comportement mesuré |
|---|---|---|
(none) | § (signe de section, par défaut) | Difficile à saisir ; c'est son seul vrai défaut |
pilcrow | ¶ (pied-de-mouche) | Se comporte comme §, et se saisit tout aussi mal |
sharp | # | Passe même dans un tabular, mais pas de définition de macro dans l'environnement. \# imprime toujours le caractère |
at | @ | Dans un frame beamer, le @ a été imprimé littéralement sans numérotation. À éviter si le texte contient des @ |
ampersand | & | Catastrophique dans une liste contenant un tabular : ! Missing \cr inserted. et le tableau devient des éléments de liste |
Les numéros disparaissent dans beamer : sans [fragile]
Pour utiliser easylist sur une diapositive beamer, marquez le frame [fragile]. Avec cette option, [sharp] comme [at] ont numéroté comme prévu. Sans elle, les deux marqueurs échouent de façons totalement différentes. [sharp] échoue bruyamment, avec ! Illegal parameter number in definition of \iterate. et un ! You can't use ... reprochant que le caractère de paramètre de macro est interdit en mode vertical interne, tandis que les éléments s'écrasent sur une seule ligne. [at] est le cas le plus vicieux : code de retour 0, pas une seule erreur, et pourtant le PDF portait @ One. @@ Two. avec les marqueurs imprimés comme du texte ordinaire. C'est l'échec silencieux qui fait mal ensuite.
\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}L'autre inquiétude courante porte sur un conflit avec enumitem. Il n'y en a pas. Sur TeX Live 2024, charger enumitem avant ou après easylist a compilé sans la moindre erreur, et une liste easylist a cohabité sans peine avec \begin{itemize}[label=\textbullet] dans le même document. Leurs rôles ne se recouvrent pas : enumitem remodèle l'aspect d'itemize et d'enumerate par des options clé-valeur, tandis qu'easylist ajoute à côté un environnement distinct. Charger les deux ne pose aucun problème, du moins au chargement.
easylist ou enumitem : lequel prendre
Une seule question tranche : la profondeur fait-elle partie de la structure du document, ou n'est-ce qu'une affaire d'apparence ? Pour les clauses contractuelles, les normes, les textes de loi et les plans finement ramifiés — des textes où cinq et six niveaux portent du sens — la réponse est easylist. Un # de plus descend d'un niveau, et ne plus avoir à compter mentalement les \begin et les \end soulage réellement quand on saisit un long dispositif. Si au contraire vos listes s'arrêtent à deux ou trois niveaux et que vous voulez un contrôle fin des formats de numéro, des espacements, des listes en ligne et du remplacement des étiquettes, c'est enumitem qu'il faut. L'approche par clés et valeurs lui appartient, et \ListProperties ne la remplace pas.
Un dernier point. Les itemize et enumerate standard tiennent des compteurs de profondeur séparés : en les alternant, on descend à six niveaux — un fait mesuré sur la page custom-labels. Le fameux mur des quatre niveaux est donc plus bas qu'il n'y paraît. easylist mérite tout de même sa place au-delà du sixième niveau, ou le jour où compter les paires d'environnements lasse. Il est de Paul Isambert ; la version fournie dans TeX Live 2024 est la v1.4, datée du 11 janvier 2014, sous LPPL. Un package figé depuis dix ans — mais qui fait assez peu de choses pour qu'il reste peu d'endroits où casser.