Hiperlinks no beamer com permitframebreaks

Hiperlinks no beamer com permitframebreaks

NissoresponderHeiko Oberdiek me mostrou como criar âncoras que poderiam ser usadas posteriormente para gerar hiperlinks funcionais na classe beamer. Isso funciona muito bem, exceto no caso em que a allowframebreaksopção é dada. Para ver isso, considere o seguinte MWE:

\documentclass{beamer}
\usepackage{lmodern}
\usepackage{lipsum}

\setbeamertemplate{caption}[numbered]
\hypersetup{colorlinks=true}

\makeatletter
\newcounter{phantomtarget}
\renewcommand*{\thephantomtarget}{phantom.\the\value{phantomtarget}}
\newcommand*{\phantomtarget}{%
  \stepcounter{phantomtarget}%
  \hypertarget{\thephantomtarget}{}%
  \edef\@currentHref{\thephantomtarget}%
}
\makeatother

\begin{document}
\begin{frame}[allowframebreaks]
  \frametitle{First figure}
  \lipsum[3]
  See Figure \hyperref[fig:first_figure]{\ref*{fig:first_figure}} and Figure
  \hyperref[fig:second_figure]{\ref*{fig:second_figure}}.
  \phantomtarget
  \begin{figure}
    \rule{6cm}{6cm}
    \caption{First figure}
    \label{fig:first_figure}
  \end{figure}
\end{frame}
\begin{frame}
  \frametitle{Second figure}
  \phantomtarget
  \begin{figure}
    \rule{6cm}{6cm}
    \caption{Second figure}
    \label{fig:second_figure}
  \end{figure}
\end{frame}
\end{document}

A segunda figura está hiperlinkada corretamente, mas a primeira figura (que está no segundo quadro ou "continuação" de um quadro com a allowframebreaksopção) não está hiperlinkada corretamente. Como isso pode ser consertado?

Responder1

Basicamente você deve colocar \phantomtargetlogo após a linha \begin{figure}, em vez de antes dessa linha.

Explicação

O problema no seu MWE é que a quebra de página está ocorrendo entre o \phantomtargete o \begin{figure}, então o destino está em uma página diferente da própria figura.

Em beamer, \begin{figure}não faz muita coisa: apenas define o tipo de legenda, inicia um novo parágrafo e um centerambiente, cercado (importantemente) pelo uso de \nobreak.

Portanto, colocando o \phantomtargetjust dentro dos \begin{figure}meios é mais provável que o alvo permaneça junto com o conteúdo real da figura, sem quebra de página entre eles. Certamente não há desvantagem em mover o \phantomtargetinterior para \begin{figure}dentro beamer. Em geral, se isso resolverá ou não completamente o problema, dependerá do que mais está dentro do figureambiente e se ele é quebrável entre páginas, etc.

MWE fixo

\documentclass{beamer}
\usepackage{lmodern}
\usepackage{lipsum}

\setbeamertemplate{caption}[numbered]
\hypersetup{colorlinks=true}

\makeatletter
\newcounter{phantomtarget}
\renewcommand*{\thephantomtarget}{phantom.\the\value{phantomtarget}}
\newcommand*{\phantomtarget}{%
  \stepcounter{phantomtarget}%
  \hypertarget{\thephantomtarget}{}%
  \edef\@currentHref{\thephantomtarget}%
}
\makeatother

\begin{document}
\begin{frame}[allowframebreaks]
  \frametitle{First figure}
  \lipsum[3]
  See Figure \hyperref[fig:first_figure]{\ref*{fig:first_figure}} and Figure
  \hyperref[fig:second_figure]{\ref*{fig:second_figure}}.
  \begin{figure}
    \phantomtarget
    \rule{6cm}{6cm}
    \caption{First figure}
    \label{fig:first_figure}
  \end{figure}
\end{frame}
\begin{frame}
  \frametitle{Second figure}
  \phantomtarget
  \begin{figure}
    \rule{6cm}{6cm}
    \caption{Second figure}
    \label{fig:second_figure}
  \end{figure}
\end{frame}
\end{document}

informação relacionada