我想知道是否有一些宏可以用来拍摄整个 Beamer 帧(在其最后一张幻灯片中)的快照,并在另一帧中重复使用它。以下代码不起作用,只是为了说明这个想法。
\documentclass{beamer}
\begin{document}
\begin{frame}
\mymacro{
%normal frame content goes here
}
\end{frame}
\begin{frame}
\insertmymacro[scale=.30] %this will insert the snapshot of the previous frame, possibly scaled
\end{frame}
\end{document}
如果已拍摄了多张快照,还应该有一种方法来告诉宏必须插入哪一帧。
类似的东西已经存在了吗?
答案1
在这里,我将第一帧保存在命名的 中\vbox
。然后我可以使用 调用内容(按原样,或缩放和框架化)\usebox
。
我必须水平地填充一点保存的框;我认为需要填充是因为\vbox
宽度是\textwidth
,而幻灯片的宽度比宽度要宽。
已编辑,以删除杂散的空白帧。
手册版本:
\documentclass{beamer}
\newsavebox\saveframe
\fboxsep=0pt
\begin{document}
%SAVE-FRAME
\savebox{\saveframe}{\vbox{
\begin{frame}
{1st Frame}
frame text from the first frame. I will now begin an itemized list. And we begin:
\begin{itemize}
\item AAA
\item BBB
\item CCC
\end{itemize}
\end{frame}}}
%PRESENT THE SAVE-FRAME AS IS
\begin{frame}
\usebox{\saveframe}
\end{frame}
%PRESENT THE 2ND FRAME INCLUDING A SCALED SAVE-FRAME
\begin{frame}
{2nd frame}
Here is my prior frame\par
\fbox{\scalebox{.6}{\hspace{1cm}\usebox{\saveframe}\hspace{1cm}}}
\end{frame}
\end{document}
自动化版本:
如果希望自动装箱,我会sframe{}
在以下 MWE 中提供环境来输出和保存帧。A{title}
是环境的强制参数。可以使用在环境\savedframe{scale}
内调用的获得已保存帧的装箱、缩放版本frame
。以下 MWE 的行为与上面的手动版本相同。
\documentclass{beamer}
\global\newsavebox\thesaveframe
\newenvironment{sframe}[1]%
{\setbox0=\vbox\bgroup\begin{frame}{#1}}
{\end{frame}\leavevmode\unskip\setbox0=\lastbox \egroup%
\global\sbox{\thesaveframe}{\box0}
\begin{frame}\usebox{\thesaveframe}\end{frame}
}
\newcommand\savedframe[1]{\fboxsep=0pt%
\fbox{\scalebox{#1}{\hspace{1cm}\usebox{\thesaveframe}\hspace{1cm}}}%
}
\begin{document}
%SAVE-FRAME AND OUTPUT IT
\begin{sframe}{1st Frame}
frame text from the first frame. I will now begin an itemized list. And we begin:
\begin{itemize}
\item AAA
\item BBB
\item CCC
\end{itemize}
\end{sframe}
%PRESENT THE 2ND FRAME INCLUDING A SCALED SAVE-FRAME
\begin{frame}
{2nd frame}
Here is my prior frame\par
\savedframe{.6}
\end{frame}
\end{document}
答案2
我今天也需要这个,并且我对史蒂文的回答进行了一些扩展,定义了两个命令,允许您立即保存和使用多个帧,然后稍后重新使用它们:
% \saveuseframe{id}{...} saves a frame to \saveid and uses it immediately, to be reused with \reuseframe{id}
\newcommand{\saveuseframe}[2]{%
\expandafter\newsavebox\csname save#1\endcsname%
\expandafter\savebox\csname save#1\endcsname{\vbox{\vspace{-.1em}#2}}%
\begin{frame}\expandafter\usebox\csname save#1\endcsname\end{frame}}
\newcommand{\reuseframe}[1]{\fbox{\scalebox{.25}{\hspace{.9cm}\expandafter\usebox\csname save#1\endcsname\hspace{.8cm}}}}
这使您可以这样做:
\savedframe{motivation}{\begin{frame}{Motivation}
why?
\end{frame}}
... more stuff ...
\savedframe{future}{\begin{frame}{Future work}
future stuff
\end{frame}}
\begin{frame}{Thank you!}
\reuseframe{motivation}
\reuseframe{future}
\end{frame}
答案3
对于需要再次插入前一帧的特殊情况,可以使用宏\insertslideintonotes{<scale>}
:
\documentclass{beamer}
\makeatletter
\edef\beamer@origlmargin{\Gm@lmargin}%
\edef\beamer@origrmargin{\Gm@rmargin}%
\makeatother
\begin{document}
\begin{frame}
normal frame
\end{frame}
\begin{frame}
\insertslideintonotes{0.3}
\end{frame}
\end{document}
如果要保存所讨论的框架以供以后重复使用,可以执行以下操作:
\documentclass{beamer}
\makeatletter
\edef\beamer@origlmargin{\Gm@lmargin}%
\edef\beamer@origrmargin{\Gm@rmargin}%
\makeatother
\newsavebox{\mybox}
\begin{document}
\begin{frame}
interesting frame
\end{frame}
\savebox{\mybox}{\insertslideintonotes{0.3}}
\begin{frame}
some other stuff
\end{frame}
\begin{frame}
\usebox{\mybox}
\end{frame}
\end{document}