dvipdfmx で日本語のしおりをつける

TeX に含まれている hyperref パッケージはリンクつきのリソース (DVI, PS, PDF, etc) などを作るために必要です.

PDF のしおりは非 ASCII 文字を利用する場合には BOM が先頭にある Unicode (UCS-2) で記述する必要がありますが, hyperref パッケージでは文字コードの変換まではサポートしていないので, 結果的にしおりは文字化けをしてしまいます.

最近の dvipdfmx は文字コードの変換をサポートしているので, LaTeX ソース中に命令を記述すればしおりも無事に日本語になります. 次に示すのが LaTeX で記述した文書の例です.

また, hyperref 6.77a (2007 年 10 月 29 日) 版で 重要な仕様変更がありました. 古い TeX パッケージをインストールした場合は \AtBeginShipoutFirst の代わりに \AtBeginDvi を使うことでうまくいくはずです.

とある方からの指摘により, pTeX のバージョンによっては TeX ソースの文字コードによって CMap の指示を変える必要がないということが判明しました. うまくいかない場合は \special 命令における CMap の指示について いろいろ試してみてください.

\documentclass{article}

\usepackage{atbegshi}
%\AtBeginShipoutFirst{\special{pdf:tounicode EUC-UCS2}} % for JIS/EUC-JP
%\AtBeginShipoutFirst{\special{pdf:tounicode 90ms-RKSJ-UCS2}} % for Shift JIS
\AtBeginShipoutFirst{\special{pdf:tounicode UTF8-UTF16}} % for UTF-8
\usepackage[%
dvipdfmx, setpagesize=false,%
bookmarks, bookmarksopen, bookmarksnumbered,%
colorlinks, breaklinks,%
pdfstartview={FitH -32768},%
pdftitle={日本語を含むしおりの作成},%
pdfsubject={dvipdfmx が dvipdfm よりも進んでいるところ},%
pdfauthor={著作 権利者},%
pdfkeywords={dvipdfmx, TeX, pdf, 変換, 日本語, しおり}%
]{hyperref}

\begin{document}
 \section{日本語を含むしおり}
 かつて, {\LaTeX} から PDF に変換するときに,
 しおりに日本語が含まれている場合は,
 out2uni を使う必要があった.
\end{document}

\usepackage コマンドで hyperref を呼び出すときに, いろいろなオプションをつけています. その中で, 文字列を引数にするオプション (先の例では pdfauthor など) を記述するときは, ブレース ({}) でくくるのが無難です. また, 近年の hyperref パッケージでは, setpagesize オプションを false に指定しないと, hyperref パッケージが紙面サイズの定義を中途半端に上書きすることがあり, 組版に悪影響が出ることがあります. デフォルトではなぜか true 指定になっているので, 明示的に指定する必要があります.

Windows 版と Mac 版の Acrobat Reader では, 日本語のしおりをきちんと見ることが出来ますが, Linux 版 (私が確認したのは Vine Linux 2.6 の acroread 5 です) では, しおりの中に含まれる 非 ASCII 文字は表示されないようです.

最新のオリジナルの dvipdfmx には Shift JIS と Unicode の関係を示す CMap ファイルの 90ms-RKSJ-UCS2 が含まれていないようです. 角藤 亮さんが配布している Windows 用 の TeX パッケージには含まれているので, 必要ならばそこからコピーして利用するのがよいでしょう. Windows ネイティブの環境の場合は始めから角藤さんが配布しているパッケージを利用するのが無難です.

例文ファイルを ZIP 形式で圧縮してまとめたものを置いておきます. 内容は, jpdfbook/jpdfbook-{euc,jis,sjis,utf8}.tex, jpdfbook/jpdfbook.tex 及び jpdfbook/pxjahyper.tex の 6 つのファイルです. 最初の 4 つのファイルは, 上記の TeX ソースについて, 文字コードを EUC-JP, ISO-2022-JP (JIS), Shift JIS, UTF-8 にしたものです. また, jpdfbook/jpdfbook.tex は, 文字コードの切り替えをマクロで行ったもの (参考: TeX Wiki), jpdfbook/jpdfbook-pxjahyper.tex は zrbabbler 氏により作成された PXjahyper パッケージを使用したものです.

platex コマンドを何度か繰り返し使うと, 拡張子が .out のファイルが出来るので, それを確認した後にもう一度 platex コマンドをかけた後に, dvipdfmx で DVI ファイルを PDF 形式に変換しましょう.

残念ながら, この方法は万能ではありません. PSTricks などのパッケージを使う場合は, 一度 dvips などで PS 形式にしてから ps2pdf (Ghostscript のツールのひとつ) で PDF に変換する必要があります. この場合は out2uni が必要です. サンプルのプレアンブル中にある \AtBeginShipoutFirst{\special{pdf:tounicode EUC-UCS2}} (あるいは \AtBeginShipoutFirst{\special{pdf:tounicode 90ms-RKSJ-UCS2}})を削除し, hyperref パッケージを呼び出すときの \usepackage のオプションも, dvipdfm の部分を適切なオプションに変更する必要があります.