在每个帧结束时运行命令

在每个帧结束时运行命令

我想在每一帧结束时运行一个命令(将页面范围写入文件)。

我可以使用 捕获框架从一开始启动的页面\AtBeginEnvironment{frame}{\global\edef\framebeginpage{\thepage}}

但是如果我尝试在框架末尾写入页面范围,它就不起作用:似乎\AtEndEnvironment{frame}{\immediate\write\notesfile{\framebeginpage-\thepage}}没有执行。

我能做些什么吗?

最小二乘法:

\documentclass{beamer}

\usepackage{etoolbox}

\newwrite\notesfile
\AtBeginEnvironment{frame}{\global\edef\framebeginpage{\thepage}}
\AtEndEnvironment{frame}{\immediate\write\notesfile{\framebeginpage-\thepage}}


\begin{document}
\immediate\openout\notesfile=frames.txt
\immediate\write\notesfile{Begin}

\begin{frame}
    \begin{itemize}[<+->]
        \item foo
        \item bar
        \item baz
    \end{itemize}
\end{frame}

\begin{frame}
    \begin{itemize}[<+->]
        \item foo
        \item bar
        \item baz
    \end{itemize}
\end{frame}

\immediate\write\notesfile{End}
\immediate\closeout\notesfile
\end{document}

答案1

这就是beamer基础框架模板 -beamerbaseframe.sty- 关于frame“环境”:

% Normally not executed; only in containsverbatim context:
\def\endframe{\egroup\begingroup\def\@currenvir{frame}}

因此,如果您尝试利用\end{frame},结果可能不会如预期。相反,您必须深入挖掘一些内部beamer细节,找到可以将内容写入文件的位置。以下补丁抓住了适当的位置:

\documentclass{beamer}

\usepackage{etoolbox}

\newwrite\notesfile
\AtBeginEnvironment{frame}{\global\edef\framebeginpage{\arabic{page}}}
\makeatletter
\patchcmd{\beamer@doseveralframes}% <cmd>
  {\beamer@reseteecodes}% <search>
  {\beamer@reseteecodes\immediate\write\notesfile{\framebeginpage-\number\numexpr\value{page}-1\relax}}% <replace>
  {}{}% <success><failure>
\makeatother


\begin{document}
\immediate\openout\notesfile=frames.txt
\immediate\write\notesfile{Begin}

\begin{frame}
    \begin{itemize}[<+->]
        \item foo
        \item bar
        \item baz
    \end{itemize}
\end{frame}

\begin{frame}
    \begin{itemize}[<+->]
        \item foo
        \item bar
        \item baz
    \end{itemize}
\end{frame}

\immediate\write\notesfile{End}
\immediate\closeout\notesfile

\end{document}

输出文件frames.txt显示

Begin
1-3
4-6
End

答案2

您可以创建一个wframe环境来进行写作。已编辑以更正\thepage一个人的陈述。

\documentclass{beamer}
\usepackage{etoolbox}

\newcounter{tmpcnt}
\newwrite\notesfile
%\AtBeginEnvironment{frame}{\global\edef\framebeginpage{\thepage}}
%\AtEndEnvironment{frame}{\immediate\write\notesfile{\framebeginpage-\thepage}}
\newenvironment{wframe}{\global\edef\framebeginpage{\thepage}\begin{frame}}
    {\end{frame}\setcounter{tmpcnt}{\thepage}\addtocounter{tmpcnt}{-1}%
  \immediate\write\notesfile{\framebeginpage-\thetmpcnt}}

\begin{document}
\immediate\openout\notesfile=frames.txt
\immediate\write\notesfile{Begin}

\begin{wframe}
    \begin{itemize}[<+->]
        \item foo
        \item bar
        \item baz
    \end{itemize}
\end{wframe}

\begin{wframe}
    \begin{itemize}[<+->]
        \item foo
        \item bar
        \item baz
    \end{itemize}

\end{wframe}

\immediate\write\notesfile{End}
\immediate\closeout\notesfile
\end{document}

frames.txt结果的内容是

Begin
1-3
4-6
End

相关内容