Certifique-se de que a seção fantasma não ocorra na parte inferior de uma página

Certifique-se de que a seção fantasma não ocorra na parte inferior de uma página

No meu documento, tenho caixas que não podem ser divididas entre páginas e que, portanto, muitas vezes deixam espaços em branco nas páginas anteriores. Quando eu crio um \phantomsectionantes de uma dessas caixas, o \phantomsection/ \labelé deixado na primeira página em vez de ser colocado no topo da nova página. Existe uma maneira de colocá-lo na 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}

Responder1

A causa da possível quebra de página é o \labelcomando que insere um whatsit entre a âncora e a caixa.

Se eu compilar o seguinte exemplo

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

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

a parte relevante do arquivo de log é

....\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 uma penalidade infinita é adicionada antes da cola (que no seu caso provavelmente virá de \lineskip, mas isso é irrelevante), inibindo assim que essa cola seja usada como ponto de quebra de página.

Se for \nopagebreakremovido, obtemos

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

O whatsit ( \write1) não é um item descartável, então a colapodeser usado como um ponto de quebra de página.

Então

\phantomsection\label{target}\nopagebreak

deveria fazer.

Responder2

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

Responder3

Você pode colocar \phantomsectiondentro da caixa para evitar isso, ou seja

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

em vez 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} 

Agora o link aponta para o lugar certo.

informação relacionada