表の配置・整形

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

何も指定しなければ、articlebook いずれでも既定は **tbp** です。複数を並べた [htbp] は「まず here、だめなら top、それも無理なら bottom、最後にフロートページ」という 許可するの場所の集合 を意味します。重要なのは、並べた順序は処理の順序を変えない こと——LaTeX は常に t→b→p の順で試すので、[htbp][bpht] は同じ働きです。希望が通らないときに次の候補へ落ちる、という安全策だと考えてください。

感嘆符 **!** を頭に付けた [!ht] などは、「このフロートに限り、フロートの個数や本文との比率といった 内部の制限を無視して 配置を試みよ」という指示です。**! は「ここに置け」という意味ではありません——あくまで判定基準をゆるめるだけです。一方、本当にその場に固定したい** なら、float パッケージが定義する **[H]** を使います。\usepackage{float} のうえで \begin{table}[H] と書くと、表はフロートをやめ、ソースのその位置に そのまま 組まれます(その結果ページ下部に大きな空白ができることもあります)。H は厳密には「フロートしないフロート」だと理解しておくとよいでしょう。

document.tex
\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 上は \captiontabular に書けば上、 に書けば下になります。

\centering は、フロート内の中身を 左寄せ(既定)から中央寄せに 切り替える宣言です。表組みでは、center 環境(\begin{center}…\end{center})ではなく \centering を使うのが定石——center 環境は前後に余分な縦の空きを入れてしまうのに対し、\centering は宣言だけなので無駄な空白が出ません。キャプションの書式(フォント・区切り・幅など)を細かく整えたいときは caption パッケージを使います。詳しくは「キャプションとサブ図」のページへ。

紙幅をはみ出す表

lcr 列は折り返さないので、列が多かったり中身が長かったりすると、表は本文の幅(\textwidth)をはみ出します。最も手軽な対処は、graphicx の **\resizebox** で表全体を縮めることです。\resizebox{横}{縦}{中身} の形で、片方を **! にすると、もう片方の指定に合わせて 縦横比を保って** 拡大縮小します。

latex
\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 があります。

document.tex
\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}

表全体ではなく、一部だけを任意の角度で回したい ときは、同じく graphicxrotating の **\rotatebox{角度}{中身}** を使います。たとえば見出しのセルだけを \rotatebox{90}{長い項目名} で縦書き風に立てる、といった使い方です(角度は反時計回りが正)。なお rotating が扱うのは 箱(ボックス)の回転 であり、箱は必ず 1 ページに収まります。複数ページにわたる横向きの「本文」を作りたい場合は、rotating ではなく lscape(または PDF のページ自体を回す pdflscape)を使います。

threeparttable——注釈付きの表

表のセルに脚注を付けたいことがあります。ところが tabular の中で \footnote を使うと、注がページ下部へ飛んでしまったり、そもそも出力されなかったりと、うまくいきません。これを解決するのが **threeparttable パッケージです。名前のとおり、表を 「タイトル(キャプション)/本体(tabular)/注(tablenotes)」の三部構成 として扱い、注を表の幅にそろえて表の直下に** 配置します。

使い方は、threeparttable 環境のなかに **\captiontabulartablenotes 環境 の順に並べるだけ。注の対応付けは 手動** です——セルの中に \tnote{a} のように標識を置き、tablenotes のなかに \item[a] … と同じ記号で注を書きます(作者いわく、一つの注を複数のセルから参照することが多いため、あえて自動番号にしていません)。threeparttable 自身は フロートではない ので、番号や配置が欲しければ全体を table で包みます。

document.tex
\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} が上付きの小さな標識として付き、表の直下に同じ ab の注が、表と同じ幅で 整列します。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 を使います。