下面的代码在两个方面产生了不稳定的行为:1) 该行\returnFrom{fourthGoto}{fourthReturn}
创建一个beamerreturnbutton
显示Frame #2
。所有其他按钮都正确地返回一个显示 的按钮。2)和宏Frame #1
之间的唯一区别是后者不包含内的单词。很难想象为什么这种差异很重要。然而,最后一个按钮的行为可预测且不可预测。来回单击标有 -> #6 和 <-#6 的按钮,有时会起作用,但最终,单击帧#6 上的按钮会将我带回到第一帧的第一行,而不是该帧的第六行。我无法从帧#5 上标有 #5 的返回按钮生成此错误。 returnFrom
altReturnFrom
Frame
beamerreturnbutton
\documentclass{beamer}
\usepackage{ifthen}
\makeatletter
\@ifundefined{c@insideAList}{\newcounter{insideAList}}{}
\let\beamer@cramped\relax% just because
\let\c@insideAList\@listdepth % make a latex counter version
\makeatother
\def\condHyperTarget#1{
\ifthenelse{\theinsideAList=0}
{\hypertarget<.(1)>{#1}{} }
{\hypertarget<.>{#1}{} }}
\def\pointTo#1#2{
\label{pointToLoc#1}
\condHyperTarget{#1}
\hyperlink{#2}{\beamergotobutton{\#\ref{returnFromLoc#2} }}}
\def\returnFrom#1#2{
\label{returnFromLoc#1}
\condHyperTarget{#1}\hyperlink{#2}{\beamerreturnbutton{Frame \#\ref{pointToLoc#2}}}}
\def\altReturnFrom#1#2{
\label{returnFromLoc#1}
\condHyperTarget{#1}\hyperlink{#2}{\beamerreturnbutton{\#\ref{pointToLoc#2}}}}
\begin{document}
\begin{frame}[<+->]
First line \\
\pause
Second line \\
\pause
Third line
\pointTo{firstReturn}{firstGoto}
\pause
\begin{itemize}[<+->]
\item First item OUTER
\item Second item OUTER
\pointTo{secondReturn}{secondGoto}
\begin{enumerate}[<+->]
\item First item INNER
\item Second item INNER
\pointTo{thirdReturn}{thirdGoto}
\pause
\end{enumerate}
\end{itemize}
Fourth line \\
\pause
Fifth line
\pointTo{fourthReturn}{fourthGoto} \\
\pause
Sixth Line
\pointTo{fifthReturn}{fifthGoto}
\end{frame}
\begin{frame}[<+->]
Frame 2\\
\returnFrom{firstGoto}{firstReturn}
$\empty$\\%
\end{frame} \begin{frame}[<+->]
Frame 3\\
\returnFrom{secondGoto}{secondReturn}
$\empty$\\%
\end{frame} \begin{frame}[<+->]
Frame 4\\
\returnFrom{thirdGoto}{thirdReturn}
$\empty$\\%
\end{frame} \begin{frame}[<+->]
Frame 5\\
\returnFrom{fourthGoto}{fourthReturn}
\end{frame} \begin{frame}[<+->]
Frame 6\\
\altReturnFrom{fifthGoto}{fifthReturn}
\end{frame}
\end{document}
答案1
问题 2
第二个问题很容易解决。您在宏中使用\ref
,这将产生一个链接,但仅用于数字。使用显示链接目标的查看器,如果鼠标悬停在其上,则可以看到这一点(转到页面 = 转到页面):
这适用于 和\returnFrom
。\altReturnFrom
但对于后者,你不太可能达到这个数字。
解决方法:只需\ref
用替换即可\ref*
。
后者只给出号码,而不提供链接。
问题 1
第一个问题是由于使用 引起的\label
,它指的是最后一个结构元素(框架、方程、编号项等)的编号。 在您的例子中,它是enumerate
环境的第 2 项。 要测试这一点,您可以
enumerate
用替换itemize
。
不幸的是,据我所知,没有办法内置beamer
引用帧号。可以做到,但需要相当多的编程。
编辑:
既然您有充分的理由在按钮中使用帧编号,那么这里有一个解决方案。它会生成一个额外的辅助文件\jobname.fno
。
您需要运行 LaTeX 两次才能使其工作。但之后您不需要更改源\begin{document}
(除了\altReturnFrom
,我在这里没有实现)。
\documentclass{beamer}
\makeatletter
\let\beamer@cramped\relax% just because
\newcommand*{\refframenumber}[1]{%
\csname #1\endcsname
}
\newcommand*{\labelframenumber}[1]{%
\protected@write\@auxout{}%
{\string\@writefile{fno}{\string\expandafter\string\def\string\csname\space#1\string\endcsname{\insertframenumber}}}%
}
\def\condHyperTarget#1{%
\ifnum\@listdepth=0\relax
\hypertarget<.(1)>{#1}{}%
\else
\hypertarget<.>{#1}{}%
\fi
}%
\def\pointTo#1#2{%
\labelframenumber{pointToLoc#1}%
\condHyperTarget{#1}%
\hyperlink{#2}{\beamergotobutton{\#\refframenumber{returnFromLoc#2} }}}
\def\returnFrom#1#2{%
\labelframenumber{returnFromLoc#1}%
\condHyperTarget{#1}%
\hyperlink{#2}{\beamerreturnbutton{Frame \#\refframenumber{pointToLoc#2}}}}
% read .fno file
\AtBeginDocument{%
\InputIfFileExists{\jobname.fno}{}{}%
}
% open .fno file for LaTeX to write
\AtEndDocument{%
\if@filesw\newwrite\tf@fno
\immediate\openout\tf@fno\jobname.fno\fi
}
\makeatother
\begin{document}
\begin{frame}[<+->]
First line \\
\pause
Second line \\
\pause
Third line
\pointTo{firstReturn}{firstGoto}
\pause
\begin{itemize}[<+->]
\item First item OUTER
\item Second item OUTER
\pointTo{secondReturn}{secondGoto}
\begin{enumerate}[<+->]
\item First item INNER
\item Second item INNER
\pointTo{thirdReturn}{thirdGoto}
\pause
\end{enumerate}
\end{itemize}
Fourth line \\
\pause
Fifth line
\pointTo{fourthReturn}{fourthGoto} \\
\pause
Sixth Line
\pointTo{fifthReturn}{fifthGoto}
\end{frame}
\begin{frame}[<+->]
Frame 2\\
\returnFrom{firstGoto}{firstReturn}
$\empty$\\%
\end{frame}
\begin{frame}[<+->]
Frame 3\\
\returnFrom{secondGoto}{secondReturn}
$\empty$\\%
\end{frame}
\begin{frame}[<+->]
Frame 4\\
\returnFrom{thirdGoto}{thirdReturn}
$\empty$\\%
\end{frame}
\begin{frame}[<+->]
Frame 5\\
\returnFrom{fourthGoto}{fourthReturn}
\end{frame}
\begin{frame}[<+->]
Frame 6\\
\returnFrom{fifthGoto}{fifthReturn}
\end{frame}
\end{document}