Etiquetas personalizadas

La mayoría recuerda las cuatro etiquetas —los marcadores— que el itemize de LaTeX produce en los niveles sucesivos como «•, -, , ·». Pero abra article.cls y los tres últimos resultan ser algo distinto de lo que uno supondría. El nivel 2 no son dos guiones sino una raya corta en negrita (\labelitemfont \bfseries \textendash); el nivel 3 no es un asterisco corriente sino uno centrado verticalmente*, \textasteriskcentered; el nivel 4 es \textperiodcentered. Personalizar etiquetas empieza por saber qué contienen realmente esas macros. Esta página recorre los cuatro marcadores de itemize, el reparto de tareas entre \theenumi y \labelenumi en enumerate, los comandos de representación de contador de \arabic a \fnsymbol con sus límites, y el tope real del anidamiento, es decir, cuándo aparece de veras ! LaTeX Error: Too deeply nested.

Qué son realmente los cuatro marcadores por defecto de itemize

Los marcadores de itemize viven en cuatro macros, una por nivel: \labelitemi, \labelitemii, \labelitemiii, \labelitemiv (las terminaciones i / ii / iii / iv son números romanos para los niveles 1 a 4). Sus definiciones en las clases estándar figuran en la tabla siguiente, y las cuatro empiezan por \labelitemfont: un pequeño gancho que article.cls define como \normalfont y que garantiza que el marcador se componga con la tipografía del texto aunque el entorno esté en cursiva o en negrita. Solo el nivel 2 hace seguir a \labelitemfont un \bfseries adicional, de modo que su raya corta sale en negrita. Por eso parece más recio que sus vecinos.

MacroDefinición en las clases estándarLo que se imprime
\labelitemi\labelitemfont \textbullet• una viñeta
\labelitemii\labelitemfont \bfseries \textendash– una raya corta en negrita, no dos guiones
\labelitemiii\labelitemfont \textasteriskcentered∗ un asterisco centrado verticalmente, glifo distinto de *
\labelitemiv\labelitemfont \textperiodcentered· un punto medio

Para cambiar el marcador de todo un nivel, redefina la macro correspondiente con \renewcommand, colocada en el preámbulo o justo antes del ámbito deseado. Un detalle a vigilar: estas macros no entran en modo matemático. Si no escribe usted mismo los dólares, como en $\diamond$, \diamond resulta inutilizable en texto y provoca un error. Las alternativas habituales son $\diamond$ (◇), $\ast$ (∗), $\cdot$ (·) y $\triangleright$ (▷); si carga el paquete pifont, dispondrá además de ornamentos como \ding{"6C}. Conviene no excederse, sin embargo: unos marcadores demasiado elaborados dificultan distinguir los niveles, así que cambiar solo el nivel 1 suele ser lo prudente.

preamble
% the whole of level 1 becomes a diamond -- note the explicit math shift
\renewcommand{\labelitemi}{$\diamond$}

% or, with enumitem, the same thing scoped to one list
\begin{itemize}[label=$\diamond$]
  \item this list only
\end{itemize}

Sustituir la etiqueta de un solo elemento con \item[...]

Para cambiar el marcador de un solo elemento, dé una etiqueta entre corchetes justo después de \item: \item[$\star$] lo convierte en una estrella, \item[--] en un guion. Y aquí hay que corregir una creencia muy extendida. Una etiqueta entre corchetes no se compone en negrita. Escriba \item[Word] dentro de un itemize y el PDF resultante solo incrusta la redonda del texto; no aparece ninguna negrita. El \makelabel de itemize y enumerate está definido como \hss\llap{...}, de modo que la etiqueta se compone simplemente al ras de la derecha dentro de su caja, sobresaliendo a la izquierda si es demasiado ancha; la tipografía no se toca jamás. La negrita solo ocurre en description, y únicamente porque \descriptionlabel lleva un \bfseries.

\theenumi frente a \labelenumi: el número y su vestimenta

\theenumi decide cómo se representa el número —1, o I, o a—, mientras que \labelenumi decide cómo se viste ese número al principio de la línea, con paréntesis alrededor o un punto. enumerate usa un contador por nivel: enumi, enumii, enumiii, enumiv; \theenumi convierte el valor del contador en caracteres y \labelenumi lo invoca y añade la puntuación. Es un dispositivo de dos etapas. Los valores por defecto de las clases estándar figuran en la tabla siguiente, y son asimétricos: solo el nivel 2 recibe paréntesis, los demás un punto.

ContadorDefecto de \the…Defecto de la etiquetaImpreso al principio
enumi\arabic{enumi}\theenumi.1. 2. 3. …
enumii\alph{enumii}(\theenumii)(a) (b) (c) …
enumiii\roman{enumiii}\theenumiii.i. ii. iii. …
enumiv\Alph{enumiv}\theenumiv.A. B. C. …

El dispositivo de dos etapas cobra sentido en las referencias cruzadas. Lo que \ref devuelve es la representación desnuda, despojada del atavío de \labelenumi: es decir, \theenumi. Así, aunque redefina \labelenumi como (\theenumi) para imprimir (1) al principio de la línea, \ref seguirá devolviendo un 1 sin paréntesis; para escribir «véase el paso (1)» habrá que añadir los paréntesis del lado de la referencia, o recurrir al ref= de enumitem. Con más precisión: LaTeX construye la cadena de referencia anteponiendo \p@enumi a \theenumi, y las clases estándar definen \p@enumii como \theenumi y \p@enumiii como \theenumi(\theenumii). Por eso un \ref a un elemento de nivel 2 vuelve como «1a», arrastrando consigo el número del nivel superior. Crear e incrementar contadores en general es asunto de la página sobre contadores y longitudes.

preamble
% change only the representation: the head reads I. II. III. and \ref gives I
\renewcommand{\theenumi}{\Roman{enumi}}

% change only the dressing: the head reads (1) but \ref still gives a bare 1
\renewcommand{\labelenumi}{(\theenumi)}

Los comandos de representación de contador y sus límites

Para elegir el aspecto de un número dentro de \theenumi o \labelenumi se emplean los seis comandos de representación de contador estándar de LaTeX. Cada uno toma un nombre de contador como argumento, como en \Roman{enumi}, e imprime el valor de ese contador en la forma elegida. Lo importante es que tres de ellos tienen techo: \alph y \Alph más allá de 26, y \fnsymbol fuera de 1–9, se detienen con ! LaTeX Error: Counter too large. Una lista de 27 entradas etiquetadas label=\alph* fallará en la vigésima séptima, siempre.

ComandoImprimeRango y límites
\arabic1, 2, 3 … (cifras arábigas)Sin techo; los negativos se imprimen tal cual (−3 da −3)
\alpha, b, c … (minúsculas)1–26; de 27 en adelante, Counter too large. El cero no da nada, en silencio
\AlphA, B, C … (mayúsculas)1–26; el mismo techo que \alph
\romani, ii, iii … (romanos minúsculos)Nunca da error, pero cero y por debajo no dan nada, en silencio
\RomanI, II, III … (romanos mayúsculos)Sin techo; 4000 sale como MMMM, repitiendo la M sin más
\fnsymbol* † ‡ § ¶ ‖ ** †† ‡‡ (símbolos de nota)Solo 1–9; de 10 en adelante, o cero y por debajo, Counter too large

Lo delicado es que unos casos fallan a gritos y otros en silencio. \alph{0} y \roman{0} devuelven la cadena vacía sin una palabra de queja, de modo que referirse a un contador que sigue en cero produce una lista cuyas etiquetas han desaparecido sin más, y sin pista alguna de por qué. \alph{27}, en cambio, al menos se detiene con Counter too large. Los nueve símbolos de \fnsymbol —exactamente la secuencia que figura en la definición de \@fnsymbol— son una serie para notas al pie; desviados a etiquetas de lista, se rompen en el décimo elemento. Resérvelos para listas breves de anotaciones.

Escribirlo con el label= de enumitem: construir una etiqueta a partir de contadores

Redefinir macros es potente, pero incómodo en cuanto el formato debe variar de una lista a otra. En la mayoría de los casos el label= de enumitem se lee mejor, así que pruébelo primero. Dentro de label=, las formas con asterisco \arabic*, \alph*, \Alph*, \roman* y \Roman* representan el contador actual de ese nivel. El \arabic{...} sin asterisco sigue siendo utilizable junto a ellas, y mezclar ambos permite construir una etiqueta a partir de otro contador: escriba label=\thesection.\arabic* y los elementos quedarán numerados «3.1», «3.2», con el número de sección delante, que sigue automáticamente a la sección si la mueve.

preamble
\usepackage{enumitem}
\setlist[enumerate,1]{label=\Roman*.}    % level 1 becomes I. II. III.
\setlist[enumerate,2]{label=(\alph*)}    % level 2 becomes (a) (b)
\setlist[itemize,1]{label=$\diamond$}    % itemize level 1 becomes a diamond

% a label built from another counter
\begin{enumerate}[label=\thesection.\arabic*, leftmargin=*]
  \item numbered 3.1 inside section 3
\end{enumerate}

% label*= accumulates onto the parent label: 1. then 1.1. 1.2.
\begin{enumerate}[label*=\arabic*.]
  \item one
  \begin{enumerate}[label*=\arabic*.]
    \item one-point-one
  \end{enumerate}
\end{enumerate}

label*= se encadena a la etiqueta del nivel superior, de modo que al anidar se acumulan 1., 1.1., 1.2.; compilado y comprobado. Ahora bien, ese encadenamiento solo vale para la etiqueta impresa: el número del nivel superior no se añade automáticamente a las referencias cruzadas. Para obtener una referencia del tipo «1.a» hay que escribirla explícitamente con ref=, como en ref=\theenumi.\alph*. Y siempre que entregue una etiqueta ancha, recuerde añadir leftmargin=*: la caja de etiqueta por defecto mide solo 20pt, de modo que una etiqueta larga como \thesection.\arabic* sobresaldrá por la izquierda. Para aplicar el estilo en todo el documento, nombre el tipo y el nivel, como en \setlist[enumerate,1]{...}.

Cargar el paquete como \usepackage[shortlabels]{enumitem} permite además escribir el escueto \begin{enumerate}[(1)] del antiguo paquete enumerate. Colocar A, a, I, i o 1 como primer elemento entre corchetes significa entonces \Alph*, \alph*, \Roman*, \roman* o \arabic*, respectivamente.

Too deeply nested: el límite real del anidamiento

Suele decirse que las listas de LaTeX solo pueden anidarse cuatro niveles. Eso es verdad solo a medias. Hay dos techos distintos, y leer latex.ltx revela la estructura. itemize guarda su profundidad en \@itemdepth y enumerate en \@enumdepthdos contadores independientes— y cada una llama a \@toodeep en cuanto su propio contador pasa de 3. El límite de cuatro niveles rige, pues, solo cuando se apila el mismo entorno. Encima de eso, \list lleva una barrera global propia, \ifnum \@listdepth >5, y esa no se fija en el tipo de las listas.

Compilado, es exactamente lo que ocurre. Apile cinco entornos itemize y el quinto provoca ! LaTeX Error: Too deeply nested.; cinco enumerate hacen lo mismo. Pero alterne itemize y enumerate y seis niveles no producen error alguno; solo el séptimo lo provoca, y esta vez quien detiene todo es \@listdepth. El techo práctico es, pues, de cuatro niveles de un mismo tipo, seis si se alterna. Tómelo como conocimiento y no como permiso: un anidamiento de seis niveles no resulta legible prácticamente nunca. Si de veras necesita esa profundidad, recurra a títulos como \subsubsection, o al paquete easylist, antes que a las listas.

Lo incómodo de este error es que no detiene la composición. La prueba de profundidad en la definición de \itemize tiene la forma \ifnum ... \@toodeep \else ... \fi, de modo que al rebasarse el límite LaTeX sencillamente no abre lista alguna y deja pasar el texto de largo. El resultado es una avería desconcertante: el error se registra una vez, el PDF se produce y los elementos de ese nivel salen como texto corrido ordinario. Si ve Too deeply nested en el registro, corrija el pasaje aunque haya aparecido un PDF. Otra consecuencia: definir un \labelitemv para un quinto nivel no sirve de nada, porque la prueba descarta la lista antes de que ese nivel llegue a alcanzarse.