每当出现新的小节时,如何添加指定节和小节名称的框架标题?

每当出现新的小节时,如何添加指定节和小节名称的框架标题?

我对 StackExchange 还很陌生,更不用说 LaTeX 了。这里的问题是临时将框架标题添加到定义新子部分后紧接着出现的任何框架中。以下是示例代码,第一张幻灯片上留下了一个空白的功能区。

\documentclass{beamer}
\usepackage{lipsum}
\usetheme{Frankfurt}
\AtBeginSubsection[]
{
\addtobeamertemplate{frametitle}{\let\insertframetitle\insertsubsectionhead}{}
}

\makeatletter
  \CheckCommand*\beamer@checkframetitle{\@ifnextchar\bgroup\beamer@inlineframetitle{}}
  \renewcommand*\beamer@checkframetitle{\global\let\beamer@frametitle\relax\@ifnextchar\bgroup\beamer@inlineframetitle{}}
\makeatother

\begin{document}
\section{Introduction}

\begin{frame}
\lipsum[2]
\end{frame} 

\subsection{XYZ}

\begin{frame}
\lipsum[2]
\end{frame}

\end{document}

基本上想要一个类似的设置但仅限于新小节开始后的第一个框架,不会对其他框架/框架标题(如页面上的空白功能区)产生任何永久性影响。

编辑:找到此链接这完成了 90% 的工作,但是如果在同一框架中存在覆盖规范(如 \uncover),则子部分框架标题会消失,并且会取代单个框架标题(这是有意义的)。

TLDR 编辑:仅保留在新小节后的第一张幻灯片上,而不是同一帧。

\documentclass{beamer}
\usepackage{lipsum}
\usetheme{Frankfurt}

\makeatletter
\newcommand<>{\insertsubsectiontitle}{\frametitle{\insertsubsection}}
\let\oldbeamer@checkframetitle\beamer@checkframetitle% Store the \frametitle checking mechanism
\renewcommand<>{\subsection}{%
  \gdef\beamer@checkframetitle{% Update \frametitle checking to ...
    \insertsubsectiontitle% ...insert the section title and...
    \global\let\beamer@checkframetitle\oldbeamer@checkframetitle% ...revert to it's old definition
  }% Regular \section stuff follows
  \alt#1{\@ifnextchar[\beamer@subsection\beamer@@subsection}
    {\beamer@secgobble}}
\makeatother

\begin{document}
\section{Introduction}

\begin{frame}
\lipsum[2]
\end{frame} 

\subsection{XYZ}

\begin{frame}
\lipsum[2]
\end{frame}

\end{document}

答案1

如果子部分后面的框架只有一个覆盖,则可以使用以下对 frametitle 模板进行重新定义。

(如果您的文档以第一帧上的子节开始,请\ifnum\thepage>1 ... fi从代码中删除)

\documentclass{beamer}
\usepackage{lipsum}
\usetheme{Frankfurt}

\makeatletter
\setbeamertemplate{frametitle}{%
\ifnum\thepage>1
\ifnum\insertsubsectionstartpage=\thepage
  \ifbeamercolorempty[bg]{frametitle}{}{\nointerlineskip}%
  \@tempdima=\textwidth%
  \advance\@tempdima by\beamer@leftmargin%
  \advance\@tempdima by\beamer@rightmargin%
  \begin{beamercolorbox}[sep=0.3cm,left,wd=\the\@tempdima]{frametitle}
    \usebeamerfont{frametitle}%
    \vbox{}\vskip-1ex%
    \if@tempswa\else\csname beamer@fteleft\endcsname\fi%
    \strut\insertsubsectionhead\strut\par%
    {%
      \ifx\insertframesubtitle\@empty%
      \else%
      {\usebeamerfont{framesubtitle}\usebeamercolor[fg]{framesubtitle}\strut\insertframesubtitle\strut\par}%
      \fi
    }%
    \vskip-1ex%
    \if@tempswa\else\vskip-.3cm\fi% set inside beamercolorbox... evil here...
  \end{beamercolorbox}%
\fi\fi
\ifx\insertframetitle\@empty
\else
  \ifbeamercolorempty[bg]{frametitle}{}{\nointerlineskip}%
  \@tempdima=\textwidth%
  \advance\@tempdima by\beamer@leftmargin%
  \advance\@tempdima by\beamer@rightmargin%
  \begin{beamercolorbox}[sep=0.3cm,left,wd=\the\@tempdima]{frametitle}
    \usebeamerfont{frametitle}%
    \vbox{}\vskip-1ex%
    \if@tempswa\else\csname beamer@fteleft\endcsname\fi%
    \strut\insertframetitle\strut\par%
    {%
      \ifx\insertframesubtitle\@empty%
      \else%
      {\usebeamerfont{framesubtitle}\usebeamercolor[fg]{framesubtitle}\strut\insertframesubtitle\strut\par}%
      \fi
    }%
    \vskip-1ex%
    \if@tempswa\else\vskip-.3cm\fi% set inside beamercolorbox... evil here...
  \end{beamercolorbox}%
\fi
}

\CheckCommand*\beamer@checkframetitle{\@ifnextchar\bgroup\beamer@inlineframetitle{}}
\renewcommand*\beamer@checkframetitle{\global\let\beamer@frametitle\relax\@ifnextchar\bgroup\beamer@inlineframetitle{}}
\makeatother

\begin{document}
\section{Introduction}

\begin{frame}
\lipsum[2]
\end{frame} 

\subsection{XYZ}

\begin{frame}
\lipsum[2]
\end{frame}

\begin{frame}
\frametitle{title}
\lipsum[2]
\end{frame}

\end{document}

相关内容