如何防止 Beamer 在框架中断时重复扩展 \frametitle 中的宏

如何防止 Beamer 在框架中断时重复扩展 \frametitle 中的宏

以下 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}

在此处输入图片描述

相关内容