自己顕示欲の開放治療所

erg, programming and something.

別名:Laughing and Grief 雑記

Latin and Greekは習ったこともない

真面目な記事の他、特定の方には不快と思われる事柄に関して言及を行うことがあります。ちょっと頑張りますが、Blog内で解決できなかった場合要望があれば別ページに技術記事は書き直します

fewerfloatpagesパッケージの概略

この記事は TeXLaTeX Advent Calendar 2020の19日目の記事です。

adventar.org

18日目はtamuratakさんでした。

Github Actions 上の Windows に TeX Live をインストールする · GitHub

自動組版に3つの最適化有り。1つは段落内の行バランス最適化、1つはページネーションの最適化、1つは……とまあそんなそんな感じで、フロートの配置アルゴリズムというのは結構な方が関心を持つトピックですね。

www.latex-project.org

MittelBach氏は16年の『Alice goes floating』や17年の『Through The Looking Glass — and what Alice found there …』など、ページネーションとフロート配置についての研究を行ってきました。『Effective Floating Strategies』とか学術向け資料感の強い題のものもありますが、まあ長いこと取り組まれているということです。14年とかのfigureやtableについて言及したものもそうかもしれないけれど私は追い切れていないです。

そんな氏の成果物として2020年fewerfloatpagesパッケージが登場しました。TUGBoat41号にも載っています。というかパッケージのドキュメントPDFがまんまか?

このドキュメントはtexdoc fewerfloatpagesとかで読めると思うので、興味が出たら↑のpublicationsと合わせて読むとよい、というかここ以後の文を読むよりオススメします。

まずはフロートについて軽く。

図表などを配置するときに「htb」のように「できればこの位置に配置してほしいな」順を書いたことがありますか? なくてもいいんですが、フロート要素が書かれた記述位置、この位置をアンカーとして、置ける場所に置かれる、それがフロートです。変な指定をすると容易にぶっとんだ位置にいきますが、とりあえず組版システムはアンカー位置を基準に、指定場所に置けるかどうかチャレンジをしながら最終的な位置を決定します。このアルゴリズムによっては、本来挿入されて欲しい位置に入らず、次のページにデデンと配置されてページ数が増え、論文の規定ページ数に収まらなくなり、……ということも起こり得るワケです。

軽く例が出ましたが、フロート配置アルゴリズムへの要望の多くは、「もっとページ数が少なくて済むように置いてほしい」という方向になります。ページ数がたっぷり使える富豪組版方針ならとりあえず次のページにフロートも本文も送ってしまえば良いケースが多いでしょうし、それはそう。

アルゴリズムとして、まず置こうとして、ダメなら待機リストみたいのに突っこんで待機リストから放出できる位置まで保持、みたいな方法が素朴である程度は上手くいくんですが、待機リストにどんどん待機が貯まっていくと放出時に大変そうというのは直感で感じませんか? 素朴だとどんなことが起こるかというと、待機リストの先頭にあるヤツが条件1をのフロート候補位置に求めるとして、待機リスト2番目のヤツが条件2をフロート位置に求めるとします。フロート候補位置が条件2を満たすけれども待機リスト先頭は条件1待ちだからスルー、とかそんなことも起こるかもしれません。

この辺はちゃんとパッケージの説明読みましょう。ひだるまはざっとしか読んでいないので。

ざっくりとしたユースケースとして「これ以上フロートページは増やせないとき、前の位置に戻ってねじこめないか、すでに置き終わっているフロート含めて探索しなおす」ようなことを行います。

うっかり、フロートが大量な文書などは用意できなかったのでbefore-afterはないですが。

\usepackage{fewerfloatpages}

パラメータ指定

このパッケージはあらかじめ指定したパラメータを基に、「この範囲内だからヨシ!」「超えてるので再計算や!」みたいにフロート位置を考えるパッケージなので、とりあえずビルドしてみて気に入らなかったらこれを弄ることでユーザは調整を行う。

\setcounter{floatpagedeferlimit}{<number>}

\setcounter{floatpagekeeplimit}{<number>}

\renewcommand\floatpagekeepfraction{<decimal>}

floatpagedeferlimitはフロート待機列に置いておける期限ですね。1を指定してあると、1ページ以上は待機リストを持ち越せずフロートページを作成します。フロートを記述した場所から離れられる限界ページですね。

floatpagekeeplimitfloatpagedeferlimitの逆というか、待機リストに置いて最適な配置を伺うページ数の期限です。deferlimitがこの値より少ないと意味見られることもない、という解釈でいいのかな。あと、p指定のフロートが来た時点でこの値に関係なく置かれるっぽい。

一個だけrenewcommand\floatpagekeepfraction。まあまず、ナンチャラfractionという「その要素がページに占めてよい割合」みたいな数字がイロイロあって。あとtopnumberとか置いていい数の上限を決める数値もあります。\floatpagekeepfractionはデフォルトで\textfraction、これはテキストを置いていい最小割合とオソロです。テキストを置ける領域も置けないならフロートも置けないよね的な理解でいいんだろうか。まあ再定義できます。

floatpagedeferlimitが1のときは優先順位低まるはず。

pitfallの避け方と書いてある。

\usepackage[checktb]{fewerfloatpages}

再配置のときの挿入箇所とフロートのサイズが合わない(けど入れる)とき警告が出たりする。

\usepackage[addbang]{fewerfloatpages}

!によるちょっと強制力高めな位置指定があるんですが、こいつが効くようになる、でいいんだろうか。

完全に理解しているので自動チェックをしなくても手動でフロートのパラメータを置ける人

\usepackage[nocheck]{fewerfloatpages}

挙動のトレース

\usepackage[trace]{fewerfloatpages}

オプション付きで呼ぶと、文書のビルド時にベロベロっと動作を教えてくれます。


「いかがでしたか?」ってつけたくなるくらい何も理解できていない概略になった気がするので、ちゃんとドキュメント読もうね。

明日はwtsnjpさんです。