ページの下部でファントムセクションが発生しないようにする

ページの下部でファントムセクションが発生しないようにする

私の文書には、ページをまたいで分割できないボックスがあり、そのため前のページに空白が残ることがよくあります。\phantomsectionこれらのボックスの前に を作成すると、\phantomsection/\labelは新しいページの先頭に配置されず、最初のページに残ります。これを 2 ページ目に配置するにはどうすればよいですか?

\documentclass{article}
\usepackage{lipsum,hyperref}
\begin{document}
\hyperref[target]{My link}
\lipsum[1-4]
\phantomsection\label{target} % this stays on page 1
\vbox{\lipsum[1]}
\end{document}

答え1

ページ区切りが発生する原因は、\labelアンカーとボックスの間に何らかのものを挿入するコマンドです。

次の例をコンパイルすると

\documentclass{article}
\usepackage{hyperref}
\begin{document}
\hyperref[target]{My link}   

\phantomsection\label{target}\nopagebreak% this stays on page 1
\vbox{bbb}
\showoutput
\end{document}

ログファイルの関連部分は

....\pdfdest name{section*.1} xyz
....\penalty 10000
....\write1{\newlabel{target}{{}{\thepage }{}{section*.1}{}}}
....\penalty 10000
....\glue(\baselineskip) 3.11111
....\vbox(6.94444+0.0)x345.0

グルーの前に無限ペナルティが追加されていることがわかります (これはおそらく から来ます\lineskipが、これは無関係です)。そのため、このグルーをページ区切りポイントとして使用することが禁止されます。

を削除すると\nopagebreak

....\penalty 10000
....\write1{\newlabel{target}{{}{\thepage }{}{section*.1}{}}}
....\glue(\baselineskip) 3.11111
....\vbox(6.94444+0.0)x345.0

何とか(\write1)は捨てられないアイテムなので、接着剤できるページ区切りポイントとして使用されます。

それで

\phantomsection\label{target}\nopagebreak

すべきです。

答え2

\documentclass{article}
\usepackage{lipsum,hyperref}
\begin{document}
\hyperref[target]{My link}
\lipsum[1-4]
\filbreak\phantomsection\label{target}\nopagebreak % 
\vbox{\lipsum[1]}
\end{document}

答え3

\phantomsectionそれを避けるために箱の中に入れておくことができます。

\vbox{\phantomsection\label{target}\lipsum[1]}

の代わりに

\phantomsection\label{target}
\vbox{\lipsum[1]}

ムウェ

\documentclass{article}
\usepackage{lipsum,hyperref}
\begin{document}
\hyperref[target]{My link}
\lipsum[1-4]
\vbox{\phantomsection\label{target}\lipsum[1]}
\end{document} 

これでリンクは正しい場所を指すようになりました。

関連情報