セル結合

表のなかで複数のマス目をひとつにまとめる——いわゆる セル結合 には、向きと道具がはっきり分かれています。横方向に複数列をまたぐのは標準命令の **\multicolumn、縦方向に複数行をまたぐのは multirow パッケージの \multirow、そして両者を組み合わせれば長方形のブロックを結合できます。さらに、1 マスの中で行を折り返したいだけなら結合ではなく makecell** の出番です。このページでは、この四つの道具を順に、揃え方の落とし穴まで含めて見ていきます。

横方向の結合——\multicolumn

同じ行のなかで隣り合う列をまとめるのが **\multicolumn です。標準の LaTeX に組み込まれていて、パッケージは要りません。書式は \multicolumn{n}{spec}{text} の三引数。n はまたぐ列の本数、spec はできあがった一つのセルを どう揃えるか(一列ぶんの列指定)text** はその中身です。たとえば \multicolumn{2}{c}{Header} は、2 列ぶんを 1 マスに結合して中央揃えにします。

肝心なのは、**spec が「結合後の 1 列」の指定であって、元の n 列の指定をそのまま引き継がない** ことです。だから lcr のいずれか一つを必ず書きます。さらに spec には **縦罫線 |@{…} も書け、その位置の罫線・列間スペースを この結合セルについてだけ上書き** できます。隣り合う \multicolumn の片方に終端の |、もう片方に始端の | があると、罫線は重複せず一本だけ引かれます。

latex
\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 列ぶんを引き受けるので、この行に & は要りません。

もう一つ覚えておきたいのが、**n1 にする使い方** です。\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 行」をまたぎます(公式ドキュメントの記述)。

document.tex
\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}** です。結合セルの下に当たる範囲を罫線から外すことで、ブロックの外形だけをきれいに囲めます。

document.tex
\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 マスの中で行を折り返したい」のは、セル結合ではありませんlcr の列は中身を折り返さないため、セル内で \\ を直接書いてもエラーになります。短い文字列を意図した位置で改行したいだけなら、**makecell パッケージ\makecell{…}** が最も手軽です(\usepackage{makecell})。

\makecell{line1\\line2} は、中身を 一列の小さな tabular として組み、\\強制改行 します。任意引数で揃えも指定でき、\makecell[l]{…}(左寄せ)、\makecell[t]{…}(上端)のように、縦・横の揃えを一文字ずつ 渡します(既定は縦横とも中央)。見出し用には、共通の書体・余白が設定された **\thead{…}** も用意されています。

document.tex
\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{幅} 列**(縦中央なら arraym{幅})を使い、自動で折り返すのが筋です。列指定そのものは「列指定・整列・幅」、紙幅をはみ出す大きな表は「高機能な表環境」のページで扱います。