基于对超链接/超目标对的几个问答,我正在尝试设计带有覆盖、练习和解决方案的投影仪演示文稿。解决方案位于文档末尾,顺序与练习相同。我想自动对练习和解决方案进行编号,因此我使用了两个计数器:
\newcounter{exercise}\resetcounteronoverlays{exercise}
\newcounter{solution}\resetcounteronoverlays{solution}
我还想自动插入超链接/超目标对,以便在演示过程中来回导航。在每个练习的最后一张幻灯片中,应该有一个可点击的按钮,链接到第一的解决方案的最后一张幻灯片,每个解决方案的最后一张幻灯片应该有一个可点击的按钮,链接回最后的练习幻灯片。在讲座中,我:
- 翻开练习页,一张接一张,直到看到解答按钮,
- 点击“解决方案”按钮跳转到解决方案的第一张幻灯片,
- 一张一张地揭开解决方案,直到看到练习按钮,
- 点击“练习”按钮跳回到练习的最后一张幻灯片,
- 练习结束后继续播放第一张幻灯片。
由于练习和解决方案的文本可长可短,我决定将所有这些分成 4 个命令,再加上一个中间的 ( \overlaynumber
) 来获取当前幻灯片编号:
\makeatletter
\newcommand*{\overlaynumber}{\number\beamer@minimum}
\makeatother
\newcommand*{\newex}{\stepcounter{exercise}{Ex. \theexercise{}: }}
\newcommand*{\tosol}{\hfill{}\hyperlink<\overlaynumber{}>{sol-\theexercise}{\hypertarget{ex-\theexercise}{\beamergotobutton{}}}}
\newcommand*{\newsol}{\stepcounter{solution}\hypertarget<\overlaynumber{}>{sol-\thesolution}{}{Ex. \thesolution{}: }}
\newcommand*{\toex}{\hfill{}\hyperlink<\overlaynumber{}>{ex-\thesolution}{\beamergotobutton{}}}
\newex
增加并排版计数器exercise
。\tosol
插入sol-N
超链接和ex-N
返回超目标。\newsol
增加并排版计数器solution
,并插入sol-N
超目标。最后,\toex
插入ex-N
返回超链接。
只要我不在块或框架标题中使用命令,一切都会按预期工作(下面示例中的练习 1 和 2)。
当解决方案需要一个或多个完整的块(如下例中的练习 3 所示)并且我将命令放在\newsol
块标题的开头时,解决方案的链接不是指向首次显示该块的幻灯片,而是指向其框架的第一张幻灯片。
当解决方案需要完整的一帧或更多帧(如下例中的练习 4)并且我将命令放在\newsol
帧标题的开头时,解决方案的链接指向帧的最后一张幻灯片而不是第一张。并且返回练习的链接也是错误的:它指向问题之前的幻灯片。
我怀疑我的计数器没有在正确的编译时间递增和/或我的\overlaynumber
命令在块或框架标题中使用时没有按照我希望的方式运行。
有没有办法获得正确的超链接/超目标行为,即使在块或框架标题中?
梅威瑟:
\PassOptionsToPackage{unicode}{hyperref}
\documentclass{beamer}
\beamertemplatenavigationsymbolsempty{}
\newcounter{exercise}\resetcounteronoverlays{exercise}
\newcounter{solution}\resetcounteronoverlays{solution}
\makeatletter
\newcommand*{\overlaynumber}{\number\beamer@minimum}
\makeatother
\newcommand*{\newex}{\stepcounter{exercise}{Ex. \theexercise{}: }}
\newcommand*{\tosol}{\hfill{}\hyperlink<\overlaynumber{}>{sol-\theexercise}{\hypertarget{ex-\theexercise}{\beamergotobutton{}}}}
\newcommand*{\newsol}{\stepcounter{solution}\hypertarget<\overlaynumber{}>{sol-\thesolution}{}{Ex. \thesolution{}: }}
\newcommand*{\toex}{\hfill{}\hyperlink<\overlaynumber{}>{ex-\thesolution}{\beamergotobutton{}}}
\begin{document}
\begin{frame}{Frame one}
\begin{block}{Block one}
\begin{itemize}[<+->]
\item \newex{}How many prime numbers less than 10?\tosol{}
\item \newex{}How many even prime numbers?\tosol{}
\item \newex{}Sum of prime numbers less than 10?\tosol{}
\item \newex{}Product of prime numbers less than 10?\tosol{}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}{Frame two}
\begin{block}{Block one}
\begin{itemize}[<+->]
\item \newsol{}4 (2, 3, 5 and 7)\toex{}
\item \newsol{}1 (2)\toex{}
\end{itemize}
\end{block}
\onslide<+->
\begin{block}{\newsol{}Sum of prime numbers less than 10?}
\begin{itemize}[<+->]
\item $2 + 3 + 5 + 7 = 17$
\item Note: 17 is prime\toex{}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}{\newsol{}Product of prime numbers less than 10?}
\begin{block}{Block one}
\begin{itemize}[<+->]
\item $2 \times 3 \times 5 \times 7 = 210$
\item Note: 210 is not prime
\item Note: 210 is even\toex{}
\end{itemize}
\end{block}
\end{frame}
\end{document}