allowframebreaks を使用した Beamer のハイパーリンク

allowframebreaks を使用した Beamer のハイパーリンク

この答えHeiko Oberdiek は、後で beamer クラスで機能するハイパーリンクを生成するために使用できるアンカーを作成する方法を教えてくれました。これは、オプションが指定されている場合を除いて非常にうまく機能しますallowframebreaks。これを確認するには、次の 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}

2 番目の図は正しくハイパーリンクされていますが、最初の図 (オプションのあるフレームの 2 番目または「継続」フレームにあるallowframebreaks) は正しくハイパーリンクされていません。これを修正するにはどうすればよいですか?

答え1

基本的には、の行の直前ではなく、\phantomtargetの直後に置く必要があります。\begin{figure}

説明

MWE の問題は、と\phantomtargetの間でページ区切りが発生しているため\begin{figure}、ターゲットが図自体とは異なるページにあることです。

ではbeamer\begin{figure}実際にはあまり多くのことが行われません。キャプションの種類を設定し、新しい段落とcenter環境を開始し、(重要なことですが) の使用で囲むだけです\nobreak

したがって、 を\phantomtargetのすぐ内側に配置する\begin{figure}と、間にページ区切りがなく、ターゲットが実際の図の内容と一緒に残る可能性が高くなります。を の\phantomtarget内側に移動しても、まったくデメリットはありません。一般に、これで問題が完全に解決されるかどうかは、環境内に他に何があるか、ページをまたいで分割できるかどうかなどによって異なります。\begin{figure}beamerfigure

固定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}

関連情報