我想做一个投影仪演示,其中每一个框架出现在 PDF 目录中(即带有书签)。我的具体演示文稿只有部分,因此所有框架都可以作为 PDF 上的“子部分”出现。请注意,我不想为每个框架创建一个子部分。
一种方法是编写一个命令,通过调用 hyperref 的相应书签命令来修补 frametitle。还有更好的方法吗?
答案1
这里有一个解决方案,它修补了一个辅助宏\frametitle
,添加了代码,该代码将添加书签和目录行,就好像它是一个小节一样(如果不需要,您可以将其注释掉):
\documentclass{beamer}
\AtBeginSection{\frame{\tableofcontents[currentsection]}}
\usepackage{bookmark}
\usepackage{etoolbox}
\makeatletter
% save the current definition of \beamer@@frametitle
\let\nobookmarkbeamer@@frametitle\beamer@@frametitle
% then patch it to do the bookmarks and/or TOC entries
\apptocmd{\beamer@@frametitle}{%
% keep this to add the frame title to the TOC at the "subsection level"
\addtocontents{toc}{\protect\beamer@subsectionintoc{\the\c@section}{0}{#1}{\the\c@page}{\the\c@part}%
{\the\beamer@tocsectionnumber}}%
% keep this line to add a bookmark that shows up in the PDF TOC at the subsection level
\bookmark[page=\the\c@page,level=3]{#1}%
}%
{\message{** patching of \string\beamer@@frametitle succeeded **}}%
{\errmessage{** patching of \string\beamer@@frametitle failed **}}%
\pretocmd{\beamer@checknoslide}{%
% ensure the bookmark is not created if the slide is filtered out
\let\beamer@@frametitle\nobookmarkbeamer@@frametitle
}%
{\message{** patching of \string\beamer@checknoslide succeeded **}}%
{\errmessage{** patching of \string\beamer@checknoslide failed **}}%
\makeatother
\begin{document}
\section{First Section}
\begin{frame}{First frame}Text\end{frame}
\begin{frame}{Second frame}Text\end{frame}
\section{Second Section}
\begin{frame}{Third frame}Text\end{frame}
\begin{frame}\frametitle{Fourth frame}Text\end{frame}
\begin{frame}<handout>\frametitle{Fifth frame}Text\end{frame}
\end{document}
我不得不深入研究beamerbasesection.sty
才能弄清楚。但它似乎有效。
编辑。(由 cyberSingularity 提供):现在,当幻灯片未显示时,可以通过修补来防止不需要的书签\beamer@checknoslide
,并提供额外的框架进行测试。
注意:如果存在包含多张幻灯片的框架(例如由于\pause
s),您可能还会对以下内容感兴趣这个后续问题。