了解为什么 AtBeginEnvironment{frame} 在此 MWE 中不起作用

了解为什么 AtBeginEnvironment{frame} 在此 MWE 中不起作用

我试图理解为什么这个钩子AtBeginEnvironment{frame}似乎不适用于这个MWE:

\documentclass{beamer}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usetheme{Madrid}

\usepackage[T1]{fontenc}
\usepackage[french]{babel}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
% Redéfinition de l'environnement frame
\AtBeginEnvironment{frame}{%
    \frametitle{\thesection - \insertsection}%
    \framesubtitle{\thesubsection - \insertsubsection}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
\begin{document}
 
\section{section n°1}
\subsection{sous-section 1-1}
 
\begin{frame}
Texte du slide.
\end{frame}
 
\end{document}

正常情况下,它应该在框架中打印一个标题和一个副标题,但由于某些我无法理解的原因,它并没有这样做。

谢谢你的帮助。

答案1

在框架环境开始时设置框架标题还为时过早。由于有些人(包括 pandoc 用户)使用极其烦人的语法\begin{frame}{frametitle}{framesubtitle},beamer 需要克服许多困难来处理这种复杂的语法。您必须等待\frametitlebeamer 完成此操作后才能使用。

不要弄乱框架环境,禁用 beamer 对框架标题是否存在的检查,并修补框架标题以在框架标题为空时显示部分/子部分:

\documentclass{beamer}

\usepackage{xpatch}
\makeatletter
\patchcmd\beamer@@tmpl@frametitle{\insertframetitle}{%
\ifx\insertframetitle\@empty
  \thesection{} - \insertsection
  \ifx\insertframesubtitle\@empty
  \ifnum\thesubsection>0
    \def\insertframesubtitle{\thesubsection{} - \insertsubsection}
  \fi\fi
\else
  \insertframetitle
\fi
}{}{}
\makeatother


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


\begin{document}

\section{section 1}
\subsection{sub 1}
\begin{frame}
\end{frame}

\begin{frame}
\frametitle{frametitle}
\framesubtitle{framesub}

\end{frame}
\end{document}

答案2

这里有一种方法:

\documentclass{beamer}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usetheme{Madrid}

\usepackage[T1]{fontenc}
\usepackage[french]{babel}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
% Redéfinition de l'environnement frame
\let\oldframe\frame
\def\newframe{%
\oldframe\frametitle{\thesection - \insertsection}%
\framesubtitle{\thesubsection - \insertsubsection}%
}
\def\endnewframe{\endframe}

\renewenvironment{frame}{\newframe}{\endnewframe}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
\begin{document}
 
\section{section n°1}
\subsection{sous-section 1-1}
 
\begin{frame}
Texte du slide.
\end{frame}
 
\end{document}

相关内容