我有一个宏,我想在每个新的 beamer 帧之前运行它。我可以只定义一个myframe
运行该宏的环境,然后启动一个标准帧,但如果可以的话,我宁愿以不同的方式执行。
Beamer 具有简洁的\AtBeginSection
功能,但我是否可以认为没有类似的产品\AtBeginFrame
......
如果我在设置每个之前真的想做点什么,情况会有所不同吗?滑动?[编辑:我问这最后一部分是为了单独问题]
答案1
使用修补工具etoolbox
来做\frame
你想做的事情。
由于\frame
没有参数,所以你似乎想要这样做
\preto\frame{\foo}
这将导致\foo
在框架之前发生。
如果您希望在完成所有参数处理后发生一些事情,那么事情就会变得更加复杂,因为看起来 beamer 会遵循许多不同的路径。(我有点放弃了,\beamer@@@@frame
然后\beamer@howtotreatframe
根据某些条件以多种不同的方式进行设置。)
这是一个简单的例子:
\documentclass{beamer}
\usepackage{etoolbox}
\preto\frame{\typeout{Starting new frame.}}
\begin{document}
\begin{frame}
asdf
\end{frame}
\begin{frame}
asdf
\end{frame}
\end{document}
答案2
听起来像是\BeforeBeginEnvironment
\documentclass{beamer}
\usepackage{etoolbox}
\BeforeBeginEnvironment{frame}{\typeout{Starting new frame.}}
\begin{document}
\begin{frame}
asdf
\end{frame}
\begin{frame}
asdf
\end{frame}
\end{document}
答案3
旧帖子,但我一直在寻找类似的东西并且想出了一个很好的解决方案,不需要任何额外的包,所以我想分享它。
对于每个框架,而不是幻灯片,你可以在序言中放入类似以下内容的内容:
\let\oldframe\frame
\def\frame{\yourmacro\oldframe}
关键是\frame
宏非常脆弱,它会解析其后的选项,因此附加某些内容\frame
将不起作用。这将让你前置不会\frame
干扰宏的正常行为。
另请注意,这将影响\frame{...}
命令和\begin{frame}...\end{frame}
环境。