Asegúrese de que la sección fantasma no aparezca en la parte inferior de una página

Asegúrese de que la sección fantasma no aparezca en la parte inferior de una página

En mi documento tengo cuadros que no se pueden dividir en páginas y que, por lo tanto, a menudo dejan espacios en blanco en las páginas anteriores. Cuando creo un \phantomsectioncuadro antes de uno de estos cuadros, \phantomsection/ \labelse deja en la primera página en lugar de colocarse en la parte superior de la nueva página. ¿Hay alguna manera de incluirlo en la segunda página?

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

Respuesta1

La causa del posible salto de página es el \labelcomando que inserta un whatsit entre el ancla y el cuadro.

Si compilo el siguiente ejemplo

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

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

la parte relevante del archivo de registro es

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

Vemos que se agrega una penalización infinita antes del pegamento (que en su caso probablemente provendrá de \lineskip, pero esto es irrelevante), inhibiendo así que este pegamento se use como punto de salto de página.

Si se \nopagebreakelimina, obtenemos

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

El whatsit ( \write1) no es un elemento descartable, por lo que el pegamentopoderutilizarse como punto de salto de página.

Entonces

\phantomsection\label{target}\nopagebreak

debería hacer.

Respuesta2

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

Respuesta3

Puedes poner el \phantomsectioninterior de la caja para evitar eso, es decir

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

en lugar de

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

MWE

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

Ahora el enlace apunta al lugar correcto.

información relacionada