Beamer:如果已定义则显示框架

Beamer:如果已定义则显示框架

在使用构建较大的演示文稿时beamer,我经常将它们拆分成几个文件,然后单独处理。为了 MWE,它可能看起来像这样:

\documentclass{beamer}

\begin{document}
\include{foo1}
\include{foo2}
\end{document}

其中foo1.tex包含

\begin{frame}[label=myslide]{Title}
  \begin{itemize}[<+->]
  \item One
  \item Two
  \end{itemize}
\end{frame}

看起来foo2.tex像这样:

\againframe<2>{myslide}

但是如果我现在将其添加\includeonly{foo2}到主文档中,我当然会得到一个错误。我通常会通过将的定义放在myslide第三个文件中来规避这些问题,使用我加载的foo0.tex覆盖说明符而不是通过在和中使用来加载。<0>inputincludeagainframefoo1.texfoo2.tex

然而,我想知道是否有某种 TeX 魔法可以让我说foo2.tex类似这样的话:“重复框架myslide 如果它已被定义,否则不执行任何操作”。

答案1

您可以用警告替换错误:

\documentclass{beamer}

\makeatletter
\def\beamer@@@againframe<#1>[#2][#3]#4{%
  \@ifundefined{beamer@again@#4}%
  {\ClassWarning{beamer}{No frame has been designated to resume under
      the name "#4"}{}}%
  {%
  \def\beamer@temp{\frame<#1>[#2][{#3,relabel=#4}]}%
  \expandafter\let\expandafter\beamer@templet\csname beamer@again@#4\endcsname%
  \expandafter\beamer@temp\beamer@templet}%
}
\makeatother

\begin{filecontents*}[overwrite]{foo1.tex}
\begin{frame}[label=myslide]{Title}
  \begin{itemize}[<+->]
  \item One
  \item Two
  \end{itemize}
\end{frame}
\end{filecontents*}

\begin{filecontents*}[overwrite]{foo2.tex}
\againframe<2>{myslide}
\begin{frame}
test
\end{frame}
\end{filecontents*}

\includeonly{foo2} 

\begin{document}



\include{foo1}
\include{foo2}
\end{document}

相关内容