マクロツイーター

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

Beamer は dvipdfmx をサポートするか否か? (3)

前回の続き)

ナビゲーションシンボルが働かない問題についての補足。

アレが働かない理由

Beamer のナビゲーションシンボルが機能しないのは「Beamer と dvipdfmx の実装の相性が悪い」からと CHoF 氏が述べているという話は、このシリーズの 1 回目で紹介した。

上述のコードは、2 つの special 命令 “pdf:bann”(前)と“pdf:eann”(後)に囲まれた空の箱を出力する。不幸なことに、DVIPDFM も DVIPDFMx も箱が空の場合はアノテーションを構築しないのである。この場合は代わりに別の special 命令 “pdf:ann”を用いる必要がある。

つまりリンクが生成されのは、リンクを表す部分のテキストが空だからという訳である。これは Beamer に限った話でなく次のような hyperref 使用の文書でも同じ現象が起こる。(前述通り、Beamer は単に hyperref の \hyperlink 命令を実行しているだけである。)

\documentclass[a4paper,dvipdfmx]{article}
\usepackage{hyperref}
\begin{document}
\def\BOX{\vrule width0.5em height1.5ex depth0pt\relax} % 罫の箱
Here症候群の説明はこちらをクリック→
\hyperlink{here}{\hbox{here}}\par
Here症候群の説明はこちらをクリック→
\hyperlink{here}{\hbox{\kern20pt}}\par
Here症候群の説明はこちらをクリック→
\hyperlink{here}{\hbox{\BOX\kern20pt\BOX}}\par
Here症候群の説明はこちらをクリック→
\hyperlink{here}{\hbox{\BOX.\kern20pt\BOX}}\par
\newpage % \hypertarget がリンク先になる
\hypertarget{here}{}その理想は真ですか?
\end{document}

組版結果は以下の通り。赤い枠の箇所がリンクになっている。

これを見ると、\hyperref の引数に相当する領域にあるテキスト(のみ)の全てを収める最小の矩形領域に実際にリンクが設定されることが判る(罫は無視される)。もしテキストが全くなければ結果的にリンクは生成されない。ちなみに、pdfTeX では \hyperref の引数の領域全体にリンクが設定されるため「リンクが消えてしまう」という問題は起こらない。

本来どうあるべきなのか?

この動作は ChoF 氏がそう言っている以上(バグでなく)仕様であることは間違いないが、不都合に感じる人も多いであろう。ただ、一旦 DVI 上の special 命令に変換するという機構のため、「空だとリンクが消える」問題に完全に対応するのは難しい(罫やその他の PDF 描画を考慮するように修正することは可能だろう)。空の箱はたとえ大きさがあっても DVI には何も出力されないからである。例えば次のようなソースの場合、

\hyperlink{here}{\vbox to 10pt{}\kern 20pt} % 指定した領域は (10pt+0pt)x20pt

結果の DVI は次のようになる。

xxx 'pdf:bann<</Type/Annot/Subtype/Link......>>'
right3 1310720
xxx 'pdf:eann'

2 つの special の間に高さ 10pt の箱があったという情報は失われている。なので、設定すべきリンクの大きさがもはや解らなくなっている。

実際にはこの問題に対応する手段を用意していて、それは「大きさを明示的に指定してアノテーションを作成する」というものである。すなわち上の DVI コードの代わりに次のようにすると、所望の「高さ 10pt、幅 20pt の領域」にリンクが作られることになる。

xxx 'pdf:ann width 20pt height 10pt depth 0pt<</Type/Annot/Subtype/Link......>>'
right3 1310720

すなわち、hyperref のドライバがこちらの方式の special 命令を利用するように修正されれば、前掲の文書のリンクも機能する*1し、また Beamer のナビゲーションシンボルも機能するようになるだろう。ただ、この修正を行うとそれまでの hyperref の動作が変わることになるのでその影響も考慮する必要がある。

bxdpx-beamer パッケージの解決法

bxdpx-beamer パッケージではもっとアドホックな解説方法を用いている。要するに、「文字」があればリンクが作られるわけなので、\hyperlink の引数に「見えない文字」を入れておけば良い訳である。そこで、以前に紹介した「欧文ゴースト」の文字を出力している。

この方法の欠点は、特定のフォントの存在に依存してしまうことである。*2実際には(Beamer が動くような十分に新しいシステムでは)ほぼ確実に存在すると思われる LM Roman(ec-lmr10)を使っているので問題にならない*3と思う。また PDF にそのフォントが埋め込まれるという点にも注意した方がいいかも知れない。

なお、Beamer に既に組み込まれている XeTeX 用対策コードでは、「字形のない文字」を使う代わりに、「色を透明にして(現在のフォントで)〈.〉を出力する」という方法を使っている。最初に試したときに dvipdfmx で異常動作したのでこの方法から離れたのであるが、もう少し検討した方がよいかも知れない。

もう一つの働かないリンク

なお、「リンク領域が空であるせいでリンク働かない」事例として、ナビゲーションシンボルの他に、「フレームズーム機能(\framezoom)のリンク」があることが判明している。こちらは XeTeX でも機能しない。新版の bxdpx-beamer パッケージでこの問題にも対策したので、それを使えば dvipdfmx と XeTeX の両方でフレームズームのリンクが正しく機能するようになる。詳細は以下の情報を参照されたい。

*1:ただし 2 番目のリンクのように大きさがそもそもゼロである場合は上手くいかないだろう。

*2:「ゴーストの文字」が利用できるフォントであれば何でもいいのだが、とにかく何かに決めなければならない。

*3:なお、万が一このフォントが無い場合は、何もせずに警告を出す。(つまりナビゲーションシンボルは機能しないまま。)