我正在尝试使用@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@slideinframe
,beamerpauses
计数器仅在每次之后递增\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}