Убедитесь, что фантомное сечение не появляется внизу страницы

Убедитесь, что фантомное сечение не появляется внизу страницы

В моем документе есть блоки, которые нельзя разбить на страницы, и которые поэтому часто оставляют пустое место на предыдущих страницах. Когда я создаю \phantomsectionперед одним из таких блоков, \phantomsection/ \labelостается на первой странице, а не помещается в верхнюю часть новой страницы. Есть ли способ перенести его на вторую страницу?

\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} 

Теперь ссылка ведет в нужное место.

Связанный контент