Hatena::ブログ(Diary)

アセトアミノフェンの気ままな日常

2015-07-19

「pagebox オプションが使えない」について補足

メインブログで BoundingBox について初心者にもわかるところから話を進める記事をとりあえず第一弾第二弾まで公開。そのなかで「graphicx パッケージの pagebox= オプションが pdfLaTeX 以外で使えない」という指摘をした。この件をナントカBox の話(3)と見比べながら検討したい。pagebox= オプションが使えるかどうかはもちろん以下のような LaTeX ソースからすぐにわかる。

% pdflatex / lualatex (NG) / xelatex (NG)
\documentclass{article}
\usepackage{graphicx}
\pagestyle{empty}
\begin{document}
This is a test of \textsf{graphicx} package.\par
BEGIN\fbox{\includegraphics[pagebox=mediabox,width=0.5\textwidth]{hoge.pdf}}END
\end{document}

この LaTeX ソースの結果と plain TeX ソースの結果を比べれば、どうして? と思わずにはいられない現象が明るみに出る。

pdfLaTeX の場合

上記の LaTeX ソースは正常に処理可能である。そもそも pdfTeX (plain TeX) では

\pdfximage ...[〈ボックス指定〉]{〈ファイル名〉}

なる書式で「どの ナントカBox を使うか」を指定できる。この〈ボックス指定〉は mediabox / cropbox / bleedbox / trimbox / artbox のいずれかが有効であり、その既定値は \pdfpagebox の値により決定される。\pdfpagebox の値は 1-5 の整数で、それぞれが上記 Box に対応している。0 も指定可能で、どうやらその場合は cropbox を指すらしい。このフロントエンドとして graphicx パッケージの pagebox= オプションが存在するといえる。pagebox オプションは v0.05a でサポートされたらしい。

% 2010/09/09 v0.05a (HO)
%  * Option `pagebox' added for specifying the pdf page box
%    of the included image. Values are `mediabox', `cropbox',
%    `bleedbox', `trimbox' and `artbox'. Default is `cropbox'. (MS/HO)

LuaLaTeX の場合

上記の LaTeX ソースは警告を返す。そのメッセージをみてみよう。

This is LuaTeX, Version beta-0.80.0 (TeX Live 2015/W32TeX) (rev 5238)
…
Package pdftex.def Warning: pdfTeX >= 1.10a required for option `pagebox' on inp
ut line 7.
…

どうやら pdftex.def の \pdftexversion による判定ではじかれているようである。え? それだけ? そう、LuaTeX は pdfTeX と全く同じ書式の plain TeX ソースを書けるので、原理的には今すぐにでも pagebox= オプションが使える状況にある。いま pagebox= オプションが使えない理由はただ一つ、pdftex.def に pdfTeX のバージョンが古いとはじかれているわけである*1 実際、最初に挙げた LaTeX ソースの冒頭に

\def\pdftexversion{110}

と書き加えるだけで警告は消え、期待通り MediaBox が選択された結果を得る。なんともったいない! ちなみに LuaTeX では \pdftexversion の必要条件を満たさないというだけの理由で相当数のオプションが pdftex.def によってはじかれている。複数ページ PDF の page= などもそれに該当し、非常にもったいない状態である。
追記 (2015-07-21):この現象は LuaTeX 0.80.0 における仕様変更に未だ pdftex.def が対応していないことが原因であり、メンテナである Oberdiek さんは既に問題を把握していらっしゃる。間もなく問題は解消する見通し。

XeLaTeX の場合

上記の LaTeX ソースはエラーを返す。メッセージを見てみると

This is XeTeX, Version 3.14159265-2.6-0.99992 (TeX Live 2015/W32TeX) (preloaded
format=xelatex)
…
! Package keyval Error: pagebox undefined.

See the keyval package documentation for explanation.
Type  H <return>  for immediate help.
 ...

l.7 ...mbox,width=0.5\textwidth]{hoge.pdf}}
                                           END
?

そう、keyval のエラー。すなわち、ドライバ内で pagebox というオプションが定義されていないのである。ところが、XeTeX には

\XeTeXpdffile 〈ファイル名〉 ... [〈ボックス指定〉]

なる書式が存在し、〈ボックス指定〉は media / crop / bleed / trim / art の中から選択する(名称に box がないことに注意;デフォルトは crop)。これが単純にドライバで扱われていないだけで、これももったいない状態である。
追記 (2015-07-23):角藤さんによって XeLaTeX でも pagebox オプションが使えるように拡張された! 速報はこちら

dvipdfmx の場合

これは XeLaTeX と同様のエラーを返す。dvipdfmx のドライバでも pagebox がハンドルされていない。しかし、そもそも extractbb に「特定の Box を返させる」ということができないので、現時点でマクロレベルで対処することは不可能である。したがって、extractbb 本体のコードの拡張が必須であるといえる。
追記 (2015-07-23):角藤さんによって dvipdfmx でも pagebox オプションが使えるように拡張された! 速報はこちら

*1:ここで LuaTeX なのに僕がなぜ pdfTeX のバージョンが「未定義」ではなく「古い」という表現を用いたかは、本記事を読んだ ZR さんが僕より先に解説してくださったのでそちらを参照。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証