假设我正在为 Beamer 演示文稿制作一个自定义主题,并且我想在每个框架上不仅显示框架本身的标题,还显示前一帧和下一帧的标题(当然,以某种方式弱化)。有人知道是否有某种方法可以构建一个宏,我可以使用这个宏来访问相邻框架的标题吗?或者这是否已经在某个地方完成了?
答案1
这是插入访问其他幻灯片的解决方案框架标题(与其他部分标题就像我的第一个答案)。流程非常相似,因此我仅解释已更改的部分:
\usepackage{etoolbox}
\makeatletter
\apptocmd{\beamer@@frametitle}{\write\@auxout{\string\@writefile{frm}{\string\frametitleentry{\the\c@framenumber}{#1}{#2}}}}{}{}
\newcommand*{\frametitleentry}[3]{\@namedef{frametitleshort#1}{#2}\@namedef{frametitle#1}{#3}}
\AtEndDocument{\if@filesw\newwrite\tf@frm\immediate\openout\tf@frm\jobname.frm\relax\fi}
\@input{\jobname.frm}
\newcommand*{\insertpreviousframetitle}[1][1]{\bgroup\advance\c@framenumber by -#1\relax\@ifstar{\@nameuse{frametitleshort\the\c@framenumber}\egroup}{\@nameuse{frametitle\the\c@framenumber}\egroup}}
\newcommand*{\insertnextframetitle}[1][1]{\bgroup\advance\c@framenumber by #1\relax\@ifstar{\@nameuse{frametitleshort\the\c@framenumber}\egroup}{\@nameuse{frametitle\the\c@framenumber}\egroup}}
\makeatother
与第一个解决方案一样,对能够处理标题的命令(\beamer@@frametitle
这次)进行了修补,以便保存框架标题。但是,文件中没有存储框架标题.nav
,因此我们必须.frm
为此创建一个新的辅助文件。首先将框架标题写入文件,然后在文档末尾.aux
刷新到文件中。.frm
该文件在下一次 LaTeX 运行开始时输入,用于存储宏\frametitle1
/中的框架标题,...这些值由用户宏/\frametitleshort1
读取。\insertpreviousframetitle
\insertnextframetitle
用法:
将上述代码放入文档的序言中。现在,您可以使用宏\insertpreviousframetitle
/插入上一个和下一个框架标题\insertnextframetitle
。带星号的形式\insertpreviousframetitle*
/\insertnextframetitle*
产生您可以在命令的可选参数中指定的短框架标题\frametitle
。宏还可以接受可选参数:\insertnextframetitle[2]
例如插入下一个框架的标题。
(当然,您必须在所需的框架中提供框架标题,否则命令的输出将为空。)
答案2
您可以定义命令来插入上一节和下一节的标题,如下所示:
\makeatletter
\g@addto@macro\beamer@lastminutepatches{%
{%
\def\sectionentry#1#2#3#4#5{{\global\@namedef{secname#1}{#4}\global\@namedef{secnameshort#1}{#2}}}%
\def\slideentry#1#2#3#4#5#6{}%
\dohead%
}%
}
\newcommand*{\insertprevioussection}{\bgroup\advance\c@section by -1\relax\@ifstar{\@nameuse{secnameshort\the\c@section}\egroup}{\@nameuse{secname\the\c@section}\egroup}}
\newcommand*{\insertnextsection}{\bgroup\advance\c@section by 1\relax\@ifstar{\@nameuse{secnameshort\the\c@section}\egroup}{\@nameuse{secname\the\c@section}\egroup}}
\makeatother
将此代码放入文档的前言部分(\documentclass{beamer}
和之间\begin{document}
)。
它的工作原理如下: 前几行在文档开头执行处理文件条目的代码.nav
: 它定义\secname1
、\secname2
、... 和\secnameshort1
、 、\secnameshort2
... 命令,用于存储所有章节的长章节标题和短章节标题(处理本身以 开始\dohead
)。
保存这些值后,您可以使用宏\insertprevioussection
/读取它们\insertnextsection
。它们会暂时减少/增加包含当前章节编号的计数器section
,以便读取上一节/下一节的标题。带星号的表格\insertprevioussection*
/\insertnextsection*
返回您可以在命令的可选参数中指定的简短章节标题\section
。
一个小演示:
\documentclass{beamer}
\usetheme{Ilmenau}
\makeatletter
\g@addto@macro\beamer@lastminutepatches{%
{%
\def\sectionentry#1#2#3#4#5{{\global\@namedef{secname#1}{#4}\global\@namedef{secnameshort#1}{#2}}}%
\def\slideentry#1#2#3#4#5#6{}%
\dohead%
}%
}
\newcommand*{\insertprevioussection}{\bgroup\advance\c@section by -1\relax\@ifstar{\@nameuse{secnameshort\the\c@section}\egroup}{\@nameuse{secname\the\c@section}\egroup}}
\newcommand*{\insertnextsection}{\bgroup\advance\c@section by 1\relax\@ifstar{\@nameuse{secnameshort\the\c@section}\egroup}{\@nameuse{secname\the\c@section}\egroup}}
\makeatother
\newcommand*{\demo}{\begin{frame}
Previous section: \insertprevioussection \\
Previous section (short): \insertprevioussection* \\
\alert{Current section: \insertsection} \\
Next section: \insertnextsection \\
Next section (short): \insertnextsection* \\
\end{frame}}
\begin{document}
\section{First section}
\demo
\section[short (2)]{Second section}
\demo
\section{Third section}
\demo
\end{document}
结果:
编辑:
如果你想知道上一节和下一节的标题以外的内容,你可以使用可选参数:通过定义
\newcommand*{\insertprevioussection}[1][1]{\bgroup\advance\c@section by -#1\relax\@ifstar{\@nameuse{secnameshort\the\c@section}\egroup}{\@nameuse{secname\the\c@section}\egroup}}
\newcommand*{\insertnextsection}[1][1]{\bgroup\advance\c@section by #1\relax\@ifstar{\@nameuse{secnameshort\the\c@section}\egroup}{\@nameuse{secname\the\c@section}\egroup}}
您可以获取该部分的标题前上一节用\insertprevioussection[2]
,下一节标题用 ,\insertnextsection[2]
等等。
答案3
我能想到两种可能性,但我不确定这是否是您的情况所期望的。首先,有特定的 Beamer 主题允许您在专用框架中显示大纲,例如 Bergen、Goettingen、Marburg、Berkeley 或 Hannover。其次,您可以在新章节的开头显示目录,方法是添加
\AtBeginSubsection[]{
\begin{frame}[plain]{Outline}
\tableofcontents[currentsection,currentsubsection]
\end{frame}
}
到您的 Beamer 模板。这样做的缺点是它不会显示在当前幻灯片上。但是,也许您可以查看上述模板并了解内部如何处理切片。
在这两种情况下,这意味着每张幻灯片都应该被(子)分段,我想这对你来说可能不是很方便,尽管已经提出了一种自动化解决方案早期线程。