読者です 読者をやめる 読者になる 読者になる

Acetaminophen’s diary

化学に関すること,TeXに関すること,ゆきだるまに関すること。

日本語の文書に media9 パッケージでマルチメディア埋め込み

以前の記事を書いた時からの懸念であった「media9 パッケージを使ったソースを platex + dvipdfmx に通す方法」の案を、ここで紹介することに決めた。これまで触れなかったのには理由があるのだが、そうこうしているうちに ZR さんに指摘されてしまった

movie15 はすでに obsolete 扱いになってて、そのため dvipdfmx で使う設定をするのも今ではトリッキーになっている感じなのだが。

ごもっともである。ただ、すでに書いていたとおり

僕の場合は「ある方法で結果的に目的の動作が可能ならば、わざわざ他の方法を検証することはしない」という方針なので、現在では obsolete となっている TeX パッケージをわざわざ取ってきたりしている。もちろんこのような点に関しては自分でも気持ち悪いのだが、おそらく誰かが最新のより好ましい方法を解説してくださると信じている。

としていたので、どこかで先に書かれるだろうと思ったのだが意外と現れず、暫定的に“自己解決”している方法を紹介。

追記:記事の末尾に、ZR さんによる根本的な解決策も書き加えた。

 

そもそもの経緯

本来なら obsolete なパッケージを使いたくはなかったが、どうしても movie15 の方が便利な理由があった。

  • もともと「マルチメディア」企画は第1回から第5回で終わる予定であった
  • 第5回で扱う予定だった MeshLab は最新版でも movie15 向けの LaTeX ソースを自動生成する
  • いずれにせよ movie15 向けのソースを dvipdfmx に通す必要があるのならば、どうせなら古くても movie15_dvipdfmx を使ってしまえ

このため、幸か不幸か media9 の実験からは手を引いたわけである。

しかしその後、3D モデルに関してより良い方法を発見したため、早速これを第6回で紹介しようという発想に至った。しかし、以下の問題が生じた。

  • Jmol が自動生成するソースは media9 向けであることが判明
  • ということは、media9 向けのソースを dvipdfmx に通す必要があるが、そのままでは pdflatex 用になっていて不可能
  • 可能性としては
    1. 既に成功した movie15_dvipdfmx に適合するようにソースを書き換える
    2. 他のパッケージやオプションで media9 を dvipdfmx に通せるようにする
    3. そもそも movie15 から movie15_dvipdfmx が作られたように、media9 パッケージを書き換える
    がある。

というわけでいろいろ試してみるわけだが…

  • 単に \usepackage[dvipdfmx]{media9} とオプションを付けるだけ、あるいは \documentclass のオプションでグローバル指定:失敗
  • media9 を書き換える:media9 は LaTeX3 仕様なので自分の能力を超えるし、それほど余裕もない…
  • では逆に、ソースを書き換えて movie15_dvipdfmx で通そう
    • お、通った。まあいいや…

で落ち着いてしまったのである。後付けの理由としては、media9 のドキュメントには movie15 に明記されていた「対応フォーマット一覧」が抜けていて、サポート状況が分かりづらいという不満もある。

初めに 2. の方法で media9 を通そうと思ったときは、dvipdfmx オプションが受け入れられれば大丈夫ではという安易な発想だった。しかし、keyval のエラーかと思いきやそうではなかったため時間的な制約から検証をやめ、記事を書いた際にはここで諦めた。とはいっても 3. のようにパッケージを書き換える気は毛頭なかったので、第2回第5回で既出だった movie15_dvipdfmx を使う方向で進めたというのが実のところである。

 

今回の検証:media9 を使うために

しかし、今回はゆっくり時間があるので 2. の方法を再度検証した。以下、その過程とともに述べる。環境は最新の W32TeXTeX Live 2014 (MacTeX-2014) である。

元のソースは以前公開した「100d.idtf.tex」であり、これは Jmol によって自動生成した media9 パッケージ用のソースであった。このままでは pdflatex しか通せないが、以下では platex + dvipdfmx を通るように書き換える実験のため、ひたすら platex を実行してエラーを見ていこう。なおサンプルはすべてここ (GitHub) に置いておく。

先ほど述べたとおり keyval のエラーが出ないことから、media9 パッケージに dvipdfmx オプションを付与するのは問題なさそうだ。ついでに hyperref パッケージにも dvipdfmx オプションを付けて、実験スタート。

1. 「100d-test1.tex

platex を実行すると以下のエラーが出る。

! Undefined control sequence.
<argument> \pdftexversion 
                          <130
l.95 }

つまり \pdftexversion が未定義。この時点で dvipdfmx オプションを認識していないのが分かったが、とりあえず他のエラーを見るために \def\pdftexversion{130} で逃げる。

2. 「100d-test2.tex

すると今度は、各所に pgf なる文字列が出ている最中にエラー。

! Undefined control sequence.
<argument> ...mp_tl {}\ifpgf@sys@pdf@extgs@exists 
                                                  \tl_set:Nn \l_mix_temp_tl ...
l.34         ]{}{100d.u3d}

そうか TikZ のライブラリに依存しているのか、と分かったところで、早速 \usepackage[dvipdfmx]{graphicx} を先に付け足す。

3. 「100d-test3.tex

今度はファイルの一致検査のコマンドでエラー。

! Undefined control sequence.
\mix_filemdfivesum:n #1->\pdfmdfivesum 
                                       file {#1}
l.35         ]{}{100d.u3d}

よく見ると file {#1} で空白が入り込んでしまっている。つまり展開されてしまっているわけで、ZR さんによる以前の TeX Q&A の解答を参考にする。

ここでは movie15 に対して2つの方法が提案されている。

(方法1) hyperref を movie15 より前に読み込む。
(方法2) movie15 よりも前*1に pdftexcmds というパッケージ
  (hyperref の内部で読まれている)を読み込む。

しかし、movie15 を media9 に読み替えて試してみても状況は変わらず、やはりエラー。というわけで、そもそも問題になっているコマンド定義を直接ソースファイルに書き込んでしまおう。つまり

\def\pdfmdfivesum file #1{#1}

を今回は media9 の直前に書き加える。

4. 「100d-test4.tex

今度は成功! 「pdfTeX 以外の各ドライバへの対応が media9 になって統合された」のは確かなようだが、パッケージを読む順番がコマンドの定義を左右するのでとりわけ難しい…とりあえず重要なのは

  • \usepackage[dvipdfmx]{graphicx} は \usepackage[dvipdfmx]{media9} より前*2
  • \def\pdfmdfivesum file #1{#1} は、media9 と hyperref の少なくともいずれか一方より後*3

が必須のようである。

なお、\def\pdftexversion{130} と勝手に定義したのがやや気持ち悪いし、フォールバックにすぎないコマンドをわざわざ書き込むというのも変である…

 

というわけで…めでたしめでたし?

無事 media9 パッケージを platex + dvipdfmx に通す書き方が一つ見つかった。ただ、安心してこの方法を使うことができるかというと若干後味の悪さが残り、やはりトリッキーな気がする。

また、少し古い TeX を使っている場合に media9 が使える保証はないので、その場合の応急処置として movie15_dvipdfmx の存在は頭の片隅に置いておいてよいだろう。

 

追記:本当の「めでたしめでたし」!

ZR さんのコメントを参考に、\documentclass のオプションで dvipdfmx をグローバル指定し、初めに bxexpl3ptex パッケージを読みこめば、media9 を platex + dvipdfmx で使えるようになった*4

\documentclass[...,dvipdfmx]{article}
\usepackage{bxexpl3ptex}% at the beginning of preamble
\usepackage{media9}

サンプルも置いておく*5:100d-test-bxexpl3ptex.tex, 100d-test-bxexpl3ptex.pdf

本質的な問題は LaTeX3 で使われる expl3 のエンジン誤判定であった。ありがとうございました!

*1:編註:こちらでは hyperref は movie15 より後に読み込む前提。

*2:media9 によって TikZ ライブラリが読み込まれるより前に、graphicx に dvipdfmx オプションを渡す必要がある。

*3:これは経験則にすぎない。もう少し詳しく media9 と hyperref の内部処理を(ZR さんのように)詳しく調べたいのだが、今回はパス。

*4:これは最新の W32TeXTeX Live 2014 (MacTeX-2014) で確認。ちなみに、僕が昔使っていた TeX Live 2011 で試そうとしたところ、そもそも media9 が存在しないうえ、expl3 を含む LaTeX3 関連のパッケージが欠落していたため失敗。こういう場合は上に書いたとおり movie15 や movie15_dvipdfmx を用いるとよい。

*5:ちなみに個人的に letter オプションが好きではないので削除した。