我想在每一帧结束时运行一个命令(将页面范围写入文件)。
我可以使用 捕获框架从一开始启动的页面\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