itemize

La viñeta que itemize coloca al principio de cada línea en LaTeX se inclinaba antes en cuanto caía dentro de un texto en cursiva, porque el marcador heredaba sin más la fuente vigente a su alrededor. La versión del 2020-02-02 introdujo un comando llamado \labelitemfont y puso fin a esa manía. El punto de una lista con viñetas, por tanto, no es un adorno sino un carácter que se compone igual que cualquier otro. Esta página se acerca a itemize desde tres ángulos: dónde están definidos realmente esos marcadores, qué ocurre cuando se sustituye uno con \item[...], y qué dos longitudes deciden el espacio entre las entradas.

Dónde se define la viñeta: de \labelitemi a \labelitemiv

Los marcadores no viven en el entorno itemize en absoluto: viven en la clase de documento. Al abrir article.cls aparecen cuatro comandos seguidos, de \labelitemi a \labelitemiv, que contienen por orden \textbullet (•), un \textendash en negrita (–), \textasteriskcentered (*) y \textperiodcentered (·). Todo lo que hace itemize es contar a qué profundidad se encuentra, componer el nombre \labelitem más un número romano y llamar a lo que ese nombre contenga. Cambiar un marcador nunca exige, por tanto, tocar el entorno: se sustituye el comando. Y que no haya nada después del cuarto nivel tiene una razón igual de sencilla: nunca se definió un quinto nombre.

ComandoNivelMarcadorContenido en article.cls
\labelitemi1\labelitemfont \textbullet
\labelitemii2\labelitemfont \bfseries \textendash (negrita)
\labelitemiii3*\labelitemfont \textasteriskcentered
\labelitemiv4·\labelitemfont \textperiodcentered
\labelitemfont\normalfont; aísla el marcador de la fuente circundante

La última fila, \labelitemfont, es la corrección de 2020 mencionada al principio. Los cuatro marcadores se invocan con ella delante, de modo que una lista colocada dentro de un bloque en cursiva o negrita conserva hoy su marcador recto. También se puede aprovechar para componer los marcadores en otra letra por completo: \renewcommand{\labelitemfont}{\normalfont\sffamily} deja el texto con serifas y saca los marcadores de palo seco. Para sustituir el marcador de un nivel entero se sobrescribe el \labelitem… correspondiente con \renewcommand. Puesto en el preámbulo afecta a todo el documento; dentro de un entorno o de un grupo, solo a esa parte.

latex
% swap the first-level marker for the whole document
\renewcommand{\labelitemi}{$\diamond$}

\begin{itemize}
  \item this level now uses a diamond
  \item so does this one
\end{itemize}

Sustituir el marcador de una sola entrada con \item[...]

Si se da a \item un argumento entre corchetes, solo esa entrada recibe el contenido de los corchetes como marcador. \item[$\star$] da una estrella, \item[--] un guion, \item[Note] la palabra «Note» compuesta donde iría la viñeta. Conviene corregir aquí una idea muy extendida: una etiqueta entre corchetes en itemize no se compone en negrita. La negrita viene del entorno description, cuyo \descriptionlabel sí incluye un \bfseries. El formateador de etiquetas de itemize no es más que \hss\llap{…}: alinea a la derecha y no toca la fuente.

latex
\begin{itemize}
  \item the default marker
  \item[$\star$] a star for this one entry
  \item[Note] a whole word in the marker slot
\end{itemize}

Ese \llap crea además una trampa. La etiqueta se compone alineada a la derecha en una caja de anchura \labelwidth, y \llap se desborda en silencio. \item[Note] cabe sin problema, pero una palabra larga como \item[Prerequisite] se estira hacia la izquierda más allá del bloque de texto y, en el peor caso, fuera del área impresa. El interlineado no se rompe ni aparece un aviso Overfull \hbox, así que nada avisa hasta mirar el PDF. Si se quieren palabras como etiquetas, ese es el trabajo de description y no de itemize; con enumitem se puede reservar sitio mediante labelwidth= y leftmargin=.

Cuando las entradas quedan demasiado separadas: \itemsep y \parsep

El hueco entre dos entradas no es una longitud sino la suma de dos. Antes de empezar la entrada siguiente, \item inserta \itemsep; justo después comienza un párrafo nuevo, que aporta además \parskip, y dentro de una lista \parskip está fijado a \parsep. El hueco real es, por tanto, \itemsep + \parsep. En un article de 10pt ambos valen 4pt en el nivel 1, es decir 8pt en total; frente a un interlineado de 12pt, eso son dos tercios de línea de aire entre entradas. Esto es lo que se suele estar viendo cuando una lista «parece estirada», y por eso poner solo \itemsep a cero cierra apenas la mitad.

LongitudValor por defecto en el nivel 1 (article de 10pt)Qué controla
\itemsep4pt plus 2pt minus 1ptel espacio que \item añade antes de la entrada siguiente
\parsep4pt plus 2pt minus 1ptentre párrafos de una entrada; también pasa a ser \parskip, así que cae entre entradas
\topsep8pt plus 2pt minus 4ptel espacio por encima y por debajo de toda la lista
\partopsep2pt plus 1pt minus 1ptse suma a \topsep solo si una línea en blanco precede a la lista

La última fila describe un comportamiento con el que todo el mundo tropieza al menos una vez. Dejar o no una línea en blanco antes de \begin{itemize} cambia el espacio sobre la lista de 8pt a 10pt: una línea en blanco hace que la lista empiece en modo vertical, que es justo cuando se añade \partopsep. Reformatear un fichero fuente y descubrir que la compaginación se ha movido suele venir de ahí. Las cifras mismas tienen truco: son longitudes elásticas con componentes plus y minus, de modo que al compaginar pueden encogerse a 6pt o estirarse a 12pt. Los números escritos no llegan intactos al papel. Los niveles profundos se aprietan además de forma automática: en el nivel 2 tanto \itemsep como \parsep valen 2pt, y en el nivel 3 \parsep baja a 0pt. Que las listas anidadas parezcan más compactas es intencionado.

latex
% tighten one list by hand: inside the body it is \parskip,
% not \parsep, that still carries the second half of the gap
\begin{itemize}
  \setlength{\itemsep}{0pt}
  \setlength{\parskip}{0pt}
  \item first
  \item second
  \item third
\end{itemize}

Conviene fijarse en que allí se pone a cero \parskip, no \parsep. La copia de \parsep a \parskip ya se ha producido cuando \begin{itemize} devuelve el control, así que cambiar \parsep una vez dentro del cuerpo deja intactos los segundos 4pt. Medido sobre la página, los 19,93pt por defecto de una entrada a la siguiente solo bajan a 15,94pt si se anula \parsep, y alcanzan los 11,96pt —exactamente una línea— únicamente cuando \parskip pasa a cero. En lugar de repetir eso cada vez conviene cargar enumitem y pasar [noitemsep] (pone a cero \itemsep y \parsep) o [nosep] (que añade a eso \topsep y \partopsep); con \setlist cualquiera de los dos pasa a ser el valor por defecto de todo el documento. Una queja emparentada es que las listas se parten a mitad de página en sitios incómodos. Eso es diseño, no accidente: la clase article fija \@itempenalty en −51. Una penalización negativa no dice «aquí se permite un corte» sino «aquí se desea un corte», de modo que LaTeX trata activamente la junta entre dos entradas como un buen final de página. Una lista que no deba partirse hay que sujetarla de forma explícita: envuelta en un minipage o unida con \samepage.

Los dos errores relacionados con \item

Un itemize no puede estar vacío. Si \begin{itemize}\end{itemize} se cierra sin un solo \item, la compilación se detiene con ! LaTeX Error: Something's wrong--perhaps a missing \item. En la práctica el mensaje surge menos por un \item olvidado que porque se ha puesto texto o una imagen justo al principio de la lista. La posición inmediatamente posterior a la apertura está reservada: allí solo caben un \item o ajustes de espaciado y longitudes. También existe el fallo simétrico. Usar \item fuera de cualquier lista produce ! LaTeX Error: Lonely \item--perhaps a missing list environment., casi siempre tras un \end{itemize} de más o tras copiar un bloque con \item dejando atrás su \begin. En ambos casos el mensaje nombra la causa sin rodeos: basta con seguir el número de línea y comprobar que los \begin y \end de alrededor siguen emparejados.

Cuándo una lista con viñetas se justifica y cuándo no

itemize no es prosa a la que se han quitado los conectores: es un dispositivo para hacer las entradas comparables una junto a otra. La ausencia de números es en sí una declaración al lector: estas cuatro cosas no tienen orden ni jerarquía. Alinear entradas muy dispares en alcance, registro y extensión equivale a mandar al lector a buscar un eje de comparación que no existe. A la inversa, en cuanto el orden o la prioridad empiezan a significar algo, la lista debe convertirse en un enumerate; una hilera de viñetas que codifica en secreto una secuencia es la más penosa de leer. Sigue una lista de comprobación para releer el propio borrador.

  • Mantener la gramática paralela. Si la primera entrada es un sintagma nominal, que lo sean todas; si una está en imperativo, que lo estén todas.
  • Volver a los párrafos cuando las entradas crecen. Si cada una pasa de tres frases, eso es texto corrido con subtítulos, no una lista.
  • Anidar dos niveles como mucho. LaTeX permite cuatro, pero el lector solo suele seguir dos.
  • Pasar a enumerate en cuanto el orden importe. Querer escribir «primero» y «después» es la señal de una lista numerada.
  • Cambiar un marcador solo cuando signifique algo. \item[$\star$] sirve para destacar una entrada, no para adornarla.