No es cosa suya: la leyenda de una tabla parece pegada a la tabla. Las clases estándar de LaTeX fijan \abovecaptionskip en 10pt y \belowcaptionskip en 0pt —idénticamente en article, report y book— y esos valores están ajustados para figuras. Como la costumbre coloca la leyenda de una tabla encima de ella, el lado con aire queda arriba y el lado nulo toca la tabla. De ahí viene esa sensación de estrechez. Esta página cubre todo lo que rodea al tabular: colocación y leyenda mediante el entorno table, qué hacer con una tabla más ancha que la página, cómo girarla en apaisado y threeparttable para las notas. Construir el contenido en sí corresponde a «Fundamentos de tabular» y «Especificación de columnas, alineación y ancho».
Por qué flotan las tablas: diferencia entre table y tabular
Porque una tabla no puede partirse por un salto de página. Lo que construye tabular es una caja grande, y una caja no se puede dividir en un límite de página. Si LaTeX intentara componerla exactamente donde aparece en la fuente y el espacio restante fuera insuficiente, aparecería un hueco o una página destrozada. Por eso trata tablas y figuras como flotantes: las separa del texto corrido y las envía a donde caben. El mecanismo para usarlo es el entorno table: se coloca un tabular dentro, se le da un encabezado numerado como «Tabla 1» con \caption{…} y se hace referenciable con \label{…} y \ref{…}. En la prosa se escribe entonces una referencia por número —«como muestra la Tabla~\ref{tab:sales}»— y por muchas páginas que se desplace la tabla, el número sale correcto. El ~ es un espacio indivisible que evita que la palabra y su número se separen por un salto de línea.
\usepackage{booktabs}
\usepackage{float} % needed only for the [H] specifier
\begin{table}[htbp]
\centering
\caption{Quarterly sales}
\label{tab:sales} % \label always AFTER \caption
\begin{tabular}{@{}lrr@{}}
\toprule
Quarter & Sales & YoY \\
\midrule
Q1 & 1{,}200 & +5\% \\
Q2 & 1{,}350 & +8\% \\
\bottomrule
\end{tabular}
\end{table}
% in the body: as Table~\ref{tab:sales} shows ...La diferencia entre los especificadores [htbp] y [H]
[htbp] es un conjunto de lugares que usted permite; [H] es la instrucción de dejar de flotar. En los corchetes justo después de \begin{table} se enumeran h (aquí), t (parte superior de la página), b (parte inferior) y p (página solo para flotantes). Si no escribe nada, el valor por omisión tanto en article como en book es tbp: h ni siquiera es candidato de partida. Lo importante es que el orden en que los escribe no cambia el orden en que LaTeX los prueba: siempre intenta t, luego b y luego p, así que [htbp] y [bpht] se comportan igual. Vea los corchetes no como una preferencia, sino como una enumeración de permisos.
Un ! inicial, como en [!ht], dice «solo para este flotante, ignora los límites internos e intenta colocarlo»; no significa «ponlo aquí». Esos límites internos son números concretos: en article, los valores por omisión son \topfraction = 0,7 (la parte de la página que los flotantes pueden ocupar arriba), \bottomfraction = 0,3, \textfraction = 0,2 (la parte mínima que debe conservar el texto), \floatpagefraction = 0,5 (el umbral para crear una página de flotantes), y como mucho dos flotantes arriba, uno abajo y tres en total por página (\topnumber, \bottomnumber, \totalnumber). Cuando una tabla se niega a aparecer, la causa suele ser uno de esos límites, y ! solo relaja la comprobación. Si de verdad quiere fijarla, use [H] del paquete float: con \usepackage{float}, \begin{table}[H] hace que la tabla deje de flotar y se componga exactamente donde está en la fuente, lo que puede dejar un gran hueco al pie de la página. Leer H como «un flotante que no flota» ahorra muchas sorpresas.
| Especificador | Significado | Valor por omisión asociado |
|---|---|---|
h | Aquí, en la posición de la fuente. h solo no se admite; se añade t | No forma parte del tbp por omisión |
t | Parte superior de una página de texto | \topfraction = 0,7, \topnumber = 2 |
b | Parte inferior de una página de texto | \bottomfraction = 0,3, \bottomnumber = 1 |
p | Página solo para flotantes, sin texto corrido | \floatpagefraction = 0,5 |
! | Solo para este flotante, ignorar las fracciones y recuentos anteriores. No es una posición | También afecta a \textfraction = 0,2 y \totalnumber = 3 |
H | Dejar de flotar y fijar en el sitio. Requiere el paquete float | No es un especificador de LaTeX estándar |
Leyenda encima de la tabla, debajo de la figura, y \label tras \caption
Estos dos puntos explican la mayoría de los percances con las leyendas. \caption{…} da al flotante un encabezado numerado, «Tabla 1:» en article o «Tabla 1.1:» en book. Tablas y figuras usan contadores separados, así que sus números nunca se mezclan. Con el argumento opcional, \caption[corta]{leyenda completa}, la lista de tablas muestra la forma corta y el cuerpo la completa. Y puesto que es \caption quien avanza el contador, \label debe ir después de \caption; si los invierte, \ref apuntará al número anterior, en silencio y sin error alguno. En cuanto a la colocación, la costumbre pone la leyenda encima de una tabla y debajo de una figura: se lee el encabezado de una tabla antes de entrar en los datos, pero se mira una figura antes de leer su explicación. En LaTeX la leyenda queda encima si \caption va antes del tabular, y debajo si va después.
Aquí es donde rinde la medición de la entrada. En las clases estándar, \abovecaptionskip vale 10pt y \belowcaptionskip 0pt, de modo que el aire queda solo por fuera de la leyenda y nada separa la leyenda del cuerpo del flotante. Para una figura, cuya leyenda va debajo, eso está bien; para una tabla, cuya leyenda va encima, la leyenda toca la tabla. Hay dos remedios. En LaTeX puro, declare \setlength{\belowcaptionskip}{6pt}. Con el paquete caption, escriba \usepackage[skip=6pt]{caption}, o limítelo a las tablas con \captionsetup[table]{skip=6pt}. Dar estilo a la propia leyenda —fuente, separador, ancho— también es tarea del paquete caption, detallada en la página «Leyendas y subfiguras».
Para centrar el contenido se usa \centering. Dentro de un flotante lo habitual es \centering y no el entorno center (\begin{center}…\end{center}): center añade espacio vertical extra arriba y abajo, mientras que \centering es solo una declaración y no añade ninguno. Para empujar la tabla contra el margen derecho en vez de centrarla, ponga \hfill antes del contenido: toda la holgura horizontal se acumula entonces a la izquierda. Conviene señalar que \centering dentro de un flotante es seguro, pero \centering dentro de una columna p{ancho} es otra historia: si esa columna es la última de la tabla, el terminador de fila \\ se rompe y aparece ! Extra alignment tab has been changed to \cr. Cómo tratar un \centering escrito en la especificación de columnas corresponde a «Especificación de columnas, alineación y ancho».
Cuando una tabla de LaTeX es más ancha que el texto
Antes de encoger nada, mida a dónde se va el ancho. Las columnas de tipo l, c y r no se parten, así que una tabla con muchas columnas desborda \textwidth. Pero el desbordamiento no suele ser de letras: es el espacio entre columnas. Un caso real: una tabla de booktabs con doce columnas, una fila de encabezado y una de datos mide 412,95pt de ancho, mientras que \textwidth en el article por omisión es 345pt, así que se sale 68pt. Componga la misma tabla con \tabcolsep = 0pt y baja a 268,95pt: una diferencia de exactamente 144pt, es decir 2 × 12 columnas × 6pt. Dicho de otro modo, el 35 % del ancho de la tabla era relleno, no texto.
Saberlo cambia el orden en que se prueban los remedios. El consejo habitual —bajar un cuerpo de letra— da 392,77pt con \small y 372,55pt con \footnotesize para la misma tabla; ninguno llega a 345pt. La razón es que \tabcolsep es una longitud y no escala con la fuente, así que los 144pt de relleno sobreviven intactos a la letra más pequeña. Redúzcala a la mitad con \setlength{\tabcolsep}{3pt} y la tabla queda en 340,95pt: cabe, al tamaño del texto. \small junto con \tabcolsep = 4pt da 344,77pt. Recorra las opciones en ese orden: primero el relleno, después el cuerpo de letra y por último el escalado.
\usepackage{graphicx} % for \resizebox
% 1. trim the padding first -- \tabcolsep is 6pt on EACH side of EVERY column
\begingroup
\setlength{\tabcolsep}{3pt}
\begin{tabular}{@{}lrrrrrrrrrrr@{}} % @{} also removes the outer 2 x 6pt
...
\end{tabular}
\endgroup
% 2. only then consider a smaller size, or scaling as a last resort
\resizebox{\textwidth}{!}{%
\begin{tabular}{lrrrrr}
...
\end{tabular}%
}Poner @{} en ambos extremos de la especificación de columnas también elimina el \tabcolsep exterior y alinea la tabla con el borde izquierdo del texto: medido, exactamente 2 × 6pt = 12pt. Es el modismo habitual en las tablas de booktabs. Cuando nada de eso basta, el último recurso es \resizebox{ancho}{alto}{material} de graphicx, donde poner ! en uno de los dos valores escala proporcionalmente. Pero escala el contenido: pase la tabla anterior por \resizebox{\textwidth}{!} y el factor es 345 ÷ 412,95 = 0,836, de modo que la letra de 10pt sale a unos 8,4pt y el \toprule de 0,8pt a 0,67pt. Ni las letras ni las líneas guardan ya proporción con el texto vecino, así que trátelo como un apaño. En lugar de \resizebox, adjustbox ofrece una forma de entorno: \begin{adjustbox}{width=\textwidth}…\end{adjustbox}. Para airear un poco las filas, \renewcommand{\arraystretch}{1.2} (el valor por omisión es 1) hace que una tabla de tres filas en un documento a 10pt crezca 0,2 × 3 × 12pt = 7,2pt.
Si aun así no cabe, es la señal para cambiar de herramienta. La columna X de tabularx, que estira las columnas hasta un ancho objetivo, y el tblr de tabularray se tratan en la página «Entornos de tabla avanzados». Si el problema son demasiadas filas para una página, se trata de longitud y no de ancho, y la respuesta es longtable, que puede partirse entre páginas: la página «Tablas que abarcan páginas». Ambos merecen considerarse antes del escalado y la rotación de esta página.
Girar una tabla: sidewaystable y rotatebox
Una tabla demasiado grande para una página vertical puede ocupar una página entera girando 90°: colóquela en el entorno sidewaystable del paquete rotating en lugar de table. La leyenda y el número giran con ella, y sigue apareciendo en la lista de tablas. En documentos a doble cara, el paquete elige automáticamente el sentido de giro para que la doble página se lea con naturalidad. Para figuras existe el equivalente sidewaysfigure. Para girar solo una parte de una tabla, en un ángulo cualquiera, use \rotatebox{ángulo}{material}, también de graphicx/rotating; lo típico es poner de pie una celda de encabezado con \rotatebox{90}{long column name} (los ángulos positivos giran en sentido antihorario).
\usepackage{rotating}
\usepackage{booktabs}
\begin{sidewaystable}
\centering
\caption{A wide table turned 90 degrees}
\label{tab:wide}
\begin{tabular}{@{}lrrrrrrrr@{}}
\toprule
Region & Q1 & Q2 & Q3 & Q4 & Total & Prev & Diff & Ratio \\
\midrule
East & 120 & 135 & 128 & 142 & 525 & 500 & +25 & 105\% \\
\bottomrule
\end{tabular}
\end{sidewaystable}Hay un límite que conviene conocer: rotating trabaja con cajas giradas, y una caja siempre permanece en una página, así que no puede producir texto corrido apaisado a lo largo de varias páginas. Cuando lo necesite, use lscape, que compone el cuerpo del texto de lado, o pdflscape, que gira la propia página PDF. pdflscape resulta especialmente adecuado para documentos que se leen en pantalla, porque el visor gira la página por usted. Una tabla a la vez apaisada y de varias páginas exige combinar pdflscape con longtable.
Notas bajo una tabla: threeparttable
Use \footnote dentro de un tabular y la nota salta al pie de la página o directamente no se imprime. El paquete threeparttable de Donald Arseneau resuelve esto. Como dice su nombre, trata una tabla como tres partes: título (leyenda), cuerpo (tabular) y notas (tablenotes), y compone las notas con el ancho de la tabla, justo debajo. Como señala la propia documentación del paquete, un threeparttable no flota por sí solo, así que para obtener número y colocación se envuelve todo en un table (o table* para ancho completo a dos columnas).
\usepackage{booktabs}
\usepackage{threeparttable}
\begin{table}[htbp]
\centering
\begin{threeparttable}
\caption{Yield by variety}
\label{tab:yield}
\begin{tabular}{@{}lrr@{}}
\toprule
Variety & Yield\tnote{a} & Price\tnote{b} \\
\midrule
Koshihikari & 540 & 380 \\
Akitakomachi & 520 & 360 \\
\bottomrule
\end{tabular}
\begin{tablenotes}
\footnotesize
\item[a] Kilograms per 10 a.
\item[b] Wholesale price per kilogram.
\end{tablenotes}
\end{threeparttable}
\end{table}Dentro de un entorno threeparttable basta con colocar, por orden, \caption, el tabular y luego tablenotes. La vinculación de las notas es manual: ponga un marcador como \tnote{a} en una celda y escriba la nota con la misma letra como \item[a] … dentro de tablenotes. El autor dejó su razón para no automatizarlo al principio del archivo .sty: «Por ahora no hay nada automático en las notas… Elegí este método porque la numeración automática con \footnote sería muy difícil de usar, sobre todo porque muchas tablas remiten repetidamente a una misma nota. Si alguien tiene un sistema automático cómodo y elegante, ¡lo escucharé!» El paquete se sigue distribuyendo con ese diseño intacto.
| Opción | Efecto |
|---|---|
para | Compone varias notas seguidas en un solo párrafo, sin saltos de línea |
flushleft | Elimina la sangría francesa de las notas |
online | Imprime la etiqueta \item a tamaño normal en vez de como superíndice |
normal | Restaura el formato predeterminado, anulando una opción global para una tabla |
Estas opciones pueden fijarse para todo el documento, como en \usepackage[para]{threeparttable}, o por tabla, como en \begin{tablenotes}[flushleft]. threeparttable no da estilo a la leyenda por sí mismo, así que combínelo con el paquete caption cuando quiera un aspecto de encabezado adecuado. Para poner notas en una tabla que abarca páginas (longtable), use el paquete hermano threeparttablex.
- La tabla no va donde usted quiere — repase primero las letras de
[htbp]como un conjunto de permisos, no como un orden. Si aun así no se mueve, está chocando con\topfractiony compañía: pruebe[!ht]; para fijarla de verdad,[H]defloat. - La leyenda queda pegada a la tabla —
\belowcaptionskipvale 0pt por omisión. Use\setlength{\belowcaptionskip}{6pt}o elskip=del paquetecaption. - La tabla es más ancha que la página — primero
\tabcolsepy@{}, después\small, y\resizeboxen último lugar. Si las columnas pueden partirse, usep{ancho}otabularx. - Demasiadas filas — es cuestión de longitud, no de ancho:
longtable; combínelo conpdflscapesi además debe ir apaisada. - Quiere una nota al pie en una celda — no
\footnote, sino\tnoteytablenotesdethreeparttable.