是否可以在 beamer 中的每一帧的主体中添加一些内容?
具体来说,我想在\par\unskip
正前方添加\end{frame}
,这样无论幻灯片是以文本、枚举环境还是显示公式结尾,整个幻灯片的底部边距都是相同的。我使用的是 metropolis 主题,其差异非常明显。
我有两个想法:
\addtobeamertemplate{footline}{\par\unskip}{}
或标准技巧
\let\oldendframe\endframe
\def\endframe{\par\unskip\oldendframe}
第一个不起作用,因为\lastskip
当时已经被遗忘了。第二个不起作用,因为\endframe
实际上从未使用过。在 中定义它的地方beamerbaseframe.sty
,有一个注释:
% Normally not executed; only in containsverbatim context:
\def\endframe{\egroup\begingroup\def\@currenvir{frame}}
我不太了解纯 TeX,无法理解框架主体的处理方式,因此无法确定我需要在何处包含\par\unskip
。有人知道如何实现这一点吗?以下是 MWE:
\documentclass{beamer}
\usetheme{metropolis}
\usepackage{lipsum}
\begin{document}
\begin{frame}
\frametitle{This frame ends in text}
\begin{enumerate}
\item \lipsum[1][1]
\item \lipsum[1][2]
\item \lipsum[1][3]
\item \lipsum[1][4-5]
\item \lipsum[1][6]
\end{enumerate}
\lipsum[1][7-13] This is the bottom margin in metropolis.
%\par\unskip % it works if entered manually
\end{frame}
\begin{frame}
\frametitle{This frame ends in a formula}
\begin{enumerate}
\item \lipsum[1][1]
\item \lipsum[1][2]
\item \lipsum[1][3]
\item \lipsum[1][4-5]
\item \lipsum[1][6]
\end{enumerate}
\lipsum[1][7-12]
\[ a + b = c \]
%\par\unskip % it works if entered manually
\end{frame}
\end{document}
如果\par\unskip
手动插入,在我看来它会更好。
答案1
修补内部环境的末端部分beamer@frameslide
似乎有效。此环境定义为(参见beamerbaseframe.sty
)
\newenvironment{beamer@frameslide}{%
% ...
\global\setbox\beamer@framebox=\vbox\bgroup
% ...
\begin{beamer@framepauses}%
% ...
}{%
\par
\end{beamer@framepauses}%
\egroup
% ...
}
因此我们只需要在\unskip
后面附加:\par
\endbeamer@frameslide
\documentclass{beamer}
\usetheme{metropolis}
\usepackage{lipsum}
\makeatletter
\patchcmd\endbeamer@frameslide
{\par}
{\par\unskip}
{}{\PatchFailed}
\makeatother
\begin{document}
\begin{frame}
\frametitle{This frame ends in text}
\begin{enumerate}
\item \lipsum[1][1]
\item \lipsum[1][2]
\item \lipsum[1][3]
\item \lipsum[1][4-5]
\item \lipsum[1][6]
\end{enumerate}
\lipsum[1][7-13] This is the bottom margin in metropolis.
%\par\unskip % it works if entered manually
\end{frame}
\begin{frame}
\frametitle{This frame ends in a formula}
\begin{enumerate}
\item \lipsum[1][1]
\item \lipsum[1][2]
\item \lipsum[1][3]
\item \lipsum[1][4-5]
\item \lipsum[1][6]
\end{enumerate}
\lipsum[1][7-12]
\[ a + b = c \]
%\par\unskip % it works if entered manually
\end{frame}
\end{document}