投影机的转到和返回按钮行为不稳定

投影机的转到和返回按钮行为不稳定

下面的代码在两个方面产生了不稳定的行为:1) 该行\returnFrom{fourthGoto}{fourthReturn}创建一个beamerreturnbutton显示Frame #2。所有其他按钮都正确地返回一个显示 的按钮。2)和宏Frame #1之间的唯一区别是后者不包含内的单词。很难想象为什么这种差异很重要。然而,最后一个按钮的行为可预测且不可预测。来回单击标有 -> #6 和 <-#6 的按钮,有时会起作用,但最终,单击帧#6 上的按钮会将我带回到第一帧的第一行,而不是该帧的第六行。我无法从帧#5 上标有 #5 的返回按钮生成此错误。 returnFromaltReturnFromFramebeamerreturnbutton

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

相关内容