我今天遇到了这个错误,这是一个最小的例子:
\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}
但是,最好的做法是不要使用没有前一节的小节(无论如何,使用没有节的小节没有多大意义)。