从 Beamer 文档中我发现我们可以创建模板,predefined options
\setbeamertemplate{⟨element name⟩}[⟨predefined option⟩]⟨args⟩
这样可以非常方便地从一个模板切换到另一个模板。但是,从文档中也可以看出,\addtobeamertemplate{⟨element name⟩}{⟨pre-text⟩}{⟨post-text⟩}
我用来扩展模板的命令似乎不接受这种预定义选项。换句话说,它只能将代码添加到当前模板。然而,我发现将代码添加到存储的模板非常有用。
所以我的问题是:有没有办法将代码添加到存储的模板?或者使用 \addtobeamertemplate
“预定义选项”将补丁应用于模板?
这是一个例子(我同意这\addtobeamertemplate
是没有意义的,因为我可以直接在模板定义中添加东西,但这是一个例子):
\documentclass{beamer}
\defbeamertemplate{background canvas}{normal}[1][]
{%
TEST 1
}
\defbeamertemplate{background canvas}{fancy}[1][]
{%
SUPER STYLE TEST 1
}
\setbeamertemplate{background canvas}[normal]
\addtobeamertemplate{background canvas}{% pre patch
}{%post patch
IS UGLY
}
%%%% An workaround attempt not working
% \setbeamertemplate{background canvas}[fancy]
% \addtobeamertemplate{background canvas}{% pre patch
% }{%post patch
% IS BEAUTIFUL
% }
% \setbeamertemplate{background canvas}[normal]
\begin{document} %
\begin{frame}{title}
normal ugly frame
\end{frame}
{
\setbeamertemplate{background canvas}[fancy]
\begin{frame}{title}
fancy frame that I would like prettier
\end{frame}
}
\begin{frame}{title}
normal frame still ugly
\end{frame}
\setbeamertemplate{background canvas}[normal]
\begin{frame}{title}
normal frame that should stay uglier
\end{frame}
\end{document}
答案1
如果您知道模板中出现的一些代码,您可以像这样修补它:
\documentclass{beamer}
\defbeamertemplate{background canvas}{normal}[1][]
{%
TEST 1
}
\defbeamertemplate{background canvas}{fancy}[1][]
{%
SUPER STYLE TEST 1
}
\usepackage{xpatch}
\makeatletter
\expandafter\xpatchcmd\csname beamer@@tmpop@background canvas@normal\endcsname{%
1
}{%
1 is ugly
}{}{}
\makeatother
\setbeamertemplate{background canvas}[normal]
\begin{document} %
\begin{frame}{title}
normal ugly frame
\end{frame}
{
\setbeamertemplate{background canvas}[fancy]
\begin{frame}{title}
fancy frame that I would like prettier
\end{frame}
}
\begin{frame}{title}
normal frame still ugly
\end{frame}
\setbeamertemplate{background canvas}[normal]
\begin{frame}{title}
normal frame that should stay uglier
\end{frame}
\end{document}
如何找出宏的全名?快速而肮脏的破解方法:尝试定义一个已经存在的模板,错误消息将方便地告诉您完整的宏名称:)