マクロツイーター

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

実験レポート:LaTeX + dvipdfmx による画像ファイル挿入

まあ、自分自身は、「間違った指定をしたときの出力結果」について、それほど関心がないのであるが、この辺りが物凄く気になる人もいるようなので……。

実験内容
  • テスト用画像ファイルは例のアレ。
    • tiger.pngPNG 画像、bbox は [0 0 550 568]。*1
    • tiger.eps : EPS 画像、bbox は [17 171 567 739]。
    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.3〜v3.4」および「v3.5〜v3.6〜v4.01」の更新では実質的なロジックの変更はない。また v3.1 は恐らく実際には公開されたことがないと思われる。従って、
    • 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 で行った。latexplatex、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.01v3.2v3.4v3.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.01v3.2v3.4v3.6
無し無し無し
無し無し有り × ×
無し有り無し
無し有り有り × ×
無し偽装無し (○)(×)(×)(×)
とりあえず結論
  • 最新のドライバ(v3.6〜v4.01)には(この試験の範囲では)バグがない!
  • しかし、「bbox 偽装」の反則技はもはや使えない!

*1:550×568 ピクセルで解像度は 72 dpi。

*2:viewport は bbox の左下点を基準にするので、実際に指定する bb の値はこれを考慮して、tiger.png では [111 222 333 444]、tiger.eps では [128 393 350 615] とした。

*3:v3.6 の「更新日付」がちょっとアレだが気にしないことにしよう。

*4:内部で bp と pt を取り違えているバグのため。