请参见Beamer 演示:部分/部分内的框架列表。我已复制粘贴了 Gonzalo Medina 的示例代码。取消注释 [allowframebreaks] 或在 lbf 文件中列出的任何其他框架中使用它都会导致错误。假设上下文需要使用它,有没有办法通过使用 [allowframebreaks] 获得相同的结果?
\documentclass{beamer}
\usetheme{Berkeley}
\newif\ifframeinlbf
\frameinlbftrue
\makeatletter
\newcommand\listofframes{\vfill\@starttoc{lbf\thesection}}
\makeatother
\addtobeamertemplate{frametitle}{}{%
\ifframeinlbf
\addcontentsline{lbf\thesection}{section}{\protect\makebox[2em][l]{%
\protect\usebeamercolor[fg]{structure}\insertframenumber\hfill}%
\insertframetitle\vfill}%
\else\fi%
}
\begin{document}
\section{Test Section One}
\frameinlbffalse
\begin{frame}
\frametitle{List of Frames for Section One}
\listofframes
\end{frame}
\frameinlbftrue
\begin{frame}%[allowframebreaks]
\frametitle{Test Frame One One}
test
\end{frame}
\begin{frame}
\frametitle{Test Frame One Two}
test
\end{frame}
\section{Test Section Two}
\frameinlbffalse
\begin{frame}
\frametitle{List of Frames for Section Two}
\listofframes
\end{frame}
\frameinlbftrue
\begin{frame}
\frametitle{Test Frame Two One}
test
\end{frame}
\begin{frame}
\frametitle{Test Frame Two Two}
test
\end{frame}
\begin{frame}
\frametitle{Test Frame Two Three}
test
\end{frame}
\end{document}
答案1
该问题是由于使用该选项时beamer
所做的更改(在条件中\insertframetitle
添加包装)引起的。\space\usebeamertemplate*{frametitle continuation}
allowframebreaks
其中存在两个问题:
\usebeamertemplate
*
在仅扩展的上下文中是不安全的,因为它寻找\usebeamertemplate*
在错误的时间执行\usebeamercolor
扩展
这是一个本地修复,直接转到-parsing 的结果*
,然后\protect
等等\usebeamercolor
:
\documentclass{beamer}
\usetheme{Berkeley}
\usepackage{etoolbox}
\errorcontextlines=\maxdimen
\newif\ifframeinlbf
\frameinlbftrue
\makeatletter
\newcommand\listofframes{\vfill\@starttoc{lbf\thesection}}
\addtobeamertemplate{frametitle}{}{%
\ifframeinlbf
\bgroup
\patchcmd\insertframetitle{\usebeamertemplate*{frametitle continuation}}{{{\protect\usebeamerfont{frametitle continuation}\protect\usebeamercolor[fg]{frametitle continuation}\beamer@usebeamertemplatedo{frametitle continuation}}}}{}{\errmessage{failed to patch}}
\addcontentsline{lbf\thesection}{section}{\protect\makebox[2em][l]{%
\protect\usebeamercolor[fg]{structure}\insertframenumber\hfill}%
\insertframetitle\vfill}%
\egroup
\else\fi%
}
\makeatother
\begin{document}
\section{Test Section One}
\frameinlbffalse
\begin{frame}
\frametitle{List of Frames for Section One}
\listofframes
\end{frame}
\frameinlbftrue
\begin{frame}[allowframebreaks]
\frametitle{Test Frame One One}
test
\end{frame}
\begin{frame}
\frametitle{Test Frame One Two}
test
\end{frame}
\section{Test Section Two}
\frameinlbffalse
\begin{frame}
\frametitle{List of Frames for Section Two}
\listofframes
\end{frame}
\frameinlbftrue
\begin{frame}
\frametitle{Test Frame Two One}
test
\end{frame}
\begin{frame}
\frametitle{Test Frame Two Two}
test
\end{frame}
\begin{frame}
\frametitle{Test Frame Two Three}
test
\end{frame}
\end{document}
如果您想要从帧列表中完全删除延续计数器,则\insertframetitle
可以不用修补,而直接在其位置执行即可\beamer@autobreakcount=0
(在同一行上,因此更改仍然保持本地)。
答案2
有了更多传统的方法,即为每个帧创建一个小节并触及投影仪选项,就可以获得一个目录,其中只突出显示实际部分,并且只显示该部分的帧(=小节)列表。
是不同的显示,但希望能够实现相同的功能(?)并且更简单的代码可以顺利运行 allowframebreaks
。
\documentclass{beamer}
\usetheme{Berkeley}
%\usetheme[hideothersubsections]{Berkeley}
%macros only to simplify commands in document
\newcommand\newframeb[1]{%
\subsection[]{#1}\begin{frame}[allowframebreaks]{#1}}
\newcommand\newframe[1]{%
\subsection[]{#1}\begin{frame}{#1}}
\begin{document}
% This make the partial TOCs
\AtBeginSection[]
{\begin{frame}{Contents}
\tableofcontents[currentsection,hideothersubsections]
\end{frame}}
\section{Test Section One}
\newframe{Test Frame One One} Single frame \end{frame}
\newframeb{Test Frame One Two (breaked)}
Break \vspace{3 cm} \\ frame \vspace{3 cm} \\
Break \vspace{3 cm} \\ frame \vspace{3 cm} \\
\end{frame}
\section{Test Section Two}
\newframe{Test Frame Two One} test \end{frame}
\newframeb{Test Frame Two Two (breaked)}
Break \vspace{3 cm} \\ frame \vspace{3 cm} \\
Break \vspace{3 cm} \\ frame \vspace{3 cm} \\
\end{frame}
\newframe{Test Frame Two Three} test \end{frame}
\end{document}