マクロツイーター

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

dvipdfmx の tounicode で ToUnicode されるのはどれか

dvipdfmx の pdf:docinfo special 命令を使って文書情報を PDF に書き出す時に、pdf:tounicode 命令で ToUnicode CMap を指定しておくと、タイトル等の文字列情報に文字コード変換*1が適用されて正常に出力される。のであるが、この文字コード変換は「どの文字列」に適用されるのであろうか。

気になったのでチョット調べてみた。

[test.tex]
% plain upTeX 文書, 文字コードUTF-8
Hello!
% ToUnicode を指定
\special{pdf:tounicode UTF8-UTF16}
% 文書情報辞書にエントリを追加
\special{pdf:docinfo <<
  /Title (☃)
  % '☃'(U+2603) は UTF-8 では 
  /Author 
  /Snowman (☃)
>>}
% ページオブジェクトの辞書にエントリを追加
\special{pdf:put @thispage <<
  /CropBox [10 10 90 90]
  /Snowman (☃)
>>}
\bye

これを以下のコマンドで PDF に変換する。

uptex test
dvipdfmx -V 4 -z 0 test

結果の PDF の中の文書情報辞書は以下のようになった。*2

2 0 obj
<<
  /Creator( TeX output 2015.11.28:2059)
  /Title<feff2603>   % UTF-16 に直された
  /Author<feff2603>  % UTF-16 に直された
  /Snowman<e29883>   % UTF-8 のまま
  /Producer(dvipdfmx \(20150315\))
  /CreationDate(D:20151128205950+09'00')
>>
endobj

先頭ページのオブジェクトは以下の通り。

3 0 obj
<<
  /CropBox[10 10 90 90]
  /Snowman<e29883>  % UTF-8 のまま
  /Resources 6 0 R
  /Type/Page
  /Parent 7 0 R
  /Contents[5 0 R]
>>
endobj

これを見ると、やはり pdf:docinfo における /Title や /Author のように、「必要な特定の箇所」だけが文字コード変換の対象となっているようである。

ちなみに、文書情報辞書への書込は、専用の pdf:docinfo 命令を用いて

pdf:docinfo << ... >>

とする代わりに、一般的な pdf:put 命令を用いて

pdf:put @docinfo << ... >>

でも可能であるが、この場合は pdf:tounicode による文字コード変換が一切適用されなくなるようである。

*1:具体的には、(u)pTeX の内部漢字コードから UTF-16 へと変換される。

*2:適当に改行とコメントを入れて示す。以下同様。