バウンディングボックス

バウンディングボックス(Bounding Box)とは,図形をちょうど囲うのに必要な大きさの,四角い箱 (矩形)のことです。 図形の大体の大きさを知るのに用いられます。 TeX においては,TeX が組版する際に必要となる「画像のサイズ」を表す数値の組として利用されます。 元来は,図形が実際に占める領域をちょうど囲む矩形なのですが,バウンディングボックスとして設定された領域から図形がはみ出していることもしばしばあります。



TeX の画像とりこみとバウンディングボックス

TeX の仕事は,文字や図形を版面(紙面)にきれいに配置することですが,図形の「中身」の処理,すなわち図形の表示や出力形式へのとりこみなど,は TeX 自身の機能ではなく,実際はプレビュアーや変換ソフトなどの「ドライバ」がそれを担います。 TeX が組版するうえで必要なのは,「その図形を版面に配置するために,どれくらいの幅と高さを確保するか」だけであり,その際に利用されるのがバウンディングボックスです。

本来の意味でのバウンディングボックスは,それぞれの図形に対して一意的に定まるものです。 しかしながら,画像フォーマットなどによっては,これはあいまいさを伴います。 そのような状況では,バウンディングボックスを何らかのやり方で推量する必要が出てきます。 この場合,組版作業を行う TeX と,出力処理を行うドライバとの間で,推量のやり方に不整合が起きると,意図せぬ結果となってしまうという問題があります。 TeX が図形の幅が 3cm だと思って配置したのに,実際の出力では,ドライバが 5cm 幅で出力してしまったなどです。 このため,使用するドライバに合わせて,TeX が利用すべきバウンディングボックスの意図された値を決めてやる必要があります。

本項目では,「バウンディングボックスの推量において不整合が起きない値」のことを「正解の値」と呼ぶことにします。 組版を担う TeX と出力処理を行うドライバが不整合を起こさないためには,TeX が使うバウンディングボックスの値はドライバに合致した「正解の値」でなければなりません。 以降では,使用するドライバに応じて TeX が利用すべきバウンディングボックスの「正解の値」について説明します。

EPS ファイルにおけるバウンディングボックス

EPS (Encapsulated PostScript) は,PostScript 形式の図を様々なメディアに挿入し,配置するための画像フォーマットで,バウンディングボックス情報を持ちます。 EPS ファイルの冒頭には,バウンディングボックスを指定する行を持つことが仕様で定められています。 EPS は通常,唯一のバウンディングボックスを情報として持つので,特にあいまいさなく図形の大きさが決定されます。

以下の値は,エラー報告用の標準データセットの tiger.eps から抜き出したものです:

%%BoundingBox: 17 171 567 739

EPS ファイルによっては,より桁数の多い高精度なバウンディングボックスをあわせもつこともあります。

%%HiResBoundingBox: 17.817252 171.021390 566.801823 738.921393

この値の組は,左下を原点とした座標系における,バウンディングボックスとして設定する矩形の左下頂点と右上頂点の各 x, y 座標を順に並べたものです(PostScript 言語には「座標系」の概念があることに注意)。 単位は bp(PostScript big point; 1bp = 1/72in)です。

TeX が EPS 画像を配置するときは,ファイルの中身を読んで冒頭の BoundingBox または HiResBoundingBox を見つけ,これを利用します。 EPS ファイルは基本的にはテキスト形式で,(時に大部分が圧縮されてバイナリになることはありますが)冒頭と末尾だけは常にテキストですので,TeX はこれを自分で読むことができます。 現在では EPS 形式以外の画像に対して

といった仕組みが整ったこともあり,いちいち Ghostscript を呼び出して PDF に変換しなければとりこめない不便な EPS 形式の画像は好まれなくなりました(参考:古い情報)。

EPS ファイル以外の画像におけるバウンディングボックス

JPG や PNG,PDF といったファイルには BoundingBox や HiResBoundingBox といった記述がありませんので,なんらかの方法でバウンディングボックス情報を取得する必要があります。 そこで,pdfTeX / LuaTeX や XeTeX は TeX エンジン自体を拡張し,これらのバウンディングボックスを取得することができるようになっています。 しかし,日本でよく用いられている pTeX や upTeX はこうした拡張を経ていないいわば “素の TeX” で,画像のサイズを知る手段がありません。 そこで,TeX からの外部コマンドの実行の機構を利用して extractbb という「バウンディングボックスを抽出するプログラム」を実行し,バウンディングボックス情報を取得します。

TeX はバウンディングボックスの概念について PostScript を踏襲しているため,EPS 以外の画像形式でも単位は基本的に bp です。 JPG や PNG などのビットマップ画像には「ピクセル」(px) という概念がありますが,これとは必ずしも一致しませんので注意してください。

dvipdfmx (extractbb) の場合のバウンディングボックス

LaTeX + dvipdfmx の処理で graphicx パッケージを使う場合,EPS 形式以外の画像におけるバウンディングボックスの指定は

  1. ソースに bb オプションがあればそれを最優先に採用
  2. bb がなければ .xbb ファイルを探しに行って読む
  3. .xbb もなければ extractbb を実行

の順に優先されます(これは dvipdfmx.def の中で定義されています)。 実は extractbb というプログラムは dvipdfmx のシンボリックリンクで,これを実行すれば dvipdfmx にとってのバウンディングボックスの「正解の値」を知ることができるのです。

JPG / PNG の場合

ビットマップ画像が実際にどのくらいの大きさを占めるかを知るには,想定された出力機器の解像度の情報が必要です。 100 ピクセル幅の画像を,1cm 幅あたり 100 以上のピクセルを表示できる高精細の出力デバイスで表示させると,1cm の幅になりますが,1cm あたりせいぜい 30 程度のピクセルしか表示できないものでは,3cm 程にもなります。 ビットマップ画像の場合のバウンディングボックスは,左下隅を原点とみなし,解像度とピクセル数から算出できる物理的な寸法です。

JPG では,Exif データなどに解像度情報を含めることができ,そこから画像の意図された大きさを算出することができます。 また,PNG などの画像形式でも,オプションとして想定される解像度情報を含めることもできます。 とりこんだ画像のサイズが異常に大きかったり,小さかったりする場合は,このデータが原因です。

PDF の場合

PDF では,印刷媒体や描画領域などに関する情報として,いくつかの異なる矩形領域を宣言することができます:

このうち MediaBox だけは必須とされ,いかなる PDF ファイルにも明示されています。 他の Box については,アプリケーションによっては追加で明示することもあるという程度です。 プログラム,特にバッチ処理プログラムが,どのようにこれら複数の画像サイズに関連した値を使うかは不明瞭なところがあります。

extractbb (dvipdfmx) が取得するバウンディングボックスは,PDF に存在する CropBox → ArtBox → TrimBox → BleedBox → MediaBox を順に探し,明示されている最初のものとなります。 W32TeX [2015/07/21] 以降および TeX Live 2016 以降では,extractbb 実行時に -B オプションで5つの Box のうちどれを使うか指定することも可能です。 どうしても思うようにいかない場合は使ってみましょう。

pdfinfo の場合のバウンディングボックス

PopplerXpdf に含まれるツールである pdfinfo は,PDF ファイルのバウンディングボックスを表示する機能を持ちます。

$ pdfinfo -box hoge.pdf

によって,hoge.pdf の5つのバウンディングボックスの値を確認することができます。

Ghostscript の場合のバウンディングボックス

Ghostscript の bbox デバイスは,PDF ファイルや PostScript ファイルのバウンディングボックスを表示する機能を持ちます。 ただし,extractbb (dvipdfmx) や pdfinfo と異なり「余白をクリップした,実際に文字や図形がある領域」の矩形を返します。

$ gs -sDEVICE=bbox -dBATCH -dNOPAUSE hoge.pdf

によって,hoge.pdf の余白をクリップしたバウンディングボックスの値を確認することができます。 TeX Live や W32TeX に含まれる pdfcrop は,この機能を利用して PDF の余白をクロップしています。

関連リンク

コメント



Last-modified: 2016-01-06 (水) 17:56:51 (1139d)