ページをまたがるリンクに警告

ページをまたがるリンクに警告

- Toshio Otaguro の投稿
返信数: 10
自力で解決できないので,ここに質問します.

長い日本語の文章の中で,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
Toshio Otaguro への返信

Re: ページをまたがるリンクに警告

- aminophen の投稿
> プリアンブルは以下のとおりです.

と書かれましても,再現することができません。

> 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ページめにも
きちんとリンクが貼られました。

質問するときは,ソース全体を載せていただないと,議論が不毛になってしまいます。
aminophen への返信

Re: ページをまたがるリンクに警告

- Toshio Otaguro の投稿
aminphenさん,早速のレスポンスありがとうございます.

確かに,ご提示のソースだと私の環境でも再現しません.しかし,全ソースとなると,200ページ超の分量になりますし,差し障りのある内容も含まれていますので,私の環境で症状が現れる短いソースを準備して,再度提示したいと思います.週末にかけて少々お時間を頂きます.よろしくお願いいたします.
Toshio Otaguro への返信

Re: ページをまたがるリンクに警告

- Toshio Otaguro の投稿

ようやく再現できる短いサンプルを作成できましたので,以下にに示します.

最後の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

Toshio Otaguro への返信

Re: ページをまたがるリンクに警告

- aminophen の投稿
なるほど,「ページをまたいだ文字列」にリンクがあり,かつ脚注にもリンクがあるケースですね。
どうやら hyperref は「複数のリンクのスタック」を想定していないようです。

# 個人的には,これは特に驚くべきことではないと思っています。まあ,
# ごく最近も https://github.com/latex3/latex2e/issues/1 で color パッケージが
# 「複数の色指定スタック」を想定していないことが話題になっていましたが…。

複数のリンクのスタックのようなものが発生する理由は,LaTeX における脚注挿入処理は
本文のページ分割の処理の途中に割り込んでくるからです。そこで本来ならば
「脚注の処理に入る時にそこまでのスタックを一旦抜けて新しいスタックの階層を始め,
脚注の処理を出る時に元のスタックを復旧する」
といった処理があるべきだと思いますが,実際はそうなっていなくて,単に
「リンクが始まった」「リンクが終わった」
だけしか扱えない状態になっています。

ちなみに今回の例だと,脚注内の \href の手前の「おりしも」もリンクが有効になっている
ので,そのことが裏付けられると思います(リンクカラーの青色は付いていませんが)。

解決策は…すぐにはできないですね。
aminophen への返信

Re: ページをまたがるリンクに警告

- 前田 一貴 の投稿
> どうやら hyperref は「複数のリンクのスタック」を想定していないようです。

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 ではだめなようです.
前田 一貴 への返信

Re: ページをまたがるリンクに警告

- aminophen の投稿
前田さんのソース(簡潔なものをありがとうございます)で
\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 への返信

Re: ページをまたがるリンクに警告

- 前田 一貴 の投稿
> pdflatex の場合にも CTAN web: や here! の部分が
> tug.org へのリンクになっています。

本当ですね.

私には hyperref はさっぱりなので,対策はわかる人に丸投げです.
前田 一貴 への返信

Re: ページをまたがるリンクに警告

- 北見 けん の投稿
DVIOUT を愛用しています(ドライバオプションも[dviout])。

aminophenさん仰るテストをやってみたところ、
DVIOUT3.17 では、CTAN web: や here! の部分は除外されて、
CTAN の部分だけにリンクが張られます。
(dviout.def は 2000/5/11、hyperref は 2001/08/19 v6.71 でした)

また、DVIOUTでは color special がページ独立になっていないと警告が出て、
自動修復させると2ページ目の文字列にもリンク色だけは付きます。
自動修復させなければ2ページ目の文字には色も付きません。
(どちらの場合も2ページ目の文字にはリンクは付かず)

動作報告だけですが、何かの参考にでもなれば。
前田 一貴 への返信

Re: ページをまたがるリンクに警告

- Z. R. の投稿

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氏は「ページを跨ぐリンク」の問題は対処不能と考えているように見えます。

Z. R. への返信

Re: ページをまたがるリンクに警告

- Toshio Otaguro の投稿
コメントいただいた皆様,

お返事が遅くなって申し訳ありません.平日は夜しか書き込む時間の余裕がないものですから.

総合して考えると,現状ではうまい解決策は無さそうだということがよくわかりました.

ページをまたぐリンクのうち,ページを跨いだ部分にリンクが張られないのはまだ害が少ないと思うのですが,aminophenさんが示してくれたように,意図しないリンク先にリンクを張られてしまう現象は重大な障害です.私の例では,オルセー美術館に張ったはずのリンクが印象派美術館に張られているので,これは非常にまずいと思います.これから,私のソースを総点検しなければならなくなりました.

結局,hyperrefの現時点での仕様と思って諦めるしか無いようですので,つきあい方を工夫するなど,考えなおしてみたいと思います.

皆様,どうもありがとうございました.