Beamer 演示:使用 [allowframebreaks] 列出某一部分/部分内的框架

Beamer 演示:使用 [allowframebreaks] 列出某一部分/部分内的框架

请参见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

其中存在两个问题:

  1. \usebeamertemplate*在仅扩展的上下文中是不安全的,因为它寻找
  2. \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}

相关内容