マクロツイーター

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

dvipdfmx で mediabb できない件(1)

TeX Forum のトピックの方に書いた話であるが、そちらの方は私の認識の混乱のため嘘が混じっているので、改めてここに纏めておく。

先にまとめておくと
  • mediabb パッケージは(dvipdfmx の前身である)dvipdfm、あるいは、かなり昔(7 年以上前)の dvipdfmx での利用を前提としている。
  • 従って、(新しい)dvipdfmx と一緒に使うことは全く考慮されていない。すなわち、その場合の動作は「未定義」だと思うべきである。
  • 実際には、mediabb の一部の機能は一応動作するが、残りの機能については不正な、直感に反する動作が起こる。

以上より、dvipdfmx を用いている状況では原則として mediabb パッケージは読み込んではいけない。(例外については後述。)

以下では詳細について述べる。

mediabb パッケージは“dvipdfm”専用

最近の TeX 環境を前提とする場合、(u)pLaTeX を用いて PDF 文書を作成する際には dvipdfmx を用いるのが標準的になっている。このブログで何度か触れているように、dvipdfmx は元々欧文 TeX 用であった“dvipdfm”(x がない)というソフトウェアを pTeX 系に対応するように拡張したものである。*1(なお、いつか改めて説明したいが、最近の TeX Live ではもはや dvipdfm は使えない。)

ところが、mediabb パッケージがサポートしているのは、dvipdfmx ではなく元々の“dvipdfm”の方である。ただし、厳密に言うと、かなり昔(2007 年 5 月以前)の dvipdfmx は dvipdfm と互換性があり、この「昔の dvipdfmx」もサポート対象に含まれている。これは、mediabb の配布元のサイトの記述を見れば判る。

graphics/graphicxパッケージのdvipdfmドライバではpdf画像のサイズを外部のbbファイルから取得しなくてはならない。そこで、pdfの画像サイズの読み込みをpdftex.defのように/MediaBoxを使うようにしたmediabb.styを作った。

\usepackage[dvipdfm]{graphicx}
\usepackage{mediabb}

のように使うと、.bbファイルを用意する必要がなくなる。なるべくdvipdfmxの動作と同じになるよう……(以下略)

このように、“dvipdfmx”とは書いてあるものの、graphicx で「dvipdfmドライバ」を指定することが前提となっているので、これは「昔の dvipdfmx」(dvipdfm と互換だったため当然ドライバも dvipdfm 用のものがそのまま用いられていた)のことであることは明らかである。*2

2 つの機能

mediabb パッケージは次の 2 つの機能を提供している。

  • ① PDF ファイルについて、その中身を(可能であれば)自分で解析することで、バウンディングボックスの値を検出する。(だから .(x)bb ファイルが不要になる。)
    • ただし、以前の記事で述べたように、これが上手くいくのは、「PDF のバージョンが 1.4 以下である」か「オブジェクトストリームの内容が非圧縮の場合」に限られる。最近のソフトウェアで“普通に”生成した PDF ファイルでは「上手くいかない方が多い」と考えた方がいいだろう。
  • ② ビットマップ画像ファイルについて、シェル実行機能を利用して、ebb を自動で起動して .bb ファイルを作成する。
    • シェル実行機能は(セキュリティの理由で)通常は無効になっているので、この機能を利用するためには、pLaTeX のコマンド実行時に -shell-escape オプションを指定して有効かする必要がある。
    • さらに、UNIX 系のコマンドを使っているため、これが利用できるシェル環境が前提となる。(普通の Windows では利用不可。)
    • 「ebb」「.bb ファイル」というのは、dvipdfmx における「extractbb」「.xbb ファイル」に相当するものである。以前の記事で説明したように、dvipdfm(または「昔の dvipdfmx」)と今の dvipdfmx では解像度の扱いが異なるため、処理が別になっている。
    • (今の)dvipdfmx の場合、シェル実行機能を利用した extractbb の自動起動(およびそれによる .xbb ファイルの作成)は graphicx パッケージの標準でサポートされているので、この機能は不必要である。
    • というより、dvipdfmx を使っている場合は、.xbb ファイルが利用されるるので、.bb ファイルを作成しても無視される。つまり、この機能はそもそも何の役にも立たない

ネット上に存在する割と最近の記事を見る限りでは、(今の)dvipdfmx と mediabb パッケージを併用している人は確かに存在して、そういう人は①の機能を目的としているようである(②はそもそも機能しないのだから当然)。

mediabb が要らない話

ただし、「画像ファイルのバウンディングボックスの情報をどう取得するか」については、現状では、PDFとビットマップの両方について、「extractbb を自動起動」させるアプローチが標準的になっていることに注意してほしい。前述のとおり、外部プログラムの起動の機能は普通は無効化されているのだが、W32TeX では extractbb の起動については「特別に許可」に許可されている。TeX Live については現在(2014 年版)についてはそうなっていないが、最近のインストールの指南においては、extractbb を「特別許可」のリストに含めることが指示されることが多いようだ。なので、単純に「extractbb を手動で起動するのが面倒」という理由で mediabb を利用するのは一般的ではないだろう。

さらに言うと、最近のドライバの実装(dvipdfmx.def の v4.02 以降)においてはこの extractbb の自動起動の挙動が改良されていて*3、次のような利点が得られる。

  • 中間ファイルの生成が抑制される。(つまり「邪魔な .xbb ファイルが作られない」。)
  • extractbb のファイル書込の挙動を制限することができる。(現在の extractbb では既に制限が実装されている。)これにより、extractbb を安全なプログラムと見做すことが可能になり、次期の TeX Live では「特別許可」のリストに extractbb が含められる模様。

すなわち、そもそも「(今となっては)特殊な PDF ファイルしか扱えない」mediabb を使う必要性は失われつつある、といっていいであろう。

続く

*1:ただし初期の拡張は dvipdfm の名のままで行われているため、“pTeX に対応した dvipdfm”も存在し、TeX Live や W32TeX に嘗て収録されていたのはそちらであうr。

*2:最終更新が 2013 年なのに、それより 6 年も昔の dvipdfmx の存在を前提にしていることは奇妙に見えるかもしれないが、大学の計算機環境における TeX のインストールが「恐ろしく古い」ことは特に珍しいことではない。本当に…(嘆息)

*3:extractbb の出力先を .xbb ファイルでなく標準出力にして、パイプ実行によりその内容を読み込んでいる。