LaTeX Beamer:如何在使用覆盖时获取不同的页码?

LaTeX Beamer:如何在使用覆盖时获取不同的页码?

问题

当我使用 Beamer 类在 LaTeX 中创建演示文稿幻灯片时,我喜欢使用如下构造overprint

\begin{frame}
  \begin{block}{}
    \begin{itemize}
      \item Some general remarks about ALL plots
    \end{itemize}
  \end{block}
  \begin{block}{}
    \begin{center}
      \begin{overprint}
        \only<+>{
          \incgraphics{width=7cm}{plot1.pdf}\\
          Explanation of Figure 1
        }
        \only<+>{
          \incgraphics{width=7cm}{plot2.pdf}\\
          Explanation of Figure 2
        }
        % maybe more plots...
      \end{overprint}
    \end{center}
  \end{block}
\end{frame}

问题是这样的从一张幻灯片创建的所有幻灯片frame都分配有相同的页码这使得人们抱怨很难跟踪我正在看的幻灯片(当通过电话等进行演讲时)。

我该如何改变这种情况?

重现问题的最小示例

\documentclass{beamer}

\usetheme{Madrid}

\begin{document}

\begin{frame}
  Common text\\
  \begin{overprint}
    \only<+>{
      Figure 1 and explanation of Figure 1
    }
    \only<+>{
      Figure 2 and explanation of Figure 2
    }
  \end{overprint}
\end{frame}

\end{document}

部分答案

人们可以随意\setbeamertemplate使用 和\insertpagenumber{}来代替\insertframenumber{},但是这样就失去了通用性(例如,您无法轻松地在主题之间切换)。

也许有更好的解决办法?

答案1

好问题。似乎没有内置功能可以做你想做的事。一定有一个计数器来保存幻灯片编号,但手册似乎没有公开它,我不想深入研究源代码。

我的解决方案可能会被归类为“瞎搞”,但如下所示:

\documentclass{beamer}
\usetheme{Madrid}
\newcounter{slidenumber}

\defbeamertemplate*{footline}{infolines theme frame plus slide}{
    \setcounter{slidenumber}{\insertpagenumber}%
    \addtocounter{slidenumber}{-\insertframestartpage}%
    \addtocounter{slidenumber}{1}%
    \leavevmode%
    \hbox{%
        \begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,center]{author in head/foot}%
            \usebeamerfont{author in head/foot}\insertshortauthor~~(\insertshortinstitute)
        \end{beamercolorbox}%
        \begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,center]{title in head/foot}%
            \usebeamerfont{title in head/foot}\insertshorttitle
        \end{beamercolorbox}%
        \begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,right]{date in head/foot}%
            \usebeamerfont{date in head/foot}\insertshortdate{}\hspace*{2em}
            \insertframenumber.\arabic{slidenumber}{}/ \inserttotalframenumber\hspace*{2ex} 
        \end{beamercolorbox}}%
        \vskip0pt%
    }

\setbeamertemplate{footline}[infolines theme frame plus slide]

\begin{document}
\begin{frame}
    Common text\\
    \begin{overprint}
        \only<+>{
            Figure 1 and explanation of Figure 1
        }
        \only<+>{
            Figure 2 and explanation of Figure 2
        }
    \end{overprint}
\end{frame}

\begin{frame}
    Common text on frame 2\\
    \begin{overprint}
        \only<+>{
            Figure 1 and explanation of Figure 1
        }
        \only<+>{
            Figure 2 and explanation of Figure 2
        }
    \end{overprint}
\end{frame}

\end{document}

因此,任何使用 infolines 内部主题的主题都可以进行修改。如果你不想触碰任何模板,你可以可以重新定义\insertframenumber以返回帧号.幻灯片号,但我不知道这是否会破坏其他任何东西。

答案2

我有同样的问题,并使用内置的 beamer 宏\insertpagenumber\insertsectionendpage\insertpresentationendpage分别显示当前页码和部分或演示文稿的总页数。页码使用叠加层递增,而帧号则不递增。您可以在 footlines 中使用此命令。下面是 MWE。我知道这个问题很老了,但我花了一段时间才找到这些命令,所以我想引起大家的注意。

\documentclass{beamer}

\usetheme{Madrid}

\setbeamertemplate{footline}{% set footline options
 \insertpagenumber/\insertsectionendpage
 }

\begin{document}

\begin{frame}
  Common text\\
  Frame - \insertframenumber{} of \inserttotalframenumber \\
  Page - \insertpagenumber{} of \insertpresentationendpage \\
  \begin{overprint}
    \only<+>{
      Figure 1 and explanation of Figure 1
    }
    \only<+>{
      Figure 2 and explanation of Figure 2
    }
  \end{overprint}
\end{frame}

\end{document}

框架1 框架2

答案3

虽然这个问题很老了,但我想我可以做出贡献。每次需要时,只需手动将帧号增加一。通过编写来执行此操作,\addtocounter{framenumber}{1}请确保在范围内执行此操作\only{},否则它将应用于所有幻灯片。并确保它是正确的\only{}。您的 MWE 可以修改为:

\documentclass{beamer}

\usetheme{Madrid}

\begin{document}

\begin{frame}
  Common text\\
  \begin{overprint}
  \only<+>{
    Figure 1 and explanation of Figure 1
  }
  \only<+>{\addtocounter{framenumber}{1}
    Figure 2 and explanation of Figure 2
  }
  \end{overprint}
\end{frame}

\end{document}

这也会增加您的总页数。

让我们明确一点,因为它很重要:它必须在内\only{},使用\onslide\pause还不够,只能\only{}确保代码不会在其他幻灯片中执行。如果您使用除以外的其他方式实现叠加\only{},在最坏的情况下,您只需添加一系列\only{}具有精确页码的,例如:

\only<2>{\addtocounter{framenumber}{1}}
\only<3>{\addtocounter{framenumber}{1}}
\only<4>{\addtocounter{framenumber}{1}}

等等。


编辑:

而不是\addtocounter{framenumber}{1},您可以直接使用\stepcounter{framenumber}。此外,要将每张幻灯片编号为单独的帧,而不是像我上面指出的那样插入整个序列,您可以这样写:

\only<2-|handout:0>{\stepcounter{framenumber}}

因为此命令将应用于第一张幻灯片之后的每一张幻灯片。我添加了 handout:0 以避免讲义模式的混乱。


总结一下:

如果您想让所有幻灯片都编号为单独的帧,只需\only<2-|handout:0>{\stepcounter{framenumber}}在顶部添加即可。但请注意,只在实际使用叠加层时使用它,否则会\only<2->导致叠加,并且帧将在两个相同的幻灯片中重复。

答案4

我不确定这是否正是您想要的,但您也可以使用标签和覆盖规范\begin{frame}\againframe

\documentclass{beamer}

\usetheme{Madrid}

\begin{document}

\begin{frame}<1>[label=somelabel]
  Common text\\
  \begin{overprint}
    \only<+>{
      Figure 1 and explanation of Figure 1
    }
    \only<+>{
      Figure 2 and explanation of Figure 2
    }
  \end{overprint}
\end{frame}

\againframe<2>{somelabel}

\end{document}

通过这个解决方案,您至少可以选择哪些覆盖应该具有相同的帧号,哪些不应该。

相关内容