有没有办法引用上一张 Beamer 幻灯片的标题?通常,一系列幻灯片的标题相同,我想避免重复标题。我可以为每张幻灯片的标题定义一个宏,但有没有办法获取任意幻灯片的标题?
答案1
Beamer 有一个内置功能:使用 而不是 插入显式帧中断,\framebreak
然后\end{frame}
使用\begin{frame}
将后面的内容放在下一帧中,并且会自动重复帧标题并附加罗马数字。请参阅此话题。
答案2
一种可能的解决方案是让\frametitle
为您完成工作;在下面的例子中,我进行了修改\beamer@frametitle
,使得每次调用\frametitle
全局定义一个存储标题的命令;第一次使用 时\frametitle
,命令\Frametitlei
被定义并包含标题;第二次\frametitle
使用 时,命令\Frametitleii
被创建并存储图块,依此类推(创建的命令都是 形式\Frametitle<roman numeral>
,其中是用罗马数字表示的已使用<roman numeral>
次数);然后您可以使用这些命令来检索名称:\frametitle
\documentclass{beamer}
\makeatletter
\newcounter{ftitle}
\long\def\beamer@@frametitle[#1]#2{%
\beamer@ifempty{#2}{}{%
\gdef\insertframetitle{{#2\ifnum\beamer@autobreakcount>0\relax{}\space\usebeamertemplate*{frametitle continuation}\fi}}%
\gdef\beamer@frametitle{#2}%
\stepcounter{ftitle}
\expandafter\gdef\csname Frametitle\romannumeral\theftitle\endcsname{#2}
\gdef\beamer@shortframetitle{#1}%
}%
}
\makeatother
\begin{document}
\begin{frame}
\frametitle{Test Frame Title One}
Test
\end{frame}
\begin{frame}
\frametitle{Test Frame Title Two}
Test
\end{frame}
\begin{frame}
\frametitle{\Frametitlei}
Test
\end{frame}
\begin{frame}
\frametitle{Test Frame Title Three}
Test
\end{frame}
\begin{frame}
\frametitle{\Frametitleii}
Test
\end{frame}
\end{document}
答案3
你的问题有点模棱两可。你这样开头:
有没有办法引用上一张 Beamer 幻灯片的标题?
最后结束:
... 有没有办法获取任意幻灯片的标题?
这些是不同的问题。第一个问题只是想获取上一个 Beamer 幻灯片的名称。第二个问题想要完全随机访问。Gonzalo 已经回答了第二个问题,下面是获取第一个问题的稍微便宜的方法。它的工作原理相同:我们保存前一帧标题(和副标题),但访问它的方式略有不同。我推断的规则是“如果没有给出帧标题,则使用前一个”。实现这一点的最简单方法是将前一帧标题(和副标题)作为新标题插入帧的开头。然后任何实际分配都会否决它,但如果没有分配,则可以使用默认值。
以下是代码(在https://tex.stackexchange.com/a/519/86)
\documentclass{beamer}
%\url{https://tex.stackexchange.com/q/66274/86}
\makeatletter
\def\beamer@checkframetitle{%
\begingroup
\edef\temp{%
\endgroup
\noexpand\frametitle
[\unexpanded\expandafter{\beamer@savedshortframetitle}]%
{\unexpanded\expandafter{\beamer@savedframetitle}}%
}
\temp
\@ifnextchar\bgroup\beamer@inlineframetitle{}}
\long\def\beamer@@frametitle[#1]#2{%
\beamer@ifempty{#2}{}{%
\gdef\insertframetitle{{#2\ifnum\beamer@autobreakcount>0\relax{}\space\usebeamertemplate*{frametitle
continuation}\fi}}%
\gdef\beamer@frametitle{#2}%
\gdef\beamer@shortframetitle{#1}%
\global\let\beamer@savedshortframetitle\beamer@shortframetitle
\global\let\beamer@savedframetitle\beamer@frametitle
}%
}
\global\let\beamer@savedshortframetitle\@empty
\global\let\beamer@savedframetitle\@empty
\makeatother
\begin{document}
\begin{frame}{The Frame Title}
A frame with a title
\end{frame}
\begin{frame}
A frame without a title
\end{frame}
\begin{frame}
\frametitle{The Next Frame Title}
A frame with a title
\end{frame}
\begin{frame}
A second frame without a title
\end{frame}
\end{document}
结果:
:
答案4
我更喜欢这个简单的命令,因为它可以轻松适应您的特定需求。其他一切都像往常一样用\subsection{}
和完成\subsubsection{}
。作为一个很好的副作用,每个标题和副标题都是可点击的参考。
\documentclass{beamer}
\newenvironment{slide}[0]{
\begin{frame}\ifx \insertsubsection \empty
\frametitle{\insertsection} \else
\frametitle{\insertsubsection}\framesubtitle{\insertsection} \fi
}{\end{frame}}
\begin{document}
\begin{frame}{Table of Contents}
\tableofcontents
\end{frame}
\section{my section}
\begin{slide}
first slide
\end{slide}
\subsection{my subsection}
\begin{slide}
second slide
\end{slide}
\end{document}
\end
结果如下: