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

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

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

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

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

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

\documentclass{article}

\usepackage{atbegshi}
%\AtBeginShipoutFirst{\special{pdf:tounicode EUC-UCS2}} % for JIS/EUC-JP
\AtBeginShipoutFirst{\special{pdf:tounicode 90ms-RKSJ-UCS2}} % for Shift JIS
\usepackage[%
dvipdfm, 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 など) を記述するときは, ブレース ({}) でくくるのが無難です.

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}.tex の 3 つのファイルです. それぞれの文字コードが EUC-JP, ISO-2022-JP (JIS), Shift JIS になっています. 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 の部分を適切なオプションに変更する必要があります.