Combinar celdas

LaTeX no tiene una verdadera operación de «combinar celdas». Abre latex.ltx y verás que la horizontal, \multicolumn, empieza con \multispan, es decir, con la primitiva \omit de TeX: una instrucción para tirar la plantilla de columna de esa celda. No pega a las vecinas; ignora el patrón declarado y se toma su propio ancho. La vertical, \multirow, es aún más audaz: se limita a componer texto en una caja lo bastante alta como para colgar sobre las filas de abajo. Esas dos implementaciones explican casi todos los tropiezos de esta página, desde el error ! Misplaced \omit. hasta el texto impreso encima de la fila siguiente. De paso veremos la parte realmente incómoda: reglar bajo una celda combinada con \cline y \cmidrule.

Combinar columnas — \multicolumn y por qué debe abrir una celda

La forma es el \multicolumn{n}{spec}{text} de tres argumentos: n es el número de columnas que abarca, spec la especificación de la única celda resultante y text su contenido. Está integrado en LaTeX estándar, así que no hace falta paquete. El punto crucial es que spec describe una sola columna combinada y no hereda las n especificaciones originales, de modo que escribe exactamente uno de l, c o r. Poner dos, como en \multicolumn{2}{cc}{…}, lo rompe con ! Missing \endgroup inserted. seguido de ! Extra alignment tab has been changed to \cr.. En cambio, spec puede llevar una regla vertical | o un @{…}, que sustituyen reglas y espacio entre columnas solo para esa celda combinada.

\multicolumn debe ser lo primero en una celda. Llámalo después de otra cosa, como en X \multicolumn{1}{c}{Y} & Z, y obtendrás ! Misplaced \omit.. Como se apuntó arriba, \multicolumn es en realidad \omit, la primitiva que declara «no uses la plantilla de esta celda», y una declaración así solo puede significar algo antes de que la celda haya empezado. Por eso el error llega con el nombre \omit y no con el de \multicolumn.

latex
\begin{tabular}{lcc}
  \hline
  \multicolumn{3}{c}{Sales summary} \\
  \hline
  Item & H1 & H2 \\
  \hline
  Domestic & 120 & 145 \\
  Overseas & 80  & 96  \\
  \hline
\end{tabular}

La primera fila pliega lo que serían tres columnas en una celda centrada con \multicolumn{3}{c}{Sales summary}, que hace de título de toda la tabla. Incluso en una fila combinada, las celdas de esa fila deben sumar el número declarado de columnas; aquí \multicolumn{3}{…} cubre las tres, así que no hace falta ningún &. Conviene recordar también el uso de poner n en 1. No abarca nada, pero puede sobrescribir la alineación de esa celda o quitar la regla vertical | en esa posición. Para centrar solo el encabezado de una columna numérica (r), escribe \multicolumn{1}{c}{Header}; para suprimir la regla de una sola celda en una tabla enmarcada, basta con no poner | en spec.

Cuando dos celdas \multicolumn quedan una junto a otra en una tabla enmarcada, escribe la regla vertical solo en una de ellas. Si tras \multicolumn{2}{|c|}{left} pones \multicolumn{2}{|c|}{right}, se dibujan dos reglas superpuestas en el límite, y esa se ve claramente más gruesa que las demás; sube \arrayrulewidth y salta a la vista. Lo correcto es quitar la barra inicial de la segunda: \multicolumn{2}{c|}{right}. Es un efecto colateral de la implementación llana: \multicolumn dibuja exactamente lo que escribiste en lugar de la plantilla que descartó, y no se ocupa de limpiar duplicados.

Combinar filas: el paquete multirow y sus argumentos

Una celda que abarca filas no se hace con un comando estándar: hay que cargar el paquete multirow (TeX Live 2024 incluye la v2.8 del 15 de marzo de 2021). Si lo olvidas, obtienes sin más ! Undefined control sequence.. La forma completa tiene seis huecos —\multirow[vpos]{nrows}[bigstruts]{width}[vmove]{text}— de los que solo nrows, width y text son obligatorios: el número de filas que abarca, el ancho de la celda y su contenido. Pasa * como ancho y el texto se compone en su ancho natural, lo que hace de \multirow{3}{*}{Label} la forma más directa.

La regla decisiva es dejar vacías las celdas de debajo. Pon \multirow en la fila superior y, en las siguientes, pasa por esa columna con solo un &. En palabras de la documentación oficial: deja vacías las demás filas en esa columna, «otherwise the stuff created by \multirow will over-write it». Si escribes contenido real ahí, no aparece error alguno: los dos textos se imprimen sencillamente uno sobre otro. nrows también puede ser negativo: un valor positivo abarca «esta fila y las n−1 filas de abajo», uno negativo «esta fila y las |n|−1 filas de arriba», cubriendo el mismo número de filas en ambos casos; la única diferencia es si escribes el comando en la fila de arriba o en la de abajo. También se admiten valores fraccionarios, así que \multirow{2.5}{*}{…} puede afinar la altura.

document.tex
\usepackage{multirow}
% ...
\begin{tabular}{|l|l|c|}
  \hline
  \multirow{2}{*}{Fruit}     & Apple  & 380 \\
                             & Orange & 120 \\
  \hline
  \multirow{2}{*}{Vegetable} & Carrot & 90  \\
                             & Radish & 150 \\
  \hline
\end{tabular}
ArgumentoFunciónNotas
[vpos]Alineación vertical (opcional, primero)Por omisión c; también t / b
nrowsFilas que abarca (obligatorio)Positivo hacia abajo, negativo hacia arriba; admite fracciones
[bigstruts]Número de usos de bigstrut abarcados (opcional)Por omisión 0; prefijo t / b / tb para afinar
widthAncho de celda (obligatorio)* ancho natural, = el ancho de la columna, una longitud da una parbox
[vmove]Ajuste fino de posición (opcional, antes de text)Positivo sube, negativo baja
\multirowsetupGancho expandido justo antes de textInicialmente \raggedright; se cambia con renewcommand

Da a width una longitud absoluta en vez de *\multirow{2}{4em}{…}— y el contenido se compone como una parbox de ese ancho, de modo que una etiqueta larga se parte. Con esa forma quizá notes que el texto sale en bandera izquierda y no justificado. No es un fallo sino el diseño: el gancho \multirowsetup, expandido justo antes de text, contiene inicialmente \raggedright. Para centrarlo, escribe \renewcommand{\multirowsetup}{\centering}. Además, width acepta un valor más, =, que significa «usa el ancho definido para la columna en la que está la entrada»: útil dentro de una columna p{} o de una columna X de tabularx, pero en una columna sin ancho definido produce un resultado extrañamente ancho.

\multirow no reserva espacio: cuando el texto invade las filas siguientes

Este es el accidente más famoso con \multirow. No hace que la tabla reserve el espacio vertical que necesita. La altura de su caja solo se estima a partir de nrows y bigstruts, porque desconoce las alturas reales de las filas. Así que cuando el contenido forma una caja alta, sencillamente cuelga sobre las filas de abajo o por debajo del final de la tabla. La documentación oficial lo dice sin rodeos, ilustrándolo con una tabla de efectos secundarios en la que dos entradas \multirow «are too high; the first sticks out into the second entry, and the second one sticks out of the table». El síntoma aparece siempre que nrows es demasiado pequeño para la cantidad de contenido.

Hay tres arreglos, los dos primeros de la documentación oficial. Primero, añadir filas vacías para cubrir el solapamiento: escribe tantas líneas & & \\ como te falten. Es la vía más segura y solo exige contar filas. Segundo, estirar las propias filas: pon en cada una un puntal de ancho cero como \newcommand{\mystrut}{\rule[-8pt]{0pt}{20pt}} para ganar altura. (También puedes usar \bigstrut del paquete bigstrut y declarar cuántos abarcaste en [bigstruts].) Tercero, declarar un nrows mayor que el literal, incluso fraccionario: lo más rápido, pero descuadra fácilmente la relación con las reglas, así que déjalo como último recurso.

document.tex
\usepackage{multirow}
% ...
% the label wraps to four lines but the block has only two rows,
% so raise nrows to 4 and add two empty rows to cover the overlap
\begin{tabular}{|l|c|}
  \hline
  \multirow{4}{4em}{A long label that wraps} & one \\
                                             & two \\
                                             &     \\
                                             &     \\
  \hline
  next & row \\
  \hline
\end{tabular}

La misma debilidad —desconocer las alturas de fila— aparece también cuando alguna fila del resto de la tabla es inusualmente alta. El ejemplo de la documentación es una tabla cuya tercera fila se parte en una columna p{4cm}, de modo que \multirow{3}*{Week 38} acaba por encima del centro visual del bloque. Cuando las filas no tienen la misma altura, el centro que estimó \multirow y el que ve el ojo no coinciden. Ese desajuste se corrige a mano con un [vmove] pequeño. Usar una unidad relativa como .1ex da a la corrección buenas probabilidades de sobrevivir a un cambio posterior del cuerpo del texto: ese consejo también es de la documentación oficial.

Cuando una regla se cruza con una celda combinada: \cline y \cmidrule, no \hline

Este es el punto más incómodo de todo el asunto. Escribe \hline entre filas que abarca un \multirow y la regla se traza justo a través del texto de la celda combinada: la etiqueta parece tachada, porque \hline se limita a tender una \hrule a todo el ancho de la tabla entre dos filas y no sabe nada de lo que hay encima. Engrosa \arrayrulewidth y verás claramente las letras atravesadas por la línea. El remedio es simple: dejar esa columna fuera de la regla, con un rango de columnas: \cline{2-3} en LaTeX estándar, o \cmidrule{2-3} si usas booktabs.

document.tex
\usepackage{multirow}
% ...
% \hline here would draw straight through the word "Group";
% \cline{2-3} spares column 1
\begin{tabular}{|l|l|c|}
  \hline
  \multirow{2}{*}{Group} & alpha & 1 \\
  \cline{2-3}
                         & beta  & 2 \\
  \hline
\end{tabular}

\cline y \cmidrule aceptan ambos un rango de columnas, pero tienen caracteres distintos. \cline{i-j} tiene el grosor de \arrayrulewidth (0,4 pt por omisión) y va exactamente de borde a borde de las columnas indicadas, de modo que dos \cline contiguos se unen y se leen como uno solo. El \cmidrule{i-j} de booktabs es más fino —\cmidrulewidth, 0,03 em por omisión, unos 0,3 pt con cuerpo de 10 pt— y toma \aboverulesep y \belowrulesep de espacio arriba y abajo. Más importante en la práctica: un argumento opcional entre paréntesis recorta sus extremos. \cmidrule(lr){2-3} lo acorta por ambos lados, de forma que se abre un hueco entre él y el \cmidrule vecino y ambos se leen como reglas separadas: el tratamiento habitual cuando varios grupos de encabezado van uno al lado del otro.

latex
\usepackage{booktabs}
% ...
% two \multicolumn headers, each underlined by its own trimmed rule
\begin{tabular}{lcccc}
  \toprule
       & \multicolumn{2}{c}{2024} & \multicolumn{2}{c}{2025} \\
  \cmidrule(lr){2-3} \cmidrule(lr){4-5}
  Item & Q1 & Q2 & Q1 & Q2 \\
  \midrule
  Apple & 1 & 2 & 3 & 4 \\
  \bottomrule
\end{tabular}

Esta es la forma de trabajo estándar al combinar \multicolumn con reglas. \multicolumn{2}{c}{2024} crea un encabezado sobre dos columnas, y el \cmidrule(lr){2-3} justo debajo dice «estas dos van juntas». Quita el (lr) y las dos reglas se unen, ocultando el límite entre grupos. Si de verdad quieres dos \cmidrule apilados sobre el mismo rango de columnas, intercala el \morecmidrules de booktabs: escritos sin más uno tras otro, dos se tratan como pertenecientes a la misma fila de reglas. En tablas con color, un \cline puede desaparecer bajo el panel de fondo; ese síntoma y el rodeo con hhline se tratan en la página «Colorear una tabla».

Combinar un bloque rectangular: \multirow va dentro de \multicolumn

Un bloque rectangular que abarca ambas direcciones se hace combinando \multirow y \multicolumn. El orden es fijo: pon \multirow dentro de \multicolumn. La documentación oficial da \multicolumn{2}{c}{\multirow{3}{*}{Multi-multi}} como ejemplo y afirma que anidarlos al revés «will not work». Recuérdalo así: el \multicolumn exterior lleva la extensión horizontal y el \multirow interior la vertical. Y la regla de \multirow sigue vigente aquí: la misma posición en las filas de abajo conserva la forma del \multicolumn pero se deja sin contenido.

document.tex
\usepackage{multirow}
% ...
\begin{tabular}{|l|l|c|}
  \hline
  \multicolumn{2}{|c|}{\multirow{2}{*}{Region and class}} & Count \\
  \multicolumn{2}{|c|}{}                                  &       \\
  \hline
  East & Kanto  & 12 \\
  \cline{1-3}
  West & Kansai & 9  \\
  \hline
\end{tabular}

Partir líneas dentro de una celda no es combinar: makecell

Conviene hacer aquí una distinción. Querer que una sola celda se parta en varias líneas no es combinar celdas. Como las columnas l, c y r no se ajustan, tienta escribir \\ directamente dentro de una celda; pero hacerlo rompe la tabla en silencio, sin error: con A & B\\C \\, TeX lee el \\ como fin de fila y compone C como primera celda de la fila siguiente. Precisamente la ausencia de error hace que este fallo sea el más molesto. Cuando solo quieres partir una cadena corta donde tú elijas, \makecell{…} del paquete makecell es la herramienta más cómoda.

\makecell{line1\\line2} compone su contenido como un pequeño tabular de una columna, y por eso \\ funciona allí como salto de línea forzado. Un argumento opcional fija la alineación —\makecell[l]{…} a la izquierda, \makecell[t]{…} arriba— pasando una letra para la alineación vertical y otra para la horizontal (ambas centradas por omisión). Para encabezados existe además \thead{…}, con fuente y espaciado comunes. Si el contenido es largo y quieres que se ajuste automáticamente a un ancho, la vía correcta es una columna p{width}, o m{width} de array para centrado vertical, no \makecell.

document.tex
\usepackage{makecell}
% ...
\begin{tabular}{lc}
  \hline
  \thead{Item} & \thead{Year on year\\(\%)} \\
  \hline
  Revenue & \makecell[r]{+8.2\\(record high)} \\
  \hline
\end{tabular}

Qué herramienta usar y cuándo

Elegir es sencillo: abarca columnas con \multicolumn, filas con \multirow, usa ambos para un rectángulo (con \multirow dentro) y recurre a \makecell solo para partir líneas dentro de una celda. Si quieres que la prosa larga se ajuste a un ancho, ninguno de ellos es la respuesta: eso es tarea de una columna p{width}. Y cuando termines una tabla con combinaciones, mira siempre el PDF y comprueba tres cosas: si olvidaste vaciar una celda bajo un \multirow (¿hay texto superpuesto?), si la caja del \multirow cuelga por debajo del bloque (sube nrows o añade una fila vacía) y si una regla atraviesa una celda combinada (cambia \hline por \cline o \cmidrule). Esos tres cubren casi todos los accidentes que ocurren de verdad.