为什么使用标签选项时框架选项 allowframebreaks 不起作用?

为什么使用标签选项时框架选项 allowframebreaks 不起作用?

label当使用MWE 中的参数进行编译时,allowframebreaks不起作用。为什么?

frame将框架标题设置为参数和使用之间有什么区别吗\frametitle

\documentclass{beamer}
\usetheme{Warsaw}
\usepackage{blindtext}
\begin{document}

\begin{frame}[allowframebreaks,label=frame1]{Title}
%\frametitle{Title}
\framesubtitle{Sub-title}
\blindtext
Text........ Text........ Text........ Text........ Text........
Text........ Text........ Text........ Text........ Text........
Text........ Text........ Text........ Text........ Text........ 
Text........ Text........ Text........ Text........ Text........ 
\end{frame}

\end{document}

答案1

frame将标题设置为参数和使用之间可能会有差异,\frametitle如果 TeX 找到的下一个内容是,{因为这将被解释为框架字幕的开始或框架内容的开始。

例如

\documentclass{beamer}
\usetheme{Warsaw}
\usepackage{blindtext}
\begin{document}
\begin{frame}{Title}{\centering A sunny day\par}And a gloomy one.
\end{frame}
\begin{frame}\frametitle{Title}{\centering A sunny day\par}And a gloomy one.
\end{frame}
\end{document}

演示了使用参数之间的区别frame

作为参数

并使用宏

作为宏


在中beamerbaseframe.sty,我们发现

\define@key{beamerframe}{label}{\def\beamer@againname{#1}%
  {\let\@elt\beamer@labelsavecounter\beamer@overlaycounterresets}%
}

beamerbaseframesize.sty显示allowframebreaks将切换设置beamer@autobreaktruebeamerbaseframe.sty例如,我们发现

\newenvironment{beamer@frameslide}{%
  \ifbeamer@autobreak\else% i.e. unless allowframebreaks is requested ...
    \ifx\beamer@againname\@empty% if label isn't set ...
      {\let\@elt\beamer@restorecounter\beamer@overlaycounterresets}%
    \else% otherwise i.e. we have label=<some label> ...
      {\let\@elt\beamer@labelrestorecounter\beamer@overlaycounterresets}%
    \fi%
  \fi%
  ...

因此,仅当未设置为时,才使用通过将label选项传递给环境来激活的机制。frameallowframebreakstrue

重要的是要理解,label选项并不等同于\label{}在任何时候说。label选项是为更复杂的事情而设计的。它的主要目的是支持\againframe。为此,它为当前帧的每张幻灯片命名。每张幻灯片也会获得一个标签。如果label=mylabel,则幻灯片会获得标签mylabel<1>mylabel<2>等等。为方便起见,在第一张幻灯片上设置了一个附加标签mylabel。因此,假设框架有n幻灯片,设置此选项相当于说

\label{mylabel}\label{mylabel<1>}% on the first slide
\label{mylabel<2>}% on the second slide
...
\label{mylabel<n>}% on the nth slide

allowframebreaks如果设置了,此机制就没有任何用处,因为在这种情况下覆盖被禁用。

当然,您可以对选项进行编码,以便如果allowframebreakstrue,则在第一帧上label发出问题\label{}。但是,这可能会造成混淆,因为这意味着该label选项会根据是否允许中断帧而激活非常不同的机制。

答案2

此问题已在提交中修复e2267ba-- 非常感谢@amonakov!

它应该包含在 beamer v3.72 或更新版本中。

相关内容