自动将覆盖编号传递给 beamer 中的 \hypertarget

自动将覆盖编号传递给 beamer 中的 \hypertarget

我正在尝试使用@gonzalo_medina 的建议关于超链接的这个帖子 以及@diabonas 的建议此线程有关覆盖数字自动将覆盖号传递给\hypertarget

我使用的方法很笨拙,我相信使用 beamer 的内部功能会有更好的方法。但这是我尝试过的,大量借鉴了 @gonzalo_median 的代码

\documentclass{beamer}
\usepackage{ifthen}
\makeatletter
\newcommand*{\overlaynumber}{\number\beamer@slideinframe}
\makeatother
\begin{document}
\begin{frame}
\hyperlink{label4}{\beamerbutton{I jump to fourth slide of next frame}}
\hyperlink{label6}{\beamerbutton{I jump to sixth slide of next frame}}
\end{frame}
\begin{frame}
\begin{itemize}[<+->]
\item First.
\pause
\item Second.
\pause
\item Third;
\pause
\item
\ifthenelse{\isundefined{\firstValue}}{\def\firstValue{\overlaynumber}}{}
Fourth;  I'm now at overlay
\#\firstValue.  \hypertarget<\firstValue>{label4}{\beamerbutton{I'm on the fourth slide}}
\pause
\item Fifth
\pause
\item
\ifthenelse{\isundefined{\secondValue}}{\def\secondValue{\overlaynumber}}{}
Sixth I'm now on overlay \#\secondValue   \hypertarget<\secondValue>{label6}{\beamerbutton{I'm on the sixth slide}}
\end{itemize}
\end{frame}
\end{document}

我发现代码中存在一个问题(可能还有其他问题),尽管我已指定\firstValue\secondValue仅在尚未定义时才应定义,但ifthen条件不起作用,值会随着 而不断增加\overlaynumber。运行代码后,问题应该立即显现出来

如果有人能够让它正常运行,或者建议更好的方法,我将不胜感激。

答案1

作为约翰·科米洛已经指出,每次排版覆盖时都会处理完整的幻灯片,因此\firstValue\secondValue已经在第一个覆盖上定义(如果您使用\global\edef而不是\def,否则定义将是当前覆盖的本地定义),即使相应的覆盖仅在稍后显示。

然而,有一个更简单的解决方案:只需使用<.>覆盖规范仅在当前覆盖层上放置\hypertarget。这是因为点返回计数器的当前值beamerpauses减一。与内部使用的计数器相比\beamer@slideinframebeamerpauses计数器仅在每次之后递增\pause(通过使用类似 的覆盖层规范显式或隐式<+->) - 尝试使用\arabic{beamerpauses}\overlaynumber进行比较。

所以你的例子变得简单

\documentclass{beamer}

\begin{document}
\begin{frame}
\hyperlink{label4}{\beamerbutton{I jump to fourth slide of next frame}}
\hyperlink{label6}{\beamerbutton{I jump to sixth slide of next frame}}
\end{frame}

\begin{frame}
\begin{itemize}[<+->]
\item First \arabic{beamerpauses}\overlaynumber
\item Second
\item Third
\item Fourth \hypertarget<.>{label4}{\beamerbutton{I'm on the fourth slide}}
\item Fifth
\item Sixth \hypertarget<.>{label6}{\beamerbutton{I'm on the sixth slide}}
\end{itemize}
\end{frame}
\end{document}

答案2

Beamer 使用两种计数:\beamer@slideinframe\beamer@minimum。当两者相等时,幻灯片才会首次可见。

\documentclass{beamer}
\usepackage{ifthen}

\makeatletter
\newcommand*{\overlaynumber}{\number\beamer@minimum}
\makeatother

\begin{document}
\begin{frame}
\hyperlink{label4}{\beamerbutton{I jump to fourth slide of next frame}}\par
\hyperlink{label6}{\beamerbutton{I jump to fifth slide of next frame}}\par
\end{frame}
\begin{frame}
\begin{itemize}[<+->]
\item First.
\item Second.
\item Third;
\item Fourth;  I'm now at overlay \#\overlaynumber
\only<\overlaynumber>{\hypertarget{label4}{\beamerbutton{I'm on the fourth slide}}}
\item Fifth;  I'm now on overlay \#\overlaynumber   
\hypertarget<\overlaynumber>{label6}{\beamerbutton{I'm on the fifth slide}}
\item Sixth
\end{itemize}
\end{frame}
\end{document}

相关内容