tabular が組むのは「表の中身」だけです。その表に 番号付きの見出し(キャプション)を付け、ページ上の適切な位置へ送り出す のが、浮動体(フロート)の **table 環境** の役割。このページでは、\begin{table}[htbp] の配置指定、\caption と \label の作法、紙幅をはみ出す表を収める拡大縮小・回転、そして表に注釈を付ける **threeparttable** まで、tabular の外側を一通り扱います。中身そのものの組み方は「tabular の基本」を参照してください。
なぜ表は「浮く」のか
表や図は途中で改ページできません——一つのまとまりとして、まるごと同じページに収める必要があります。もし本文の流れのちょうどその位置に置こうとして残りのスペースが足りなければ、大きな空白が生じたり、表だけが不格好に切れたりします。そこで LaTeX は表や図を 浮動体(float) として扱い、本文とは切り離して、収まりのよい場所(多くは次のページの先頭など)へ自動的に 流し込み(float) ます。
この仕組みを使うのが table 環境です。なかに tabular を入れ、\caption{…} で「表 1」のような番号付きの見出しを与え、\label{…} と \ref{…} で本文から参照できるようにします。だから本文には「表 1 に示すように…」と 番号で参照 を書けばよく、表が実際にどのページへ送られても参照は自動で正しい番号を指します。これがフロートの利点です。
配置指定 [htbp] と [H]
\begin{table} の直後の角括弧には、どこに置きたいか の希望を一文字ずつ並べて渡します。指定できるのは四つです。
| 指定 | 意味 | |
|---|---|---|
h | その位置(here)に。ただし h 単独は不可で、自動的に t が補われる | Here |
t | 本文ページの上端(top) | Top of a text page |
b | 本文ページの下端(bottom) | Bottom of a text page |
p | フロート専用ページ(page)に、本文と分けて | A float-only page |
何も指定しなければ、article・book いずれでも既定は **tbp** です。複数を並べた [htbp] は「まず here、だめなら top、それも無理なら bottom、最後にフロートページ」という 許可するの場所の集合 を意味します。重要なのは、並べた順序は処理の順序を変えない こと——LaTeX は常に t→b→p の順で試すので、[htbp] と [bpht] は同じ働きです。希望が通らないときに次の候補へ落ちる、という安全策だと考えてください。
感嘆符 **!** を頭に付けた [!ht] などは、「このフロートに限り、フロートの個数や本文との比率といった 内部の制限を無視して 配置を試みよ」という指示です。**! は「ここに置け」という意味ではありません——あくまで判定基準をゆるめるだけです。一方、本当にその場に固定したい** なら、float パッケージが定義する **[H]** を使います。\usepackage{float} のうえで \begin{table}[H] と書くと、表はフロートをやめ、ソースのその位置に そのまま 組まれます(その結果ページ下部に大きな空白ができることもあります)。H は厳密には「フロートしないフロート」だと理解しておくとよいでしょう。
\usepackage{float} % \begin{table}[H] のために
\begin{table}[htbp]
\centering
\caption{四半期ごとの売上}
\label{tab:sales}
\begin{tabular}{lrr}
\hline
四半期 & 売上 & 前年比 \\
\hline
Q1 & 1{,}200 & +5\% \\
Q2 & 1{,}350 & +8\% \\
\hline
\end{tabular}
\end{table}本文からは 表~\ref{tab:sales} のように参照します(~ は数字と「表」が離れて改行されないようにする連結空白)。配置がどうしても思い通りにならないときの対処は「フロートと配置」のページで詳しく扱います。
キャプション・ラベル・センタリング
\caption{…} は、フロートに番号付きの見出しを与え、article なら「表 1:」、book なら「表 1.1:」のような 通し番号 を自動で振ります。表と図は別々のカウンタなので、図の番号と混ざることはありません。\caption[短い見出し]{本文の見出し} と任意引数を付けると、図表一覧 には短い方が、本文には長い方が載ります。
作法として押さえるべき点が二つあります。第一に、**番号を更新するのは \caption なので、\label は必ず \caption の後に置く** こと。順序を逆にすると \ref が一つ前の番号を指してしまいます。第二に、配置の慣習 です。一般に キャプションは、表では上に、図では下に 置きます(表は読む前に見出しを見せ、図は見てから説明を読ませる、という考え方)。LaTeX 上は \caption を tabular の 前 に書けば上、後 に書けば下になります。
\centering は、フロート内の中身を 左寄せ(既定)から中央寄せに 切り替える宣言です。表組みでは、center 環境(\begin{center}…\end{center})ではなく \centering を使うのが定石——center 環境は前後に余分な縦の空きを入れてしまうのに対し、\centering は宣言だけなので無駄な空白が出ません。キャプションの書式(フォント・区切り・幅など)を細かく整えたいときは caption パッケージを使います。詳しくは「キャプションとサブ図」のページへ。
紙幅をはみ出す表
l・c・r 列は折り返さないので、列が多かったり中身が長かったりすると、表は本文の幅(\textwidth)をはみ出します。最も手軽な対処は、graphicx の **\resizebox** で表全体を縮めることです。\resizebox{横}{縦}{中身} の形で、片方を **! にすると、もう片方の指定に合わせて 縦横比を保って** 拡大縮小します。
\resizebox{\textwidth}{!}{%
\begin{tabular}{lrrrrr}
\hline
項目 & 1月 & 2月 & 3月 & 4月 & 5月 \\
\hline
売上 & 120 & 135 & 128 & 142 & 150 \\
\hline
\end{tabular}%
}これは表を本文幅ぴったりに収めます。ただし **\resizebox は中身を「拡大縮小(スケーリング)」する ので、文字の太さ・罫線の太さ・数式記号まで一律に拡縮され、本文と書体の大きさがずれて不自然になりがちです。だから縮小はあくまで応急処置で、できれば表そのものを直す**(列を減らす、p{幅} で折り返す、略記を使う)のが本筋です。\resizebox の代わりに **adjustbox** パッケージを使うと、周囲のレイアウトとなじみやすく、\begin{adjustbox}{width=\textwidth}…\end{adjustbox} のように環境としても書けます。
スケーリングを避けたいなら、表全体の 文字を一段小さくする 手もあります。\begin{table} の中で \small や \footnotesize を宣言すれば、罫線や数式の比率を崩さずに本物の小さな書体で組めます。横方向の余りを使って中央でなく右に寄せたいときは \hfill を中身の前に置く、といった微調整も可能です。より根本的に幅を制御する tabularx(指定幅に列を自動で伸縮)などの高機能な表環境は「高機能な表環境」のページで扱います。
回転——横向きの表
どうしても縦向きのページに収まらない大きな表は、横向き(ランドスケープ) に回して 1 ページを使い切る方法があります。rotating パッケージ(標準のグラフィックス機能の上に作られています)が提供する **sidewaystable** 環境を、table の代わりに使うだけです。表は 専用の 1 ページに 90 度回転して 配置され、キャプション・番号も一緒に回り、図表一覧にもきちんと載ります。両面組版では、見開きで読みやすいよう回転の向きも自動で調整されます。図には対応する sidewaysfigure があります。
\usepackage{rotating}
\begin{sidewaystable}
\centering
\caption{多数の列を持つ横向きの表}
\label{tab:wide}
\begin{tabular}{lrrrrrrrr}
\hline
地域 & Q1 & Q2 & Q3 & Q4 & 合計 & 前年 & 増減 & 比率 \\
\hline
東日本 & 120 & 135 & 128 & 142 & 525 & 500 & +25 & 105\% \\
\hline
\end{tabular}
\end{sidewaystable}表全体ではなく、一部だけを任意の角度で回したい ときは、同じく graphicx/rotating の **\rotatebox{角度}{中身}** を使います。たとえば見出しのセルだけを \rotatebox{90}{長い項目名} で縦書き風に立てる、といった使い方です(角度は反時計回りが正)。なお rotating が扱うのは 箱(ボックス)の回転 であり、箱は必ず 1 ページに収まります。複数ページにわたる横向きの「本文」を作りたい場合は、rotating ではなく lscape(または PDF のページ自体を回す pdflscape)を使います。
threeparttable——注釈付きの表
表のセルに脚注を付けたいことがあります。ところが tabular の中で \footnote を使うと、注がページ下部へ飛んでしまったり、そもそも出力されなかったりと、うまくいきません。これを解決するのが **threeparttable パッケージです。名前のとおり、表を 「タイトル(キャプション)/本体(tabular)/注(tablenotes)」の三部構成 として扱い、注を表の幅にそろえて表の直下に** 配置します。
使い方は、threeparttable 環境のなかに **\caption → tabular → tablenotes 環境 の順に並べるだけ。注の対応付けは 手動** です——セルの中に \tnote{a} のように標識を置き、tablenotes のなかに \item[a] … と同じ記号で注を書きます(作者いわく、一つの注を複数のセルから参照することが多いため、あえて自動番号にしていません)。threeparttable 自身は フロートではない ので、番号や配置が欲しければ全体を table で包みます。
\usepackage{threeparttable}
\begin{table}[htbp]
\centering
\begin{threeparttable}
\caption{品種ごとの収量}
\label{tab:yield}
\begin{tabular}{lrr}
\hline
品種 & 収量\tnote{a} & 価格\tnote{b} \\
\hline
コシヒカリ & 540 & 380 \\
あきたこまち & 520 & 360 \\
\hline
\end{tabular}
\begin{tablenotes}
\footnotesize
\item[a] 単位は 10a あたりの kg。
\item[b] 1kg あたりの卸売価格(円)。
\end{tablenotes}
\end{threeparttable}
\end{table}この例では、外側の table が番号と配置を、threeparttable がキャプション・本体・注の三部をまとめます。見出しセルの \tnote{a}・\tnote{b} が上付きの小さな標識として付き、表の直下に同じ a・b の注が、表と同じ幅で 整列します。tablenotes 環境には書式オプションがあり、次のように使い分けます。
| オプション | 効果 | |
|---|---|---|
para | 複数の注を改行せず続けて一段落に組む | Notes run one after another without line breaks |
flushleft | 注のぶら下げインデントをなくす | No hanging indentation |
online | 標識を上付きにせず本文サイズで組む | The \item tag is printed at normal size, not as a superscript |
normal | 既定の書式に戻す(文書全体の設定の打ち消し) | Restores default formatting |
これらは \usepackage[para]{threeparttable} のように文書全体へ、または \begin{tablenotes}[flushleft] のように表ごとに指定できます。なお threeparttable はキャプションの書式そのものは整えないので、見出しらしい体裁にしたいときは caption パッケージと併用します。長い表(longtable)に注を付けたい場合は、姉妹パッケージの threeparttablex を使います。