El primer argumento de tabular, una especificación de columnas como {lcr}, no es solo un lugar para listar alineaciones. Es un pequeño lenguaje: junto con el número de columnas y su alineación, puedes indicar que LaTeX inserte una declaración antes o después de cada celda, sustituya el espacio entre columnas o repita un grupo de columnas. Gran parte de esto no existe en el tabular simple; lo añade el paquete array. Partiendo de l, c, r y p{width}, esta página recorre m{width} y b{width}, >{…} y <{…}, @{…} y !{…}, y *{n}{…}.
El minilenguaje de las columnas
Los cuatro básicos se cubrieron en otra página. l, c y r alinean a la izquierda, al centro y a la derecha, dimensionando la columna al contenido natural sin ajuste. Solo p{width} se compone como una caja de párrafo del ancho dado que se ajusta cuando el contenido lo supera. En los términos del paquete array, p{width} equivale a \parbox[t]{width}: un párrafo alineado arriba. Ese valor predeterminado “arriba” es el punto de contraste con los dos parientes que añadimos ahora.
La mayoría de la notación que aparece a partir de aquí — m/b, >/<, @/!, * — solo está disponible después de poner \usepackage{array} en el preámbulo. array viene con TeX Live y MiKTeX, y muchos paquetes de tablas (tabularx, booktabs y otros) lo cargan internamente, así que a menudo ya está activo. Aun así, cargarlo explícitamente es lo más seguro.
Columnas de párrafo — p, m, b
Hay tres tipos de columna de párrafo con ajuste, que solo difieren en la posición vertical de la celda, es decir, cómo se alinea su caja dentro de la fila. Según el manual de array, p{width} es \parbox[t], alineado arriba; m{width} centra su contenido verticalmente en la fila; y b{width} es \parbox[b], alineado abajo. m y b son añadidos del paquete array; el tabular simple no los tiene.
Esto importa cuando una fila mezcla una celda alta, como una columna p que se ajusta a varias líneas o una imagen grande, con celdas de una sola línea. Con el p predeterminado, alineado arriba, una celda corta vecina se pega al borde superior de la fila y no queda a la altura del centro de la celda alta. Usar m{width} coloca el contenido de esa columna en el centro vertical de la fila, de modo que se alinea naturalmente con una vecina de una línea. Es útil en celdas con imágenes o en tablas que ponen una etiqueta y una descripción larga una al lado de la otra.
\usepackage{array}
% ...
\begin{tabular}{ p{3cm} m{3cm} b{3cm} }
\hline
上端揃え (p) & 縦中央 (m) & 下端揃え (b) \\
この列は parbox[t]。 & この列は行の上下中央に。 & この列は parbox[b]。 \\
\hline
\end{tabular}Con el mismo ancho y el mismo texto, p, m y b cambian dónde se sitúa verticalmente cada celda. En las tres, ten en cuenta que dentro de una columna de párrafo \parindent (sangría de párrafo) es 0 por omisión; puedes añadirla de nuevo, por ejemplo, con >{\setlength{\parindent}{1em}}.
| Especificador | Posición vertical | parbox equivalente | Proporcionado por |
|---|---|---|---|
p{wd} | Arriba | \parbox[t]{wd} | Estándar |
m{wd} | Medio | centrado en la fila | array |
b{wd} | Abajo | \parbox[b]{wd} | array |
Insertar alrededor de celdas — >{…} y <{…}
La pieza central del paquete array son >{decl} y <{decl}. >{decl} inserta decl justo antes del contenido de cada celda de esa columna; <{decl} lo inserta justo después. Por ejemplo, >{\bfseries}l hace que todas las celdas de una columna alineada a la izquierda estén en negrita sin escribir \bfseries en cada una. >{\itshape}c da cursiva centrada, >{\color{red}}r rojo alineado a la derecha, etc.
También puedes poner declaraciones de alineación en >{…}. Las columnas de párrafo (p, m, b) se justifican por omisión, pero >{\raggedright}p{4cm} crea una columna alineada a la izquierda con derecha irregular, >{\centering} una centrada y >{\raggedleft} una alineada a la derecha. Esto satisface el deseo fino de “ajustar, pero no justificar”.
Hay, sin embargo, una trampa importante. Los tres comandos \raggedright, \raggedleft y \centering redefinen internamente el terminador de fila \\. Si una columna que usa uno de ellos en >{…} es la última columna de la tabla, \\ deja de funcionar como “fin de fila” y aparecen errores o una salida rota. La solución es añadir \arraybackslash de array al final de la declaración: >{\raggedright\arraybackslash}p{4cm} restaura \\ como salto de fila. Lo mismo se aplica a \centering y \raggedleft.
Otro truco habitual es poner toda una columna en modo matemático. Escribir >{$}c<{$} encierra cada celda con $ antes y después, de modo que todas las celdas de esa columna se componen como matemáticas en línea; ya no hace falta escribir $…$ en cada celda llena de números o símbolos. A la inversa, dentro de un entorno array, cuyas celdas ya están en modo matemático, >{$}…<{$} hace que los dos $ se cancelen y pone solo esa columna en modo texto.
Advertencia: lo que va en >{…} y <{…} debe ser una declaración. Las formas que no toman un argumento siguiente, como >{\bfseries} o >{\itshape}, están bien, pero no debes terminar con un comando que toma argumento. Por ejemplo, >{\textbf} intentará leer el contenido de la celda como su argumento y fallará; para negrita, usa la forma declarativa \bfseries. El manual de array advierte que >{\textbf} no pondría en negrita toda la columna ni siquiera el primer carácter.
En el límite entre columnas — @{…} y !{…}
Entre dos columnas, LaTeX inserta por omisión espacio \tabcolsep (6 pt por cada lado, por lo que el total es el doble). Colocado en esa posición de la especificación, @{decl} elimina el espacio entre columnas allí e inserta decl en su lugar; en palabras del manual de array, “suppresses inter-column space and inserts decl. instead”.
Tiene dos usos principales. Primero, recortar el relleno exterior de la tabla: poner @{} (una declaración vacía) en ambos extremos de la especificación elimina \tabcolsep a la izquierda de la primera columna y a la derecha de la última, de modo que la tabla queda alineada con el margen izquierdo del texto; es un modismo común en tablas con booktabs. Segundo, insertar un separador: para alinear números por el punto decimal, sepáralos en una columna de parte entera y otra de parte fraccionaria y coloca @{.} entre ellas; los puntos quedan en una posición fija y producen alineación decimal.
La contraparte de @{…} es !{decl}. Puede escribirse donde iría una regla vertical | e inserta un decl arbitrario en lugar de la regla. La diferencia decisiva con @{…} es que !{…} no elimina el espacio normal entre columnas. Por eso sirve para casos como “dibujar una línea discontinua entre columnas pero conservar el relleno”, por ejemplo colocando un comando de regla discontinua del paquete arydshln dentro de !{…}.
Por cierto, cargar array también cambia ligeramente el comportamiento de la regla vertical |: el espacio entre columnas aumenta por el grosor de la regla. En LaTeX estándar la regla se coloca dentro del espacio existente y la separación no crece. Dicho esto, las reglas verticales en sí suelen evitarse en tablas profesionales; ese tema se deja para “reglas y tablas de calidad editorial”.
Repetir columnas — *{n}{…}
Cuando muchas columnas con la misma especificación van seguidas, *{count}{spec} pliega la repetición. Según el manual de array, equivale a “count copias de spec”. Para seis columnas centradas, escribe *{6}{c} en lugar de cccccc. La unidad repetida puede contener varios especificadores: *{3}{|c}| se expande a |c|c|c|. Es especialmente útil para repetir una especificación larga con >{…} o @{…}; por ejemplo, *{4}{>{$}c<{$}} construye cuatro columnas matemáticas centradas de una vez.
Un ejemplo que combina varios recursos
Por último, aquí hay una especificación de columnas que reúne las herramientas anteriores. La columna 1 es una columna de etiquetas en negrita (>{\bfseries}l); la columna 2 es una columna de párrafo ajustable alineada a la izquierda (>{\raggedright\arraybackslash}p{5cm}; aquí no es estrictamente necesario porque no es la última columna, pero se añade \arraybackslash por costumbre); las columnas 3 y 4 son columnas matemáticas centradas construidas juntas con *{2}{…}; y el relleno exterior se recorta con @{} en ambos extremos.
\usepackage{array}
% ...
\begin{tabular}{@{} >{\bfseries}l >{\raggedright\arraybackslash}p{5cm} *{2}{c} @{}}
\hline
記号 & 意味 & 値 & 単位 \\
\hline
$c$ & 真空中の光速。物理定数のひとつ。 & $2.998\times10^{8}$ & m/s \\
$g$ & 標準重力加速度。地表付近での近似値。 & $9.807$ & m/s$^2$ \\
\hline
\end{tabular}El resultado: la columna de símbolos queda uniformemente en negrita, la columna de significado se ajusta a 5cm alineada a la izquierda, las dos columnas de valores quedan centradas y toda la tabla se alinea con el borde izquierdo del texto sin relleno exterior. Poder empaquetar varios mecanismos en una especificación es la fuerza del lenguaje de columnas, pero puede volverse difícil de leer. Para una combinación que uses a menudo, dale un nombre con \newcolumntype{yourletter}{…} como tipo de columna personalizado y reutilízala de forma breve, como {C C C}; es una función del paquete array.
Para alinear números por el punto decimal, por cierto, la opción moderna y fiable es la columna S del paquete siunitx, no el @{.} mostrado aquí. La columna S analiza cada número y alinea correctamente la parte entera, el punto decimal, la parte fraccionaria, el exponente e incluso las incertidumbres, además de ordenar la agrupación de cifras y las cifras significativas. Consúltalo junto con la página “tablas anchas y ancho automático”.