修补 Beamer 命令 \addtobeamertemplate 以使用预定义选项

修补 Beamer 命令 \addtobeamertemplate 以使用预定义选项

从 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}

如何找出宏的全名?快速而肮脏的破解方法:尝试定义一个已经存在的模板,错误消息将方便地告诉您完整的宏名称:)

相关内容