以下 latex 源生成两个 pdf 页面。第 1 页的标题为“练习 1 I”,第 2 页的标题为“练习2二"。
\documentclass[t]{beamer}
\let\Tiny=\tiny
\newcounter{mycounter}
\setcounter{mycounter}{0}
\def\exercise{\refstepcounter{mycounter}Exercise \arabic{mycounter}}
\begin{document}
\begin{frame}[allowframebreaks]
\frametitle{\exercise} % this seems expanded in each frame
ABC
\framebreak
DEF
\end{frame}
\end{document}
结果第 1 页是
Exercise 1 I
ABC
和第 2 页
Exercise 2 II % I want Exercise 1 II
DEF
\refstepcounter{mycounter}
我想要第 2 页上的“练习 1 II”。一种方法是从宏中删除\exercise
,然后在外面手动执行\refstepcounter
。这很麻烦,而且我会犯错误。有没有更好的方法?
答案1
\beamer@autobreakcount
只有当该计数器的数值小于 2 时(通常为零,但在allowframebreaks
发出时变为 1),您才可以使用该计数器并进行步进。
\documentclass[t]{beamer}
\let\Tiny=\tiny
\newcounter{mycounter}
\makeatletter
\newcommand\exercise{%
\ifnum\beamer@autobreakcount<2
\refstepcounter{mycounter}%
\fi
Exercise \themycounter
}
\makeatother
\begin{document}
\begin{frame}[allowframebreaks]
\frametitle{\exercise} % this seems expanded in each frame
ABC
\framebreak
DEF
\end{frame}
\begin{frame}
\frametitle{\exercise}
GHI
\end{frame}
\end{document}
答案2
@gernot:使用 LaTeX 永远不要说永远 :)
基本思想是测试当前页面是否是框架的第一页,然后才增加计数器。
\documentclass[t]{beamer}
\let\Tiny=\tiny
\newcounter{mycounter}
\setcounter{mycounter}{0}
\makeatletter
\def\exercise{%
\ifnum\insertframestartpage=\thepage
\refstepcounter{mycounter}
\fi
Exercise \arabic{mycounter}%
}
\makeatother
\begin{document}
\begin{frame}[allowframebreaks]
\frametitle{\exercise} % this seems expanded in each frame
ABC
\framebreak
DEF
\end{frame}
\end{document}