2017/06/01付(および2017/06/12付1)のgraphics/graphicxパッケージにおいて仕様変更が行われました。特に、dvipdfmxで2PDF画像を挿入することについて重要な非互換を含む仕様変更が行われています。本記事では、この仕様変更およびその対策について解説します。
仕様変更の内容
前提知識
- 一般に、PDF画像には複数の「描画領域の情報」(バウンディングボックス)を持っていて用途に応じて使い分けている。具体的には、MediaBox、CropBox、BleedBox、TrimBox、ArtBoxの5種類がある。
- 参考情報: [ナントカBoxの話(2)]
- graphicxパッケージの
\includegraphics
命令でPDF画像を取り込む際には、pagebox
というオプションキーで適用するボックスを選択できる。- ただしdvipdfmx用のドライバで
pagebox
指定がサポートされたのは2015年11月のこと3。
- ただしdvipdfmx用のドライバで
変更点
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 を挿入する場合の例]
% 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 画像の取込でエラーになる、など)が色々と残っていました。該当する版を使っている場合は更新が推奨されます。
-
バグ修正のため。なお、TeX Liveのマスタに反映されたのは2017/06/13頃のこと。 ↩
-
TeXエンジンの種類(LaTeX/pLaTeX/upLaTeX)は無関係です。もちろん、PDF出力のエンジン(pdfLaTeX/XeLaTeX/LuaLaTeX)はそもそもdvipdfmxを利用しません。 ↩
-
dvipdfmx.def のv4.07[2015/11/04]。 ↩
-
通常は、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 ↩ -
新しいドライバでは画像挿入時にその都度extractbbを呼び出す処理となるため、.xbbファイルは作成されません。もし何らかの理由で.xbbファイルを配置する運用を行いたい場合は、「
extractbb -B <ボックス> <ファイル名>
」(<ボックス>
はcropbox
など)を実行して.xbbファイルを作成しなおします。 ↩ -
もちろん、仕様上の動作が未定義な(要するにマチガッテル)コードについては、それを書いた場合の挙動はいつでも変わりえます。 ↩