Navigation : Top/float環境(figure/table)の出力位置をコントロール

LaTeXではfigure環境やtable環境の出力位置は半自動的に決定されます。これらの環境は共通のfloatマクロでできているのでまとめてfloatと呼びます。 floatの出力位置は文章とfloat の大きさなどのバランスを考慮して決まりますが、一般に狙った場所に出そうとするとうまくいかないことが多いです。ここではなるべく少ない労力で出力位置をうまくコントロールすることを 考えます。

  1. デフォルトの位置指定子でfloatの処理をさせる
    つまり\begin{figure}[ht]などと明示的にオプションを 指定しないでおきます。ちなみにデフォルトのfigure/table環境の位置指定子は[tbp]になっています。これは、ページの上(t)、下(b)、 単独ページ(p)を順に評価してfloatの出力制約を満す位置に出力せよという意味です。
  2. 個別に位置指定子を修正する
    デフォルトの出力位置が気に入らない場合には、 気に入らないfloatだけ位置指定オプションを修正します。 例えば、なるべくその場(figure環境などを書いた場所)に出したいときは[hbt]などと指定します。
  3. 位置指定修飾子「!」を使う
    LaTeX2eでは位置指定の修飾子として新たに「!」が使えます。 これによりfloatの出力制約が無視され、 多少無理があっても指定した位置に出そうと*努力*します。例えば、その場所に出したいと思って[hbt]としてもその場の近くに出ない場合には、[!hbt]あるいは [!hb]などとすれば、大抵の場合うまくいきます。
  4. float用のパラメータを調節する

それでもうまく行かないのは、1つのfloat(図など)が大きすぎたり、 多くの図を同じページに出そうとしたりからかも知れません。 1つのページに入るfloatの数や文字部分との比率などは パラメータによって決まっています。 以下はデフォルト(article.cls)のパラメータ値です。

\setcounter{topnumber}{2} % 頁上部の最大float数 \setcounter{bottomnumber}{1} % 頁下部の 〃 \setcounter{totalnumber}{3} % 1頁の 〃 \setcounter{dbltopnumber}{2} % twocolumn時の頁上部の最大float数 \renewcommand\topfraction{.7} % 頁上部のfloatで占める最大の割合 \renewcommand\bottomfraction{.3} % 頁下部の 〃 \renewcommand\textfraction{.2} % 1頁のテキスト部の占める最小割合 \renewcommand\floatpagefraction{.5} % floatが単独頁になるときの最小割合 \renewcommand\dbltopfraction{.7} % twocolumn時の topfraction \renewcommand\dblfloatpagefraction{.5} % twocolumn時の floatpagefraction

1つの頁に入るfloatを調節するには totalnumber などを変えます。 また、サイズが大きなfloatでもできるだけ単独頁にならないようにしたいなら、 fraction系の定義を下のように修正すると良いです。

\renewcommand{\topfraction}{.85} \renewcommand{\bottomfraction}{.60} \renewcommand{\textfraction}{.15} \renewcommand{\floatpagefraction}{.6}

この場合でも、topfraction=1、textfraction=0 には決してしないでください。 高さゼロのテキストが無理やり詰め込まれたりすることになります。

それでもだめで、どうしてもその場所に出したいときには… とめません、floatパッケージかhere.styを使ってください。

\usepackage{float} ... <中略> \begin{figure}[H]

と[H]オプションを使えば確実にその場に出ます。 ただし他の通常のfloatと順番が前後してしまう危険を承知ください。

多くのfloatがあって、本来あるべき位置よりもずっと後の方 (例えば別の\sectionの方)に図が飛んでいる場合には、 \sectionなどの直前で\clearpageを挿入してみます。 とりあえずこれ以上後ろには図は飛ばなくなります。

物凄く沢山のfloatがあるためにLaTeXのコンパイルエラー がでてしまうときにも、適度に\clearpageを挿入します。

最初の参照(\ref)よりもさきにfloatが出力されるのが気に入らなければ、 flafterパッケージを使います。

\usepackage{flafter}

ソースを修正せずに、 floatを文書の最後にまとめて出力したい場合には endfloatパッケージを使います。

\usepackage{endfloat