列指定・整列・幅

tabular の第一引数——{lcr} のような 列指定 ——は、ただ揃え方を並べるだけの場所ではありません。実は一つの小さな言語で、列の本数と整列に加えて、各セルの 前後に宣言を差し込む列間の空きを置き換える列をまとめて繰り返す といった指定までここに書き込めます。多くは標準の tabular にはなく、**array パッケージ** が足す機能です。このページでは、基本の lcrp{幅} を出発点に、m{幅}b{幅}>{…}<{…}@{…}!{…}*{n}{…} までを順に解説します。

列指定という小さな言語

基本の四つは別ページで扱いました。**lcr は左・中央・右に揃え、内容の 自然な幅 に列が広がって折り返しません。p{幅} だけは指定幅の段落ボックスとして組まれ、内容が幅を超えると 折り返します**。array パッケージが定める内部表現で言えば、p{幅}\parbox[t]{幅} と等価——つまり 上端揃え の段落です。この「上端」という既定が、これから足す二つの仲間との対比点になります。

ここから紹介する記号——m/b>/<@/!*——のほとんどは、プリアンブルに **\usepackage{array}** を書いて初めて使えます。array は TeX Live・MiKTeX に標準で入っており、tabularxbooktabs など多くの表パッケージが内部で読み込むので、すでに有効なこともよくあります。それでも、明示的に読み込んでおくのが安全です。

段落列の縦位置——p・m・b

折り返す段落列には三種類あり、違いは セルの縦位置(行内での垂直方向の揃え) だけです。array の定義そのままに並べると、**p{幅}** は \parbox[t]上端揃え、**m{幅} は中身を 行の中央 に置く垂直中央揃え、b{幅}** は \parbox[b]下端揃え です。mbarray パッケージが追加するもので、標準の tabular にはありません。

なぜこれが効いてくるかというと、同じ行に背の高いセル(折り返して何行にもなる p 列や、大きな画像)と一行きりのセルが混在するときです。既定の p(上端)だと、隣の短いセルは行の上に張り付き、背の高いセルの中ほどと視線が合いません。m{幅} を使えば、その列の中身が行の上下中央に来て、隣の一行セルと自然にそろいます。画像を入れたセルや、ラベルと長い説明を左右に並べる表で重宝します。

latex
\usepackage{array}
% ...
\begin{tabular}{ p{3cm} m{3cm} b{3cm} }
  \hline
  上端揃え (p) & 縦中央 (m) & 下端揃え (b) \\
  この列は parbox[t]。 & この列は行の上下中央に。 & この列は parbox[b]\\
  \hline
\end{tabular}

同じ幅・同じ本文でも、pmb で各セルの上下位置が変わります。なお三種類とも、段落列の内部では **\parindent(段落字下げ)が既定で 0** になります(必要なら >{\setlength{\parindent}{1em}} のように足せます)。

列指定縦位置等価な parbox提供元
p{wd}上端揃え\parbox[t]{wd}標準
m{wd}縦中央行の上下中央array
b{wd}下端揃え\parbox[b]{wd}array

セルの前後に差し込む——>{…} と <{…}

array パッケージの目玉が **>{宣言}<{宣言}** です。>{宣言} は、その列の 各セルの中身の直前に 宣言 を挿入します。<{宣言} は逆に 直後に 挿入します。たとえば >{\bfseries}l と書けば、左揃えの列のセルすべてが、いちいち \bfseries と書かなくても 太字 になります。>{\itshape}c なら中央揃えで斜体、>{\color{red}}r なら右揃えで赤、といった具合です。

>{…} には 整列の宣言 も書けます。pmb 列は既定で両端揃えですが、>{\raggedright}p{4cm} とすれば 左寄せ(右側ぼろぼろ)>{\centering} で中央、>{\raggedleft} で右寄せの段落列になります。これで「折り返すが両端揃えにはしたくない」という細かな要望に応えられます。

ただし 重大な落とし穴 があります。\raggedright\raggedleft\centering の三つは、内部で **行末の \\ の意味を作り変えてしまう** ため、これらを >{…} に入れた列が表の 最終列 にあると、\\ が「行末」として効かなくなり、エラーや崩れが起きます。対策は、array が用意する **\arraybackslash を宣言の 最後** に添えること——>{\raggedright\arraybackslash}p{4cm} と書けば、\\ の行末機能が復活します。\centering\raggedleft でも同様です。

もう一つの定番が、列ぜんたいを数式モードにする 技です。>{$}c<{$} と書くと、各セルの前に $、後に $ が挟まれ、その列のすべてのセルが インライン数式 として組まれます。数値や記号ばかりの列で、毎回 $…$ を書かずに済みます。逆に array 環境(中身がもともと数式モード)で >{$}…<{$} を使うと、二つの $ が打ち消しあって その列だけ文章モード になります。

注意点として、>{…}<{…} に書けるのは 宣言(declaration) です。>{\bfseries}>{\itshape} のように後ろに引数を取らないものは問題ありませんが、引数を取る命令で終えてはいけません。たとえば >{\textbf} は、続くセルの中身を引数だと思って読みかけて崩れます(太字にしたいなら宣言形の \bfseries を使います)。array のマニュアルも「>{\textbf} は列全体を太字にしないし、最初の一文字も太字にしない」と注意しています。

列の境目をいじる——@{…} と !{…}

列と列のあいだには、既定で **\tabcolsep(片側につき既定 6pt、両側で都合その倍)の空きが入ります。@{宣言} は、列指定のその位置に置くと、そこの列間の空きを取り除き**、代わりに 宣言 を差し込みます(array マニュアルいわく「inter-column space を抑制し、代わりに decl. を挿入する」)。

使いどころは二つ。一つは 表の外周の余白を削ること。列指定の両端に **@{}**(空の宣言)を置くと、最初の列の左と最後の列の右にある \tabcolsep が消え、表が本文の左マージンにぴたりとそろいます。booktabs を使う表でよく見る作法です。もう一つは、区切り文字を差し込む こと。たとえば数値を小数点でそろえたいとき、整数部の列と小数部の列に分け、あいだに @{.} を置けば、ピリオドが固定幅で並んで 小数点ぞろえ が得られます。

@{…} と対になるのが **!{宣言}** です。これは縦罫 | と同じ場所に書け、| の代わりに任意の 宣言 を差し込みます。@{…} との決定的な違いは、**!{…} は通常の列間の空きを消さない** こと。だから「列のあいだに点線を引きたいが、列間の余白は保ちたい」といったとき(たとえば arydshln パッケージの点線命令を !{…} に入れる)に向きます。

ちなみに、array パッケージを読み込むと縦罫 | の扱いも少し変わり、罫線の太さのぶんだけ列間が 広がる(標準 LaTeX では罫線は空きの中に置かれ、列間は広がらない)という違いがあります。とはいえ縦罫線そのものは専門的な表では避けるのが定石で、その話は「罫線とプロ品質の表」に譲ります。

列を繰り返す——*{n}{…}

同じ並びの列が何本も続くとき、***{回数}{列指定}** で繰り返しを畳めます。array マニュアルの定義どおり「列指定回数 回コピーしたもの」と等価です。たとえば中央揃えの列が 6 本なら cccccc の代わりに ***{6}{c}** と書けます。中身は複数の指定でもよく、*{3}{|c}||c|c|c| に展開されます。>{…}@{…} を含む長い指定を繰り返すときに、ことさら効きます——たとえば *{4}{>{$}c<{$}} は数式モードの中央列を 4 本まとめて作ります。

いくつも組み合わせた例

最後に、ここまでの道具を一つの列指定に詰め込んだ例を示します。1 列目は太字の見出し列(>{\bfseries}l)、2 列目は左寄せで折り返す段落列(>{\raggedright\arraybackslash}p{5cm}——最終列ではないので必須ではありませんが、流儀として \arraybackslash を付けています)、3・4 列目は数式モードの中央列を *{2}{…} でまとめて作り、外周の余白は両端の @{} で削っています。

document.tex
\usepackage{array}
% ...
\begin{tabular}{@{} >{\bfseries}l >{\raggedright\arraybackslash}p{5cm} *{2}{c} @{}}
  \hline
  記号 & 意味 & 値 & 単位 \\
  \hline
  $c$ & 真空中の光速。物理定数のひとつ。 & $2.998\times10^{8}$ & m/s \\
  $g$ & 標準重力加速度。地表付近での近似値。 & $9.807$ & m/s$^2$ \\
  \hline
\end{tabular}

結果は、記号の列が太字でそろい、意味の列は 5cm 幅で左寄せに折り返し、値の二列は中央に並び、表全体は外側の余白なしで本文左端にそろいます。一行に複数の仕掛けを書けるのが列指定の強みです——ただし読みづらくなりがちなので、よく使う組み合わせは \newcolumntype{自分の文字}{…}独自の列指定 として名前を付けておくと、{C C C} のように簡潔に再利用できます(array パッケージの機能)。

なお、数値を小数点でそろえる用途には、ここで触れた @{.} よりも、**siunitx パッケージの S 列** を使うのが現代的で確実です。S 列は数値を解析して整数部・小数点・小数部・指数・不確かさまでを正しくそろえ、桁区切りや有効数字の体裁も整えます。詳しくは「広い表と幅の自動調整」のページとあわせて参照してください。