假设我有一个beamer
演示文稿,其中包含一些连续的帧,其中包含“特殊内容”,这些帧位于specialcontent
。我想介绍此特殊内容带有一个框架,可同时显示以下内容:
- “特殊”帧的数量,
- 最后一个“特殊框架”的框架号(不是页面号),
如下面的 MCE 所示(<total number of frames>
和<number of last frame of the special content>
)。
我怎样才能实现这个目标?
\documentclass{beamer}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\setbeamertemplate{footline}[frame number]
\setbeamertemplate{navigation symbols}{}
\newenvironment{specialcontent}{%
\begin{frame}
\frametitle{Special content}
The following special content:
\begin{itemize}
\item has <total number of frames> frames,
\item ends frame \# <number of last frame of the special content>.
\end{itemize}
\end{frame}
}{%
}
\begin{document}
\begin{frame}
\frametitle{Foo bar}
Foo\pause{} bar.
\end{frame}
\begin{specialcontent}
\begin{frame}
\frametitle{Foo bar (special content)}
Foo\pause{} bar.
\end{frame}
\begin{frame}
\frametitle{Foo bar (special content)}
Foo\pause{} bar.
\end{frame}
\end{specialcontent}
\begin{frame}
\frametitle{Foo bar}
Foo\pause{} bar.
\end{frame}
\end{document}
答案1
使用totcount
包:
\documentclass{beamer}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\setbeamertemplate{footline}[frame number]
\setbeamertemplate{navigation symbols}{}
\usepackage{totcount}
\newcounter{endspecial}
\newcounter{startspecial}
\regtotcounter{endspecial}
\newenvironment{specialcontent}{%
\begin{frame}
\frametitle{Special content}
The following special content:
\begin{itemize}
\setcounter{startspecial}{\totvalue{endspecial}}
\addtocounter{startspecial}{1}
\addtocounter{startspecial}{-\insertframenumber}
\item has \thestartspecial <total number of frames> frames,
\item ends frame \total{endspecial} <number of last frame of the special content>.
\end{itemize}
\end{frame}
}{%
\setcounter{endspecial}{\insertframenumber}
}
\begin{document}
\begin{frame}
\frametitle{Foo bar}
Foo\pause{} bar.
\end{frame}
\begin{specialcontent}
\begin{frame}
\frametitle{Foo bar (special content)}
Foo\pause{} bar.
\end{frame}
\begin{frame}
\frametitle{Foo bar (special content)}
Foo\pause{} bar.
\end{frame}
\end{specialcontent}
\begin{frame}
\frametitle{Foo bar}
Foo\pause{} bar.
\end{frame}
\end{document}
答案2
为了记录在案,我在这里提出了一个扩展的解决方案samcarter 的一个这也适用于需要使用多个环境的情况specialcontents
(比如,这个环境不是我们的,而是由第三方包或类提供的——在我的实际用例中,它来自包versions
)。
棘手的问题是,在动态定义许多“总计数器”时,只创建了最后一个。 感谢埃格雷格的诡计,下面的操作非常有效:
\documentclass{beamer}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{multido}
\usepackage{totcount}
\usetheme{PaloAlto}
\useoutertheme{infolines}
\setbeamertemplate{navigation symbols}{}
\newenvironment{specialcontent}{%
}{%
}
\AtBeginEnvironment{specialcontent}{%
\stepcounter{specialcontent@cntr}%
%
\begingroup\edef\x{\endgroup
\noexpand\newtotcounter{startspecial@\roman{specialcontent@cntr}}
\noexpand\newtotcounter{endspecial@\roman{specialcontent@cntr}}%
}\x
%
\begin{frame}
\frametitle{Special content (begins)}
%
\setcounter{startspecial@\roman{specialcontent@cntr}}{\totvalue{endspecial@\roman{specialcontent@cntr}}}%
\addtocounter{startspecial@\roman{specialcontent@cntr}}{-\insertframenumber}%
%
The following special content:
\begin{itemize}
\item \alert{has \total{startspecial@\roman{specialcontent@cntr}} frames},
\item \alert{ends frame \total{endspecial@\roman{specialcontent@cntr}}}.
\end{itemize}
\end{frame}
}
\AtEndEnvironment{specialcontent}{%
\setcounter{endspecial@\roman{specialcontent@cntr}}{\insertframenumber}%
}
\newcounter{specialcontent@cntr}%
\begin{document}
\multido{\i=1+1}{17}{%
\begin{frame}
\frametitle{Foo bar}
Foo\pause{} bar.
\end{frame}
%
\section{Special \i{}}
%
\begin{specialcontent}
\multido{\I=1+1}{\i}{%
\begin{frame}
\frametitle{Foo bar (special content)}
Foo\pause{} bar.
\end{frame}
}
\end{specialcontent}
%
\begin{frame}
\frametitle{Foo bar}
Foo\pause{} bar.
\end{frame}
}
\end{document}