表のなかで複数のマス目をひとつにまとめる——いわゆる セル結合 には、向きと道具がはっきり分かれています。横方向に複数列をまたぐのは標準命令の **\multicolumn、縦方向に複数行をまたぐのは multirow パッケージの \multirow、そして両者を組み合わせれば長方形のブロックを結合できます。さらに、1 マスの中で行を折り返したいだけなら結合ではなく makecell** の出番です。このページでは、この四つの道具を順に、揃え方の落とし穴まで含めて見ていきます。
横方向の結合——\multicolumn
同じ行のなかで隣り合う列をまとめるのが **\multicolumn です。標準の LaTeX に組み込まれていて、パッケージは要りません。書式は \multicolumn{n}{spec}{text} の三引数。n はまたぐ列の本数、spec はできあがった一つのセルを どう揃えるか(一列ぶんの列指定)、text** はその中身です。たとえば \multicolumn{2}{c}{Header} は、2 列ぶんを 1 マスに結合して中央揃えにします。
肝心なのは、**spec が「結合後の 1 列」の指定であって、元の n 列の指定をそのまま引き継がない** ことです。だから l・c・r のいずれか一つを必ず書きます。さらに spec には **縦罫線 | や @{…} も書け、その位置の罫線・列間スペースを この結合セルについてだけ上書き** できます。隣り合う \multicolumn の片方に終端の |、もう片方に始端の | があると、罫線は重複せず一本だけ引かれます。
\begin{tabular}{lcc}
\hline
\multicolumn{3}{c}{売上集計} \\
\hline
項目 & 上期 & 下期 \\
\hline
国内 & 120 & 145 \\
海外 & 80 & 96 \\
\hline
\end{tabular}この例の 1 行目は、本来 3 列に分かれるはずの行を \multicolumn{3}{c}{売上集計} で 一つの中央揃えセル にまとめ、表全体の見出しにしています。結合した行でも、その行のセルの合計は 必ず宣言した列数(ここでは 3)に一致 させる必要があります。\multicolumn{3}{…} が 3 列ぶんを引き受けるので、この行に & は要りません。
もう一つ覚えておきたいのが、**n を 1 にする使い方** です。\multicolumn{1}{…}{…} は列をまたぎませんが、そのセルだけ揃えを上書きする、あるいは **その位置の縦罫線 | を消す** のに使えます。たとえば数値列(r)の見出しだけを中央に置きたいときは \multicolumn{1}{c}{見出し}、外枠付きの表で 1 マスだけ縦罫線を抜きたいときは \multicolumn{1}{c}{…}(| を書かない)とします。
縦方向の結合——multirow
縦に複数行をまたぐセルは標準命令では作れず、**multirow パッケージ** を読み込みます(プリアンブルに \usepackage{multirow})。中心となるのが **\multirow{n}{width}{text}。n はまたぐ行数、width はセルの幅、text は中身です。幅に * を渡すと、中身の 自然な幅** で組まれます——\multirow{3}{*}{ラベル} がいちばん素直な形です。
決定的に大切なのは、**\multirow がまたぐ下の行のセルを空にしておく** ことです。\multirow は上の行に置き、続く行では同じ列の位置を **& だけ書いて中身を空に** します。空にし忘れると、\multirow が組んだ文字に下の行の中身が 重なって しまいます。n を正の値にすると「この行と下の n−1 行」を、負の値にすると「この行と上の −n−1 行」をまたぎます(公式ドキュメントの記述)。
\usepackage{multirow}
% ...
\begin{tabular}{|l|l|c|}
\hline
\multirow{2}{*}{果物} & りんご & 380 \\
& みかん & 120 \\
\hline
\multirow{2}{*}{野菜} & 人参 & 90 \\
& 大根 & 150 \\
\hline
\end{tabular}この例では、1 列目の「果物」「野菜」がそれぞれ 2 行ぶんを縦にまたぎます。\multirow{2}{*}{果物} を上の行に書き、その下の行の 1 列目は **何も書かずに &** で送っているのが要点です。width が * なので、ラベルは自然な幅で組まれ、2 行の縦の中央に置かれます。
\multirow には任意引数も二つあります。先頭の **[vpos]** は縦の揃え(既定は中央 c、上端 t、下端 b)。text の後ろの **[vmove] は 微調整用の長さ** で、本来の位置から上へ(負なら下へ)ずらします。罫線とセルの境目で文字の中央が少しずれて見えるとき、\multirow{3}{*}[2pt]{…} のように小さな値を与えて整えます。なお width を絶対値(例 \multirow{2}{4em}{…})にすると、中身はその幅の parbox として組まれ、長いラベルは折り返ります。
| 引数 | 役割 | 備考 |
|---|---|---|
[vpos] | 縦の揃え(任意・先頭) | 既定 c、ほかに t / b |
n | またぐ行数(必須) | 正で下方向、負で上方向 |
width | セルの幅(必須) | * で自然幅、絶対値で折り返す parbox |
[vmove] | 位置の微調整(任意・text の後) | 正で上へ、負で下へずらす |
ブロック結合——\multirow と \multicolumn の併用
縦横どちらにもまたぐ 長方形のブロック を作るには、\multirow と \multicolumn を 組み合わせ ます。順序が決まっていて、**\multirow を \multicolumn の内側に入れる** のが正解です。公式ドキュメントも \multicolumn{2}{c}{\multirow{3}{*}{Multi-multi}} を例に挙げ、「逆の入れ子は動かない」と明記しています。外側の \multicolumn が横方向の本数を、内側の \multirow が縦方向の行数を受け持つ、と覚えるとよいでしょう。
ブロックの周りに罫線を引くときは、\hline(行幅いっぱい)ではなく、特定の列範囲だけを引く罫線 を使うと結合部分を傷つけません。標準では **\cline{i-j}**(i 列目から j 列目まで)、booktabs を使うなら **\cmidrule{i-j}** です。結合セルの下に当たる範囲を罫線から外すことで、ブロックの外形だけをきれいに囲めます。
\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}ここでは左上に、2 列 × 2 行の長方形ブロックを作っています。1 行目の \multicolumn{2}{|c|}{\multirow{2}{*}{地域・分類}} が横 2 列・縦 2 行をまとめ、**2 行目では同じ位置を空の \multicolumn{2}{|c|}{}** で受けています(\multirow が縦をまたぐぶん、下の行のブロック部分は空にする)。\cline{1-3} は本文側の行の区切りに使い、ブロック自体は \hline で上下を囲んでいます。
1 マスで折り返す——makecell
ここで一つ区別しておきたいことがあります。「1 マスの中で行を折り返したい」のは、セル結合ではありません。l・c・r の列は中身を折り返さないため、セル内で \\ を直接書いてもエラーになります。短い文字列を意図した位置で改行したいだけなら、**makecell パッケージ の \makecell{…}** が最も手軽です(\usepackage{makecell})。
\makecell{line1\\line2} は、中身を 一列の小さな tabular として組み、\\ で 強制改行 します。任意引数で揃えも指定でき、\makecell[l]{…}(左寄せ)、\makecell[t]{…}(上端)のように、縦・横の揃えを一文字ずつ 渡します(既定は縦横とも中央)。見出し用には、共通の書体・余白が設定された **\thead{…}** も用意されています。
\usepackage{makecell}
% ...
\begin{tabular}{lc}
\hline
\thead{項目} & \thead{前年比\\(\%)} \\
\hline
売上高 & \makecell[r]{+8.2\\(過去最高)} \\
\hline
\end{tabular}この例では、見出しの「前年比 (%)」を \thead{前年比\\(\%)} で 2 行に積み、本文側の数値も \makecell[r]{+8.2\\(過去最高)} で右寄せ 2 行にしています。どちらも 1 マスのなかで 改行しているだけで、隣のセルとは結合していない点に注意してください。中身が長く、幅で自動的に折り返したい場合は \makecell ではなく **p{幅} 列**(やその仲間)を使うのが本筋です。
揃えの落とし穴と使い分け
結合まわりでつまずきやすい点をまとめます。まず 縦の中央 ——\multirow の文字は既定で行の中央に置かれますが、行の高さや罫線の太さによって少し上下に見えることがあります。そのときは [vpos] で t/b を選ぶか、[vmove] に小さな長さを与えて微調整します。次に 行数の整合 ——\multicolumn を含む行でも、& の数と結合幅の合計は宣言した列数に一致させること。そして 入れ子の順序 ——ブロック結合では必ず \multirow を \multicolumn の内側に置きます。
道具の選び分けは単純です。**横にまたぐなら \multicolumn、縦にまたぐなら \multirow、長方形なら両者の併用、1 マス内で改行したいだけなら \makecell。長い文章を「幅で」折り返したいなら、これらではなく p{幅} 列**(縦中央なら array の m{幅})を使い、自動で折り返すのが筋です。列指定そのものは「列指定・整列・幅」、紙幅をはみ出す大きな表は「高機能な表環境」のページで扱います。