easylist

Una lista de LaTeX se queda sin camino en el cuarto nivel. easylist salva ese muro renunciando por completo a los entornos anidados: dentro de \begin{easylist}, el número de caracteres # es la profundidad, de modo que ### es el nivel tres y ##### el nivel cinco. Ni \item, ni \begin anidados. El paquete incluye además un preajuste llamado tractatus que reproduce exactamente la numeración del Tractatus Logico-Philosophicus de Wittgenstein. Esta página cubre cómo se escribe easylist, dónde está el techo real (diez niveles, y el error que aparece) y cuándo gana a enumitem y cuándo no, con todo compuesto y medido en TeX Live 2024.

Cómo se usa easylist: el número de # es el nivel

Se carga con \usepackage[sharp]{easylist} y, dentro del entorno easylist, cada línea empieza con una serie de #. Un # es el nivel 1, ## el nivel 2. Después de la serie de marcadores va siempre exactamente un espacio. Nunca se escribe \item: no hay dónde ponerlo. Como easylist no construye entornos anidados, la profundidad no depende de cuántos \begin estén abiertos sino solo de cuántos # lleva esa línea. Por eso se dice que la profundidad es ilimitada, y por eso también se puede subir y bajar de nivel en cualquier punto de la lista.

document.tex
\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}

Compuesto en TeX Live 2024, los números salen 1. 1.1. 1.1.1. 1.1.2. 1.1.2.1. 2.: los contadores de nivel unidos por puntos, con un punto también tras el último. Ese punto final es FinalMark y puede eliminarse. Saltarse un nivel cuenta el nivel omitido como cero: ponga ### justo detrás de un elemento de nivel 1 y el número queda 1.0.1., sin error. En cambio, si olvida el espacio tras los marcadores, se rompe en silencio. Escribir #With no space. imprimió ese elemento sin número alguno, y la línea ## siguiente salió como 0.0.1.: no solo una etiqueta perdida, sino un contador desplazado para todo lo que viene después.

El techo real son diez niveles: al ver el error Too many

«Sin límite de profundidad» no es del todo cierto. Por omisión se crean diez niveles de contadores, y un undécimo detiene la compilación. Pasar una lista de catorce niveles por TeX Live 2024 produjo ! Package easylist Error: seguido de tres líneas que empiezan por ==> Too many, cuyo mensaje es que no se pueden usar más de diez marcadores salvo que se indique al cargar el paquete. Y el PDF que aun así escribió mostraba, desde el nivel once, el texto literal !!! en el lugar del número. Si se pasa por alto el error en el registro, se imprime una lista sembrada de triples signos de exclamación.

El remedio es el que indica el propio error: pasar el número de niveles como opción numérica del paquete. \usepackage[sharp,14]{easylist} llevó la misma fuente sin tropiezos hasta 1.1.1.1.1.1.1.1.1.1.1.1.1.1. sin error. Vale cualquier número, pero los contadores se reservan al cargar, así que conviene pedir solo lo necesario. Y si de verdad tiene una lista de más de diez niveles, también se aplica el consejo evidente: lo que probablemente convenga cuestionar es la estructura del documento.

De tractatus a itemize: los seis preajustes integrados

easylist trae seis preajustes, que se nombran en el argumento opcional del entorno: \begin{easylist}[tractatus]. Son tractatus, checklist, booktoc, articletoc, enumerate e itemize, definidos hacia la línea 820 de easylist.sty. El primero es, como dice su nombre, el sistema de numeración del Tractatus Logico-Philosophicus de Wittgenstein. Al componerlo sale 1. 1.1 1.11 1.2 2.: un punto solo tras el primer nivel y, por debajo, las cifras simplemente se encadenan. El índice de aquel libro de 1921 vuelve a usted con una sola palabra de opción.

PreajusteLo que imprimeDónde encaja
tractatus1. 1.1 1.11 1.2 2.Filosofía y lógica, donde las proposiciones se anidan
checklistOculta los números y pone un cuadro vacío ante cada elementoListas de verificación para marcar a mano
booktocNivel 1 en negrita grande con números romanos mayúsculos, niveles inferiores sangradosÍndices compuestos a mano
articletocUn booktoc aligerado: nivel 1 en negrita, sin punto tras el númeroÍndices a escala de artículo
enumerate1., luego (a), luego i., luego A.Ir más hondo con el aspecto de enumerate estándar
itemize, luego , luego , luego ·Viñetas sin número que imitan las marcas estándar

Dos de ellos, enumerate e itemize, imitan deliberadamente el aspecto de las listas estándar. Medidos, el primero imprime 1. (a) i. A. y el segundo ·. Pero el preajuste itemize no usa las verdaderas órdenes de marca como \labelitemi: fabrica aproximaciones con \textbullet, --, $\ast$ y $\cdot$ (líneas 858–864 de easylist.sty). Cómo están definidas realmente las marcas estándar lo mide la página custom-labels, que es adonde hay que ir si quiere cambiar las marcas mismas. Lo que aporta easylist es que puede conservar ese aspecto y seguir hasta los niveles cinco y seis.

Fijar números y sangría con \ListProperties

Donde un preajuste se queda corto, \ListProperties(...) lo arregla. Dentro de los paréntesis se escriben pares key=value separados por comas, y los ajustes rigen para todos los elementos y listas que sigan. Muchas claves tienen forma por nivel, formada añadiendo el número: Numbers para todos los niveles, Numbers3 solo para el nivel 3. \NewList devuelve todo a los valores por omisión. Conviene notar que \ListProperties no es obligatorio: easylist funciona sin él, como muestra el primer ejemplo de esta página. Los ajustes solo hacen falta si se quiere cambiar el aspecto.

ClaveEfectoEjemplo
NumbersTipo de número: a arábigo (por omisión), r/R romano minúscula o mayúscula, l/L letras minúsculas o mayúsculas, z Zapf DingbatsNumbers2=R, Numbers3=l
Mark / FinalMarkSeparador entre contadores (un punto por omisión) y marca tras el últimoFinalMark= quita el punto final
StyleTipografía; * afecta solo al número, ** solo al textoStyle1*=\bfseries pone en negrita solo los números de nivel 1; \color{blue} también sirve
HideOcultar los primeros n contadores, que es como se obtiene una lista sin numerarHide=10000 oculta los números en todos los niveles
StartValor inicial del contador; la forma * lo enlaza a un contador externoStart1*=\thesection sigue el número de sección
ProgressiveEl margen izquierdo crece con la profundidad; la forma * deja el nivel 1 en el margen actualProgressive=1.5em
SpaceEspacio vertical entre elementos; la forma * entre elementos del mismo nivel. Los valores negativos lo aprietanSpace*=2pt
document.tex
\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}

Aquí el nivel 1 imprime cifras arábigas en negrita, el nivel 2 romanas mayúsculas y el nivel 3 letras minúsculas, componiendo 1.I.a.. Los niveles 4 y 5 aparecen con solo escribir #### y ##### , cada uno sangrado 1,5em más por Progressive. Otras claves cubren los ajustes finos: Hang (colgar el texto del número), Align (alinear elementos del mismo nivel), Margin e Indent (margen izquierdo y sangría de párrafo), FinalSpace (hueco entre número y texto, .3em por omisión) y CtrCom (envolver todo el número en algo como \fbox). Para poner una coma o un paréntesis de cierre literal en un valor, enciérrelo entre llaves: \ListProperties(FinalMark={)}).

#, @ o &: qué marcador elegir y cuál destroza las tablas

El marcador se elige por opción de paquete: sin nada se obtiene el signo de sección §, [pilcrow] da , [sharp] da #, [at] da @ y [ampersand] da &. El único carácter elegido se vuelve carácter activo entre \begin{easylist} y \end{easylist}, y fuera recupera su papel normal. El consejo aquí más repetido —que # es el carácter de parámetro de LaTeX y por eso choca dentro de las tablas, y que pasarse a & es lo seguro— resultó, al medirlo, ser justo al revés.

Al meter un tabular dentro de un entorno easylist en TeX Live 2024, [sharp] pasó sin queja; una macro definida fuera del entorno también se llama dentro con normalidad. Haga lo mismo con [ampersand] y el & se traga como marcador de elemento en vez de separador de columna: ! Missing } inserted., ! Missing \cr inserted. y ! Missing { inserted. se encadenan, y las celdas de la tabla se convierten en los elementos dos, tres y cuatro de la lista. Para una lista con tablas, & es la peor elección posible. Lo que de verdad rompe # es definir una macro nueva dentro del entorno. Ponga \newcommand\inside[1]{[#1]} justo antes de # \inside{boom} y el #1 se lee como marcador, la definición nunca ocurre y aparece ! Undefined control sequence. Defina las macros fuera del entorno, o apague el marcador momentáneamente dentro de la lista con \Activate y \Deactivate.

OpciónMarcadorComportamiento medido
(none)§ (signo de sección, por omisión)Incómodo de teclear; ese es su único inconveniente real
pilcrow (calderón)Se comporta como § y es igual de incómodo de teclear
sharp#Sobrevive dentro de tabular, pero sin definir macros en el entorno. \# sigue imprimiendo el carácter literal
at@En un frame de beamer imprimió el @ literal sin numeración. Evítelo si el texto lleva @
ampersand&Catastrófico en una lista con tabular: ! Missing \cr inserted. y la tabla pasa a ser elementos de lista

Los números desaparecen en beamer: qué pasa sin [fragile]

Para usar easylist en una diapositiva de beamer, marque el frame como [fragile]. Con ello, tanto [sharp] como [at] numeraron como se esperaba. Sin ello, los dos marcadores fallan de maneras totalmente distintas. [sharp] falla a gritos, con ! Illegal parameter number in definition of \iterate. y un ! You can't use ... que se queja de que el carácter de parámetro de macro no vale en modo vertical interno, y los elementos se aplastan en una sola línea. [at] es el caso más traicionero: código de salida 0, ni un solo error, y sin embargo el PDF llevaba @ One. @@ Two. con los marcadores impresos como texto normal. El fallo silencioso es el que duele después.

beamer
\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}

La otra preocupación habitual es si choca con enumitem. No lo hace. En TeX Live 2024, cargar enumitem antes o después de easylist compiló sin un solo error, y una lista de easylist convivió sin problemas con \begin{itemize}[label=\textbullet] en el mismo documento. Sus papeles no se solapan: enumitem remodela el aspecto de itemize y enumerate mediante opciones clave-valor, mientras que easylist añade a su lado un entorno aparte. Tener ambos cargados no causa problemas, al menos en el momento de la carga.

easylist o enumitem: cuál elegir

Una sola pregunta lo decide: ¿la profundidad forma parte de la estructura del documento, o es solo cuestión de apariencia? Para cláusulas contractuales, normas, textos legales y esquemas finamente ramificados —textos donde cinco y seis niveles cargan significado— la respuesta es easylist. Un # más baja un nivel, y no tener que llevar la cuenta mental de \begin y \end alivia de verdad cuando se teclea un articulado largo. Si en cambio sus listas se detienen en dos o tres niveles y lo que quiere es control fino de formatos de número, espaciados, listas en línea y sustitución de etiquetas, lo suyo es enumitem. El enfoque de claves y valores le pertenece, y \ListProperties no lo sustituye.

Un último punto. Los itemize y enumerate estándar llevan contadores de profundidad separados, así que alternándolos se anida hasta seis niveles: un hecho medido en la página custom-labels. El famoso muro de los cuatro niveles es, pues, más bajo de lo que parece. easylist se gana igualmente su sitio más allá del sexto nivel, o el día en que uno se cansa de contar pares de entornos. Es obra de Paul Isambert; la versión incluida en TeX Live 2024 es la v1.4, del 11 de enero de 2014, bajo LPPL. Un paquete que lleva una década sin moverse, pero que hace tan pocas cosas que le quedan pocos sitios donde romperse.