Fundamentos de tabular

El & que se teclea en una tabla no es un ampersand para LaTeX. Es un carácter con un código de categoría especial, el número 4, al que TeX llama alignment tab. Por eso, cuando el número de columnas no cuadra, el error es ! Extra alignment tab has been changed to \cr., redactado con una palabra que no aparece por ninguna parte en pantalla. Esta página recorre las tres convenciones del entorno tabular —separar celdas con &, cerrar una fila con \\, trazar una regla con \hline— junto con la maquinaria que hay debajo. Cuando esa maquinaria se hace visible, los dos errores que todo principiante encuentra, Extra alignment tab y Misplaced \noalign, dejan de ser acertijos y pasan a ser instrucciones.

Los tres símbolos de tabular: &, \\ y \hline

Solo tres símbolos tienen significado dentro del cuerpo de un tabular. & separa celdas dentro de una fila, \\ cierra una fila y \hline traza una regla horizontal a todo lo ancho de la tabla en ese punto. \begin{tabular} toma justo después un argumento obligatorio: la especificación de columnas. \begin{tabular}{ccc} declara «tres columnas centradas», y el número de columnas fijado ahí es el esqueleto de toda la tabla. Los espacios alrededor de & se ignoran, así que pueden usarse en la fuente para alinear las celdas.

latex
\begin{tabular}{ccc}
  \hline
  A & B & C \\
  D & E & F \\
  \hline
\end{tabular}

\\ no es un símbolo propio de las tablas, sino el comando de salto de línea general de LaTeX. El mismo símbolo actúa como separador de filas en pmatrix y en align, de modo que el hábito de «alinear columnas con & y romper filas con \\» se traslada directamente de las tablas a las fórmulas. El \\ tras la última fila puede omitirse, pero si quieres una regla debajo de esa fila has de cerrarla primero con \\ y solo entonces escribir \hline; si lo omites, irás derecho al Misplaced \noalign que se trata más abajo. \\ admite además un argumento opcional entre corchetes: \\[2pt] añade espacio vertical extra bajo la fila, y un valor negativo lo estrecha.

\begin{tabular} acepta además, antes de la especificación de columnas, un argumento opcional de posición vertical entre corchetes. \begin{tabular}[t]{…} alinea la parte superior de la tabla con la línea base circundante y [b] la inferior; por omisión se alinea el centro vertical. Hay una trampa: si la tabla empieza o termina con \hline, la alineación ocurre a la altura de la regla y el resultado no es el esperado. El paquete array existe en parte para este síntoma y ofrece \firsthline y \lasthline; escritas en lugar de \hline, la tabla se alinea sobre su primera o última fila de texto.

Extra alignment tab has been changed to \cr: el número de columnas no cuadra

Este error significa una sola cosa: hay más & en la fila que columnas declaradas. Escribe A & B & C en una tabla declarada {ll} y aparecerá sin falta. TeX se recupera leyendo el & sobrante como fin de fila (\cr) y sigue adelante, así que no desaparece nada: lo que sale es una tabla descuadrada. Contar mal la especificación es la causa habitual, pero otras tres son frecuentes: un & en una fila donde \multicolumn{3}{c}{…} ya ha consumido las tres columnas; un \\ escrito dentro de una celda; y el >{\raggedright} de array aplicado a la última columna. Este último muerde porque \raggedright redefine \\: el terminador de fila deja de actuar, el & de la fila siguiente se desborda y produce el mismo error; >{\raggedright\arraybackslash} lo arregla.

Tener demasiados pocos &, en cambio, no dice nada. Las celdas que faltan se componen vacías, sin error ni advertencia; así que cuando una tabla está visiblemente descuadrada pero compila limpia, la primera sospecha es un & olvidado. Otra pista: si escribes una letra desconocida en la especificación, la redacción del error depende del paquete cargado. LaTeX a secas dice ! LaTeX Error: Illegal character in array arg., mientras que con array cargado sale ! Package array Error: Illegal pream-token. Cuál de los dos aparezca indica sobre qué implementación corre realmente tu tabla.

Misplaced \noalign: \hline solo cabe entre filas

Este error casi siempre tiene una única causa: escribir \hline sin haber cerrado la fila con \\. Omite el \\ tras la última fila y encadena \hline, y el registro de TeX Live 2024 muestra tres errores seguidos: ! Misplaced \noalign., ! You can't use \hrule here except with leaders. y ! Missing number, treated as zero.. Los tres nacen de la misma causa. Está en la definición misma de \hline: en latex.ltx se lee \def\hline{\noalign{…\hrule \@height \arrayrulewidth …}}. \noalign es una primitiva de TeX que significa solo «inserta este material entre las filas de una alineación». Llamada en mitad de una fila no tiene adónde ir, y por eso \noalign y luego su contenido previsto, \hrule, se derraman uno tras otro.

latex
% WRONG: the last row was never closed, so \hline has no gap to sit in
\begin{tabular}{ll}
  A & B \\
  C & D
  \hline
\end{tabular}

% RIGHT: close the row first, then draw the rule
\begin{tabular}{ll}
  A & B \\
  C & D \\
  \hline
\end{tabular}

Por la misma lógica, un \hline escrito dentro de una celda produce el mismo trío de errores. En cambio, un \hline solo, justo después de un \\, siempre es seguro, e incluso \hline \\, que crea una fila vacía, no es un error: solo añade espacio visible. Otro mensaje omnipresente alrededor de tabular es ! LaTeX Error: \caption outside float., resultado clásico de meter \caption dentro de un tabular: como explica la sección siguiente, el encabezado es tarea de table. Olvidar \end{tabular} da el más servicial ! LaTeX Error: \begin{tabular} on input line N ended by \end{document}., que incluso indica el número de línea.

Cómo trazar reglas y cuáles conviene no trazar

Las reglas horizontales vienen de \hline; las verticales, de escribir | en la especificación de columnas. {|l|c|r|} pone líneas en los bordes exteriores y entre las tres columnas, y con \hline convierte cada celda en una casilla de una cuadrícula. \hline\hline da una regla doble, y la separación entre ambas es la longitud \doublerulesep (2 pt por omisión). El grosor lo fija la longitud \arrayrulewidth, 0,4 pt en las clases estándar. \cline{2-3} toma un rango de números de columna y traza solo parte del ancho. Eso es todo lo que LaTeX estándar puede dibujar.

NotaciónQué haceNotas
&Separa celdas de una filaCódigo de categoría 4; de más da Extra alignment tab
\\Cierra una filaMismo papel en align y pmatrix
\\[2pt]Añade espacio bajo la filaUn valor negativo lo estrecha
\hlineRegla horizontal a todo el anchoGrosor: \arrayrulewidth (0,4 pt)
\hline\hlineRegla horizontal dobleSeparación: \doublerulesep (2 pt)
\cline{2-3}Regla solo de la columna 2 a la 3El recurso para reglar bajo celdas combinadas
|Regla vertical, en la especificaciónMejor evitarla en tablas formales
||Regla vertical dobleLa separación es de nuevo \doublerulesep

Ahora bien, de las herramientas recién enumeradas, la composición profesional sostiene que las reglas verticales y las dobles no deberían usarse en absoluto. El manual de booktabs, Publication quality tables in LaTeX, de Simon Fear (la copia de TeX Live 2024 está revisada el 12 de enero de 2020), enuncia dos principios: «1. Never, ever use vertical rules. 2. Never use double rules.» El autor llega a escribir que si la mitad izquierda de una tabla difiere tanto de la derecha que parece necesitar una línea entre ambas, lo que corresponde es hacer dos tablas; y añade con franqueza que trabajó para una editorial que exigía una regla fina doble sobre la fila de totales, «but this would not have been my choice». Lo que recomienda en su lugar: reglas horizontales de distinto grosor y espacio generoso por encima y por debajo.

Lo importante es que estos principios no valen para toda tabla. Fear traza una frontera explícita entre la formal table —un conjunto de valores en columnas etiquetadas— y el tableau, esa maquetación puntual que probablemente irá cuajada de iconos y usará color; y deja claro que los dos principios se refieren a la primera. La disposición de una tabla formal, escribe, se estableció a lo largo de siglos de experiencia y solo debería alterarse en circunstancias extraordinarias. Leído al revés: enmarcar un horario o un esquema de interfaz sencillamente no es de lo que hablan esos principios. Para una tabla de cifras en un artículo, el uso moderno es booktabs con \toprule, \midrule y \bottomrule, tratado en detalle en «Reglas y tablas de calidad editorial».

Cuando las filas quedan apretadas y las reglas parecen tocar las letras, lo más rápido es subir el multiplicador de altura con \renewcommand{\arraystretch}{1.2} (el valor por omisión es 1). El espacio entre columnas es la longitud \tabcolsep, 6 pt por lado por omisión, o sea 12 pt en total entre dos columnas. Con el paquete array cargado dispones además de \setlength{\extrarowheight}{2pt}, que añade solo a la altura de cada fila y deja la profundidad intacta: justo el remedio para reglas que rozan la parte alta de las mayúsculas.

tabular frente a table: una tabla no es un flotante

tabular compone el contenido de una tabla y nada más: sin número, sin leyenda, sin voz sobre la colocación. Se trata como un trozo de texto, así que puede ir a mitad de párrafo, dentro de un elemento de lista e incluso en una nota al pie. table, en cambio, es un flotante. Lo envuelves alrededor de un tabular y aporta un encabezado numerado automáticamente con \caption{…}, referencias cruzadas con \label{…} y \ref{…}, y especificadores de colocación como [htbp]. Escribir \caption dentro de un tabular da ! LaTeX Error: \caption outside float.: esa división de tareas convertida en mensaje de error.

document.tex
\begin{table}[htbp]
  \centering
  \caption{Quarterly sales}
  \label{tab:sales}
  \begin{tabular}{lrr}
    \hline
    Quarter & Sales & YoY \\
    \hline
    Q1 & 1{,}200 & +5\% \\
    Q2 & 1{,}350 & +8\% \\
    \hline
  \end{tabular}
\end{table}

% ... and refer to it from the running text:
See Table~\ref{tab:sales}.

La razón para convertirlo en flotante es menos la numeración que el hecho de que un tabular no puede partirse entre páginas. Se compone como una caja grande, así que si no cabe en lo que queda de página salta entera a la siguiente y deja un hueco detrás. Dentro de un table, LaTeX puede mover esa caja a la parte alta de una página posterior y rellenar el hueco con texto. [htbp] es una lista de deseos —aquí, arriba, abajo, página propia— y LaTeX prueba las posiciones en ese orden. Una tabla demasiado alta para caber en cualquier página no puede ser un flotante en absoluto: esa es la tarea de longtable, que sí se parte entre páginas.

Una tabla con texto largo: sin p{width} se sale de la página

Los tres especificadores l, c y r solo ensanchan la columna hasta el ancho natural de su contenido y nunca parten dentro de la línea. Mete una descripción larga directamente en una columna l y esta se estira hasta el ancho de esa única línea, empujando la tabla fuera de la caja de texto. Lo que sale es el aviso Overfull \hbox (…pt too wide): un aviso, no un error, así que el documento compila igualmente y solo lo descubres al mirar el PDF. Eso es lo molesto de este fallo. Si hace falta partir líneas, tabular a secas ofrece un único especificador: p{width}. Compone la celda como una caja de párrafo del ancho dado, y lo que rebasa ese ancho fluye automáticamente a las líneas siguientes.

latex
\begin{tabular}{l p{5cm} r}
  \hline
  Item & Description & Price \\
  \hline\hline
  Apple  & A large honey-cored variety, popular as a gift. & 380 \\
  Orange & A small, sweet citrus that peels by hand.       & 120 \\
  \hline
\end{tabular}

La columna 1 va alineada a la izquierda a su ancho natural, la 3 a la derecha, y solo la 2 es una columna p de 5 cm. La descripción larga se parte en esos 5 cm, de modo que solo esa celda pasa a varias líneas y la fila crece en altura. La misma frase en una columna l simplemente se estira de lado sin partirse: esa es la diferencia decisiva que aporta p{width}. Bajo el encabezado hay una regla doble \hline\hline; reglas simples \hline cierran arriba y abajo. El contenido de una columna p se alinea arriba y se justifica por omisión, y la sangría \parindent vale 0 dentro de ella. Querer la celda centrada o alineada abajo verticalmente, o compuesta en bandera izquierda en vez de justificada, lleva al terreno de array, tratado en «especificadores de columna en profundidad».