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

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

## 仕様変更の内容

### 前提知識

  * 一般に、PDF画像には複数の「描画領域の情報」（**バウンディングボックス**）を持っていて用途に応じて使い分けている。具体的には、MediaBox、CropBox、BleedBox、TrimBox、ArtBoxの5種類がある。
      * 参考情報： [ナントカBoxの話(2)]
  * graphicxパッケージの`\includegraphics`命令でPDF画像を取り込む際には、`pagebox`というオプションキーで適用するボックスを選択できる。
      * ただしdvipdfmx用のドライバで`pagebox`指定がサポートされたのは2015年11月のこと[^pagebox-add]。

### 変更点

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

  * 旧仕様： 5つのボックスの何れになるかは**不可解な規則**により決まる。内部的な記述に依存するため、完全に予測することは困難である。
      * 参考情報： [ナントカBoxの話(2)]（再掲）
      * 例えば、Illustratorで生成したPDF画像の場合、MediaBoxとCropBoxの値は同じで、ArtBoxはそれらと異なる値を持つ。この仕様自体は変わっていないにも関わらず、CS6版とCC2015版で“チョット内部記述が異なる”のが原因で、「CS6版の画像ではArtBox、CC2015版の画像ではCropBoxが選択される」という**不可解な結果**になる。
          * 参考情報： [TeX Live 2016 で変わったところ]
  * 新仕様： 常に**CropBoxが選択される**。つまり、`pagebox=cropbox`がデフォルト。
      * pdfLaTeX／LuaLaTeX／XeLaTeX用のドライバと同じ動作になる。
      * 大抵のPDFビューアではCropBoxの領域を表示する仕様になっている。従って、“素人”にとってはCropBoxが選択されるのが最も直感的であろう。

### 影響範囲

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

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

```latex
% 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です。
  * 最後の手段として**全部試してみれば**判るはずです[^allbox]。

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

```latex
\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ファイルが存在する場合はそのファイルを削除してください[^xbb]。
  * `\includegraphics`命令に`bb`オプションキーが指定されている場合は、その`\includegraphics`については全く変更する必要はありません。

## 補足

  * 念のため繰り返すと、仕様が変更されたのは「**dvipdfmxでPDF画像**を挿入する」場合だけです。それ以外の場合については仕様の変更はありません[^wrong]。
  * この記事にある「仕様変更」は意図的なものですが、それと同時に、graphics関連のパッケージに関して大規模な改修が入っています。そのため当該の時期（2017年6月頃）の版にはバグ（無関係なはずの PNG 画像の取込でエラーになる、など）が色々と残っていました。該当する版を使っている場合は更新が推奨されます。


[^revise]: バグ修正のため。なお、TeX Liveのマスタに反映されたのは2017/06/13頃のこと。
[^engine]: TeXエンジンの種類（LaTeX/pLaTeX/upLaTeX）は無関係です。もちろん、PDF出力のエンジン（pdfLaTeX/XeLaTeX/LuaLaTeX）はそもそもdvipdfmxを利用しません。
[^pagebox-add]: dvipdfmx.def のv4.07[2015/11/04]。
[^github]: 方法が解らない人は「GitHubからZIPファイルをダウンロードする」でググりましょう。
[^allbox]: 通常は、CropBox、MediaBox、ArtBoxの何れかが正解です。TrimBoxやBleedBoxが使われることは滅多にありません。
[ナントカBoxの話(2)]: http://d.hatena.ne.jp/zrbabbler/20140629/1404010741
[TeX Live 2016 で変わったところ]: http://doratex.hatenablog.jp/entry/20160609/1465398002
[GitHub:texjporg/graphics-patch]: https://github.com/texjporg/graphics-patch
[^xbb]: 新しいドライバでは画像挿入時にその都度extractbbを呼び出す処理となるため、.xbbファイルは作成されません。もし何らかの理由で.xbbファイルを配置する運用を行いたい場合は、「`extractbb -B <ボックス> <ファイル名>`」（`<ボックス>`は`cropbox`など）を実行して.xbbファイルを作成しなおします。
[^wrong]: もちろん、仕様上の動作が未定義な（要するにマチガッテル）コードについては、それを書いた場合の挙動はいつでも変わりえます。