(这是上一个问题得到了答复,但提出了这里提出的新问题)
目标
鉴于(据我所知)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
。这样做并不是不好,但如果不需要,会更容易。
该解决方案可让您获得
通过使用\includeonlylecture{firstChapter}
或
通过注释掉该命令。如果我理解正确的话,它应该可以像您尝试创建的命令一样工作。
以下是代码:
\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}