enumerate

Los números [1], [2], [3] que recorren la bibliografía de un documento LaTeX los produce el contador de cuarto nivel de enumerate. En lugar de definir un contador propio, thebibliography en article.cls escribe sencillamente \usecounter{enumiv} y toma prestado el nivel más profundo de una lista numerada. Hasta ahí llega la maquinaria de listas dentro del esqueleto de un documento. Esta página recorre enumerate por orden: los contadores enumi a enumiv que guardan los números, la familia \theenumi que los convierte en texto, cómo señalar un elemento con \label y \ref, y cómo continuar la numeración tras una interrupción.

Los números viven en contadores, no en el entorno: de enumi a enumiv

enumerate no guarda los números por sí mismo. latex.ltx define cuatro contadores LaTeX corrientes —enumi, enumii, enumiii, enumiv— y el entorno se limita a elegir uno según la profundidad actual. El trabajo se reparte en tres capas: \begin{enumerate} llama a \usecounter, que pone el contador a cero; \item lo incrementa en uno con \refstepcounter antes de componer la entrada; y la familia \theenumi convierte el valor resultante en texto. Tener presente ese orden vuelve evidente la rareza posterior: escribir 4 para que la lista empiece en 5.

NivelContadorFormato por defectoEtiqueta de encabezadoSalida
enumi1\theenumi = \arabic{enumi}\labelenumi = \theenumi.1.
enumii2\theenumii = \alph{enumii}\labelenumii = (\theenumii)(a)
enumiii3\theenumiii = \roman{enumiii}\labelenumiii = \theenumiii.i.
enumiv4\theenumiv = \Alph{enumiv}\labelenumiv = \theenumiv.A.

Confundir la tercera y la cuarta columna de esa tabla se paga después. \theenumi decide cómo se escribe el número mismo; \labelenumi decide el adorno colocado al principio de la línea. El nivel 2 lo deja claro: \theenumii solo dice a, y los paréntesis los pone \labelenumii. Para otro estilo de número se modifica \theenumi; para otra puntuación alrededor, \labelenumi. Cinco comandos convierten una cuenta en caracteres —\arabic (1, 2, 3), \alph (a, b, c), \Alph (A, B, C), \roman (i, ii, iii) y \Roman (I, II, III)— y cualquiera de ellos sirve con cualquier contador.

latex
% style of the number itself
\renewcommand{\theenumi}{\Roman{enumi}}
% punctuation around it: I) II) instead of I. II.
\renewcommand{\labelenumi}{\theenumi)}

Señalar un elemento con \label y \ref: por qué la referencia no coincide con la etiqueta

Colocar \label{clave} al principio del cuerpo de un \item permite que \ref{clave} imprima el número de esa entrada desde cualquier punto del documento. El \refstepcounter que \item usa para avanzar el número registra al mismo tiempo que «el objeto referenciable actual es esta entrada», y eso es lo que ata la \label al \item inmediatamente anterior. De ahí que la referencia se ajuste sola al reordenar los pasos. Los valores viajan por el fichero .aux, así que en la pasada en que se añade una \label nueva el número aún no está fijado: hay que compilar dos veces. Con hyperref cargado, esa misma referencia se convierte en un enlace en el que se puede pulsar. Si lo que interesa es la página en la que está el elemento y no su número, \pageref{clave} admite la misma clave.

latex
\begin{enumerate}
  \item Bring the sample to room temperature
  \item \label{step:weigh} Record the weight
  \item Add solvent and stir
\end{enumerate}
Use the value from step~\ref{step:weigh} in the yield calculation.

He aquí un comportamiento que desconcierta a todo el mundo: referenciar un elemento anidado devuelve una cadena distinta de la etiqueta visible en la línea. Una entrada de segundo nivel se compone como «(a)», pero \ref devuelve 2a; una de tercer nivel muestra «i.» y se referencia como 2(a)i. No es un fallo: opera un comando de prefijo llamado \p@enumii. article.cls define \p@enumii como \theenumi, y la cadena que devuelve una referencia se ensambla como prefijo + \theenum…. \labelenumii, que fabrica la etiqueta de encabezado, no interviene en absoluto en la referencia, y por eso los paréntesis que añade nunca aparecen en ella.

NivelNúmero visible en la líneaCadena que devuelve \refDefinición del prefijo
enumi2.2sin prefijo
enumii(a)2a\p@enumii = \theenumi
enumiiii.2(a)i\p@enumiii = \theenumi(\theenumii)
enumivA.2(a)iA\p@enumiv = \p@enumiii\theenumiii

El diseño tiene sentido en sí mismo: una «a» a secas dejaría al lector sin saber de qué elemento padre es ese (a). Aun así, «2a» choca a menudo con el estilo de la casa. Para quitar el padre y devolver una a limpia, se escribe \renewcommand{\p@enumii}{}; para separarlo como «2.1», \renewcommand{\p@enumii}{\theenumi.}. Lo que no hay que hacer aquí es tocar \theenumii: modificarlo reescribe también la etiqueta de encabezado como «2.1» y estropea el aspecto de la lista. Cuando solo hay que arreglar la referencia, el comando que se toca es \p@enum….

Continuar la numeración tras una interrupción: por qué se escribe 4 para empezar en 5

Si un párrafo explicativo o una figura interrumpe un procedimiento y se cierra la lista, el siguiente enumerate vuelve a empezar en 1, inevitablemente, porque el \usecounter que llama \begin{enumerate} pone el contador a cero cada vez que se entra en el entorno. Para continuar la numeración se reescribe el valor con \setcounter justo después de abrir la lista. Aquí es donde compensa el orden de tres capas visto antes: \item incrementa el contador antes de componer la entrada, así que para empezar en 5 se pone 4. Ese «restar uno» no es un conjuro: es la consecuencia directa de que \refstepcounter se ejecute primero.

latex
\newcounter{savedstep}

\begin{enumerate}
  \item first
  \item second
\end{enumerate}
\setcounter{savedstep}{\value{enumi}}

An interrupting paragraph.

\begin{enumerate}
  \setcounter{enumi}{\value{savedstep}}
  \item this one is numbered 3
\end{enumerate}

El giro es fiable porque enumi conserva su valor final después de \end{enumerate}. Guardándolo en un contador propio justo al cerrar la lista, la numeración sobrevive a cuantos párrafos y figuras se interpongan. Para niveles más profundos se tratan enumii, enumiii y enumiv igual. Dicho esto, antes que repetir esa plantilla cada vez conviene cargar enumitem: \begin{enumerate}[resume] retoma donde se detuvo la lista anterior y \begin{enumerate}[start=7] empieza en 7 —con start= no hay que «restar uno»—. Para un documento largo de procedimientos merece la pena cargar enumitem desde el principio.

Cuándo la numeración se justifica y cuándo engaña

No se elige enumerate porque los números queden ordenados. Un número es un contrato con el lector: declara que aquí el orden, la prioridad o la referencia significan algo de verdad. Numerar elementos sin orden invita al lector a leer una cronología o una jerarquía, y afirma así lo que el autor nunca quiso decir. A la inversa, en un procedimiento real los números son lo que permite decir «vuelve al paso 3». Y esa referencia hay que delegarla en \label y \ref en vez de teclear un «3» literal en el texto: los números escritos a mano se vuelven mentira en cuanto se inserta un elemento.

  • enumerate para procedimientos, cronología y prioridad. Que el lector pueda decir «vuelve al número 3» es la única razón para numerar.
  • itemize para condiciones y propiedades sin orden. Numerarlas afirma una jerarquía o una secuencia que no se quería.
  • Poner siempre un \label en el elemento al que se hará referencia. Un número tecleado en el texto falla en cuanto se añade una entrada.
  • Comprobar qué devuelve \ref en los elementos anidados. La línea muestra «(a)» pero la referencia vuelve como 2a.
  • Llevar la numeración por encima de una interrupción. LaTeX puro lo hace con \setcounter; enumitem, con resume.