キャプションとサブ図

図や表に説明を添える \caption は、見た目こそ素朴ですが、番号付け・相互参照・図表目次のすべてに関わる要の命令です。このページでは、まず \caption の基本(フロートの中でしか使えないこと、自動採番、短い見出しの指定、\label を置く位置)を押さえ、続いて見た目を細かく整える caption パッケージ、そして一つの図を (a)(b) と小分けにする subcaption パッケージへと進みます。

`\caption` の基本

\caption{…} は、図や表に説明文(キャプション)を付ける命令です。重要な制約として、**フロート環境の中、すなわち figure 環境か table 環境の内側でしか使えません。地の文に直接書くとエラーになります。フロートの中に置けば、LaTeX が「図 1」「表 3」のように 種類ごとの通し番号を自動で振り**、その番号とキャプション本文を所定の書式で組みます。番号を自分で書く必要はありません。

次は図の最小例です。\centering で図版を中央に置き、\includegraphics で画像を読み込み、その下に \caption を書いています。

latex
\begin{figure}
  \centering
  \includegraphics[width=0.6\textwidth]{plot}
  \caption{測定値と理論曲線の比較。}
  \label{fig:plot}
\end{figure}

キャプションが長く、図表目次(List of Figures / List of Tables)には短い見出しだけを載せたいときは、\caption[短い見出し]{本文} のように 角括弧の任意引数 を使います。角括弧の中が図表目次に、波括弧の中が図のそばに組まれます。角括弧を省くと、本文がそのまま目次にも使われます。

latex
\caption[測定値と理論曲線]{測定値(点)と理論曲線(実線)の比較。誤差棒は標準偏差を表す。}

相互参照のための \label には、見落としやすい鉄則があります。**\label は必ず \caption の後ろに置く** こと。LaTeX は \caption を処理した時点で「いまの番号」を図の番号に更新するため、\caption より前に \label を書くと、節番号など 直前のカウンタを拾ってしまい\ref が誤った番号を返します。\caption の直後(同じ行でも次の行でもよい)に \label を置けば、\ref{fig:plot} は正しく「1」を返します。

配置の慣習にも触れておきます。図のキャプションは図の下、表のキャプションは表の上 に置くのが一般的です。LaTeX は \caption を書いた位置にそのまま組むので、上に出したければ図版より前に、下に出したければ後に \caption を書きます(番号と本文の間隔などの体裁そのものは位置では変わりません)。学会の規定で向きが決まっていることも多いので、まずは投稿先の指定を確認しましょう。

caption パッケージで見た目を整える

標準のキャプションの見た目(書体・番号と本文の区切り・配置)を変えたいときは、Axel Sommerfeldt 作の caption パッケージを使います。プリアンブルで \usepackage{caption} と読み込み、\captionsetup{キー=値, …} で各種オプションを指定します。よく使うキーは次のとおりです。

キー主な値働き
formatplain / hang本文の組み方。hang は 2 行目以降を番号の幅だけ字下げ
labelsepcolon / period / space / quad番号(ラベル)と本文の区切り。colon は「: 」、period は「. 」
fontsmall / bf / it …キャプション全体の書体・サイズ
labelfontbf / sc …「図 1」の番号部分だけの書体
justificationcentering / raggedright / justified行揃え。中央・左寄せ(右ラギッド)・両端揃え
width寸法(例 0.8\textwidth)キャプションの折り返し幅を制限
singlelinechecktrue / false1 行に収まる短いキャプションを自動で中央寄せする挙動の可否

たとえば「番号を太字に、区切りはピリオド、全体は小さめの書体で」という体裁は、プリアンブルで次のように一括指定します。\captionsetupプリアンブルに書くと文書全体に、フロート環境の内側に書くと その場のキャプションだけに 効きます。

latex
\usepackage{caption}
\captionsetup{labelfont=bf, labelsep=period, font=small, justification=raggedright}

図と表で別々の体裁にしたいときは、\captionsetup[figure]{…}\captionsetup[table]{…} のように 角括弧でフロートの種類を指定 します。なお singlelinecheck は既定で有効で、1 行に収まる短いキャプションを justification の指定にかかわらず中央寄せにします。常に左寄せにしたいなら singlelinecheck=false を加えます。

caption パッケージはもう一つ便利な命令 \captionof{種類}{本文} を提供します。これは フロートの外でキャプションを付ける ための命令で、\caption が使えない minipagecenter 環境の中でも、\captionof{figure}{…} と書けば「図」として正しく採番・参照できます。フロートの自動配置に乗せず、本文中の決まった位置に図とキャプションを置きたいときに役立ちます。

latex
\begin{center}
  \includegraphics[width=0.5\textwidth]{diagram}
  \captionof{figure}{フロートに入れずに置いた図。}
  \label{fig:inline}
\end{center}

subcaption で図を小分けにする

一つの図の中に複数の小さな図を並べ、それぞれに (a)(b)(c) と小見出しを付けたいことがあります。これを担う現在の標準が、同じ Sommerfeldt 作の subcaption パッケージです。\usepackage{subcaption} と読み込むだけで、内部で caption パッケージも自動的に読み込まれます。

中心となるのが subfigure 環境(表向けには subtable 環境)です。\begin{subfigure}[位置]{幅} のように、幅を必須の引数として与えます(任意引数の [b] などは縦方向の揃え)。これは実体としては指定幅の minipage で、その中に \includegraphics\caption を書きます。**サブ図の中の \caption は (a)(b) という小見出し** になり、subfigure 環境の外側に置いた \caption図全体の番号 を受け持ちます。

次は二つのサブ図を横に並べた完全な例です。二つの subfigure の幅をそれぞれ 0.45\textwidth とし、間に \hfill を入れて左右に振り分けています。

latex
\usepackage{graphicx}
\usepackage{subcaption}

\begin{figure}
  \centering
  \begin{subfigure}[b]{0.45\textwidth}
    \centering
    \includegraphics[width=\textwidth]{before}
    \caption{処理前}
    \label{fig:before}
  \end{subfigure}
  \hfill
  \begin{subfigure}[b]{0.45\textwidth}
    \centering
    \includegraphics[width=\textwidth]{after}
    \caption{処理後}
    \label{fig:after}
  \end{subfigure}
  \caption{画像処理の前後比較。}
  \label{fig:compare}
\end{figure}

この例では、図全体が「図 1」となり、左右のサブ図がそれぞれ「(a) 処理前」「(b) 処理後」と組まれます。本文からは、\ref{fig:before} が「1a」を、\ref{fig:compare} が「1」を返します。サブ図の 小見出しだけ((a) など)を参照したいときは、\subref{fig:before} と書くと「a」だけが、\subref*{fig:before} なら「(a)」が得られます。

subfigure 環境のほかに、一行で書ける \subcaptionbox 命令もあります。書式は \subcaptionbox[目次見出し]{小見出し}[幅][内部位置]{中身} で、ここでは **\label を小見出しの引数の中** に置く点に注意してください(例: \subcaptionbox{処理前\label{fig:before}}{\includegraphics{…}})。複数行の minipage を書かずに済むので、画像一枚を入れるだけの単純なサブ図に向きます。

古いパッケージ(subfig・subfigure)を避ける

サブ図のためのパッケージは歴史的に三世代あり、混同しがちです。最も古い subfigure パッケージは廃止扱い(obsolete)で、\subfigure という古い命令を使います。その後継が subfig パッケージ(\subfloat 命令)ですが、これも現在は積極的に保守されていません。新規の文書では、本ページで説明した subcaption を使うのが推奨です。

注意すべきは、これらは同時に読み込めない ことです。subcaption と subfig(や古い subfigure)を両方 \usepackage すると、内部の定義が衝突して大量のエラーが出ます。学会のテンプレートが古いパッケージを読み込んでいる場合があるので、自分で別のものを足す前に、テンプレートが何を読み込んでいるかを確認してください。

  • subcaption — 現在の標準。subfigure / subtable 環境と \subcaptionbox\subref。caption パッケージと統合され、本ページ推奨。
  • subfig — 旧世代。\subfloat 命令。保守は停滞気味で、新規には非推奨。
  • subfigure — 最古。\subfigure 命令。廃止扱いのため使わない。