dvipdfmx / xdvipdfmx : \special{pdf:dest ...} で使える文字列

Re: dvipdfmx / xdvipdfmx : \special{pdf:dest ...} で使える文字列

- Z. R. の投稿
返信数: 2

こちらでも検証してみました。

[テスト用文書ソース]
%\special{pdf:tounicode UTF8-UTF16}% ToUnicode 有無を切り替える
Here's the
\special{pdf:dest <E29883> [@thispage /XYZ @xpos @ypos null]}%
SNOWMAN (UTF-8).
\bigskip
Here's the
\special{pdf:dest <FEFF3020> [@thispage /XYZ @xpos @ypos null]}%
POSTAL-FACE (UTF-16).

\special{pdf:docview << /PageMode /UseOutlines >>}
\special{pdf:outline [-] 1 % SNOWMAN, UTF-8
  << /Title <E29883> /A << /S /GoTo /D <E29883> >> >>}
\special{pdf:outline [-] 1 % SNOWMAN, UTF-16
  << /Title <FEFF2603> /A << /S /GoTo /D <FEFF2603> >> >>}
\special{pdf:outline [-] 1 % POSTAL-FACE, UTF-8
  << /Title <E380A0> /A << /S /GoTo /D <E380A0> >> >>}
\special{pdf:outline [-] 1 % POSTAL-FACE, UTF-16
  << /Title <FEFF3020> /A << /S /GoTo /D <FEFF3020> >> >>}
\bye
結果:
リンク元 リンク先
dvi
ToUni有

旧xdv
ToUni無

旧xdv
ToUni有

新xdv
ToUni無

新xdv
ToUni有
UTF-8 UTF-8 × ×
UTF-16 UTF-8 × × ×
UTF-8 UTF-16 × × ×
UTF-16 UTF-16
dvi: uptex + dvipdfmx
旧xdv: xetex + xdvipdfmx(TeX Live 最新)
新xdv: xetex + xdvipdfmx(W32TeX 最新)

修正の目的は、「①と⑤を同じにすること」であり、確かにそれは実現できています。しかし、(少なくとも自分の感覚としては)XeTeX では ToUnicode を指定することは一般的でなく、②と④(そしてその中でも最初のパターン「UTF-8・UTF-8」)が“最も自然な使い方”でしょう。その観点から見ると、残念ながら劣化していることになります。

Z. R. への返信

Re: dvipdfmx / xdvipdfmx : \special{pdf:dest ...} で使える文字列

- Z. R. の投稿

今自分が理解している範囲で要点をまとめると、以下のようになります。

  • 今の問題である「pdf:destのラベル」は単なる符牒でありUIに表示されるものではないので、“同じバイト列”であればよい。
    (※UIに表示する文字列はUTF-16(かPDFDocEncoding)でないとダメ。)
  • “リンク元のラベル”(つまりpdf:outのリンク先情報に含まれるラベル)は:
    • ToUnicode指定での変換対象にはならない。
    • ToUnicode無しxdvipdfmxでの変換対象にはなる。つまり元がUTF-8ならUTF-16に変換される。
    この違いの原因は、前者は後者と違って「キー名」を判定対象に入れているから。
  • これに合わせて“リンク先のラベル”(つまりpdf:destのラベル)の変換を決めるとすると、以下の処理が望ましいことになる:
    (※ちなみに、ソースコードの構造上、逆に(outlineをdestに)合わせるのは面倒)
    • ToUnicode指定の場合(①③⑤)は変換しない。
    • ToUnicode無しxdvipdfmxの場合(②④)は「元がUTF-8であればUTF-16に変換する」。
Z. R. への返信

Re: dvipdfmx / xdvipdfmx : \special{pdf:dest ...} で使える文字列

- TrueRoad の投稿
Z.R.さん

詳細な調査とご説明いただきありがとうございます。
tounicode有無で変換対象が異なるというのは、考え付きませんでした。

たしかに、pdf:out で /D に指定した文字列が見つからないときの警告と思われる、

xdvipdfmx:warning: PDF destination "日本語" not defined.

等は、tounicode が有効のときは UTF-8 で出力され、無効の時は UFF-16 で出力しようとしているようでしたので、tounicode があるときは、逆変換でもしているのかと思ってしまいましたが、そもそも変換していない、んですね。

今回の TeX Live SVN r39753 の変更で、お示しいただいた例ですと tounicode 有無いずれも、リンク元先それぞれの文字コードが一致している場合はジャンプできるようになりましたので、とりあえずの解決にはなっているかと思います。

#不一致の場合はジャンプできないようですが。。。
#お示しいただいているロジックは②のように不一致の場合でもジャンプできるようにする想定なのかな、と思いますが。。。