6.5 図の位置を制御する

LaTeX に共通の不満点の1つは図表の配置です. Microsoft Word のような図がユーザーの指定した場所にそのまま置かれるワードプロセッサと違い, LaTeX は特定の組版ルールに反しないように図を配置しようとします. そうなると図はテキストで参照した場所から浮動 (フロート) するかもしれません. この節では (図などの) フロート環境がどう機能するかについての背景情報と, その挙動をカスタマイズするためにどうオプションを与えればよいか解説します.

6.5.1 フロート環境

LaTeX ではデフォルトではキャプションのある図は figure 環境で生成されます. 例えば Pandoc は以下の画像を含む Markdown コードを…,

![This is a figure.](images/cool.jpg)

こう変換します.

\begin{figure}
  \includegraphics{images/cool.jpg}
  \caption{This is a figure.}
\end{figure}

figure 環境はフロート環境です. フロートの詳細な説明は https://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions で読むことができます. 要約するとフロートは, 図や表のようにページで区切られないコンテナとして使われます. 図表が現在のページの余白に収まらないときには, LaTeX は次のページの先頭に配置します. 図が十分に縦長だと, テキストを数行分の余白が残っていたとしても, 次のページ全てを占有します. この挙動は, \begin{figure}[b] のように, \begin{figure}の後の角カッコ内のいくつかの配置指定修飾子によって制御できます. 以下は使用可能な記号のリストです.

  • h: フロートをここ (here) に配置します. つまりソーステキスト上に現れるところとほぼ同じ位置です.
  • t: そのページの先頭 (top) に配置します.
  • b: そのページの末尾 (bottom) に配置します.
  • p: フロート専用の特別なページ (page) に配置します.
  • !: LaTex が「良い」フロートの位置を決定するための内部パラメータ上書きします.
  • H: フロートを正確に LaTex コード上と同じ位置に配置します. float パッケージが必要です (\usepackage{float}).

これらの修飾子は併用できます. 例えば !b は LaTeX が図をページ末尾に置くよう強制できます. デフォルトの挙動は tbp です. これは LaTeX が図をまずページ先頭に, ついで末尾に, そして独立したページに置こうとします.

6.5.2 図がフロートするのを防ぐ

多くのユーザは初めに, 伝統的なワードプロセッサの挙動を再現できるよう, 文書内を図が移動するのを防ぎたくなります. これを実現するには, まず LaTeX パッケージの float を読み込まなければなりません. YAML に以下の記述を含めることでできます.

output: 
  pdf_document:
    extra_dependencies: ["float"]

チャンクオプション fig.pos をフロートの挙動を制御するのに使えます. オプションの値 !H は文書でのいかなる移動も防ぎます. 以下の行を R Markdown 文書の最初のコードチャンクに書くことで, 全てのチャンクがこの設定になるように, 文書のデフォルトの挙動を設定できます.

knitr::opts_chunk$set(fig.pos = "!H", out.extra = "")

一般論として, LaTeX の図のフロートを強制的にやめさせることをおすすめしません. よくある要望なので, 本書にこの解決策を盛り込んだのですが,27 LaTeX が図をフロートできないときにはいくつかの深刻な副作用が発生することがあります.

6.5.3 フロートを後回しに強制する

全てのフロートを固定するよう強制する代わりに, テキストの後ろにフロートが回るよう強制する方法があります. これはよくある問題を排除できます. 問題とは関連するテキストが現れるよりも前に図がページの先頭に現れてしまうということで, こうなるとレポートを読む流れが破壊されてしまいます. LaTeX パッケージの flafter を使って以下のようにすることで, 常に図がテキストより後に現れるよう強制できます.

output: 
  pdf_document:
    extra_dependencies: ["flafter"]

6.5.4 LaTeX 配置ルールを調整する (*)

LaTeX のフロート配置パラメータの初期値は, あなたにとっては「理にかなった」配置を全体的に邪魔しているかもしれません. 堅実などころか悪質なまでに. これらのデフォルト設定を表6.1に示します.

表 6.1: LaTeX デフォルトのフロート設定
コマンド 概要 デフォルト
topfraction ページ先頭からフロートが占めるページ割合の最大値 0.7
bottomfraction ページ末尾からフロートが占めるページ割合の最大値 0.3
textfraction 1ページに占めるテキストの割合の最小値 0.2
floatpagefraction 1ページに占めるフロートの割合の最小値 0.5
topnumber ページ先頭のフロート最大数 2
bottomnumber ページ末尾のフロート最大数 1
totalnumber 1ページの最大フロート数 3

LaTeX に図を動かさないよう努力してもらうために, これらの設定を変えることができます. LaTeX プリアンブルファイルに, 1ページのテキストの最小量を減らすような以下のコードを追加し, フロートが収まる余地を増やすことができます.

\renewcommand{\topfraction}{.85}
\renewcommand{\bottomfraction}{.7}
\renewcommand{\textfraction}{.15}
\renewcommand{\floatpagefraction}{.66}
\setcounter{topnumber}{3}
\setcounter{bottomnumber}{3}
\setcounter{totalnumber}{4}

これらの記述を .tex ファイルに追加したら, 6.1節で紹介した方法で LaTeX 文書のプリアンブルで読み込ませることができます.


  1. 関連するスタック・オーバーフローの質問 https://stackoverflow.com/q/16626462/559676 は 45,000 回以上閲覧されました.↩︎