Hatena::ブログ(Diary)

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

2015-07-06

e-pTeX の \pdfmdfivesum プリミティブで助かる例

W32TeXChangelog を見に行って、あることに気づいた。

[2015/07/04]
(03) ptex-w32.tar.xz
     Update e-pTeX (3.14159265-p3.6-150702-2.6). Support \pdfmdfivesum.
(05) uptex-w32.tar.xz
     Update e-upTeX (3.14159265-u1.20-p3.6-150702-2.6). Support \pdfmdfivesum.

おおっ、e-(u)pTeX に \pdfmdfivesum プリミティブが追加されている! 実装したのは北川さんらしい(e-pTeX Wiki より)。

また,2015/07/04 に,TeX Live SVN r37756 として

  • \pdfmdfivesum: pdfTeX の同名のプリミティブ.\pdfmdfivesum{...} で引数の MD5 sum を,\pdfmdfivesum file {<filename>} でファイル <filename> の中身の MD5 sum を計算.

の実装が行われました.

pdfTeX には従来から存在したプリミティブであり、ZR さんの記事でも脚注に一瞬だけ登場している。これがついに e-pTeX にも実装されたというので、W32TeX をアップデートしてみた。7月6日早朝現在ではミラーによっては行き渡っていないようだったので、更新が反映されているミラーサイトを選択して TeX インストーラ 3 でアップデートした。

\pdfmdfivesum プリミティブをどう確認するか

さて、\pdfmdfivesum プリミティブが実装されたことを確認するにはどうすればよいだろうか、と考えると…そう、movie15 パッケージの問題である。

要約すると、従来の状況では movie15 がファイル一致検査に使用する \pdfmdfivesum という命令について

  • pdfTeX であれば、pdfTeX 拡張の \pdfmdfivesum というプリミティブを利用する
  • LuaTeX なら、Lua で実装されている同義の命令を利用する
  • 上のいずれでもなければ(=\pdfmdfivesum が定義されていなければ)、movie15 が自前でフォールバックの定義を作って利用する

であった。この「フォールバックの \pdfmdfivesum」が曲者で、hyperref と共存した場合に「hyperref → movie15 の順で \usepackage すれば正常、movie15 → hyperref の順ならエラー」という意図しない挙動を示す。

今回の e-pTeX への \pdfmdfivesum プリミティブ実装は「e-pTeX エンジンでも movie15 によるフォールバック定義をさせない」という結果を生む。したがって、hyperref → movie15 の順に限らず movie15 → hyperref の順でも正常にタイプセットできるようになったはずである。

というわけで、以前のブログ記事で作ったソースを転用して試してみよう。ちょうどプリミティブ実装直前と直後の e-pTeX format を持っていたので、両方で試してみた。

まずは hyperref → movie15 の順。

% platex + dvipdfmx で最低3回コンパイルが必要 
\documentclass{jsarticle} 
\let\ifdraft\relax % 後で movie15 パッケージが ifdraft.sty が読み込むことへの対策 
\usepackage[dvipdfmx]{hyperref} % \movieref を使う場合に必要 
\usepackage[dvipdfmx]{movie15_dvipdfmx} 
\begin{document} 

\begin{figure}[ht] 
\centering 
\includemovie[label=hikone]{80mm}{60mm}{movie1501.mp4} \\ 
\begin{tabular}{|c|c|c|} 
\movieref{hikone}{再生} 
 & \movieref[pause]{hikone}{一時停止/再生} 
 & \movieref[stop]{hikone}{停止} 
\end{tabular} 
\end{figure} 

\end{document} 

これは、昔のものでも今回のものでも正常。

This is e-pTeX, Version 3.14159265-p3.6-141210-2.6 (utf8.sjis) (TeX Live 2015/W32TeX) (preloaded format=platex 2015.7.3)  6 JUL 2015 02:57
entering extended mode
 restricted \write18 enabled.
(中略)
Output written on movie15-test-1.dvi (1 page, 9504 bytes).
This is e-pTeX, Version 3.14159265-p3.6-150702-2.6 (utf8.sjis) (TeX Live 2015/W32TeX) (preloaded format=platex 2015.7.4)  6 JUL 2015 03:13
entering extended mode
 restricted \write18 enabled.
(中略)
Output written on movie15-test-1.dvi (1 page, 9504 bytes).

ここで、プリアンブルの hyperref と movie15_dvipdfmx の順番を入れ替える。

\usepackage[dvipdfmx]{movie15_dvipdfmx} 
\usepackage[dvipdfmx]{hyperref} % \movieref を使う場合に必要 

こうすると、昔のものではエラーが出る。

This is e-pTeX, Version 3.14159265-p3.6-141210-2.6 (utf8.sjis) (TeX Live 2015/W32TeX) (preloaded format=platex 2015.7.3)  6 JUL 2015 02:58
entering extended mode
 restricted \write18 enabled.
(中略)
! Use of \pdfmdfivesum doesn't match its definition.
\pdf@filemdfivesum {->\pdfmdfivesum file{
                                         
l.6 \begin{document}
                    
?

一方、新しいものでは正常にタイプセットが通る。

This is e-pTeX, Version 3.14159265-p3.6-150702-2.6 (utf8.sjis) (TeX Live 2015/W32TeX) (preloaded format=platex 2015.7.4)  6 JUL 2015 03:20
entering extended mode
 restricted \write18 enabled.
(中略)
Output written on movie15-test-2.dvi (1 page, 9504 bytes).

やったね!(なお、もちろん movie15 は obsolete なので、media9 を使うのが最善であることは言うまでもない。日本語ソースで media9 を使う件は以前メインブログに書いた)。

追記 (2015-07-10):追加情報あり