有一种方法可以使用 来制作目录\tableofcontents
,但是只有章节和小节。
如何在不使用分段的情况下获取所有框架的列表?
答案1
\@starttoc
以下是通过新定义的 \listofframes 命令使用该命令的简单方法;新列表将具有扩展名.lbf
。\addtobeamertemplate
被使用,以便frametitle
命令将所需的信息(帧编号和标题)写入文件.lbf
。 创建列表时发出\listofframes
:
\documentclass{beamer}
\makeatletter
\newcommand\listofframes{\@starttoc{lbf}}
\makeatother
\addtobeamertemplate{frametitle}{}{%
\addcontentsline{lbf}{section}{\protect\makebox[2em][l]{%
\protect\usebeamercolor[fg]{structure}\insertframenumber\hfill}%
\insertframetitle\par}%
}
\begin{document}
\begin{frame}
\frametitle{List of Frames}
\listofframes
\end{frame}
\begin{frame}
\frametitle{Test Frame One}
test
\end{frame}
\begin{frame}
\frametitle{Test Frame Two}
test
\end{frame}
\end{document}
以下是结果框架列表:
为了方便控制将哪些框架包含在新列表中,您可以使用布尔开关;在下面的例子中,我\ifframeinlbf
最初将其设置为 true;如果您想从框架列表中删除一些带标题的框架,请\frameinlbffalse
在这些框架之前使用,然后\frameinlbftrue
在框架之后使用以激活列表中的包含:
\documentclass{beamer}
\newif\ifframeinlbf
\frameinlbftrue
\makeatletter
\newcommand\listofframes{\@starttoc{lbf}}
\makeatother
\addtobeamertemplate{frametitle}{}{%
\ifframeinlbf
\addcontentsline{lbf}{section}{\protect\makebox[2em][l]{%
\protect\usebeamercolor[fg]{structure}\insertframenumber\hfill}%
\insertframetitle\par}%
\else\fi
}
\begin{document}
\frameinlbffalse
\begin{frame}
\frametitle{List of Frames}
\listofframes
\end{frame}
\frameinlbftrue
\begin{frame}
\frametitle{Test Frame One}
test
\end{frame}
\begin{frame}
\frametitle{Test Frame Two}
test
\end{frame}
\end{document}
答案2
除了 Gonzalo Medina 的回答之外,如果您希望框架标题链接到页码,请在之前使用此代码\insertframetitle
:
\protect\hyperlink{page.\insertframenumber}
完整代码如下:
\addtobeamertemplate{frametitle}{}{%
\ifframeinlbf
\addcontentsline{lbf}{section}{\protect\makebox[2em][l]{%
\protect\usebeamercolor[fg]{structure}\insertframenumber\hfill}%
\protect\hyperlink{page.\insertframenumber}\insertframetitle\par}%
\else\fi
}
以上内容需要该hyperref
包,因此请确保将其包含在内。
答案3
这桑德罗的回答显示了非常有用的补充Gonzalo Medinas 回答如果有人确实想使用框架列表作为链接集合来轻松访问某个框架。
但是,如果在演示过程中重置帧计数器,Sandro 的解决方案就会失败。这是一种更强大的方法,它还考虑了叠加,以避免同一帧的多个链接:
\addtobeamertemplate{frametitle}{}{%
\only<1>{%
\hypertarget{\insertframetitle}{}%
\addcontentsline{lbf}{section}{\protect\makebox[2em][l]{%
\protect\usebeamercolor[fg]{structure}\insertframenumber\hfill}%
\protect\hyperlink{\insertframetitle}{\insertframetitle}\par}%
}%
}
答案4
我想对Sandro的解决方案添加一些评论:
在我更改代码之前,代码对我来说不起作用
\addcontentsline{lbf}{section}{\protect\makebox[2em][l]{%
到
\addcontentsline{lbf\thesection}{section}{\protect\makebox[2em][l]{%
此外,带链接的想法很好,但如果你使用隐藏效果,例如暂停、隐藏……,帧号与页码不对应。因此我更改了以下行
\protect\hyperlink{page.\insertframenumber}\insertframetitle\par}%
到
\protect\hyperlink{page.\insertpagenumber}\insertframetitle\par}%
希望我能够做出一些贡献!