为 Beamer 构建一种 \includeonlypart

为 Beamer 构建一种 \includeonlypart

(这是上一个问题得到了答复,但提出了这里提出的新问题)

目标

鉴于(据我所知)Beamer 没有提供仅包含特定内容的方法\part,我尝试自己做。

因此,如果确实有一种“自然”的方法可以做到这一点,那么以下所有讨论都是无用的。

我目前所做的

为了做到这一点,我建立一种动态的方式来为我的框架分配标签。因此,每个框架都有选项[labe=\partName]。我用设置此变量的内容\defPartName{partX},并在每个新部分之前更改它。因此,当我调用命令时\includeonlyframes{partX},将显示第 X 章的所有框架,并且只有它们。

对于框架的标准用法来说,它工作得很好。除了我还构建了自定义框架来介绍章节

而且这两个代码似乎不兼容。

问题

为了给我的框架分配动态标签(使用选项[label=\partName],我必须fragile向框架添加选项。它适用于标准框架,但不适用于章节框架宏内的框架。

如果您编译以下代码,它将起作用,但是由于您激活了该行\includeonlyframes{firstChapter},因此它会崩溃。

\documentclass{beamer}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Code for the dynamic labels
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\partName}{blank}
\newcommand {\defPartName}[1]{\renewcommand{\partName}{#1}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Code for the customized chapter frame
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\AtBeginPart{\begingroup
\advance\textwidth-2cm 
\hsize\textwidth
\columnwidth\textwidth
\begin{frame}[fragile, plain, label=\partName]
\begin{block}{}
\begin{center}
  \Huge Chapitre  \thepart \\
    \vspace{.5cm}
  \Large \insertpart
\end{center}
  \end{block}
  \tableofcontents
\end{frame}
\endgroup} 



%\includeonlyframes{firstChapter}
\begin{document}

\defPartName{firstChapter}
\part{first Part}
\begin{frame}[fragile,label=\partName]{A title}
The label of the current frame is \partName .
\end{frame}

\defPartName{secondChapter}
\begin{frame}[fragile,label=\partName]{A title}
The label of the current frame is \partName .
\end{frame}


\end{document}

如果我删除fragile章节框架的或标签选项,它会再次工作,它会显示预期的框架,但不显示章节框架。

我的问题

知道如何让这段代码工作吗?或者最终有这段代码的替代方案吗?

答案1

一种解决方案可能是使用讲座而不是部分。这样做的好处是beamer已经有命令可以选择性地包含讲座。此外,您不需要使用fragile或 定义自定义命令,例如\defPartName。这样做并不是不好,但如果不需要,会更容易。

该解决方案可让您获得

Only the first lecture

通过使用\includeonlylecture{firstChapter}

Both/All lectures

通过注释掉该命令。如果我理解正确的话,它应该可以像您尝试创建的命令一样工作。

以下是代码:

\documentclass{beamer}

\AtBeginLecture{\begingroup% use \AtBeginLecture rather than \AtBeginPart
\advance\textwidth-2cm
\hsize\textwidth
\columnwidth\textwidth
\begin{frame}[plain]% no need to label the frame, so no need for fragile
  \begin{block}{}
    \begin{center}
      \Huge Chapitre  \thelecture \\% use \thelecture rather than \thepart
        \vspace{.5cm}
      \Large \insertlecture% use \insertlecture rather than \insertpart
    \end{center}
  \end{block}
  \tableofcontents
\end{frame}
\endgroup}


\includeonlylecture{firstChapter}% to produce only the first lecture
\begin{document}

\lecture{First Lecture}{firstChapter}
\part{First Part}% you can use parts within lectures, if you wish
\begin{frame}{A title}
This frame needs no label as it is part of Lecture \thelecture, \insertlecture.
\end{frame}

\lecture{Second Lecture}{secondChapter}
\begin{frame}{A title}
This frame needs no label as it is part of Lecture \thelecture, \insertlecture.
\end{frame}


\end{document}

答案2

我不清楚你在做什么,为什么到处都有脆弱的框架。你不能将脆弱的框架作为宏的参数,所以你的 MWE 不起作用。你不需要使用脆弱的框架来定义动态标签,你只需要正确扩展。只要你的“部分”框架不需要脆弱,下面的 MWE 就可以完成我认为你想要完成的任务

\documentclass{beamer}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Code for the customized chapter frame
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\AtBeginPart{
\edef\partName{\beamer@partname}
\begingroup
\advance\textwidth-2cm 
\hsize\textwidth
\columnwidth\textwidth
\def\@tempa{\begin{frame}[plain, label=}
\expandafter\@tempa\partName]
\begin{block}{}
\begin{center}
  \Huge Chapitre  \thepart \\
    \vspace{.5cm}
  \Large \insertpart
\end{center}
  \end{block}
  \tableofcontents
\end{frame}
\endgroup} 
\makeatother


\includeonlyframes{firstChapter}
\begin{document}

\part{firstChapter}
\def\temp{\begin{frame}[label=}
\expandafter\temp\partName]{A title}
The label of the current frame is \partName .
\end{frame}

\begin{frame}[fragile,label=\partName]{B title}
The label of the current frame is \partName .
\end{frame}

\part{secondChapter}
\def\temp{\begin{frame}[label=}
\expandafter\temp\partName]{C title}
The label of the current frame is \partName .
\end{frame}
\begin{frame}[fragile,label=\partName]{D title}
The label of the current frame is \partName .
\end{frame}


\end{document}

相关内容