重复使用上一张 Beamer 幻灯片的标题

重复使用上一张 Beamer 幻灯片的标题

有没有办法引用上一张 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

结果如下:

乳胶输出

相关内容