素の tabular は、各列を中身の自然な幅に広げます。だから「表全体を本文幅ちょうどに収めたい」「長い文章を含む列を等幅で並べたい」となると途端に苦労します。この問題を解くのが、**tabularx(指定した幅に合わせて列を伸ばす)と tabulary(中身の量に応じて列幅を配分する)、そして近年の標準になりつつある tabularray**(tblr 環境。キー=値で表のすべてを制御する現代的なパッケージ)です。このページでは三つの違いと、それぞれの実例を見ていきます。
幅の問題
tabular の l・c・r 列は折り返さず、p{幅} 列は折り返しますが 幅を自分で数えて指定 しなければなりません。列が三本あって表を本文幅 \textwidth ちょうどに収めたいとき、p{0.3\textwidth} などと当て推量で書いては、罫線や列間の空き(\tabcolsep)の分だけずれて、はみ出したり余ったりします。
ここで発想を変えます。幅を先に決めて、列のほうを合わせる——これが tabularx。中身の分量に応じて自動で配分する——これが tabulary。どちらも David Carlisle による tools 系の定番パッケージで、\usepackage{tabularx} あるいは \usepackage{tabulary} で読み込みます。
tabularx — 幅を固定して伸ばす X 列
tabularx 環境は、tabular と違って 最初の引数に表全体の目標幅 をとります。書式は \begin{tabularx}{幅}{列指定}。列指定には新しい列タイプ **X** が使え、これは「残りの幅を埋めるように自動で伸縮する p 列」です。X 列が複数あれば、利用できる幅を 均等に分け合います。
仕組みは少し変わっています。tabularx は表を 何度か試し組み して幅を求めます。まず X 列を目標幅いっぱいにして組み(はみ出した状態)、超過分を X 列の本数で割って各 X 列を縮め、また組み直す——これを収束するまで繰り返します。最終的に X は内部で \tabularxcolumn が定める列に置き換わり、その既定は次のとおりです。
\newcommand{\tabularxcolumn}[1]{p{#1}}つまり X は既定で 上端揃え の段落列です。中身を 天地中央 にそろえたいなら \renewcommand{\tabularxcolumn}[1]{m{#1}} と再定義します。また X 列の中身は既定で両端揃え(justified)になりますが、左寄せにしたいときは列指定で **>{\raggedright\arraybackslash}X と前処理を添えます。ここで \arraybackslash** が要点です。\raggedright・\centering・\raggedleft は内部で \\ の意味を変えてしまい、表の行末 \\ と衝突するため、これらの宣言の後に \arraybackslash を置いて \\ を行末記号に戻します。
同じ前処理を何度も書くなら、\newcolumntype で一文字の別名を作ると読みやすくなります。次の例は、1 列目を内容幅の左揃え l、残り二列を **左寄せで折り返す等幅の Y 列** として、表全体を \textwidth に収めます。
\usepackage{tabularx}
\newcolumntype{Y}{>{\raggedright\arraybackslash}X}
% ...
\begin{tabularx}{\textwidth}{l Y Y}
\hline
項目 & 長所 & 短所 \\
\hline
tabular & 単純で速い & 幅を自分で調整する必要がある \\
tabularx & 表幅を固定でき、列が自動で伸縮する & 試し組みのぶん処理が遅い \\
\hline
\end{tabularx}この表は紙面の左右いっぱい(\textwidth)に広がり、1 列目「項目」は短い語の自然な幅、2・3 列目は 残り幅を半分ずつ 受け取って、長い説明文がその幅で折り返します。Y(=左寄せ X)にしたので、各セルは右端が不揃いな左寄せで組まれます。比率を変えたいときは、後述の tabularray の X[2] のような係数指定が便利です(素の tabularx には係数指定はありません)。
注意点として、表を複数回展開する性質上、tabularx の中では 副作用のある命令(カウンタの加算、ファイル書き込み、\verb など)が誤動作することがあります。脚注や \verb を含めたいセルは、いったんボックスに入れるなどの工夫が要ります。
tabulary — 中身に応じて配分する
tabularx は各 X 列を 均等に 割り当てます。しかし「片方の列は短い見出し、もう片方は長い説明」のように、列ごとに分量が大きく違うと、均等配分はかえって不格好です。そこで tabulary は、各列の中身の自然な幅に比例 させて幅を配り、全体を指定幅に収めます。
書式は tabularx と同じく \begin{tabulary}{幅}{列指定}。列タイプは四つで、いずれも自動幅の段落列です。**L は左寄せ、C は中央、R は右寄せ、J** は両端揃え。普通の l・c・r・p{幅} なども混在でき、そちらは 測定の対象外(自然幅のまま)です。各列の幅は、その列で一番幅広いセルの自然幅を基準に重み付けされ、全体が指定幅になるよう調整されますが、自然幅のほうが小さい列はそのまま残されます。
極端な配分を防ぐため、測定される列の **最小幅 \tymin**(既定 10pt)と **最大幅 \tymax**(既定 2\textwidth)という長さで上限・下限を調整できます。一語だけ極端に長いセルが列幅を独占するのを抑えたいときに使います。
\usepackage{tabulary}
% ...
\begin{tabulary}{\textwidth}{L L}
\hline
用語 & 説明 \\
\hline
X 列 & 表幅から固定部分を引いた残りを、X 列どうしで均等に分け合う列。 \\
\hline
\end{tabulary}この二列はどちらも L(左寄せ)ですが、1 列目「用語」は中身が短いので狭く、2 列目「説明」は長文なので広く配分されます。tabularx で X X と書けば二列は同じ幅になりますが、tabulary は 内容の重み に従うため、見出し列+本文列のような表が自然な体裁になります。なお tabulary も本文を二度処理するので、tabularx と同じく脚注やカウンタには注意が必要です。
tabularray — 現代的な tblr 環境
tabularray は近年もっとも活発に開発されている表組みパッケージで、作者は 呂建瑞(Jianrui Lyu、lvjr)**。古い \halign ベースの実装を捨て、LaTeX3(expl3)の機能で表を直接解析・組版します。最大の特徴は、罫線・色・セル結合・段落整形・列幅といった「これまで array・booktabs・multirow・colortbl・diagbox など複数パッケージを併用して実現していたこと」を、一つのキー=値インターフェース に統合した点です。\usepackage{tabularray} で読み込み、主環境は **tblr** です。
tblr の構造は tabular と少し違います。\begin{tblr}{ … 内側指定 … } のように、本体の前に キー=値をカンマで並べた一つの引数(内側指定) を置きます。列の整列は **colspec** キーで宣言します。colspec={lcr} のように従来どおりの一文字指定もできますが、本領は **Q[…](汎用列:整列や幅などのオプションを角括弧で渡す基本列)と X[…]**(tabularx 同様の伸縮列)にあります。X[c] は中央寄せの伸縮列、X[2,l] は 係数 2(他の X の倍の幅)で左寄せの伸縮列です。
X 列を使うときは、表が広がる先の幅を **width** キーで与えます(未指定なら既定は \linewidth)。行間・列間の余白は **rowsep・colsep** キーで、tblr の既定は rowsep=2pt・colsep=6pt。罫線は宣言的で、**hlines/vlines** と書けば全ての横/縦罫線を引き、hline{2}={1pt,solid} のように **hline{番号}/vline{番号}** で特定の線の太さや種類を指定できます。\hline を本文に書く必要はありません。
セル結合は本文側で **\SetCell** を使います。\SetCell[c=2]{c} は 2 列にまたがる 中央寄せセル(\multicolumn 相当)、\SetCell[r=2]{c} は 2 行にまたがる セル(\multirow 相当)で、c=・r= が列・行の連結数、波括弧がそのセルの整列です。行や列をまとめて装飾するには **\SetRow・\SetColumn** を使い、たとえば \SetRow{cyan8} で行を淡い水色に塗れます(色はパッケージ既定の色名)。
\usepackage{tabularray}
% ...
\begin{tblr}{
width = \textwidth,
colspec = {Q[l] X[c] X[2,l]},
rowsep = 3pt,
hline{1,Z} = {1pt,solid},
hline{2} = {0.5pt,solid},
row{1} = {font=\bfseries},
}
項目 & 区分 & 説明 \\
\SetCell[r=2]{l} 表環境 & 固定幅 & 表全体の幅を固定し、X 列が残りを分け合う。 \\
& 内容幅 & 各列の中身の量に応じて幅を配分する。 \\
注記 & --- & 罫線・色・結合をキーで一括指定できる。 \\
\end{tblr}この tblr は、width=\textwidth で表幅を本文幅に固定します。列は Q[l](左寄せの基本列)、X[c](中央寄せの伸縮列)、X[2,l](係数 2・左寄せの伸縮列)の三本で、二本の X は残り幅を 1 : 2 で分け合うため、3 列目「説明」が最も広くなります。罫線は本文に \hline を書かず、内側指定の hline{…} だけで引いています(Z は最終行を表す特別な番号)。先頭行は row{1}={font=\bfseries} で太字、1 列目の「表環境」は \SetCell[r=2]{l} で 2 行ぶち抜き にしています。booktabs・multirow・array を併用せずとも、これだけで体裁が整うのが tabularray の強みです。
ページをまたぐ長い表には **longtblr** 環境があり、見出し行の繰り返し・キャプション・脚注に対応します。threeparttable のように注付きで 1 ページに収める用途には **talltblr** を使います。これらでは、キャプションやラベル、note{…} などを、本体の前の **任意引数 […](外側指定)** に書きます。
どれを選ぶか
使い分けの目安はこうです。表を 決まった幅にぴったり収め、長文の列を 等幅 で並べたいなら tabularx。同じく幅は固定しつつ、列ごとの 分量に応じて自然に配分 したいなら tabulary。罫線・色・セル結合・列幅まで含めて 表全体を一つの仕組みで 整え、新規に書き起こすなら tabularray。
tabularray は機能が豊富で、tabularx/tabulary が解いていた幅の問題も X 列+width キーで吸収します。一方で tabularx・tabulary は枯れていて軽く、既存の tabular 資産にもなじみます。短い既存の表に幅調整を足すだけなら従来パッケージ、表組みを本格的に作り込むなら tabularray、と捉えるとよいでしょう。
| パッケージ | 幅の決め方 | 主な用途 |
|---|---|---|
tabularx | 表幅を固定し X 列を均等配分 | 本文幅に収める等幅の段落列 |
tabulary | 表幅を固定し内容量で比例配分 | 分量の偏る見出し+本文の表 |
tabularray | width キー+X 列(係数で比率も) | 罫線・色・結合まで一括した現代的な表 |
列指定そのものの詳細(\multicolumn・array の >{…} など)は「列指定の詳細」、セル結合の基礎は「セル結合」、ページをまたぐ長大な表は「longtable」のページで扱います。