测试 1

测试 1

受到以下讨论的启发https://github.com/josephwright/beamer/issues/388

该网站上有很多问题,例如“我使用主题 X,但我想使用主题 Y 的页脚/页眉/其他内容”,仅举一个例子:混合华沙和马德里投影机主题

为了使这更容易,如何才能从主题中加载特定的模板,例如只是脚注?


测试用例

测试 1:简单案例

\useoutertheme{infolines}
\setbeamertemplate{footline}[infolines theme] 

测试 2:测试它是否与父主题兼容

\usetheme{Boadilla} 
\setbeamertemplate{footline}[infolines theme] 

测试 3:测试是否适用于选项

\usetheme[height=3cm]{Rochester}
\setbeamertemplate{headline}[sidebar theme]

答案1

测试 1

这似乎有效。

\documentclass{beamer}
    \usecolortheme{whale}
    \useoutertheme{split}
\makeatletter
    \let\beamer@@@@sbto@old=\beamer@@@@sbto
    \def\text@footline{footline}
    \long\def\beamer@@@@sbto#1#2[#3]#4[#5]#6{
        \def\text@element{#1}
        \ifx\text@footline\text@element
            \beamer@@@@sbto@old{#1}{#2}[#3]{#4}[#5]{#6}
        \fi
    }
    \useoutertheme{infolines}
    \let\beamer@@@@sbto=\beamer@@@@sbto@old
\makeatother

\begin{document}
    \begin{frame}
        Test
    \end{frame}
\end{document}

测试 2

如果您想控制颜色,请对\beamer@clearbeamercolor和执行相同的操作\beamer@setbeamercolor

\setbeamerfont(和也一样\setbeamersize

\documentclass{beamer}
    \usecolortheme{whale}
    \useoutertheme{split}
\makeatletter
    \let\beamer@@@@sbto@old=\beamer@@@@sbto
    \def\text@footline{footline}
    \long\def\beamer@@@@sbto#1#2[#3]#4[#5]#6{
        \def\text@element{#1}
        \ifx\text@footline\text@element
            \beamer@@@@sbto@old{#1}{#2}[#3]{#4}[#5]{#6}
        \fi
    }
    \let\beamer@clearbeamercolor@old=\beamer@clearbeamercolor
    \let\beamer@setbeamercolor@old=\beamer@setbeamercolor
    \def\beamer@clearbeamercolor#1#2{}
    \def\beamer@setbeamercolor#1#2{}
    \usetheme{Boadilla}
    \setbeamertemplate{footline}[infolines theme]
    \let\beamer@@@@sbto=\beamer@@@@sbto@old
    \let\beamer@clearbeamercolor=\beamer@clearbeamercolor@old
    \let\beamer@setbeamercolor=\beamer@setbeamercolor@old
\makeatother

\begin{document}
    \begin{frame}
        Test
    \end{frame}
\end{document}

测试 3

在这个测试中,必不可少的\beamer@@@@sbto是一个长宏。

\documentclass{beamer}
    \usecolortheme{whale}
    \useoutertheme{split}
\makeatletter
    \let\beamer@@@@sbto@old=\beamer@@@@sbto
    \def\text@headline{headline}
    \long\def\beamer@@@@sbto#1#2[#3]#4[#5]#6{
        \def\text@element{#1}
        \ifx\text@headline\text@element
            \beamer@@@@sbto@old{#1}{#2}[#3]{#4}[#5]{#6}
        \fi
    }
    \usetheme[height=3cm]{Rochester}
    \setbeamertemplate{headline}[sidebar theme]
    \let\beamer@@@@sbto=\beamer@@@@sbto@old
\makeatother

\begin{document}
    \section{TEST}
    \begin{frame}
        Test
    \end{frame}
\end{document}

答案2

一个笨拙的解决方法:使用catchfilebetweentags包。但是这需要在.sty文件中添加一些额外的注释。

\documentclass{beamer}

\usecolortheme{whale}
\useoutertheme{split}

\usepackage{catchfilebetweentags}
\newcommand\fromtheme[2]{\ExecuteMetaData[beamertheme#1.sty]{#2}}
\newcommand\fromcolortheme[2]{\ExecuteMetaData[beamercolortheme#1.sty]{#2}}  
\newcommand\fromfonttheme[2]{\ExecuteMetaData[beamerfonttheme#1.sty]{#2}}  
\newcommand\fromoutertheme[2]{\ExecuteMetaData[beameroutertheme#1.sty]{#2}}
\newcommand\frominnertheme[2]{\ExecuteMetaData[beamerinnertheme#1.sty]{#2}}  

\fromoutertheme{infolines}{footline:infolines}

\begin{document}
    \begin{frame}
        Test
    \end{frame}
\end{document}  

这些.sty文件需要如下注释:

%<*footline:infolines>
\defbeamertemplate*{footline}{infolines theme}
{
  \leavevmode%
  \hbox{%
  \begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,center]{author in head/foot}%
    \usebeamerfont{author in head/foot}\insertshortauthor\expandafter\beamer@ifempty\expandafter{\beamer@shortinstitute}{}{~~(\insertshortinstitute)}
  \end{beamercolorbox}%
  \begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,center]{title in head/foot}%
    \usebeamerfont{title in head/foot}\insertshorttitle
  \end{beamercolorbox}%
  \begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,right]{date in head/foot}%
    \usebeamerfont{date in head/foot}\insertshortdate{}\hspace*{2em}
    \insertframenumber{} / \inserttotalframenumber\hspace*{2ex} 
  \end{beamercolorbox}}%
  \vskip0pt%
}
%</footline:infolines>

%<*headline:infolines>
\defbeamertemplate*{headline}{infolines theme}
{
  \leavevmode%
  \hbox{%
  \begin{beamercolorbox}[wd=.5\paperwidth,ht=2.65ex,dp=1.5ex,right]{section in head/foot}%
    \usebeamerfont{section in head/foot}\insertsectionhead\hspace*{2ex}
  \end{beamercolorbox}%
  \begin{beamercolorbox}[wd=.5\paperwidth,ht=2.65ex,dp=1.5ex,left]{subsection in head/foot}%
    \usebeamerfont{subsection in head/foot}\hspace*{2ex}\insertsubsectionhead
  \end{beamercolorbox}}%
  \vskip0pt%
}
%</headline:infolines>

上述假设的问题:

  • 表单的注释%<*footline:infolines>必须%</footline:infolines>插入到代码中,定制的主题可能不会这样做,并且用户会对它适用于哪些模板、哪些模板不适用感到困惑。

  • 我知道,只要模板尝试使用主题内定义的某些内容,仅加载特定模板就会中断,但在模板之外,例如\pgfdeclareverticalshading{beamer@topshade}{...}必须在模板内部的内容<*tag>...</tag>

  • 当然,如果不需要知道模板是在哪个子主题中定义的,而只需插入一般主题,然后该命令就会递归地在已加载的子主题中搜索给定的标签,这样会更方便。

  • 我还没有想过主题的可选参数如何适应这一点……

  • ....


测试用例结果:

测试 1:简单案例

作品

测试 2:测试它是否与父主题兼容

失败

测试 3:测试是否适用于选项

失败

答案3

以下代码来自 louisstuart96 的回答,我在https://github.com/josephwright/beamer/issues/388#issuecomment-296338235

[如果他决定自己添加答案,我将删除此 CM]

\documentclass{beamer}

\usecolortheme{whale}
\useoutertheme{split}

\makeatletter
\let\beamer@original@defbeamertemplate\beamer@defbeamertemplate
\def\beamer@defbeamertemplate{\beamer@sbtfalse\@ifstar{\beamer@sbtoo}{\beamer@sbtoo}}
\useoutertheme{infolines}
\setbeamertemplate{footline}[infolines theme] 
% This \set must be done manually, 
% since generally theme names have nothing to do with file names
\let\beamer@defbeamertemplate\beamer@original@defbeamertemplate
\makeatother

\begin{document}
    \begin{frame}
        Test
    \end{frame}
\end{document}

测试用例结果:

测试 1:简单案例

作品

测试 2:测试它是否与父主题兼容

有效(但有一个缺点,比如颜色会被主题覆盖)

测试 3:测试是否适用于选项

作品

相关内容