Lo que hace que una tabla de LaTeX se reconozca al instante como una tabla de LaTeX son sus líneas. Los trazos hechos con \hline y | parecen pegados a las letras, y eso se mide en lugar de intuirse: \hline no añade a la fila más que sus propios 0,4pt de grosor, con cero espacio arriba y abajo. El \midrule de booktabs trae una línea de 0,5pt más 4,52pt de blanco. Lo que separa una tabla de revista de una tabla LaTeX por defecto son exactamente esos pocos puntos de aire. Esta página recorre las líneas estándar \hline, \cline y \vline, después booktabs con \toprule / \midrule / \bottomrule, y por último hhline para los cruces a los que ninguno de los dos llega, siempre con cifras medidas.
Por qué \hline, \cline y | se ven apretados
La respuesta es que no añaden espacio alguno. Mida un tabular de dos filas: sin líneas mide 24,0pt de alto; con un \hline entre las filas pasa a 24,4pt. El aumento es exactamente \arrayrulewidth (0,4pt por omisión), el grosor de la propia línea y nada más. No se inserta blanco, y por eso la línea parece tocar las letras. \cline es aún más extremo: añadir \cline{2-3} deja la altura en 24,0pt, un aumento de cero exacto. La línea no separa las filas: se traza dentro del interlineado que ya existía.
Las herramientas en sí son sencillas. \hline, colocado tras el \\ de una fila (o al principio o al final de la tabla), traza una línea a lo ancho completo; dos seguidas, \hline\hline, dan una línea doble separada por \doublerulesep (2pt por omisión). Para trazar solo parte de una fila está \cline{i-j}: \cline{2-3} traza bajo las columnas 2 y 3, y los tramos separados se enumeran como \cline{1-1}\cline{3-4}. Las líneas verticales pertenecen a la especificación de columnas, no al cuerpo: {|l|c|r|} pone una línea de altura completa en cada |, y || una doble. También existe \vline para una línea vertical dentro de una sola celda. El grosor de |, \hline y \vline lo gobierna \arrayrulewidth, así que \setlength{\arrayrulewidth}{0.8pt} los engruesa todos a la vez.
% every standard ruling feature at once -- and a specimen of what to avoid
\begin{tabular}{|l|c|r|}
\hline
Item & Qty & Price \\
\hline\hline
Apple & 3 & 380 \\
\cline{2-3}
Orange & 12 & 120 \\
\hline
\end{tabular}Este ejemplo encierra cada columna con |, pone una línea doble bajo el encabezado con \hline\hline y corta el centro con \cline{2-3}. Recorre todo el repertorio estándar y es, precisamente, una muestra del exceso de líneas que conviene evitar. En la tradición tipográfica una línea no es una jaula alrededor de los datos, sino un recurso discreto que marca su división lógica. Las líneas verticales levantan muros entre columnas y detienen el ojo; las dobles cargan la página sin dar nada a cambio. Si se queda con el \hline normal, al menos no encajone la tabla: una línea bajo el encabezado y otras arriba y abajo, ninguna más. El paquete booktabs de la sección siguiente es esa disciplina convertida en código.
Cómo usar booktabs — \toprule, \midrule, \bottomrule
Basta con escribir \usepackage{booktabs} en el preámbulo y sustituir \hline por tres clases de línea: \toprule en lo alto de la tabla, \midrule donde el encabezado se encuentra con el cuerpo y \bottomrule al pie. Solo con eso se obtiene una tabla de revista, sin líneas verticales ni dobles. Dos cosas hacen el trabajo: gradúa las líneas en tres grosores y coloca espacio encima y debajo de cada una. Las cifras lo dejan claro: la misma tabla de tres filas mide 37,20pt de alto con \hline y 47,14pt con booktabs. Contenido idéntico y unos 10pt más de blanco.
Los valores por omisión están en booktabs.sty: \heavyrulewidth=.08em (para \toprule y \bottomrule), \lightrulewidth=.05em (\midrule), \cmidrulewidth=.03em (\cmidrule). Medidos en un documento a 10pt son 0,80002pt, 0,50003pt y 0,29999pt, un juego que encierra los 0,4pt de \hline por arriba y por abajo. La elegancia está en la unidad: al expresarse en em, un documento a 11pt obtiene una línea pesada de 0,876pt y uno a 12pt de 0,94pt, de modo que las líneas engordan en proporción a la letra. \arrayrulewidth, en cambio, se queda en 0,4pt sea cual sea la clase, así que solo por eso \hline no guarda escala con su propio texto. En cuanto al espacio, \aboverulesep=.4ex (1,72218pt a 10pt) y \belowrulesep=.65ex (2,79857pt). Una sola \midrule añade por tanto 0,5+1,72+2,80 = 5,02pt a la fila, más de doce veces los 0,4pt de \hline.
\usepackage{booktabs}
% \toprule goes right after \begin{tabular}{...}; the rest follow a row's \\
\begin{tabular}{@{}llr@{}}
\toprule
\multicolumn{2}{c}{Fruit} \\
\cmidrule(lr){1-2}
Kind & Grade & Price \\
\midrule
Apple & premium & 380 \\
Orange & second & 120 \\
\addlinespace
Total & & 500 \\
\bottomrule
\end{tabular}El pequeño hueco delante de la fila de totales lo produce \addlinespace. Colocado tras el \\ de una fila, inserta \defaultaddspace (.5em, es decir 5pt en un documento a 10pt), y se puede indicar la cantidad con \addlinespace[1ex]. Expresa la intención con más claridad que estirar una fila con \\[2pt], y junto a una línea controla el hueco con exactitud. Solo cuando quiera dictar usted mismo el grosor y el espacio arriba y abajo recurra a \specialrule{width}{above}{below} (los tres argumentos son obligatorios), un comando para casos excepcionales; las tres líneas habituales bastan. Las líneas deben ir en un límite de fila: escribir \toprule en medio de una celda detiene la compilación con ! Misplaced \noalign., porque, igual que \hline, estos comandos operan dentro de \noalign.
| Comando / longitud | Función | Valor por omisión (medido a 10pt) |
|---|---|---|
\toprule | Línea en lo alto de la tabla | \heavyrulewidth = .08em = 0,80002pt |
\midrule | Línea que separa encabezado y cuerpo | \lightrulewidth = .05em = 0,50003pt |
\bottomrule | Línea al pie de la tabla | \heavyrulewidth = .08em = 0,80002pt |
\cmidrule(lr){a-b} | Línea parcial que cubre solo las columnas a–b | \cmidrulewidth = .03em = 0,29999pt; recorte \cmidrulekern = .5em = 5pt |
\aboverulesep | Espacio insertado encima de cada línea | .4ex = 1,72218pt |
\belowrulesep | Espacio insertado debajo de cada línea | .65ex = 2,79857pt |
\addlinespace | Espacio adicional entre dos filas | \defaultaddspace = .5em = 5pt |
\specialrule | Línea con grosor y ambos huecos indicados | Los tres argumentos son obligatorios (sin valores por omisión) |
De paso: que \heavyrulewidth llame «width» a lo que es un grosor no es un desliz del inglés. booktabs.dtx incluye una nota terminológica que explica que en la composición británica una línea se llama siempre «rule», y que el grosor de un rule «suele denominarse su width», allí donde —añade el autor con sorna— casi todo el mundo hablaría de depth o height tratándose de un filete horizontal. Trasladó esa jerga del oficio tal cual a los nombres de los comandos. Y una cosa más: la versión de booktabs que acompaña a TeX Live 2024 es 1.61803398, es decir φ, la razón áurea. Una nota al pie de la portada del .dtx dice, en palabras del propio autor, que el número de versión «converge hacia phi, la razón áurea», con un dígito más por publicación. El resumen enumera 1.618, 1.6180, 1.61803 y 1.618033, y una nota registra que esas correcciones de errores las publicó Danie Els en ausencia del autor.
La diferencia entre \cline y \cmidrule
La diferencia visible se reduce a el espacio y el tratamiento de los extremos. Medido sobre la misma tabla de dos filas, \cline{2-3} añade 0,0pt de altura, mientras que \cmidrule{2-3} añade 4,82pt (0,29999pt de línea más \aboverulesep 1,72218pt más \belowrulesep 2,79857pt). Por eso un \cline parece morder las letras. La otra diferencia son los extremos. Por omisión, un \cmidrule ocupa todo el ancho de sus columnas y choca con una línea parcial vecina, así que se le da un recorte entre paréntesis: (l), (r) y (lr) retiran el extremo izquierdo, el derecho o ambos en \cmidrulekern (.5em = 5pt), y la cantidad puede indicarse, como en (r{.75em}). La sintaxis completa es \cmidrule, seguido del grosor entre corchetes, el recorte entre paréntesis y {a-b}. Como regla práctica, un \multicolumn que agrupa encabezados de columna pide casi siempre un \cmidrule(lr){…} debajo.
Lo que no debe hacerse es mezclarlas. El autor dice sin rodeos que estas líneas «no está garantizado que funcionen con \hline o \cline… no se me ocurre ninguna razón para querer mezclarlas». De hecho, las líneas están construidas para no enlazar con el | de una especificación de columnas, y la documentación lo califica de característica deliberada. Solo cuando se necesita de veras una línea parcial doble a una misma altura se pone \morecmidrules entre dos \cmidrule (\cmidrule{1-2}\morecmidrules\cmidrule{1-2}; la separación es \cmidrulesep, cuyo valor por omisión son los mismos 2pt que \doublerulesep). Como las líneas dobles ya están desaconsejadas, tampoco es una herramienta de uso diario.
Por qué no conviene usar líneas verticales
El manual de booktabs lo dice en imperativo y sin matices. No se equivocará mucho, afirma, si recuerda siempre dos pautas sencillas: «1. Nunca, jamás use líneas verticales. 2. Nunca use líneas dobles.» Y continúa: «Estas pautas pueden parecer extremas, pero nunca he encontrado un buen argumento para romperlas.» Si la mitad izquierda de una tabla difiere de la derecha tanto como para querer una línea entre ambas, la respuesta del autor es que debería hacer dos tablas. En otro lugar lo dice aún más corto: no use líneas verticales en las tablas, y punto.
El mismo documento enumera otras tres pautas que el autor presenta como «generalmente desconocidas fuera del círculo de tipógrafos y redactores profesionales», y son muy prácticas. Ponga las unidades en el encabezado de columna, no en el cuerpo de la tabla. Anteponga siempre un dígito al separador decimal: 0.1, nunca .1. No use marcas de ídem ni convenciones parecidas para repetir un valor: normalmente basta un blanco, y si no, repita el valor. El autor es franco sobre los límites de sus propias reglas: de la segunda pauta comenta que «trabajé para una editorial que insistía en una doble línea fina sobre una fila de totales. Pero esa no habría sido mi elección.» Las pautas no son absolutos; se rompen con motivo.
hhline — decidir cómo se cruzan las líneas
hhline traza las mismas líneas horizontales que \hline, pero permite indicar, carácter a carácter, si una línea vertical queda cortada en el cruce o lo atraviesa de largo. Es el paquete de David Carlisle del conjunto tools de LaTeX, que se carga con \usepackage{hhline}. Con un simple \hline\hline no se puede elegir si la línea vertical se interrumpe en la línea doble o la cruza. Puesto que booktabs desaconseja tanto las líneas verticales como las dobles, hhline solo se gana su sitio allí donde no se puede seguir ese consejo: una plantilla de revista con formato impuesto, un documento que hay que reproducir, una tabla contable. Fuera de esos casos, no hace falta.
El argumento de \hhline{…} es una lista de fichas que se lee casi como una especificación de columnas. Del lado horizontal: = es una línea doble del ancho de una columna, - una línea simple y ~ ninguna línea en esa columna. Del lado vertical: | es una línea vertical que atraviesa la horizontal, : una interrumpida por ella y # un tramo de línea doble entre dos verticales. También hay t (mitad superior de un tramo de línea doble) y b (mitad inferior) para construir esquinas: |t: es la superior izquierda y :b| la inferior derecha. Está disponible la misma forma de repetición *{n}{…} de las especificaciones de columnas. Ojo: escribir una línea vertical doble (|| o ::) interrumpe allí las horizontales; para que una pase sin cortarse, use # o prescinda por completo de los especificadores verticales.
\usepackage{hhline}
% the example from the package documentation: t/b build the corners,
% ~ leaves a column unruled, # is a double-rule segment between verticals
\begin{tabular}{||cc||c|c||}
\hhline{|t:==:t:==:t|}
a & b & c & d \\
\hhline{|:==:|~|~||}
1 & 2 & 3 & 4 \\
\hhline{#==#~|=#}
i & j & k & l \\
\hhline{||--||--||}
w & x & y & z \\
\hhline{|b:==:b:==:b|}
\end{tabular}La primera línea, |t:==:t:==:t|, construye las mitades superiores de las líneas dobles junto con las esquinas, y la última, |b:==:b:==:b|, las inferiores, de modo que el marco de doble línea empalma limpiamente con las verticales. Las filas intermedias mezclan ~ (sin línea) y # (un tramo de línea doble entre verticales), variando fila a fila dónde se corta y dónde se pasa de largo. Una última salvedad técnica: un \hline es una única \hrule de TeX, mientras que una línea de \hhline se ensambla con muchos segmentos pequeños. Sus posiciones en el DVI son exactas, pero algunos visores y controladores no alinean los segmentos a la perfección. La documentación sugiere probar otro controlador, o subir ligeramente \arrayrulewidth para que las juntas dejen de notarse.
Cuál usar
La conclusión es casi única: haga de booktabs su opción por omisión para las tablas corrientes. Las tres líneas \toprule, \midrule y \bottomrule, más un \cmidrule(lr){…} bajo un grupo de encabezados cuando haga falta, dan las tablas sobrias y legibles que se ven en las revistas. Si sigue «sin líneas verticales, sin líneas dobles», el trazado deja de ser algo sobre lo que deliberar.
booktabs— primera elección para casi cualquier tabla: solo líneas horizontales, grosores y espacios ya ajustados, calidad editorial.\hline/\cline/|estándar — cómodos porque no requieren paquete; válidos para tablas de rejilla y borradores rápidos. Cuidado con el exceso.hhline— solo para el caso especial en que haya que controlar con precisión cómo se cruzan líneas dobles y verticales. No es una herramienta de uso diario.- Cuando le entren ganas de añadir otra línea — pregúntese antes si
\addlinespaceno marcaría igual de bien el grupo de filas. El blanco pesa menos que una línea y hace el mismo trabajo.
Antes que las líneas, la disposición y la alineación de las columnas fijan el esqueleto de una tabla. Para lo básico de & y \\, y para descifrar Extra alignment tab y Misplaced \noalign, vea «Fundamentos de tabular». Para el detalle de las especificaciones de columna, incluidos p{width} y >{…}, vea «Especificación de columnas, alineación y ancho». Los encabezados de varios niveles que combinan \multicolumn con \cmidrule se tratan en «Combinar celdas». Poner la tabla en un entorno table y ponerle leyenda corresponde a «Colocación y estilo de tablas».