如何更改投影机部分的本地背景?

如何更改投影机部分的本地背景?

我使用metropolisbeamer 主题进行演示。我使用它来更改背景以添加水印。但我想在部分幻灯片上切换到另一个背景。所以我尝试了不同的方法(参见以下 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 的框架允许人们实现自定义黑客和变通方法,以实现几乎所有可以想到的功能。不过,这个过程可能有点耗时。让我来介绍一下我如何调查这个问题并提出解决方案。

  1. 该主题的 CTAN 页面metropolishttps://ctan.org/pkg/beamertheme-metropolis?lang=en。此页面为您提供了对其源代码和文档的访问。从其文档中,我意识到该sectionpage选项是其内在主题机制。因此,这将我引向它的一个源文件:beamerinnerthememetropolis.dtx
  2. 从上面提到的源文件中,我们可以提取以下感兴趣的代码段。基本上,节页是通过调用宏来实现的\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
      }
    }
    
  3. \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}

相关内容