在每一帧/幻灯片开始之前运行宏?

在每一帧/幻灯片开始之前运行宏?

我有一个宏,我想在每个新的 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}环境。

相关内容