Tablas de varias páginas (longtable)

Una tabla envuelta en el entorno table nunca se partirá entre páginas, por muchas filas que tenga, y cuando se desborda nadie protesta. En TeX Live 2024, meter una tabla de 119 filas en un flotante produjo una página en lugar de tres, con las filas restantes deslizándose en silencio por debajo del borde del papel. El paquete longtable de LaTeX derriba ese muro. Pero el verdadero trabajo de longtable no es partir páginas: es alinear las columnas en todas las páginas. Para lograrlo escribe sus mediciones en el archivo .aux y te reclama una segunda compilación con el aviso Table widths have changed. Rerun LaTeX. Esta página sigue qué compra esa segunda pasada, medido frente a supertabular, que se la ahorra.

Por qué una tabla dentro de un flotante nunca se parte

Porque table, igual que figure, es un flotante, y LaTeX trata un flotante como una caja indivisible que cabe en una página. La caja viaja entera al principio o al final de una página, y lo que viaja entero no se puede cortar por la mitad. Así que por muy alto que crezca el tabular interior nunca se divide; si no cabe, sencillamente se sale del papel. Lo desagradable es que eso no genera ningún aviso. Con las mismas 119 filas de datos, la versión envuelta en el flotante salió en una página y la versión libre en tres. Ni un solo mensaje de error. Es la clase de accidente que solo se descubre leyendo el PDF hasta el final.

Una “tabla que abarca varias páginas”, por tanto, es fundamentalmente incompatible con el mecanismo de flotantes. Hace falta una forma de colocar la tabla en el mismo flujo que el texto y entregarla al algoritmo de saltos de página de TeX, igual que se hace con un párrafo. Eso es longtable. Lo escribió David Carlisle, autor de array, tabularx y dcolumn, y viene en el conjunto tools que acompaña a toda instalación de LaTeX, así que no hay nada que instalar.

Cómo se escribe un longtable: qué cambia frente a tabular

Casi todo es igual que en tabular. Carga \usepackage{longtable}, abre con \begin{longtable}{l l r} —la especificación de columnas es un argumento obligatorio—, separa columnas con & y termina filas con \\. Los tipos l, c, r, p{width} funcionan, igual que \hline y \multicolumn. Solo tres cosas cambian. Primero, nunca lo envuelvas en un entorno table: eso lo devuelve a ser flotante y trae de vuelta el problema de la página única de más arriba. Segundo, un argumento opcional de posición [c], [r] o [l] puede preceder a la especificación de columnas. Tercero, longtable lleva su propia leyenda (más abajo). Los saltos de página ocurren solo entre filas o en un \hline, nunca a mitad de una celda de una columna p.

La posición y los blancos alrededor dependen de longitudes que puedes cambiar en cualquier momento tras \begin{document}. En TeX Live 2024 los valores por omisión medidos son: \LTleft y \LTright valen ambos 0pt plus 1fill —empuje igual por ambos lados, que es lo que centra la tabla—. Para una tabla alineada a la izquierda, conserva \setlength{\LTright}{0pt plus 1fill} y pon \setlength{\LTleft}{0pt}. El espacio arriba y abajo son \LTpre y \LTpost, ambos 12pt plus 4pt minus 4pt por omisión.

Repetir encabezado y pie en cada página: endhead y endfoot

Se declaran cuatro marcadores al principio de la tabla, cada uno diciendo «repite las filas hasta aquí en tales páginas». Un marcador se coloca al final de su fila en lugar del \\. Los cuatro son opcionales; si el mismo encabezado sirve para todas las páginas, basta con \endhead.

MarcadorDónde aparecen las filas anterioresContenido típico
\endfirstheadsolo en el encabezado de la primera página\caption{…} y los títulos de columna
\endheadencabezado de todas las páginas salvo la primera“(continued)” y los títulos de columna
\endfootpie de cada página que continúa (todas salvo la última)una fila “Continued on next page”
\endlastfootel final de la tabla, solo última páginala regla de cierre o una nota
\killen ninguna parte: la fila solo se mideuna fila ficticia con las entradas más anchas
document.tex
\documentclass{article}
\usepackage{longtable}
\begin{document}

\begin{longtable}{l l r}
  % head of the first page only
  \caption{Annual sales log}\\
  \hline
  Date & Item & Amount \\
  \hline
  \endfirsthead

  % head of every later page
  \multicolumn{3}{l}{\small (continued)}\\
  \hline
  Date & Item & Amount \\
  \hline
  \endhead

  % foot of every page that continues
  \hline
  \multicolumn{3}{r}{\small Continued on next page}\\
  \endfoot

  % foot of the last page
  \hline
  \endlastfoot

  % everything below the markers is real data
  2026-01-05 & Apple  & 380 \\
  2026-01-06 & Orange & 120 \\
  % ...rows continue; pages are broken automatically...
\end{longtable}

\end{document}

El orden importa. Los cuatro marcadores deben aparecer en ese orden, en lo más alto de la tabla, y todo lo escrito debajo son los datos reales que fluyen por las páginas. Dicho al revés: el cuerpo de la tabla empieza en la primera fila después de \endlastfoot. Rompe el orden y una fila pensada como encabezado sale como primera fila de datos. \kill es el caso aparte: crea una fila que se mide pero nunca se imprime. Si los títulos son cortos pero un valor muy largo aparece solo en la página 100, una fila \kill con muestras de ancho máximo al principio hace que las columnas nazcan ya anchas.

Table widths have changed. Rerun LaTeX. — por qué dos compilaciones

Para que las columnas queden alineadas en todas las páginas. longtable compone la tabla página a página, pero la celda más ancha de una página solo se conoce una vez compuesta esa página. Si cada página se compusiera por separado, cada una tendría sus propias anchuras. Por eso longtable escribe las anchuras medidas en el archivo .aux y las vuelve a leer en la pasada siguiente como una anchura común a todas las páginas. De ahí este mensaje en la primera compilación:

log
Package longtable Warning: Column widths have changed
(longtable)                in table 1 on input line 24.


Package longtable Warning: Table widths have changed. Rerun LaTeX.

Esto es lo que cuesta ignorar el aviso, medido. Leyendo del PDF de una tabla de tres páginas la posición del título de columna derecho “Amount”: en la primera pasada está en x = 320,41pt mientras los datos debajo están en x = 488,69pt —título y cifras en sitios distintos—. Tras una segunda pasada el título se desplaza a x = 471,53pt, idéntico en las tres páginas. Así que la salida de la primera pasada es una tabla con columnas demasiado estrechas y títulos desplazados a la izquierda. Eso es exactamente lo que significa «compilé una vez y la tabla se ve mal».

Puedes mirar dentro de ese archivo .aux. Esto es lo que deja un longtable de tres columnas. \LT@i significa «el primer longtable de este documento»; el segundo pasa a ser \LT@ii. El segundo argumento de cada entrada es la anchura medida de una columna, y la pasada siguiente usa esos números tal cual.

document.aux
\gdef \LT@i {\LT@entry
    {2}{58.6668pt}\LT@entry
    {2}{274.36153pt}\LT@entry
    {1}{47.55566pt}}

La medición no se hace de una vez sino por bloques, cuyo tamaño fija el contador LTchunksize (200 filas por omisión). Si una tabla muy larga agota la memoria de TeX, redúcelo con \setcounter{LTchunksize}{10}; aumentarlo reduce los viajes de ida y vuelta por el .aux y puede converger antes. En la práctica, con latexmk no hace falta pensar en ello: vuelve a ejecutar hasta que el aviso desaparece.

Leyendas y numeración: LTcapwidth vale 4 pulgadas por omisión

longtable no es un flotante y aun así tiene su propia \caption{…}. Incrementa el contador estándar table, así que la leyenda se numera «Tabla N» automáticamente y aparece en \listoftables. Como la leyenda forma parte del diseño de la tabla, la regla es ponerla en el bloque de encabezado, antes de \endfirsthead, cerrando la fila con \\, es decir \caption{…}\\. Hay una sorpresa en su anchura: \LTcapwidth vale por omisión 4 pulgadas, o sea 289,08pt. Como \textwidth en article es 345pt, de fábrica la leyenda es 56pt más estrecha que el texto. Para igualarla al bloque de texto, escribe \setlength{\LTcapwidth}{\textwidth}.

El resto son pequeñas convenciones. Para quitar el número, usa \caption*{…}: sin número ni entrada en la lista de tablas. Una leyenda subsidiaria como “(continued)” en páginas posteriores se escribe con un argumento opcional vacío, \caption[]{…}, para que no se liste dos veces. Y un \label{…} de referencia cruzada nunca debe ir dentro del \endhead repetido: la misma etiqueta se definiría una vez por página. Ponlo dentro de \endfirsthead, o en la primera fila del cuerpo de la tabla.

Qué pasa con las reglas de booktabs en un salto de página

\toprule, \midrule y \bottomrule funcionan tal cual dentro de un longtable: booktabs añadió compatibilidad con longtable en su versión de 2000, y booktabs.sty conserva todavía una rama \ifx\longtable\undefined para ello. Queda, eso sí, una asimetría. longtable duplica automáticamente un \hline en el corte, trazando una regla arriba y otra abajo de la costura, mientras que las reglas de booktabs no se duplican. Si una regla cae justo en un salto de página, el propio manual de booktabs aconseja arreglarlo a mano, normalmente borrando la regla molesta. La respuesta práctica es diseñar el corte fuera: pon las reglas en \endfoot y \endhead para que ninguna quede en la costura.

Hay un extra. El argumento de recorte izquierda/derecha, que normalmente pertenece solo a \cmidrule, también actúa sobre \toprule, \midrule y \bottomrule, pero únicamente dentro de un longtable. Escribe \toprule(r) y el extremo derecho se mete hacia dentro; \midrule(lr) mete ambos extremos. Compila sin errores en TeX Live 2024 con longtable y booktabs cargados juntos. La otra cara es que no puedes escribir lo mismo en un tabular corriente; el autor de booktabs apunta, medio en broma, que si de verdad quieres reglas recortadas conviertas todas tus tablas en longtables.

supertabular y xtab: una sola pasada, pero las columnas saltan

longtable no es la única forma de partir una tabla entre páginas. supertabular (Johannes Braams y Theo Jurriens) y su descendiente xtab (Peter Wilson) siguen una estrategia muy distinta. Donde longtable compone la tabla entera y se la entrega al cortador de páginas de TeX, estos dos miden cuánto espacio queda en la página y emiten un tabular nuevo que quepa: un tabular independiente por página. Por eso no necesitan viaje de ida y vuelta por el .aux y terminan en una sola compilación.

El precio se ve directamente en la página. Con las mismas 119 filas y una entrada extremadamente larga plantada en la fila 90, ambos se comportan muy distinto. Con supertabular el título de columna “Amount” está en x = 249,16pt en las páginas 1 y 2, y en x = 471,53pt en la página 3, la que lleva la entrada larga: pasas la página y la tabla cambia de anchura. Los mismos datos con longtable, tras su segunda compilación, ponen el título en x = 471,53pt en las tres páginas. Compilar dos veces es cómo se compra esa coherencia. La sintaxis también difiere: supertabular declara encabezado y pie fuera del entorno, con \tablefirsthead, \tablehead, \tabletail y \tablelasttail, y usa \topcaption y \bottomcaption para las leyendas. xtab parte de ahí y añade, por ejemplo, un número mínimo de filas para que un corte no quede desaliñado.

Columnas X ajustables que además cruzan páginas: xltabular y ltxtable

longtable usa la misma especificación de columnas que tabular, así que la prosa larga acaba en una columna p{width} de ancho fijo. Para una columna que se expanda automáticamente al ancho sobrante hace falta la columna X de tabularx, pero el entorno tabularx no puede partirse entre páginas. Dos puentes salvan la distancia. xltabular (Rolf Niepraschk y Herbert Voß) es un longtable con columnas X: \begin{xltabular}{\linewidth}{l X r} toma una anchura total y una especificación de columnas, y los marcadores de la familia \endfirsthead siguen funcionando. Carga ltablex internamente, pero deja intacto el entorno tabularx existente.

document.tex
\documentclass{article}
\usepackage{xltabular}
\begin{document}

\begin{xltabular}{\linewidth}{l X r}
  \caption{Glossary}\\
  \hline
  Term & Description & Page \\
  \hline
  \endfirsthead
  \hline
  Term & Description & Page \\
  \hline
  \endhead

  longtable  & Breaks across pages; sits in the text flow, not in a float. & 12 \\
  xltabular  & A longtable whose X column takes the leftover width.       & 34 \\
\end{xltabular}

\end{document}

El otro puente es ltxtable, también de David Carlisle. Aquí el cuerpo de la tabla va en un archivo aparte y se trae con \LTXtable{\textwidth}{nombrearchivo}. El archivo contiene un longtable con columnas X; ltxtable ejecuta una vez el cálculo de anchuras de tabularx y luego entrega el resultado a longtable. Separar el archivo es incómodo, pero evita que la expansión repetida de tabularx choque con el viaje de ida y vuelta del .aux de longtable, lo que resulta mucho más estable en tablas largas. La elección es sencilla: xltabular por comodidad, ltxtable cuando una tabla grande y enrevesada empieza a comportarse raro. Un detalle menor: xltabular no consume un número de table a menos que escribas realmente una \caption.