長い日本語の文章の中で,hyperrefパッケージの\hrefマクロを使って日本語の文字列にURLへのリンクを張っています.
ちょっと長めのリンクがたまたまページをまたぐと,dvipdfmxが以下のようなwarningを出し,リンク文字列のうち,改ページ前の文字列には正しくリンクが張られるのですが,改ページ後の文字列にはリンクが張られません.
dvipdfmx:warning: Can't begin an annotation when one is pending.
dvipdfmx:warning: Interpreting special command bann (pdf:) failed.
dvipdfmx:warning: >> at page="187" position="(120.084, 100.742)" (in PDF)
dvipdfmx:warning: >> xxx "pdf:bann<</Type/Annot/Subtype/Link/Border[0 0 0]/C[0 1 1]/A<..."
dvipdfmx:warning: >> Reading special command stopped around >><</Type/Annot/Subtype/Link/Border[0 0 0]/C[0 1 1]/A<</S/URI/...<<
][188
dvipdfmx:warning: Tried to end an annotation without starting one!
dvipdfmx:warning: Interpreting special command eann (pdf:) failed.
dvipdfmx:warning: >> at page="188" position="(103.661, 623.287)" (in PDF)
dvipdfmx:warning: >> xxx "pdf:eann"
これを解決するにはどのようにすればよいでしょうか?なお,リンクを貼る文字列はURLではなく普通の文字列なので,\hrefの代わりに\urlを使うという回避策は取れないと思っています.
なお,hyperrefパッケージのオプションbreaklinksをtrueにしても状況は変わりません.
また,システムはUbuntu上のTeXLive2017で,tlmgrで常に最新版にアップデートしているつもりです.プリアンブルは以下のとおりです.
\documentclass[uplatex,dvipdfmx,ja=standard,b5j,11pt,openany]{bxjsbook}
\usepackage[deluxe]{otf} % for multiple typefaces (see below)
\usepackage[sourcehan-otc,unicode]{pxchfon}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{lmodern}
\usepackage{ascmac}
\usepackage{mflogo}
\usepackage{makeidx}
\usepackage[dvipdfmx, colorlinks=true, bookmarks=true, bookmarksnumbered=true, %
bookmarkstype=toc, filecolor=blue, urlcolor=blue, linkcolor=blue, %
linktocpage=true, citecolor=red, menucolor=black, %
pdfnewwindow=true, breaklinks=false]{hyperref}
\usepackage{pxjahyper} % not necessary for most cases
\renewcommand{\footnotesize}{\fontsize{9pt}{11pt}\selectfont}
\makeatletter
\ifcase \@ptsize
\setlength{\footnotesep}{9pt}
\or
\setlength{\footnotesep}{10pt}
\or
\setlength{\footnotesep}{11pt}
\fi
\makeatother
と書かれましても,再現することができません。
> URLではなく普通の文字列
というのもよく理解できません。
試しに Toshio Otaguro さんのプリアンブルの後に(この例では適当な URL を使っています)
\begin{document}
\def\JA{これは日本語の文です。これは日本語の文です。これは日本語の文です。}
\def\JAJA{\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA\JA}
\href{https://texjp.org}{\JAJA\JAJA}
\end{document}
を足して uplatex と dvipdfmx でコンパイルしてみましたが,2ページめにも
きちんとリンクが貼られました。
質問するときは,ソース全体を載せていただないと,議論が不毛になってしまいます。
ようやく再現できる短いサンプルを作成できましたので,以下にに示します.
最後のJeu de Paumeにリンクを張っていますが,ページを跨いだ部分にはリンクが張られません.dvipdfmxのwarningを下にコピーします.
----------
\documentclass[uplatex,dvipdfmx,ja=standard,b5j,11pt,openany]{bxjsbook}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{lmodern}
\usepackage{ascmac}
\usepackage{mflogo}
\usepackage{makeidx}
\usepackage[dvipdfmx, colorlinks=true, bookmarks=true, bookmarksnumbered=true, %
bookmarkstype=toc, filecolor=blue, urlcolor=blue, linkcolor=blue, %
linktocpage=true, citecolor=red, menucolor=black, %
pdfnewwindow=true, breaklinks=false]{hyperref} % for screen view
\usepackage{pxjahyper} % not necessary for most cases
\renewcommand{\footnotesize}{\fontsize{9pt}{11pt}\selectfont}
\makeatletter
\ifcase \@ptsize
\setlength{\footnotesep}{9pt}
\or
\setlength{\footnotesep}{10pt}
\or
\setlength{\footnotesep}{11pt}
\fi
\makeatother
\begin{document}
\subsubsection{美術館めぐり}
ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ 閉館前\footnote{おりしも\href{https://ja.wikipedia.org/wiki/\%E3\%82\%AA\%E3\%83\%AB\%E3\%82\%BB\%E3\%83\%BC\%E7\%BE\%8E\%E8\%A1\%93\%E9\%A4\%A8}{オルセー美術館}\index{オルセーびじゅつかん@オルセー美術館}が開館準備中で,印象派美術館の作品はすべてそちらに移管されるべく,この美術館はいったん閉館されることになっていたのです.私は余裕を持ってXXXX年X月に観に行きましたが,後に同じ作品群を開館直後のオルセー美術館で観ることになります.}の旧\href{https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A5%E3%83%BB%E3%83%89%E3%83%BB%E3%83%9D%E3%83%BC%E3%83%A0%E5%9B%BD%E7%AB%8B%E7%BE%8E%E8%A1%93%E9%A4%A8}{印象派美術館}\index{いんしょうはびじゅつかん@印象派美術館}(\href{https://fr.wikipedia.org/wiki/Jeu_de_Paume_(centre_d%27art)}{Jeu de Paume}\index{Jeu de Paume})へ行ったのが良い思い出です.
\end{document}
----------
Link_over_pages.dvi -> Link_over_pages.pdf
[1
dvipdfmx:warning: Can't begin an annotation when one is pending.
dvipdfmx:warning: Interpreting special command bann (pdf:) failed.
dvipdfmx:warning: >> at page="1" position="(120.084, 100.742)" (in PDF)
dvipdfmx:warning: >> xxx "pdf:bann<</Type/Annot/Subtype/Link/Border[0 0 0]/C[0 1 1]/A<..."
dvipdfmx:warning: >> Reading special command stopped around >><</Type/Annot/Subtype/Link/Border[0 0 0]/C[0 1 1]/A<</S/URI/...<<
][2
dvipdfmx:warning: Tried to end an annotation without starting one!
dvipdfmx:warning: Interpreting special command eann (pdf:) failed.
dvipdfmx:warning: >> at page="2" position="(88.7787, 623.287)" (in PDF)
dvipdfmx:warning: >> xxx "pdf:eann"
]
32401 bytes written
どうやら hyperref は「複数のリンクのスタック」を想定していないようです。
# 個人的には,これは特に驚くべきことではないと思っています。まあ,
# ごく最近も https://github.com/latex3/latex2e/issues/1 で color パッケージが
# 「複数の色指定スタック」を想定していないことが話題になっていましたが…。
複数のリンクのスタックのようなものが発生する理由は,LaTeX における脚注挿入処理は
本文のページ分割の処理の途中に割り込んでくるからです。そこで本来ならば
「脚注の処理に入る時にそこまでのスタックを一旦抜けて新しいスタックの階層を始め,
脚注の処理を出る時に元のスタックを復旧する」
といった処理があるべきだと思いますが,実際はそうなっていなくて,単に
「リンクが始まった」「リンクが終わった」
だけしか扱えない状態になっています。
ちなみに今回の例だと,脚注内の \href の手前の「おりしも」もリンクが有効になっている
ので,そのことが裏付けられると思います(リンクカラーの青色は付いていませんが)。
解決策は…すぐにはできないですね。
hyperref というよりは,dvipdfmx か hdvipdfm.def ではと思います.
\documentclass{article}
%% \documentclass[dvipdfmx]{article}
\usepackage[colorlinks=true]{hyperref}
\begin{document}
\footnote{\href{https://ctan.org/}{CTAN}}
\vspace*{42\baselineskip}
\href{https://tug.org/}{TUG TUG TUG TUG TUG TUG TUG TUG TUG TUG TUG TUG TUG TUG TUG TUG}
\end{document}
を試すと,pdflatex, lualatex は正常で,(u)platex + dvipdfmx と xelatex ではだめなようです.
\footnote{\href{https://ctan.org/}{CTAN}}
を
\footnote{CTAN web: \href{https://ctan.org/}{CTAN} here!}
に置換すると,pdflatex の場合にも CTAN web: や here! の部分が
tug.org へのリンクになっています。
したがって,私は「少なくとも hyperref 自体には問題がある」という意見です。
(dvipdfmx や hdvipdfm.def についてはまだよくわかっていません。)
aminophenさん仰るテストをやってみたところ、
DVIOUT3.17 では、CTAN web: や here! の部分は除外されて、
CTAN の部分だけにリンクが張られます。
(dviout.def は 2000/5/11、hyperref は 2001/08/19 v6.71 でした)
また、DVIOUTでは color special がページ独立になっていないと警告が出て、
自動修復させると2ページ目の文字列にもリンク色だけは付きます。
自動修復させなければ2ページ目の文字には色も付きません。
(どちらの場合も2ページ目の文字にはリンクは付かず)
動作報告だけですが、何かの参考にでもなれば。
hyperrefの“補助マニュアル”(doc/latex/hyperref/README)にこの件に関する情報がありました。
7 LIMITATIONS ============= Wrapped/broken link support --------------------------- Only few drivers support automatically wrapped/broken links, e.g. pdftex, dvipdfm, hypertex. Other drivers lack this feature, e.g. dvips, dvipsone. Workarounds: ……(略)…… Links across pages ------------------ In general they have problems: * Some driver doesn't support them at all (see above). * The driver allows it, but the link result might include the footer and/or header, or an error message can occur sometimes.
察するに、Oberdiek氏は「ページを跨ぐリンク」の問題は対処不能と考えているように見えます。
お返事が遅くなって申し訳ありません.平日は夜しか書き込む時間の余裕がないものですから.
総合して考えると,現状ではうまい解決策は無さそうだということがよくわかりました.
ページをまたぐリンクのうち,ページを跨いだ部分にリンクが張られないのはまだ害が少ないと思うのですが,aminophenさんが示してくれたように,意図しないリンク先にリンクを張られてしまう現象は重大な障害です.私の例では,オルセー美術館に張ったはずのリンクが印象派美術館に張られているので,これは非常にまずいと思います.これから,私のソースを総点検しなければならなくなりました.
結局,hyperrefの現時点での仕様と思って諦めるしか無いようですので,つきあい方を工夫するなど,考えなおしてみたいと思います.
皆様,どうもありがとうございました.