我目前正在制作一个 Beamer 演示文稿,其中我使用了导航点。我理解如何使用子部分生成它们,如果我想每帧有一个点,我发现这个回答(或者我可以在每一帧之前添加一个小节。
\only<>
现在我有一些使用或命令的带有多张幻灯片(或叠加层)的框架\invisible<>
。如何才能获得与幻灯片一样多的导航点(并能与幻灯片正常配合使用)?
以下是 MWE:
\documentclass{beamer}
\usetheme{Copenhagen}
\useoutertheme[compress,subsection=false]{smoothbars}
\begin{document}
\section{First Frames}
\subsection{Frame 1}
\begin{frame}{Frame 1}
\only<1>{Slide 1}
\only<2>{Slide 2}
\end{frame}
\subsection{Frame 2}
\begin{frame}{Frame 2}
\only<1>{Slide 3}
\only<2>{Slide 4}
\end{frame}
\end{document}
输出如下:
说清楚一点:在这个例子中,四张幻灯片只有两个点。如何才能让四个点根据幻灯片正确打开和关闭。
笔记我知道可以重做所有帧以使每个帧只获得一张幻灯片,但我想知道是否存在其他解决方案。
答案1
我不建议这样做:覆盖层是为了实现动画,比如逐步揭示文本,所以所有的覆盖层都属于一个单一的逻辑单元,并且应该只用一个小框架来表示,以免让观众感到困惑。
但是,可以通过修补beamer
负责生成迷你框架的内部部件来实现您的要求:
\documentclass{beamer}
\usetheme{Copenhagen}
\useoutertheme[compress,subsection=false]{smoothbars}
% Multiple navigation dots in Beamer for one frame
% (http://tex.stackexchange.com/a/135999)
\usepackage{forloop}
\makeatletter
\newcounter{miniframe@page}
\newcounter{miniframe@firstslide}
\newcounter{miniframe@lastslide}
\def\miniframe@parserange(#1/#2){\setcounter{miniframe@firstslide}{#1}\setcounter{miniframe@lastslide}{#2}\stepcounter{miniframe@lastslide}}
\def\slideentry#1#2#3#4#5#6{%
%section number, subsection number, slide number, first/last frame, page number, part number
\ifnum#6=\c@part\ifnum#2>0\ifnum#3>0%
\miniframe@parserange(#4)%
\forloop{miniframe@page}{\value{miniframe@firstslide}}{\value{miniframe@page}<\value{miniframe@lastslide}}{%
\advance\beamer@xpos by1\relax%
\hbox to 0pt{%
\beamer@tempdim=-\beamer@vboxoffset%
\advance\beamer@tempdim by-\beamer@boxsize%
\multiply\beamer@tempdim by\beamer@ypos%
\advance\beamer@tempdim by -.05cm%
\raise\beamer@tempdim\hbox{%
\beamer@tempdim=\beamer@boxsize%
\multiply\beamer@tempdim by\beamer@xpos%
\advance\beamer@tempdim by -\beamer@boxsize%
\advance\beamer@tempdim by 1pt%
\kern\beamer@tempdim
\global\beamer@section@min@dim\beamer@tempdim
\hbox{\edef\beamer@goto{{Navigation\theminiframe@page}}\expandafter\hyperlink\beamer@goto{%
\usebeamerfont{mini frame}%
\ifnum\c@section=#1%
\ifnum\c@subsection=#2%
\usebeamercolor[fg]{mini frame}%
\ifnum\c@page=\c@miniframe@page%
\usebeamertemplate{mini frame}%\beamer@minislidehilight%
\else%
\usebeamertemplate{mini frame in current subsection}%\beamer@minisliderowhilight%
\fi%
\else%
\usebeamercolor{mini frame}%
%\color{fg!50!bg}%
\usebeamertemplate{mini frame in other subsection}%\beamer@minislide%
\fi%
\else%
\usebeamercolor{mini frame}%
%\color{fg!50!bg}%
\usebeamertemplate{mini frame in other subsection}%\beamer@minislide%
\fi%
}}}\hskip-10cm plus 1fil%
}}\fi\fi%
\else%
\fakeslideentry{#1}{#2}{#3}{#4}{#5}{#6}%
\fi\ignorespaces
}
\makeatother
\begin{document}
\section{First Frames}
\subsection{Frame 1}
\begin{frame}{Frame 1}
\only<1>{Slide 1}
\only<2>{Slide 2}
\end{frame}
\subsection{Frame 2}
\begin{frame}{Frame 2}
\only<1>{Slide 3}
\only<2>{Slide 4}
\end{frame}
\end{document}
代码解释
内部beamer
宏\slideentry
(beamerbasenavigation.sty
,ll. 661-707)被修改为每帧/覆盖生成一个迷你框架,而不是每张幻灯片只生成一个。这是通过读取\slideentry
(l. 16)的第四个参数中提供的幻灯片的第一页和最后一页并在(ll. 17-52)中循环遍历此页面范围来完成的\forloop
。除了链接的生成(l. 31)和检查是否突出显示当前生成的迷你框架(l. 36)之外,其余代码基本未修改。请注意,代码仅适用于选项compress
(这意味着您不会在每个小节之后的迷你框架中看到换行符)。