マクロツイーター

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

新しい 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 に組み込むことにした。

新版の 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 情報に異常が生じていないかをよく確認してほしい。

*1:☃とポーランド語の両方を UTF-8 で直接入力できるようにするのは少し面倒であるが。

*2:LuaTeX の場合、非 ASCII 文字を PDF 文字列として直接書き出すと UTF-8 になる。しかし PDF の仕様としては UTF-16BE で書き出す必要があるため、あらかじめ符号化方式の変換を行ってから書き出す必要があるのである。

*3:pdfTeX エンジンと判定されて「文字は ASCII の範囲しかない」という前提で処理されるため。