该网站上有很多问题,例如“我使用主题 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:测试是否适用于选项
作品