Combiner plusieurs cases d’un tableau en une seule — ce que l’on appelle fusionner des cellules — se distingue clairement par direction et par outil. Pour couvrir plusieurs colonnes horizontalement, on utilise la commande standard \multicolumn ; pour couvrir plusieurs lignes verticalement, \multirow du package multirow ; et la combinaison des deux fusionne un bloc rectangulaire. Si l’on veut seulement couper le contenu d’une cellule sur plusieurs lignes, ce n’est pas une fusion : c’est le rôle de makecell. Cette page parcourt ces quatre outils, avec les pièges d’alignement.
Fusion horizontale — \multicolumn
\multicolumn combine des colonnes adjacentes dans une même ligne. Il est intégré à LaTeX standard, sans package. Sa forme est \multicolumn{n}{spec}{text} : n est le nombre de colonnes couvertes, spec indique l’alignement de la cellule résultante (une spécification d’une seule colonne), et text est son contenu. Par exemple, \multicolumn{2}{c}{Header} fusionne deux colonnes en une cellule centrée.
Le point crucial est que spec décrit la colonne fusionnée unique, et non la reprise des n colonnes originales. Il faut donc écrire exactement l’un de l, c ou r. spec peut aussi contenir un filet vertical | ou @{…}, qui remplacent les filets et espaces intercolonnes pour cette seule cellule fusionnée. Si deux \multicolumn adjacents ont un | final pour l’un et initial pour l’autre, un seul filet est tracé, pas deux.
\begin{tabular}{lcc}
\hline
\multicolumn{3}{c}{売上集計} \\
\hline
項目 & 上期 & 下期 \\
\hline
国内 & 120 & 145 \\
海外 & 80 & 96 \\
\hline
\end{tabular}La première ligne utilise ici \multicolumn{3}{c}{Sales summary} pour replier ce qui serait trois colonnes en une seule cellule centrée, servant de titre au tableau entier. Même dans une ligne fusionnée, les cellules doivent toujours totaliser le nombre de colonnes déclaré, ici 3. Puisque \multicolumn{3}{…} couvre les trois, cette ligne n’a pas besoin de &.
Il faut aussi retenir l’idiome avec n égal à 1. \multicolumn{1}{…}{…} ne couvre aucune colonne supplémentaire, mais il peut remplacer l’alignement de cette seule cellule ou supprimer le filet vertical | à cet endroit. Pour centrer seulement l’en-tête d’une colonne numérique (r), écrivez \multicolumn{1}{c}{Header} ; pour supprimer le filet vertical d’une seule cellule dans un tableau encadré, écrivez \multicolumn{1}{c}{…} sans | dans la spécification.
Fusion verticale — multirow
Une cellule qui couvre plusieurs lignes verticalement ne peut pas être faite avec une commande standard ; il faut charger le package multirow (\usepackage{multirow} dans le préambule). Sa commande centrale est \multirow{n}{width}{text} : n est le nombre de lignes couvertes, width la largeur de la cellule, et text son contenu. Avec * comme largeur, le texte est composé à sa largeur naturelle ; \multirow{3}{*}{Label} est la forme la plus directe.
La règle décisive est de laisser vides les cellules situées sous le \multirow qu’il couvre. Placez \multirow dans la ligne supérieure, puis dans les lignes suivantes écrivez seulement &, sans contenu, à la même position de colonne. Si vous oubliez, le contenu des lignes inférieures se superpose au texte composé par \multirow. Un n positif couvre « cette ligne et les n−1 lignes dessous » ; une valeur négative couvre « cette ligne et les −n−1 lignes dessus ».
\usepackage{multirow}
% ...
\begin{tabular}{|l|l|c|}
\hline
\multirow{2}{*}{果物} & りんご & 380 \\
& みかん & 120 \\
\hline
\multirow{2}{*}{野菜} & 人参 & 90 \\
& 大根 & 150 \\
\hline
\end{tabular}Ici, « Fruit » et « Vegetable » en colonne 1 couvrent chacun deux lignes verticalement. Le point clé est que \multirow{2}{*}{Fruit} est placé dans la ligne supérieure, et que la cellule située dessous en colonne 1 est sautée avec & sans rien écrire. Comme width vaut *, le libellé est composé à sa largeur naturelle et centré verticalement sur les deux lignes.
\multirow accepte aussi deux arguments optionnels. Le [vpos] initial règle l’alignement vertical (par défaut centré c, haut t, bas b). Le [vmove] après text est une longueur de réglage fin qui décale le texte vers le haut, ou vers le bas si elle est négative. Si le centrage vertical semble légèrement décalé par rapport aux filets, corrigez avec une petite valeur, comme \multirow{3}{*}[2pt]{…}. Notez qu’une width absolue, par exemple \multirow{2}{4em}{…}, compose le contenu comme une parbox de cette largeur, donc un long libellé se replie.
| Argument | Rôle | Notes |
|---|---|---|
[vpos] | Alignement vertical (optionnel, initial) | Par défaut c ; aussi t / b |
n | Nombre de lignes couvertes (obligatoire) | Positif vers le bas, négatif vers le haut |
width | Largeur de cellule (obligatoire) | * pour largeur naturelle ; valeur absolue en parbox repliable |
[vmove] | Réglage fin de position (optionnel, après text) | Positif monte, négatif descend |
Fusion de bloc — \multirow dans \multicolumn
Pour créer un bloc rectangulaire couvrant les deux directions, on combine \multirow et \multicolumn. L’ordre est fixe : placez \multirow dans \multicolumn. La documentation officielle donne \multicolumn{2}{c}{\multirow{3}{*}{Multi-multi}} comme exemple et précise que l’imbrication inverse « will not work ». Retenez que le \multicolumn extérieur porte l’étendue horizontale, et le \multirow intérieur l’étendue verticale.
Pour tracer autour du bloc, utilisez un filet limité à une plage de colonnes plutôt que \hline, qui traverse toute la largeur, afin de ne pas couper la zone fusionnée. L’outil standard est \cline{i-j} (colonnes i à j) ; avec booktabs, c’est \cmidrule{i-j}. En excluant du filet la plage située sous la cellule fusionnée, vous dessinez proprement le contour du bloc.
\usepackage{multirow}
% ...
\begin{tabular}{|l|l|c|}
\hline
\multicolumn{2}{|c|}{\multirow{2}{*}{地域・分類}} & 件数 \\
\multicolumn{2}{|c|}{} & \\
\hline
東日本 & 関東 & 12 \\
\cline{1-3}
西日本 & 関西 & 9 \\
\hline
\end{tabular}On construit ici un bloc rectangulaire 2 colonnes × 2 lignes en haut à gauche. À la première ligne, \multicolumn{2}{|c|}{\multirow{2}{*}{Region / class}} fusionne deux colonnes et deux lignes, et la deuxième ligne reprend la même position avec un \multicolumn{2}{|c|}{} vide ; comme \multirow couvre les lignes, la partie du bloc dans la ligne inférieure reste vide. \cline{1-3} sépare les lignes du corps, tandis que \hline ferme le bloc en haut et en bas.
Replier dans une seule cellule — makecell
Il faut ici distinguer une chose : vouloir couper une seule cellule sur plusieurs lignes n’est pas une fusion. Comme les colonnes l, c et r ne se replient pas, écrire directement \\ dans une telle cellule provoque une erreur. Pour couper simplement une courte chaîne à l’endroit voulu, l’outil le plus simple est \makecell{…} du package makecell (\usepackage{makecell}).
\makecell{line1\\line2} compose son contenu comme un petit tabular à une colonne et utilise \\ pour un saut de ligne forcé. Un argument optionnel règle l’alignement, par exemple \makecell[l]{…} (gauche) ou \makecell[t]{…} (haut), en passant une lettre pour l’alignement vertical et une pour l’horizontal ; par défaut, les deux sont centrés. Pour les en-têtes, il existe aussi \thead{…}, avec police et espacements communs.
\usepackage{makecell}
% ...
\begin{tabular}{lc}
\hline
\thead{項目} & \thead{前年比\\(\%)} \\
\hline
売上高 & \makecell[r]{+8.2\\(過去最高)} \\
\hline
\end{tabular}Ici, l’en-tête « Year-on-year (%) » est empilé sur deux lignes avec \thead{Year-on-year\\(\%)}, et la valeur du corps est alignée à droite sur deux lignes avec \makecell[r]{+8.2\\(record high)}. Dans les deux cas, il ne s’agit que d’un saut à l’intérieur d’une seule cellule ; aucune cellule voisine n’est fusionnée. Si le contenu est long et doit se replier automatiquement selon une largeur, la bonne solution est une colonne p{width} ou apparentée, pas \makecell.
Pièges d’alignement et choix de l’outil
Résumé des pièges courants. D’abord, le centrage vertical : le texte de \multirow est centré par défaut dans la ligne, mais il peut sembler un peu trop haut ou trop bas selon la hauteur de ligne et l’épaisseur des filets ; choisissez t / b avec [vpos], ou décalez avec un petit [vmove]. Ensuite, la cohérence des lignes : même dans une ligne contenant \multicolumn, le nombre de & plus les étendues fusionnées doit égaler le nombre de colonnes déclaré. Enfin, l’ordre d’imbrication : pour une fusion de bloc, placez toujours \multirow dans \multicolumn.
Le choix de l’outil est simple : \multicolumn pour couvrir des colonnes, \multirow pour couvrir des lignes, les deux pour un rectangle, et \makecell seulement pour couper des lignes dans une cellule. Pour replier un long texte selon une largeur, la bonne solution est une colonne p{width} (ou m{width} de array pour le centrage vertical), qui se replie automatiquement. Les spécifications de colonnes sont traitées dans « spécification de colonnes, alignement et largeur », et les grands tableaux qui débordent dans « environnements de tableaux avancés ».