在 Beamer 中访问其他幻灯片的标题

在 Beamer 中访问其他幻灯片的标题

假设我正在为 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 模板。这样做的缺点是它不会显示在当前幻灯片上。但是,也许您可​​以查看上述模板并了解内部如何处理切片。

在这两种情况下,这意味着每张幻灯片都应该被(子)分段,我想这对你来说可能不是很方便,尽管已经提出了一种自动化解决方案早期线程

相关内容