Beamer 缺少部分导致未定义的控制序列错误

Beamer 缺少部分导致未定义的控制序列错误

我今天遇到了这个错误,这是一个最小的例子:

\documentclass[]{beamer}

\begin{document}
% \section{A section}
\subsection{A subsection}

\begin{frame}  
\frametitle{Cursed frame}
This is awkward.
\end{frame}

\end{document}

编译结果为:Undefined control sequence. [\end{frame}] 显然,声明一个没有节的子节会导致错误出现,因为删除注释会使错误消失。

同样奇怪的是,尽管有错误,但.pdf在两种情况下都能正常生成。我想知道为什么会发生这种情况,因为在其他文档中,没有章节的小节从来都不是问题。这是错误还是功能?

答案1

作为约瑟夫·赖特提到过他的评论,分段单元必须适当嵌套这一事实是Till Tantau的设计选择。

您可以在下面使用的\beamer@subsection(在 中给出)定义中找到导致您遇到错误的“元凶” :beamerbasesection.sty\subsection

    \Hy@writebookmark{\the\c@subsection}{#2}{Outline\the\c@part.\the\c@section.\the\c@subsection.\the\c@page}{3}{toc}%

使用原始定义并注释掉提到的行,可消除错误:

\documentclass[]{beamer}

\makeatletter
\def\beamer@subsection[#1]#2{%
  \beamer@savemode%
  \mode<all>%
  \ifbeamer@inlecture%
    \refstepcounter{subsection}%
    \beamer@ifempty{#2}{\long\def\subsecname{#1}\long\def\lastsubsection{#1}}
    {%
      \long\def\subsecname{#2}%
      \long\def\lastsubsection{#1}%
      \addtocontents{toc}{\protect\beamer@subsectionintoc{\the\c@section}{\the\c@subsection}{#2}{\the\c@page}{\the\c@part}{\the\beamer@tocsectionnumber}}%
    }%
    \beamer@tempcount=\c@page\advance\beamer@tempcount by -1%
    \addtocontents{nav}{%
      \protect\headcommand{\protect\beamer@subsectionentry{\the\c@part}{\the\c@section}{\the\c@subsection}{\the\c@page}{\lastsubsection}}%
      \protect\headcommand{\protect\beamer@subsectionpages{\the\beamer@subsectionstartpage}{\the\beamer@tempcount}}%
    }%
    \beamer@subsectionstartpage=\c@page%
    \edef\subsectionlink{{Navigation\the\c@page}{\noexpand\subsecname}}%
    \def\insertsubsection{\expandafter\hyperlink\subsectionlink}%
    \def\insertsubsubsection{}%
    \def\insertsubsectionhead{\hyperlink{Navigation\the\c@page}{#1}}%
    \def\insertsubsubsectionhead{}%
    %\Hy@writebookmark{\the\c@subsection}{#2}{Outline\the\c@part.\the\c@section.\the\c@subsection.\the\c@page}{3}{toc}%
    \hyper@anchorstart{Outline\the\c@part.\the\c@section.\the\c@subsection.\the\c@page}\hyper@anchorend%
    \beamer@ifempty{#2}{\beamer@atbeginsubsections}{\beamer@atbeginsubsection}%
  \fi%
  \beamer@resumemode}
\makeatother
\begin{document}
\section{A section}
\subsection{A subsection}

\begin{frame}  
\frametitle{Cursed frame}
This is awkward.
\end{frame}

\end{document}

但这样做当然是不可取的,因为它会弄乱书签。

防止错误的另一种方法是加载bookmark包:

\documentclass[]{beamer}
\usepackage{bookmark}

\begin{document}
% \section{A section}
\subsection{A subsection}

\begin{frame}  
\frametitle{Cursed frame}
This is awkward.
\end{frame}

\end{document}

但是,最好的做法是不要使用没有前一节的小节(无论如何,使用没有节的小节没有多大意义)。

相关内容