Entornos de tablas avanzados

El tabular simple hace que cada columna tenga el ancho natural de su contenido. En cuanto quieres que una tabla encaje exactamente en el ancho del texto, o que varias columnas de prosa fluida tengan el mismo ancho, empieza a pelear. Los paquetes que resuelven esto son tabularx (estira columnas hasta un ancho objetivo), tabulary (reparte el ancho según cuánto contenido tiene cada columna) y el cada vez más estándar tabularray (el entorno tblr, un paquete moderno que controla toda la tabla mediante opciones clave-valor). Esta página cubre en qué se diferencian, con un ejemplo trabajado de cada uno.

El problema del ancho

En tabular, las columnas l, c y r nunca se ajustan, y la columna p{width} se ajusta pero te obliga a calcular tú mismo el ancho. Con tres columnas que deberían llenar exactamente el ancho del texto \textwidth, adivinar p{0.3\textwidth} y similares te deja desfasado por el ancho de las reglas y el espacio entre columnas (\tabcolsep), así que la tabla se desborda o queda corta.

Así que invierte el problema. Fija primero el ancho y deja que las columnas se adapten: eso es tabularx. Reparte el ancho automáticamente según cuánto contenido tiene cada columna: eso es tabulary. Ambos son paquetes consolidados de David Carlisle (tabularx viene en el conjunto tools), y se cargan con \usepackage{tabularx} o \usepackage{tabulary}.

tabularx — la columna X se estira hasta un ancho fijo

A diferencia de tabular, el entorno tabularx toma el ancho objetivo de la tabla como primer argumento: \begin{tabularx}{width}{column spec}. La especificación de columnas puede usar el nuevo tipo X, una columna estilo p que se estira o encoge automáticamente para llenar el ancho restante. Cuando hay varias columnas X, comparten por igual el ancho disponible.

El mecanismo es algo inusual: tabularx encuentra los anchos componiendo la tabla varias veces. Primero compone cada columna X con todo el ancho objetivo, de modo que la tabla queda demasiado ancha; divide el exceso por el número de columnas X, estrecha cada una en esa cantidad y vuelve a componer, repitiendo hasta converger. Al final, X se sustituye por la columna que define \tabularxcolumn; su valor predeterminado es:

latex
\newcommand{\tabularxcolumn}[1]{p{#1}}

Así que X es por omisión una columna de párrafo alineada arriba. Para centrar su contenido verticalmente, redefine \renewcommand{\tabularxcolumn}[1]{m{#1}}. El contenido de una columna X se justifica por omisión; para alinearlo a la izquierda, anteponle >{\raggedright\arraybackslash}X. La clave es \arraybackslash: \raggedright, \centering y \raggedleft redefinen lo que significa \\ y chocan con el terminador de fila de la tabla, así que coloca \arraybackslash después de esas declaraciones para restaurar \\ como terminador de fila.

Si reutilizas el mismo prefijo, \newcolumntype permite darle un alias de una letra para mejorar la legibilidad. El ejemplo siguiente pone la columna 1 como una columna l de ancho natural alineada a la izquierda, y las otras dos como columnas Y de igual ancho, ajustables y alineadas a la izquierda, haciendo que toda la tabla encaje en \textwidth.

document.tex
\usepackage{tabularx}
\newcolumntype{Y}{>{\raggedright\arraybackslash}X}
% ...
\begin{tabularx}{\textwidth}{l Y Y}
  \hline
  項目 & 長所 & 短所 \\
  \hline
  tabular  & 単純で速い & 幅を自分で調整する必要がある \\
  tabularx & 表幅を固定でき、列が自動で伸縮する & 試し組みのぶん処理が遅い \\
  \hline
\end{tabularx}

Esta tabla se extiende por todo el ancho del texto (\textwidth); la columna 1 (“Item”) conserva el ancho natural de sus palabras cortas, y las columnas 2 y 3 toman la mitad del ancho restante cada una, ajustando sus descripciones largas a ese ancho. Como usamos Y (un X alineado a la izquierda), cada celda queda con borde derecho irregular. Para ponderar las columnas de forma desigual, resulta útil la sintaxis de coeficientes de tabularray, por ejemplo X[2]; el tabularx simple no tiene opción de coeficiente.

Una advertencia: como el cuerpo se expande varias veces, los comandos con efectos secundarios (avanzar contadores, escribir archivos, \verb, etc.) pueden comportarse mal dentro de tabularx. Una celda que deba contener una nota al pie o \verb suele necesitar envolverse primero en una caja.

tabulary — repartir el ancho según el contenido

tabularx divide el espacio por igual entre sus columnas X. Pero cuando las columnas contienen cantidades muy distintas —por ejemplo una etiqueta corta en una y una descripción larga en otra— las partes iguales quedan torpes. tabulary reparte el ancho en proporción al ancho natural del contenido de cada columna, escalando el total al ancho pedido.

La sintaxis refleja tabularx: \begin{tabulary}{width}{column spec}. Hay cuatro tipos de columna, todos de párrafo con ancho automático: L izquierda, C centrada, R derecha, J justificada. Puedes mezclar l, c, r, p{width} ordinarias, etc., que quedan fuera de la medición y se mantienen en su ancho natural. Cada columna medida se pondera por el ancho natural de su celda más ancha y se escala para que la tabla sume el ancho solicitado, pero una columna cuyo ancho natural ya es menor se deja como está.

Para frenar repartos extremos, dos longitudes acotan una columna medida: el mínimo \tymin (por omisión 10pt) y el máximo \tymax (por omisión 2\textwidth). Ayudan cuando una entrada muy larga dominaría de otro modo el ancho de la columna.

document.tex
\usepackage{tabulary}
% ...
\begin{tabulary}{\textwidth}{L L}
  \hline
  用語 & 説明 \\
  \hline
  X 列 & 表幅から固定部分を引いた残りを、X 列どうしで均等に分け合う列。 \\
  \hline
\end{tabulary}

Aquí ambas columnas son L (izquierda), pero la columna 1 (“Term”) es estrecha porque su contenido es corto, mientras que la columna 2 (“Description”) recibe una parte más ancha para su prosa. Con tabularx y X X, las dos columnas tendrían el mismo ancho; tabulary sigue el peso del contenido, así que una tabla de etiqueta más texto queda proporcionada de forma natural. Ten en cuenta que tabulary también procesa el cuerpo dos veces, por lo que se aplican las mismas precauciones con notas al pie y contadores que en tabularx.

tabularray — el entorno tblr moderno

tabularray es el paquete de tablas desarrollado con más actividad en los últimos años, escrito por Jianrui Lyu (lvjr). Desecha la maquinaria antigua basada en \halign y analiza y compone tablas directamente con LaTeX3 (expl3). Su rasgo principal es que unifica en una sola interfaz clave-valor lo que antes requería varios paquetes juntos —array, booktabs, multirow, colortbl, diagbox— para reglas, color, celdas combinadas, formato de párrafo y anchos de columna. Se carga con \usepackage{tabularray}; el entorno principal es tblr.

La estructura de tblr difiere un poco de tabular: antes del cuerpo das un argumento de opciones clave-valor separadas por comas, la especificación interna, como en \begin{tblr}{ … inner spec … }. La alineación de columnas se declara con la clave colspec. Puedes usar la forma familiar de una letra colspec={lcr}, pero su fuerza real está en Q[…] (una columna genérica que recibe alineación, ancho y otras opciones entre corchetes) y X[…] (una columna expansible como en tabularx). X[c] es una columna expansible centrada; X[2,l] es una alineada a la izquierda con coeficiente 2, el doble de ancho que una X normal.

Cuando uses columnas X, da el ancho al que se expanden con la clave width (por omisión \linewidth si no se fija). El espaciado entre filas y entre columnas se controla con rowsep y colsep, que en tblr valen por omisión rowsep=2pt y colsep=6pt. Las reglas son declarativas: hlines / vlines dibujan todas las reglas horizontales / verticales, y hline{n} / vline{n} dan estilo a una línea concreta, como hline{2}={1pt,solid}. No se escribe \hline en el cuerpo.

Las celdas que abarcan varias filas o columnas se declaran en el cuerpo con \SetCell. \SetCell[c=2]{c} es una celda centrada que abarca 2 columnas (equivalente a \multicolumn), y \SetCell[r=2]{c} abarca 2 filas (equivalente a \multirow); c= y r= dan la extensión en columnas / filas, y el argumento entre llaves la alineación de la celda. Para dar estilo a filas o columnas enteras, usa \SetRow / \SetColumn, por ejemplo \SetRow{cyan8} sombrea una fila en cian pálido (nombres de color integrados en el paquete).

document.tex
\usepackage{tabularray}
% ...
\begin{tblr}{
  width = \textwidth,
  colspec = {Q[l] X[c] X[2,l]},
  rowsep = 3pt,
  hline{1,Z} = {1pt,solid},
  hline{2} = {0.5pt,solid},
  row{1} = {font=\bfseries},
}
  項目 & 区分 & 説明 \\
  \SetCell[r=2]{l} 表環境 & 固定幅 & 表全体の幅を固定し、X 列が残りを分け合う。 \\
   & 内容幅 & 各列の中身の量に応じて幅を配分する。 \\
  注記 & --- & 罫線・色・結合をキーで一括指定できる。 \\
\end{tblr}

Este tblr fija el ancho de la tabla al ancho del texto con width=\textwidth. Las tres columnas son Q[l] (columna básica izquierda), X[c] (columna expansible centrada) y X[2,l] (columna expansible izquierda con coeficiente 2), así que las dos columnas X dividen el ancho sobrante 1 : 2 y la columna 3 (“Description”) acaba siendo la más ancha. No aparece \hline en el cuerpo: las reglas vienen solo de las claves hline{…} de la especificación interna (Z es el índice especial de la última fila). La primera fila va en negrita con row{1}={font=\bfseries}, y la celda “Table environment” de la columna 1 abarca dos filas con \SetCell[r=2]{l}. Lograr todo esto sin cargar booktabs, multirow y array es precisamente el atractivo de tabularray.

Para tablas que abarcan páginas existe el entorno longtblr, con filas de encabezado repetidas, leyendas y notas al pie; para una tabla de una sola página con notas al estilo de threeparttable, se usa talltblr. En estos entornos, la leyenda, la etiqueta, note{…} y similares van en el argumento opcional […] antes del cuerpo, la especificación externa.

Cuál elegir

Regla práctica: para hacer que una tabla encaje en un ancho fijo con columnas de prosa de igual ancho, usa tabularx; para fijar el ancho pero repartirlo naturalmente según cuánto contiene cada columna, usa tabulary; para manejar reglas, color, celdas combinadas y anchos de columna mediante un único sistema en trabajo nuevo, usa tabularray.

tabularray es rico en funciones y absorbe el problema de ancho que resuelven tabularx / tabulary mediante columnas X más la clave width. En cambio, tabularx y tabulary son maduros, ligeros y encajan cómodamente con código tabular existente. Piénsalo así: usa los paquetes antiguos para añadir control de ancho a una tabla corta existente, y tabularray cuando construyas tablas serias desde cero.

PaqueteCómo se fija el anchoMejor para
tabularxTotal fijo; columnas X comparten por igualColumnas de prosa de igual ancho ajustadas
tabularyTotal fijo; repartido por contenidoTablas desiguales de etiqueta más texto
tabularrayClave width + columnas X (con coeficientes)Tablas modernas con reglas, color y combinaciones unificadas

El detalle fino de las especificaciones de columnas (\multicolumn, >{…} del paquete array, etc.) está en la página “especificación de columnas”, los fundamentos de combinar celdas en “combinar celdas” y las tablas muy largas que abarcan páginas en la página “longtable”.