In diesemAntwortHeiko Oberdiek hat mir gezeigt, wie man Anker erstellt, die später zum Generieren funktionierender Hyperlinks in der Beamer-Klasse verwendet werden können. Das funktioniert sehr gut, außer in dem Fall, in dem die allowframebreaks
Option angegeben ist. Um dies zu sehen, betrachten Sie das folgende 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}
Die zweite Abbildung ist korrekt verlinkt, die erste Abbildung (die sich im zweiten oder „Fortsetzungs“-Frame eines Frames mit der allowframebreaks
Option befindet) ist jedoch nicht korrekt verlinkt. Wie kann das behoben werden?
Antwort1
Grundsätzlich sollten Sie es \phantomtarget
direkt nach dem einfügen \begin{figure}
, und nicht direkt vor dieser Zeile.
Erläuterung
Das Problem in Ihrem MWE besteht darin, dass der Seitenumbruch zwischen \phantomtarget
und erfolgt \begin{figure}
, sodass sich das Ziel auf einer anderen Seite als die Abbildung selbst befindet.
In tut es beamer
nicht \begin{figure}
wirklich viel: Es legt lediglich den Überschriftentyp fest, beginnt einen neuen Absatz und eine center
Umgebung, die (wichtig) durch die Verwendung von umgeben ist \nobreak
.
Wenn Sie also das \phantomtarget
direkt in das setzen \begin{figure}
, ist es wahrscheinlicher, dass das Ziel zusammen mit dem eigentlichen Abbildungsinhalt bleibt, ohne dass dazwischen ein Seitenumbruch erfolgt. Es gibt sicherlich keinen Nachteil, das \phantomtarget
in das \begin{figure}
in zu setzen beamer
. Ob das Problem dadurch vollständig gelöst wird, hängt im Allgemeinen davon ab, was sich sonst noch in der figure
Umgebung befindet und ob es über mehrere Seiten umbrochen werden kann usw.
Fester 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}}.
\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}