使用 Beamer 时,我经常会将幻灯片最初写在演讲正文中,然后决定将它们放在附录中。当将长篇演讲的幻灯片重新应用到较短的场合时,这也很有用。但实际上,这会产生一个附录,其部分与演讲正文平行。
从正文 TeX 中剪切和粘贴幻灯片会失去那里各部分的凝聚力。如果能够将一些幻灯片标记为附录幻灯片,并让宏重建附录中的部分结构以使其并行,那就更好了。
因此:
\documentclass{beamer}
\usepackage{appendixify}
\begin{document}
\section{Hello world}
\begin{frame}{1}\end{frame}
\appendixify{\begin{frame}{2}\end{frame}}
\begin{frame}{3}\end{frame}
\section{Farewell world}
\appendixify{\begin{frame}{4}\end{frame}}
\begin{frame}{5}\end{frame}
\appendix
\appendixified
\end{document}
应呈现如下形式:
\documentclass{beamer}
\begin{document}
\section{Hello world}
\begin{frame}{1}\end{frame}
\begin{frame}{3}\end{frame}
\section{Farewell world}
\begin{frame}{5}\end{frame}
\appendix
\section{Hello world}
\begin{frame}{2}\end{frame}
\section{Farewell world}
\begin{frame}{4}\end{frame}
\end{document}
理想情况下,此宏还可以生成导航小部件,以便从某个部分切换到相应的附录部分,然后再返回;或者通过提供指向附录的链接来标记在特定正文幻灯片之后有一个或多个附录幻灯片,从而允许演示者选择性地绕行附录部分。(显然会有一些副作用,例如宏引用将反映附录时的状态,而不是插入的位置。)
我曾尝试实现一个宏,将标记的内容写入辅助文件(或将它们保存在内存中),然后在附录中重现它们(不必担心重现文档结构)。但是 - 唉! - 我失败了,很想看到其他人贡献这个功能,或者给我一些基础模块让我自己实现。(我缺少的主要基础模块是将内容逐字逐句地写入文件。)
答案1
该beamersubframe
包提供了一种方便的方法来将帧移动到备份而无需移动实际代码:
\documentclass{beamer}
\usepackage[append]{beamersubframe}
\begin{document}
\begin{frame}
abc
\end{frame}
\begin{subframe}
moved to appendix
\end{subframe}
\begin{frame}
abc
\end{frame}
\appendix
\appendsubframes
\end{document}
对于部分导航等,来自父部分的导航将显示在“附加的”框架上。
有关创建便捷的附加框架导航的详细信息,请参阅包文档。
答案2
这是我的解决方案。可能不太好,但对我来说有效。
% Moving slides to appendix
% Define a variable to store everything to move
\newcommand{\backupSlides}{}
% Define command to append text to backup variable
\newcommand{\backup}[1]{
\expandafter\def\expandafter\backupSlides\expandafter{\backupSlides#1}
}
要附加框架,只需将其放入备份命令中:
\backup{
\begin{frame}...\end{frame}
}
在文档末尾添加(一次添加适用于所有框架):
\backupSlides
答案3
这是第一次尝试,似乎提供了部分克隆和移动到附录的功能(尽管我更改了宏名称,使其更加自我记录)。但我对 TeX 宏黑客非常不熟悉,我希望得到一些建议,使其更加惯用、安全且功能齐全。
更新:这似乎为我创建了各种各样的渲染错误,尤其是任何\hline
从我的附录中消失的错误tabular
,所以我真的很想看到一个真正的 TeX/Beamer 黑客重写它。
\documentclass{beamer}
\usepackage{verbatim}
\makeatletter
\newwrite\appendix@out
\immediate\openout\appendix@out\jobname.adx
\newcommand\toappendix{\obeylines\expandafter\toappendixArg\noexpand}
\newcommand\toappendixArg{
\begingroup
\@bsphack%
\let\do\@makeother\dospecials%
\catcode`\^^M\active%
\def\verbatim@processline{%
\immediate\write\appendix@out{\the\verbatim@line}}%
\verbatim@start}
\def\endtoappendix{\endgroup}
\let\oldAppendix\appendix
\def\appendix{\immediate\closeout\appendix@out\@esphack\oldAppendix}
\def\makeappendix{\input{\jobname.adx}}
\let\oldSection\section
\renewcommand\section[1]{%
\immediate\write\appendix@out{\unexpanded{\oldSection{#1}}}\oldSection{#1}}
\let\oldSubsection\subsection
\renewcommand\subsection[1]{%
\immediate\write\appendix@out{\unexpanded{\oldSubsection{#1}}}\oldSubsection{#1}}
\makeatother
\begin{document}
\section{Hello world}
\begin{frame}{1}\end{frame}
\begin{toappendix}
\begin{frame}{2}\end{frame}
\end{toappendix}
\begin{frame}{3}\end{frame}
\section{Farewell world}
\begin{toappendix}
\begin{frame}{4}\end{frame}
\end{toappendix}
\begin{frame}{5}\end{frame}
\appendix
\makeappendix
\end{document}
答案4
这是一个想法
\documentclass{beamer}
\newwrite\mtwrite
\immediate\openout\mtwrite=app\jobname
\newif\ifsec
\newif\ifsubsec
% this is not the best way to redefine (sub)section \command
\let\mtsection\section
\renewcommand{\section}[1]{%
\mtsection{#1}%
\def\mtsec{#1}%
\sectrue\subsecfalse}
\let\mtsubsection\subsection
\renewcommand{\subsection}[1]{%
\mtsubsection{#1}%
\def\mtsubsec{#1}%
\subsectrue}
\makeatletter
\newcommand{\appendixify}[1]{%
\ifsec
\immediate\write\mtwrite{\string\section{\mtsec}}
\secfalse\fi%
\ifsubsec
\immediate\write\mtwrite{\string\subsection{\mtsubsec}}
\subsecfalse\fi%
\immediate\write\mtwrite{\unexpanded{#1}}}
\makeatother
\begin{document}
\begin{frame}
\tableofcontents
\end{frame}
\section{Hello world}
\subsection{and hellow}
\begin{frame}{1}\end{frame}
\begin{frame}{2}\end{frame}
\section{Farewell world}
\appendixify{\begin{frame}{3}\end{frame}}
\begin{frame}{4}\end{frame}
\subsection{and world}
\appendixify{\begin{frame}{5}\end{frame}}
\begin{frame}{6}\end{frame}
\section{Last word}
\subsection{and last}
\appendixify{\begin{frame}{7}\end{frame}}
\subsection{and last end}
\begin{frame}{8}\end{frame}
\begin{frame}{9}\end{frame}
\immediate\closeout\mtwrite
\let\section\mtsection
\let\subsection\mtsubsection
\input{app\jobname}
\end{document}
如果将内容保存到 toks 或宏中而不是写入外部文件,那就更好了。