我使用metropolis
beamer 主题进行演示。我使用它来更改背景以添加水印。但我想在部分幻灯片上切换到另一个背景。所以我尝试了不同的方法(参见以下 MWE),但均未成功。我的尝试均未更改背景,也未产生预期结果。
以下是 MWE:
\documentclass{beamer}
% Metropolis Theme
\usetheme{metropolis}
\metroset{
sectionpage= progressbar,
subsectionpage= progressbar,
numbering=fraction,
}
% Background redefinition
\setbeamertemplate{background}{%
\begin{tikzpicture}
\useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight);
\fill[color=orange] (0,7) rectangle(0.8,8);
\fill[color=blue] (0.9,7) rectangle(\the\paperwidth, 8);
\end{tikzpicture}
}
% Section style
% % First try not working because it keeps the previous background
% \addtobeamertemplate{section page}{%
% \setbeamertemplate*{background}{%
% \begin{tikzpicture}
% rectangle(\the\paperwidth,\the\paperheight);
% \fill[color=red] (0.9,7) rectangle(\the\paperwidth, 8);
% \end{tikzpicture}
% }
% }
% % Second try not working because it has no effect
% \addtobeamertemplate{section page}{%
% \usebackgroundtemplate{
% \begin{tikzpicture}
% rectangle(\the\paperwidth,\the\paperheight);
% \fill[color=red] (0.9,7) rectangle(\the\paperwidth, 8);
% \end{tikzpicture}
% }
% }
% Third try not working because it kills the style of metropolis
\defbeamertemplate{background}{section}{%
\begin{tikzpicture}
rectangle(\the\paperwidth,\the\paperheight);
\fill[color=red] (0.9,7) rectangle(\the\paperwidth, 8);
\end{tikzpicture}
}
\addtobeamertemplate{section page}{%
\usebeamertemplate*{background}[section]
}
\begin{document}
\begin{frame}{Test}
Test
\end{frame}
\section{Introduction}
\begin{frame}{Test}
Test
\end{frame}
\end{document}
那么,如何在保持大都市部分风格的同时,局部重新定义部分幻灯片中的背景?
答案1
尽管是一个很棒的软件包,但现有的接口beamer
仍然无法满足高级定制的需求。但是,beamer 的框架允许人们实现自定义黑客和变通方法,以实现几乎所有可以想到的功能。不过,这个过程可能有点耗时。让我来介绍一下我如何调查这个问题并提出解决方案。
- 该主题的 CTAN 页面
metropolis
是https://ctan.org/pkg/beamertheme-metropolis?lang=en。此页面为您提供了对其源代码和文档的访问。从其文档中,我意识到该sectionpage
选项是其内在主题机制。因此,这将我引向它的一个源文件:beamerinnerthememetropolis.dtx
。 - 从上面提到的源文件中,我们可以提取以下感兴趣的代码段。基本上,节页是通过调用宏来实现的
\sectionpage
。\pgfkeys{ /metropolis/inner/sectionpage/.cd, .is choice, none/.code=\metropolis@disablesectionpage, simple/.code={\metropolis@enablesectionpage \setbeamertemplate{section page}[simple]}, progressbar/.code={\metropolis@enablesectionpage \setbeamertemplate{section page}[progressbar]}, } \newcommand{\metropolis@enablesectionpage}{ \AtBeginSection{ \ifbeamer@inframe \sectionpage \else \frame[plain,c,noframenumbering]{\sectionpage} \fi } }
\sectionpage
我们可以通过简单地输入来继续查看命令的定义\meaning\sectionpage
。输出是macro:->\usebeamertemplate *{section page}
,这意味着\sectionpage
调用一个名为的预定义模板section page
,最终触发背景绘制命令。因此,为了解决这个问题,我们可以修改块,\AtBeginSection
以便引入一个全局变量来跟踪当前帧是否是部分帧。背景绘制函数应该根据这个变量运行。
最终解决办法如下:
\documentclass{beamer}
\usepackage{expl3}
\usepackage{comment}
\usepackage{etoolbox}
% Metropolis Theme
\usetheme{metropolis}
\metroset{
sectionpage= progressbar,
subsectionpage= progressbar,
numbering=fraction,
}
\makeatletter
\ExplSyntaxOn
% marks if title page
\bool_new:N \g_doc_tp_bool
\bool_gset_false:N \g_doc_tp_bool
\AtBeginSection{
\bool_gset_true:N \g_doc_tp_bool
\ifbeamer@inframe
\sectionpage
\else
\frame[plain,c,noframenumbering]{\sectionpage}
\fi
\bool_gset_false:N \g_doc_tp_bool
}
\setbeamertemplate{background}{%
\bool_if:NTF \g_doc_tp_bool {
% title page
\begin{tikzpicture}
\useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight);
\fill[color=green] (6,7) circle (1cm);
\end{tikzpicture}
} {
% non title page
\begin{tikzpicture}
\useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight);
\fill[color=orange] (0,7) rectangle(0.8,8);
\fill[color=blue] (0.9,7) rectangle(\the\paperwidth, 8);
\end{tikzpicture}
}
}
\ExplSyntaxOff
\makeatother
\begin{document} % balise de début de la présentation
\begin{frame}{Test}
Test
\end{frame}
\section{Introduction}
\begin{frame}{Test}
Test
\end{frame}
\end{document}