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 allowframebreaks
opçã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 allowframebreaks
opção) não está hiperlinkada corretamente. Como isso pode ser consertado?
Responder1
Basicamente você deve colocar \phantomtarget
logo 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 \phantomtarget
e 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 center
ambiente, cercado (importantemente) pelo uso de \nobreak
.
Portanto, colocando o \phantomtarget
just 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 \phantomtarget
interior para \begin{figure}
dentro beamer
. Em geral, se isso resolverá ou não completamente o problema, dependerá do que mais está dentro do figure
ambiente 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}