pTeXで縦書きモード時にハイパーリンクを埋め込む方法のメモ

TeXハイパーリンクを埋め込んだり、PDF内での参照をクリックでジャンプできるようにしたりするためにはhyperrefが標準的に使われております。hyperref便利なんですがpTeXの縦書きモードには対応していなかったようで、リンクの部分のテキストが和文のとき英文と同じように右に90°回転してしまいます。


2日がかりでやっと埋め込める様になったのでメモしておく

プリアンブルでの正しいhyperrefの埋め込み方

TeX Wikiのhyperrefのページには、

例えば,下記のようにします.

\usepackage[dvipdfmx,%
 bookmarks=true,%
 bookmarksnumbered=true,%
 colorlinks=true,%
 pdftitle={LaTeX研修課程},%
 pdfauthor={ななしのごんべぇ},%
 pdfsubject={hyperref入門・演習},%
 pdfkeywords={TeX; dvipdfmx; hyperref; color;}]{hyperref}

または, \hypersetup{オプション} を使用して

\usepackage[dvipdfmx]{hyperref}
\hypersetup{%
 bookmarks=true,%
 bookmarksnumbered=true,%
 colorlinks=true,%
 pdftitle={LaTeX研修課程},%
 pdfauthor={ななしのごんべぇ},%
 pdfsubject={hyperref入門・演習},%
 pdfkeywords={TeX; dvipdfmx; hyperref; color;}}

と書いてありますがこれでは動きません


まず下のような\hypersetupは使わないようにして上のやり方で描くようにしましょう。\hypersetupを使うと謎の警告やエラーがでて悩まされました。


次に
\usepackage[dvipdfmx,...
ではなく
\usepackage[dvipdfm,...
の方がいいと思います。というか私の環境だとdvipdfmx指定はエラーがでました。

hyperrefでリンクを貼る

pTeXでも横書きなら

\href{http://d.hatena.ne.jp}{yayuguのにっき}

のようにしてリンクが貼れます。簡単です。


しかし縦書きだと「のにっき」まで文字が回転してしまう。


拙作のparseDVIを使って解析してみたらこんな感じになっていた。

dir yoko
xxx pdf:bann << /Type /Annot /Subtype /Link /Border [0 0 0] /C [0 1 1] /A << /S /URI /URI (http://d.hatena.ne.jp/yayugu) >> >>
xxx color push cmyk 0 1 0 0
fnt_def brsgnmlminr-h 10.58441162109375
fnt brsgnmlminr-h 10.58441162109375
set yayuguのにっき
xxx color pop
xxx pdf:eann

あらら。縦書きしたいのにばっちりdir=yoko指定されちゃってますね。あらら

boxでなんとかならないかな

hboxとかを適当にかませばなんとかならないかなーと

\href{http://d.hatena.ne.jp}{yayugu\hbox{のにっき}}

みたいにしたらPDF出力に「yayugu\hbox{のにっき}」がそのままでちゃいましたorz
\hrefの引数のなかだとバックスラッシュがエスケープされちゃうみたいです。

\specialを使ってdvipdfmx向けの命令を直接書く

そういえばさっきparseDVIでdvipdfmx向けにどういう命令を送ったかみたよね。あれを真似すればいいんじゃね? と思いやってみました。

\special{pdf:bann << /Subtype /Link /Border [0 0 0] /C [0 1 1] /A << /S /URI /URI (http://d.hatena.ne.jp) >> >>}%
yayuguのにっき%
\special{pdf:eann}

やった!うまくいった!

エスケープ……エスケープ…

TeXで特別な意味を持つ記号を含むURLだと上手くうごきません。
たとえば、

\special{pdf:bann << /Subtype /Link /Border [0 0 0] /C [0 1 1] /A << /S /URI /URI (http://twitter.com/_ko1) >> >>}%
@\_ko1さんいわく%
\special{pdf:eann}

こんなのとか。


%とかなら\%にするだけでうまくいくんですが、_(アンダースコア、アンダーバー)はまったくうまくいかない。
parseDVIしてみたところ\_は特別な命令に置換されてしまうようで、文字コードとしての_にはならない。代わりに\charとかを使ってみようとおもったんですが、\special内だとなぜか動かない。


TeXしねばいいのに

\catcodeで局所的に_とかを普通の文字列としてあつかう

_とかがTeX的に特別な記号だからいけないわけで、ふつうの文字として扱ってしまえばいいんです。

\begingroup
\catcode`\_=11
\catcode`\%=11
\catcode`\#=11
\catcode`\$=11
\catcode`\&=11
\special{pdf:bann << /Subtype /Link /Border [0 0 0] /C [0 1 1] /A << /S /URI /URI (http://twitter.com/_ko1) >> >>}\endgroup @\_ko1さんいわく \special{pdf:eann}

こういうふうに書くと\begingroup〜\endgroupの内側で_, %, #, $, &が普通の文字として扱われるのでエスケープは不要に!やった!


ただし、%をコメントとして使うこともできないので%を使った改行テクニックもつかえなくなり、可読性は大幅の落ちます。


\begingroup〜\endgroupと\special{pdf:bann...〜\special{pdf:eann}が入れ子になっていなくてすごくきもちわるい

色を付けて完成!

リンクなら色つけたいですよね。これも\special命令使います。

\begingroup
\catcode`\_=11
\catcode`\%=11
\catcode`\#=11
\catcode`\$=11
\catcode`\&=11
\special{pdf:bann << /Subtype /Link /Border [0 0 0] /C [0 1 1] /A << /S /URI /URI (http://twitter.com/_ko1) >> >>}\endgroup \special{color push cmyk 0.75 0.75 0 0.44} @\_ko1さんいわく \special{color pop} \special{pdf:eann}

まとめ

  • hyperrefは便利
  • hyperrefはpTeXの縦書きには対応していない。あきらめよう