Edited at

graphicxパッケージでのPDF画像挿入の仕様が変わってヤバイ件

2017/06/01付(および2017/06/12付1)のgraphics/graphicxパッケージにおいて仕様変更が行われました。特に、dvipdfmxで2PDF画像を挿入することについて重要な非互換を含む仕様変更が行われています。本記事では、この仕様変更およびその対策について解説します。


仕様変更の内容


前提知識


  • 一般に、PDF画像には複数の「描画領域の情報」(バウンディングボックス)を持っていて用途に応じて使い分けている。具体的には、MediaBox、CropBox、BleedBox、TrimBox、ArtBoxの5種類がある。



  • graphicxパッケージの\includegraphics命令でPDF画像を取り込む際には、pageboxというオプションキーで適用するボックスを選択できる。


    • ただしdvipdfmx用のドライバでpagebox指定がサポートされたのは2015年11月のこと3




変更点

pagebox指定のデフォルトの値が変更になりました。


  • 旧仕様: 5つのボックスの何れになるかは不可解な規則により決まる。内部的な記述に依存するため、完全に予測することは困難である。


    • 参考情報: ナントカBoxの話(2)(再掲)

    • 例えば、Illustratorで生成したPDF画像の場合、MediaBoxとCropBoxの値は同じで、ArtBoxはそれらと異なる値を持つ。この仕様自体は変わっていないにも関わらず、CS6版とCC2015版で“チョット内部記述が異なる”のが原因で、「CS6版の画像ではArtBox、CC2015版の画像ではCropBoxが選択される」という不可解な結果になる。





  • 新仕様: 常にCropBoxが選択される。つまり、pagebox=cropboxがデフォルト。


    • pdfLaTeX/LuaLaTeX/XeLaTeX用のドライバと同じ動作になる。

    • 大抵のPDFビューアではCropBoxの領域を表示する仕様になっている。従って、“素人”にとってはCropBoxが選択されるのが最も直感的であろう。




影響範囲

dvipdfmxを使っていて、かつ、pagebox非指定\includegraphics 命令でPDF画像を取り込む場合に、出力が予想外のものに変わってしまう可能性があります。

[Illustrator CS6で生成したPDF画像ファイル image.pdf を挿入する場合の例]

% pLaTeX + dvipdfmx 使用

\documentclass[dvipdfmx,a4paper]{jsarticle}
\usepackage{graphicx}
\begin{docuemnt}

% これは当然ArtBoxになる
\includegraphics[width=4cm,pagebox=artbox]{image.pdf}
% これは当然CropBoxになる
\includegraphics[width=4cm,pagebox=cropbox]{image.pdf}
% **注意** これは互換性が無い!
% 旧仕様ではArtBox、新仕様ではCropBoxになる
\includegraphics[width=4cm]{image.pdf}

\end{document}


対策

この仕様変更の厄介な点は、先に書いたようなPDFの仕様について知識が乏しい人にとって、「既存の文書をgraphicxの新仕様に対応させる」ための修正が難しい、ということです。


新たに作成する文書について

PDF画像を挿入する場合は、とにかく、どのボックスを適用するのが正しいのかを把握してください。


  • 「ビューア(Adobe Reader)での表示領域が正解」だという場合はCropBoxです。大抵はこれでOKでしょう。

  • Illustratorで「描画された領域だけを表示する」場合はArtBoxです。

  • 最後の手段として全部試してみれば判るはずです4

その上で、適切なpageboxオプションを明示的に指定します。

\includegraphics[width=4cm,pagebox=cropbox]{image.pdf}  % CropBoxを適用

\includegraphics[width=4cm,pagebox=mediabox]{image.pdf} % MediaBoxを適用
\includegraphics[width=4cm,pagebox=artbox]{image.pdf} % ArtBoxを適用

※古いTeXシステムでコンパイルする可能性がない場合に限り、新仕様のデフォルト値であるpagebox=cropboxは省略できます。


既存の文書に対する対策

既存の文書を新仕様で正常に出力させたい場合も、基本的には前節で述べた対策と同じになりますが、以下に挙げる点にも注意してください。


  • PDF画像に対応する.xbbファイルが存在する場合はそのファイルを削除してください5


  • \includegraphics命令にbbオプションキーが指定されている場合は、その\includegraphicsについては全く変更する必要はありません。


補足


  • 念のため繰り返すと、仕様が変更されたのは「dvipdfmxでPDF画像を挿入する」場合だけです。それ以外の場合については仕様の変更はありません6

  • この記事にある「仕様変更」は意図的なものですが、それと同時に、graphics関連のパッケージに関して大規模な改修が入っています。そのため当該の時期(2017年6月頃)の版にはバグ(無関係なはずの PNG 画像の取込でエラーになる、など)が色々と残っていました。該当する版を使っている場合は更新が推奨されます。





  1. バグ修正のため。なお、TeX Liveのマスタに反映されたのは2017/06/13頃のこと。 



  2. TeXエンジンの種類(LaTeX/pLaTeX/upLaTeX)は無関係です。もちろん、PDF出力のエンジン(pdfLaTeX/XeLaTeX/LuaLaTeX)はそもそもdvipdfmxを利用しません。 



  3. dvipdfmx.def のv4.07[2015/11/04]。 



  4. 通常は、CropBox、MediaBox、ArtBoxの何れかが正解です。TrimBoxやBleedBoxが使われることは滅多にありません。 



  5. 新しいドライバでは画像挿入時にその都度extractbbを呼び出す処理となるため、.xbbファイルは作成されません。もし何らかの理由で.xbbファイルを配置する運用を行いたい場合は、「extractbb -B <ボックス> <ファイル名>」(<ボックス>cropboxなど)を実行して.xbbファイルを作成しなおします。 



  6. もちろん、仕様上の動作が未定義な(要するにマチガッテル)コードについては、それを書いた場合の挙動はいつでも変わりえます。