在 beamer 中合并标签和允许帧中断 class

Combine labels and allowframebreaks in beamer class

对于我的 latex beamer 演示文稿,我使用了带有短、长和两者的标签系统,以便在短演示文稿和长演示文稿之间快速切换。

为此,我使用代码 \includeonlyframes{both,short}(对于简短的演示文稿,同样的 \includeonlyframes{both,long} 对于长的演示文稿)在序言中,并为每张幻灯片添加标签,如下所示:

\begin{frame}[label=both]

这个系统过去对我来说还算不错,但也带来了一些问题。我要解决的一个问题是我的参考文献超过了一张幻灯片。我尝试使用 allowframebreaks 来解决这个问题,所以这里是我的参考幻灯片的代码:

\begin{frame}[allowframebreaks,label=both]    
\frametitle{References}

\tiny    
    \bibliographystyle{apalike}    
    \bibliography{references}

\end{frame}

现在发生的是第一张参考幻灯片按预期显示,但其余的不是 pdf 的一部分。我想发生的事情是标签只应用于第一张幻灯片,因此由于我在序言中的 \includeonlyframes 命令,剩余的参考幻灯片已生成,但未包含在 pdf 中。有谁知道我该如何解决这个问题?

此外,这是我第一次 post 来这里,如果有什么 unclear/badly 解释等,请告诉我

编辑:这是一个最小的工作示例。我通常使用 natbib,但这不适用于我在此处使用的示例参考书目。问题仍然存在,所以我不认为 natbib 与它有任何关系。

\documentclass{beamer} 
%\usepackage{natbib}
\includeonlyframes{both,short}

\begin{document}

\begin{frame}[label=both] 
\frametitle{Frametitle} 
Some content for both presentations 
\end{frame}

\begin{frame}[label=short] 
\frametitle{Frametitle}
Some content for a short presentation 
\end{frame}

\begin{frame}[label=long] 
\frametitle{Frametitle}
Some content for a long presentation 
\end{frame}

\begin{frame}[label=long] 
\frametitle{Frametitle}
Some more content for a long presentation 
\end{frame}

\begin{frame}[allowframebreaks,label=both] 
\frametitle{References}
 %\tiny 
\nocite{*}
\bibliographystyle{apalike}
%\bibliography{references} \bibliography{xampl}
\end{frame}

\end{document}

您可以使用与 https://tex.stackexchange.com/a/289637 中类似的方法并将其更新为使用 \beamer@@@@frame 的当前实现:

\documentclass{beamer}
\makeatletter
\def\beamer@@@@frame<#1>[#2]{%
  \framewidth\textwidth
  \beamer@savemode%
  \gdef\beamer@mode{\mode<all>}%
  \def\beamer@frametemplate{}%
  \def\beamer@againname{}%
  \def\beamer@undolabels{}%
  \def\beamer@cramped{}%
  \def\beamer@displaybreak{}%
  \setbox\beamer@footins=\box\voidb@x%
  \beamer@autobreakcount=0\relax%
  \beamer@autobreaklastheight=16000pt%
  \beamer@zoomcount=0\relax%
  \beamer@noframenumberingfalse%
  \beamer@containsverbatimfalse%
  \beamer@isfragilefalse%
  \beamer@autobreakfalse%
  \beamer@shrinkfalse%
  \beamer@plainframefalse%
  \global\advance\beamer@zoomframecount by1\relax%
  \csname beamer@dosecondmode\beamer@defaultdosecondmode\endcsname%
  \ifbeamer@centered\setkeys{beamerframe}{c}\else\setkeys{beamerframe}{t}\fi%
  \setkeys{beamerframe}{environment=frame}%
  \setkeys{beamerframe}{#2}%
  \beamer@frametemplate%
  \ifbeamer@noframenumbering%
    \ifbeamer@isfragile%Fragile frames will be processed twice
      \stepcounter{framenumber}%
    \fi%
  \else%
    \stepcounter{framenumber}%do not set \label here - it interferes with AtBegin*
  \fi%
  {\let\@elt\beamer@savecounter\beamer@overlaycounterresets}
  \gdef\beamer@framestartpage{}%
  \gdef\beamer@whichframes{#1}%
  \ifx\beamer@framerestriction\@undefined\else% restriction stuff
    \expandafter\beamer@checkifinlist\beamer@framerestriction\relax%
  \fi%
  \ifbeamer@inlecture%
  \else%
    \gdef\beamer@whichframes{all:0}%
  \fi%
  \ifx\beamer@againname\@empty%
    \beamer@slideinframe=0\relax%
    \beamer@anotherslidefalse%
    \beamer@masterdecode{\beamer@whichframes}%
    \ifbeamer@anotherslide%
        \let\beamer@howtotreatframe\beamer@doseveralframes%
      \ifbeamer@containsverbatim%
        \let\beamer@howtotreatframe\beamer@dosingleframe%
      \fi%
      \ifbeamer@autobreak%
        \let\beamer@howtotreatframe\beamer@autobreakframe%
      \fi%
      \ifbeamer@isfragile%
        \let\beamer@howtotreatframe\beamer@doexternalframe%
      \fi%
    \else% no slides in frame
      \let\beamer@howtotreatframe\beamer@donoframe%
    \fi%
  \else% again mode
    \let\beamer@howtotreatframe\beamer@doseveralframes%
    \ifbeamer@isfragile%
      \let\beamer@howtotreatframe\beamer@doexternalframe%
    \fi%
    \ifbeamer@containsverbatim
      \let\beamer@howtotreatframe\beamer@dosingleframe
    \fi
    \beamer@slideinframe=0\relax%
    \beamer@anotherslidefalse%
    {\beamer@masterdecode{\beamer@whichframes}}%
    \message{^^J^^J \beamer@againname:\beamer@whichframes ^^J^^J}
    \ifbeamer@anotherslide%
      \message{^^J^^J \beamer@againname:I am Here ^^J^^J}
      \ifbeamer@autobreak%
        \let\beamer@howtotreatframe\beamer@autobreakframe%
      \fi%
    \fi    
  \fi%
  \beamer@howtotreatframe}
\makeatother

\includeonlyframes{both,long}


\begin{document}

\begin{frame}[allowframebreaks,label=both]   
\nocite{*} 
\frametitle{References}

%\tiny    
    \bibliographystyle{apalike}    
    \bibliography{\jobname}

\end{frame}

\begin{frame}[label=long]
content...
\end{frame}

\end{document}