新しい pxjahyper でもっと日本語 PDF 情報する話
pxjahyper で日本語 PDF 情報する話
upLaTeX + dvipdfmx の組合せの上で hyperref を利用して文書情報を含めた PDF 文書を作成する際には、pxjahyper パッケージを併用すると、文書情報の文字列に日本語を含めることができる。もちろん、日本語だけでなく、☃やポーランド語を含めることも可能である。*1
% upLaTeX文書, UTF-8 \documentclass[uplatex,dvipdfmx,a4paper]{jsarticle} % Unicode欧文したい \usepackage[utf8]{inputenc} \usepackage[prefernoncjk]{pxcjkcat} \cjkcategory{sym19}{cjk}% ☃は和文 \usepackage[T1]{fontenc} \usepackage{lmodern} % hyperref設定 \usepackage[colorlinks,pdfusetitle]{hyperref} \usepackage{pxjahyper}% 日本語したい! % 文書情報 \hypersetup{% \title,\author の内容を利用 pdfsubject={ゆきだるま☃}, pdfkeywords={ゆきだるま,☃,ナントカ,bałwan}} \title{ゆきだるま☃文書} \author{ゆきだるま☃芸人} \date{きょう} % ページ番号設定(後述) %\renewcommand{\thepage}{☃\arabic{page}} \begin{document} \maketitle \section{ゆきだるま☃作ろう} % 略 \section{Ulepimy bałwana☃!} % 略 \end{document}
pxjahyper で日本語 PDF 情報できない話
ところが pxjahyper にも弱点がある。pxjahyper を使っても「ページ番号」は日本語(や☃)にできないのである。例えば、先の例で \thepage
を再定義して「ページ番号を☃付にする」処理(コメントアウトされている)を有効にしてみる。
% ページ番号設定(☃1、☃2、……にする) \renewcommand{\thepage}{☃\arabic{page}}
これで版面ではページ番号は「☃1」となるが、その一方、PDF 情報のページ番号では☃が文字化けするという極めて残念な結果になる。
pxjahyper は dvipdfmx の機能を利用して非 ASCII 文字(upLaTeX の場合は Unicode 文字)を通しているのであるが、残念ながらこの調整機能の対象にページ番号は含まれていない。dvipdfmx 側に原因があるため pxjahyper では対処できないのである。
pxjahyper でないやつで日本語 PDF 情報できる話
ところで、この「PDF のページ番号に日本語(や☃)」であるが、実は、(u)pLaTeX 以外のエンジンでは何の問題もなく実現できる。
% LuaLaTeX文書, UTF-8 \documentclass[a4paper]{ltjsarticle} % hyperref設定 (当然pxjahyperは無し) \usepackage[unicode,colorlinks,pdfusetitle]{hyperref} % 文書情報 \hypersetup{% \title,\author の内容を利用 pdfsubject={ゆきだるま☃}, pdfkeywords={ゆきだるま,☃,ナントカ,bałwan}} \title{ゆきだるま☃文書} \author{ゆきだるま☃芸人} \date{きょう} % ページ番号設定 \renewcommand{\thepage}{☃\arabic{page}} \begin{document} \maketitle \section{ゆきだるま☃作ろう} \section{Ulepimy bałwana☃!} \end{document}
ここで、hyperref パッケージに unicode
オプションを付けていることがポイントで、この場合、hyperref パッケージが PDF 情報の中にある Unicode 文字を適切に取り扱ってくれる。(エンジン自体には自動的に対処する機能が無い。*2)そもそも PDF 情報の文字列を設定しているのが hyperref であるため、ページ番号の部分も適切に書き出されるのである。
ところが、残念なことにこの unicode
オプションは (u)pLaTeX には対応しておらず、*3仮に無理に指定したとしても文字化けした出力になってしまう。(従って、通常は (u)pLaTeX では hyperref の unicode
オプションは指定してはいけないとされている。)つまり、(u)pLaTeX ではページ番号を日本語(や☃)にする手段が無い。
pxjahyper でもっと日本語 PDF 情報できるかも知れない話
何とかならないかと思って、試しに hyperref のコードを改変して「upLaTeX の場合に LuaLaTeX/XeLaTeX と同じ初期化処理をする」ようにしてみた。すると何とそれだけで、ページ番号を含めて全ての PDF 文字列の取扱が正常になるという結果になった。
折角なので、これを試験的機能として pxjahyper に組み込むことにした。
- Package pxjahyper(CTAN) 0.3a版。
新版の pxjahyper では、
- エンジンが upLaTeX であり
- かつ、hyperref の方に
unicode
オプションが指定されている
に、hyperref について「LuaLaTeX/XeLaTeX と同じ初期化処理をした」上で unicode
処理を有効化する。(従来は unicode
が指定された状態で pxjahyper を読みこんだ場合はエラーになっていた。pLaTeX については未対応なので従来通りエラーとなる。)
unicode
対応を有効にした場合、PDF 情報のページ番号で日本語やポーランド語や☃が扱えるだけなく、素の(unicode
無効の)pxjahyper では上手くいかなかったロシア語も扱えるようになる。スバラシイ。
% upLaTeX文書, UTF-8 \documentclass[uplatex,dvipdfmx,a4paper]{jsarticle} % Unicode欧文したい \usepackage[utf8]{inputenc} \usepackage[prefernoncjk]{pxcjkcat} \cjkcategory{sym19}{cjk}% ☃は和文 \usepackage[T2A,T1]{fontenc} \usepackage{tempora} % hyperref設定 \usepackage[unicode,colorlinks,pdfusetitle]{hyperref} \usepackage{pxjahyper}% 日本語したい! % 文書情報 \hypersetup{% \title,\author の内容を利用 pdfsubject={ゆきだるま☃}, pdfkeywords={ゆきだるま,☃,ナントカ,bałwan,снеговик}} \title{ゆきだるま☃文書} \author{ゆきだるま☃芸人} \date{きょう} % ページ番号設定 \renewcommand{\thepage}{☃\arabic{page}} \begin{document} \maketitle \section{ゆきだるま☃作ろう} \section{Ulepimy bałwana☃!} % ロシア語したい \renewcommand{\encodingdefault}{T2A}\normalfont \section{Делаем снеговика☃!} \end{document}
というわけで、☃なページ番号やロシア語をどうしても使いたい人は、この unicode
対応を試してみればよいであろう。ただ、この状態で全ての hyperref の機能が正常に動作することを確認したわけではないので、この機能を使う場合は PDF 情報に異常が生じていないかをよく確認してほしい。