使 \includeonlylecture{} 仅忽略框架,而不忽略诸如部分之类的全局结构元素

使 \includeonlylecture{} 仅忽略框架,而不忽略诸如部分之类的全局结构元素

我目前正在准备讲义beamer。我将课程结构化为部分、章节等,并希望在整个课程中始终使用编号方案。无需进行大量手动复制和粘贴操作,这对我来说意味着整个课程的单个文件.tex(可能包含一些部分)是最佳解决方案。但这当然意味着 LaTeX 总是必须处理很多东西,而我总是得到包含整个课程的 PDF,这并不实际。

为了解决这个问题,beamer课堂上有\lecture命令和附带的\includeonlylecture命令。但是,如果我使用这个,我的结构就会被破坏,因为 Latex 将忽略当前讲座之外的所有结构元素(部分、章节等),为每个讲座生成新的编号。安德鲁的回答整个课程均由 Beamer 提供提供了一种更为严格的机制方法\lecture,但它也会忽略一切。

因此我的问题是:我怎样才能\includeonlylecture{}只忽略\frame命令和框架环境?

以下是 MWE 的尝试:

\documentclass[11pt, t, xcolor=dvipsnames, utf8x]{beamer}
\includeonlylecture{day2}

\begin{document}
\lecture{27. April 2014}{day1}
\part{one}
  \frame{Ignore this....}
  \section{one-one}
\lecture{24. April 2014}{day2}
  \section{one-two}
  \frame{Use this frame and let it be in section one-two}
\part{two}
\end{document}

答案1

我自己找到了一个解决方案。基本上,它重新定义了 beamer 的 \beamer@section 等宏,这样即使不在当前讲座中,在节(或部分或子节)开始时执行的大部分操作也已完成。

以下是各部分的代码(其他两个非常相似):

\long\def\beamer@section[#1]#2{%
  \beamer@savemode%
  \mode<all>%
    \refstepcounter{section}%
    \beamer@ifempty{#2}%
    {\long\def\secname{#1}\long\def\lastsection{#1}}%
    {\global\advance\beamer@tocsectionnumber by 1\relax%
      \long\def\secname{#2}%
      \long\def\lastsection{#1}%
      \addtocontents{toc}{\protect\beamer@sectionintoc{\the\c@section}{#2}{\the\c@page}{\the\c@part}%
        {\the\beamer@tocsectionnumber}}}%
    {\let\\=\relax\xdef\sectionlink{{Navigation\the\c@page}{\noexpand\secname}}}%
    \beamer@tempcount=\c@page\advance\beamer@tempcount by -1%
    \beamer@ifempty{#1}{}{%
      \addtocontents{nav}{\protect\headcommand{\protect\sectionentry{\the\c@section}{#1}{\the\c@page}{\secname}{\the\c@part}}}%
      \addtocontents{nav}{\protect\headcommand{\protect\beamer@sectionpages{\the\beamer@sectionstartpage}{\the\beamer@tempcount}}}%
      \addtocontents{nav}{\protect\headcommand{\protect\beamer@subsectionpages{\the\beamer@subsectionstartpage}{\the\beamer@tempcount}}}%
    }%
    \beamer@sectionstartpage=\c@page%
    \beamer@subsectionstartpage=\c@page%
    \def\insertsection{\expandafter\hyperlink\sectionlink}%
    \def\insertsubsection{}%
    \def\insertsubsubsection{}%
    \def\insertsectionhead{\hyperlink{Navigation\the\c@page}{#1}}%
    \def\insertsubsectionhead{}%
    \def\insertsubsubsectionhead{}%
    \def\lastsubsection{}%
    \Hy@writebookmark{\the\c@section}{\secname}{Outline\the\c@part.\the\c@section}{2}{toc}%
    \hyper@anchorstart{Outline\the\c@part.\the\c@section}\hyper@anchorend%
  \ifbeamer@inlecture
    \beamer@ifempty{#2}{\beamer@atbeginsections}{\beamer@atbeginsection}%
  \fi%
  \beamer@resumemode}%

当我们不在当前讲座中时,唯一省略的是 \AtBeginSection 类型宏的执行。

该解决方案效果很好,因为当前讲座之前的所有部分、章节和小节都添加到了目录中。因此,我可以在整个讲座中保持一致的章节编号方案。但是,对我来说,当前讲座之后的所有全局结构元素都没有添加,这似乎有点奇怪。这其实并不麻烦,但我记得它曾经在那里,但现在它不见了。

相关内容