Гиперссылки в Beamer с allowframebreaks

Гиперссылки в Beamer с allowframebreaks

В этомотвечатьХайко Обердиек показал мне, как создавать якоря, которые можно было бы использовать позже для генерации рабочих гиперссылок в классе 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}

Вторая фигура правильно гиперсвязана, но первая фигура (которая находится во втором или "продолжающем" фрейме фрейма с опцией allowframebreaks) некорректно гиперсвязана. Как это можно исправить?

решение1

По сути, вы должны поставить \phantomtargetего сразу после \begin{figure}, а не перед этой строкой.

Объяснение

Проблема в вашем MWE заключается в том, что разрыв страницы происходит между \phantomtargetи \begin{figure}, поэтому цель находится на другой странице, нежели сам рисунок.

В beamer, \begin{figure}на самом деле не делает ничего особенного: он просто устанавливает тип заголовка, начинает новый абзац и centerокружение, окруженное (что важно) использованием \nobreak.

Таким образом, размещение \phantomtargetjust внутри \begin{figure}означает, что более вероятно, что цель останется вместе с фактическим содержимым рисунка, без разрыва страницы между ними. Нет никаких недостатков в перемещении внутри \phantomtargetin \begin{figure}. beamerВ целом, решит ли это проблему полностью или нет, будет зависеть от того, что еще находится внутри среды figureи можно ли ее разбить на страницы и т. д.

Фиксированная МВЭ

\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}

Связанный контент