マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

ナントカBoxの話(2)

前回の続き)
PDF における 5 つの“ナントカBox”

さて、PDF 画像に関してはちょっと話が複雑になってくる。PDF 自体が「PostScript に取って代わるもの」として開発されたものであるため、「無限に続く座標平面があり、そこに命令列を通して描画を行う」といった基本的な仕組は PDF と EPS で共通である。しかし、PDF というファイル形式が「単体の画像」「画面に表示される(複数ページの)文書」「単純に用紙サイズのみ指定された印刷用文書」「製本を行う印刷所が取り扱う書籍データ」といった幅広い用途を想定している関係で、EPS のバウンディングボックス(bbox)に相当するボックス(どれも “ナントカBox” という形の名前をもつ)が複数存在するのである。((ところで、これらの PDF 規格で定められたボックスとは別に、「PDF ファイルに EPS ファイルと同様に “%%BoundingBox:” の形式(DSC)のコメントを入れる」という規定(?)が用いられることがあるという話を見たことがある。そういう PDF ファイルを実際に見たことは無いのであるが。))

  • MediaBox: 用紙(等の媒体)に実際に印刷される領域。一般の人が行う(非専門的な)印刷行程ではこのボックスのみが指定(および使用)されることが多く、その場合は「用紙サイズ」を表す。(La)TeX において指定された「用紙サイズ」((pdfTeX の \pdfpagewidth/height、DVIウェアのオプション設定や papersize special 命令等により指定される。))は MediaBox のサイズに一致する。
  • CropBox: 最も一般的な意味での、「そのページの(外形を込めた)内容」を表す領域。PDF ファイルを Adobe Reader 等のビューアで開いた場合、CropBox の中身のみが表示されるようである。
  • BleedBox: 専門的な印刷工程における、「断ち落としサイズ」に相当する領域。
  • TrimBox: 専門的な印刷工程における、「仕上がりサイズ」に相当する領域。
  • ArtBox: PDF 文書を画像として用いる場合の、「その画像の(外形を込めた)内容」を表す領域。ただ、その PDF 文書の用途が画像しかないのならば、MediaBox のみを指定すれば十分で、実際には ArtBox はあまり用いられていないようである。

そして、論理的には、PDF 文書の各ページが前述の 5 種類のボックスの値を必ず持っている。ただしそれらの値が明示される場合と暗黙的に決まる場合がある。*1PDF 規格によると以下のような規則になっている。

  • MediaBox の値は必ず明示される。*2
  • CropBox の値が明示されていない場合は、MediaBox と同じと解釈される。
  • BleedBox、TrimBox、ArtBox の値が明示されていない場合は、CropBox と同じと解釈される。

一つ例を挙げておくと、例えば、明示されているボックス指定が

MediaBox = [0 0 50 50], CropBox = [0 0 40 40], ArtBox = [10 10 30 30]

の 3 つであったとすると、残りの 2 つは次のように決まる。

BleedBox = TrimBox (= CropBox) = [0 0 40 40]

もし、CropBox の指定も無かったとすると、その場合は、CropBox、BleedBox、TrimBox の全てが MediaBox に一致することになる。

PDF における“bbox”

さて、PDF 形式の画像ファイルには 5 つの “ナントカBox” が存在することが判ったが、それでは、graphicx パッケージの \includegraphics 命令が画像を挿入する場合に bbox として使われるのはどれなのか。答えは DVIドライバ/エンジンにより異なる。なお、先述の通り「ビューアで開いたときに見えるのは CropBox」なので、一般のユーザにとっては CropBox が使われる*3のが最も直感に合うと感じられるだろう。

  • pdfTeX 用のドライバを使用の場合(LuaTeX を含む):
    \includegraphics 命令のオプションキー pagebox により、使用する“ナントカBox”をユーザが選択できる。可能な値は mediaboxcropboxbleedboxtrimboxartbox の何れかである。
    \includegraphics[pagebox=artbox,width=.6\linewidth]{image.pdf}
    
    pagebox キーの既定値は cropbox である。つまり、普通は CropBox が bbox として使われる。
  • XeTeX 用のドライバを使用の場合:
    ボックスの種別をユーザが選択することはできず、常に CropBox が bbox として使われる。*4
  • dvipdfmx 用のドライバを使用の場合:
    やはりボックスの種別をユーザが選択することはできない。しかも使用されるボックスの選択の規則が以下のように少々ややこしい。
    CropBox→ArtBox→TrimBox→BleedBox→MediaBox の順で明示されている最初のものを使う。

dvipdfmx の解釈の何が問題かというと、先述の「非明示時の解釈の規則」と齟齬を起こしているため、単純に「このボックスが使われる」と言い切れないのである。*5現状では「dvipdfmx が解釈する bbox」があると認識するより他に仕方が無いであろう。

なお、dvipdfmx の場合、LaTeX 処理時に bbox の情報を .xbb ファイルまたは \includegraphics 命令の bb オプションキーの何れかの方法で与える必要があるが、dvipdfmx 自体が先述の解釈を行っている以上、そこで与える bbox の情報も dvipdfmx が選択するボックスのものを用いる必要があることに注意しておく。さもないと、「bbox の偽装」を行ったことになり、将来において予期せぬ動作が起こる可能性がある。((「bbox の偽装」、すなわち dvipdfmx が(既定で)解釈する bbox とは異なる値を .xbb ファイルや bb キーで与えるという「反則技」は、EPS 画像とビットマップ画像に関しては、最新の dvipdfmx のドライバではもはや認められなくなっている。PDF 画像については「今はまだ使える」状態ではあるが、将来も使えるかどうかについては決して楽観できないと思う。))

*1:なお、この記事では各ページの各ボックスの値が PDF ファイル中にどのように記述されるかについての解説は行わない。

*2:ただし、全体的な文書設定として MediaBox の値を与えておいて、各ページではそれを継承する、ということも可能であるらしい。

*3:念のため繰り返すが、「CropBox が使われる」は「CropBox が明示された場合は CropBox が、そうでない場合は(必ず明示されているはずの)MediaBox が使われる」と言っているのと同じである。

*4:実は XeTeX エンジン自体には PDF 画像挿入時にボックスの選択を機能が備わっているが、残念ながら graphicx のドライバはそれに対応していない。

*5:例えば「MediaBox=[M], CropBox=[M], ArtBox=[A]」が明示された PDF 画像と「MediaBox=[M], ArtBox=[A]」が明示された PDF 画像は、PDF 規格の解釈に従うと「全く同じボックス指定」を持っている。にも関わらず、dvipdfmx の解釈する bbox は前者は [M]、後者は [A} と食い違ってしまう。