まあ、自分自身は、「間違った指定をしたときの出力結果」について、それほど関心がないのであるが、この辺りが物凄く気になる人もいるようなので……。
実験内容
- テスト用画像ファイルは例のアレ。 dvipdfmx の処理では、Ghostscript を経由する EPS 画像だけが他と異なり、JPEG、PDF 画像は PNG 画像と同等の扱いになるはずである。
- extractbb の実行の有無。
- 自動: shell escape により extractbb が自動的に実行される。
- 手動: LaTeX の実行の前に予め extractbb を実行しておく。
- 無し: extractbb の自動実行を禁止し、また手動でも実行せず、.xbb ファイルが無い状板。この状態でかつ bb オプションを指定しない場合、画像の bbox が取得できないので処理は失敗するはずである。
- bb オプション指定。
- 無し: bb オプションを指定しない。
- 有り: bb オプションに画像の正しい bbox の値を指定する。
- 偽装: bb オプションに「本来 viewport として指定したい値」を指定する。*2
- viewport オプション指定。
- 無し: viewport オプションを指定しない。
- 有り: viewport オプションの値として [111 222 333 444] を指定する。
- ドライバファイル(dvipdfmx.def)のバージョン。TeX Live のレポジトリの履歴にあるものを調査対象とする。*3
- 1999/02/16 v3.01 r09280
- 2013/04/29 v3.1 r30175
- 2013/05/27 v3.2 r30729
- 2013/09/21 v3.3 r31772
- 2014/01/23 v3.4 r32770
- 2014/03/31 v3.5 r33354
- 2014/06/07 v3.6 r33409
- 2014/04/28 v4.01 r33800
- v3.01, v3.2, v3.4, v3.6
- テスト用コードは以下の通り。
\documentclass[a4paper,dvipdfmx]{article} \usepackage{graphicx} \begin{document}\noindent \includegraphics[<bbオプション><viewportオプション>clip,width=42pt]{<画像ファイル名>} \end{document}
LaTeX の実行は latex で行った。latex、platex、uplatex のエンジンの違いは結果に影響しないはずである。 - 判定方法。
- viewport 指定が無い場合は、画像の全体が挿入されていれば正常とする。
- viewport 指定が有る場合は、(clip オプションもあるので)その矩形の範囲だけが切り出されて挿入されていれば正常とする。
- 「bb オプション = 偽装」の入力は、そもそも「正しい出力結果」が定義できないわけだが、便宜的に「viewport 有り」の場合の結果を正常とみなす。
- 手抜き。
- 結果に違いが出ないと判断している点については条件に含めていない。
- いちいち dvipdfmx を実行するのは面倒なので、出力結果の DVI ファイルの special の中身を見てそれを「脳内 dvipdfmx」で変換した結果で判断している。そのため「脳内」と「実在」の dvipdfmx の仕様に相違があった場合は間違った判断をしていることになる ;-)
PNG 画像(tiger.png)についての結果
- ○: 正常である。
- △: ほぼ正常であるが bbox の値に 0.3%程度の誤差がある。*4
- ×: 正常でない。
- !: LaTeX の実行でエラーが発生した。
- * 付: extractbb が自動実行されて .xbb が生成された。
- ( ) 付: これは本来不正な設定であるので、どんな結果になろうが文句は言えない。
入力設定 | 出力結果 | |||||
---|---|---|---|---|---|---|
extract bb実行 | bb 指定 | view port | v3.01 | v3.2 | v3.4 | v3.6 |
自動 | 無し | 無し | ○* | ○* | ○* | ○* |
自動 | 無し | 有り | ×* | ×* | ×* | ○* |
自動 | 有り | 無し | ○ | ○ | ○ | ○ |
自動 | 有り | 有り | ○ | ○ | ○ | ○ |
自動 | 偽装 | 無し | (○) | (○) | (○) | (×) |
手動 | 無し | 無し | ○* | ○* | ○* | ○* |
手動 | 無し | 有り | ×* | ×* | ×* | ○* |
手動 | 有り | 無し | ○ | ○ | ○ | ○ |
手動 | 有り | 有り | ○ | ○ | ○ | ○ |
手動 | 偽装 | 無し | (○) | (○) | (○) | (×) |
無し | 無し | 無し | (!) | (!) | (!) | (!) |
無し | 無し | 有り | (!) | (!) | (!) | (!) |
無し | 有り | 無し | ○ | ○ | ○ | ○ |
無し | 有り | 有り | ○ | ○ | ○ | ○ |
無し | 偽装 | 無し | (○) | (○) | (○) | (×) |
EPS 画像(tiger.eps)についての結果
票の味方は先と同じ。EPS 画像の場合は、extractbb の実行は無意味なので「無し」のみを試した。
なお、EPS 画像の読込については、dvipdfmx.def の v3.01 → v3.2 の改変の時に、Ghostscript の呼出オプション(dvipdfmx.cfg に記されている)が変更されている(参照)。このため、v3.01 以前のものは「古い dvipdfmx.cfg(GS のオプションが -sPAPERSIZE=a0
のもの)」、v3.2 以降のものは「新しい dvipdfmx.cfg(オプションが -dEPSCrop
)」との組み合わせで用いる必要がある。以下は正しい組み合わせで試したものである。ちなみに、間違った組み合わせの場合の結果は全て「(×)」となる。
入力設定 | 出力結果 | |||||
---|---|---|---|---|---|---|
extract bb実行 | bb 指定 | view port | v3.01 | v3.2 | v3.4 | v3.6 |
無し | 無し | 無し | ○ | △ | △ | ○ |
無し | 無し | 有り | ○ | × | × | ○ |
無し | 有り | 無し | ○ | △ | △ | ○ |
無し | 有り | 有り | ○ | × | × | ○ |
無し | 偽装 | 無し | (○) | (×) | (×) | (×) |
とりあえず結論
- 最新のドライバ(v3.6〜v4.01)には(この試験の範囲では)バグがない!
- しかし、「bbox 偽装」の反則技はもはや使えない!