Beamer 中一帧中有多个导航点

Beamer 中一帧中有多个导航点

我目前正在制作一个 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}

第 2 页的输出(幻灯片 1,覆盖图 2)

代码解释

内部beamer\slideentrybeamerbasenavigation.sty,ll. 661-707)被修改为每帧/覆盖生成一个迷你框架,而不是每张幻灯片只生成一个。这是通过读取\slideentry(l. 16)的第四个参数中提供的幻灯片的第一页和最后一页并在(ll. 17-52)中循环遍历此页面范围来完成的\forloop。除了链接的生成(l. 31)和检查是否突出显示当前生成的迷你框架(l. 36)之外,其余代码基本未修改。请注意,代码仅适用于选项compress(这意味着您不会在每个小节之后的迷你框架中看到换行符)。

相关内容