
В моем документе есть блоки, которые нельзя разбить на страницы, и которые поэтому часто оставляют пустое место на предыдущих страницах. Когда я создаю \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}
Теперь ссылка ведет в нужное место.