如何重新定义 beamer 模板

如何重新定义 beamer 模板

要修改命令的定义,我们使用\renewcommand,但是如何修改 beamer 模板呢?例如,如果我们itemize item像这样更改:

\defbeamertemplate{itemize item}{triangle}
{\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleleft$}}

我们得到错误:

!LaTeX 错误:命令 \beamer@@tmpop@itemize item@triangle 已定义。

这是一个例子:

\documentclass{beamer}

\defbeamertemplate{itemize item}{triangle}
    {\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleleft$}}

\begin{document}

\begin{frame}
\setbeamertemplate{itemize item}[ball]

\begin{itemize}
\item 
text 
\item 
text
\end{itemize}

\setbeamertemplate{itemize item}[tiangle]

\begin{itemize}
\item 
text 
\item 
text
\end{itemize}

\end{frame}

\end{document}

答案1

的效果是为名为 的模板\defbeamertemplate安装(beamer的术语) 中指定的选项。该命令具有以下(简化)语法:<predefined option><element name>

\defbeamertemplate{<element name>}{<predefined option>}[<argument number>][<default optional argument>]{<predefined text>}

由于已经安装了itemize item预定义选项triangle(例如,在beamerbaseauxtemplates.sty和中beamerinnerthemedefault.sty),您的尝试显然会产生错误。

为了防止这种情况,你可以对预定义选项使用另一个字符串

\defbeamertemplate{itemize item}{mytriangle}
{\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleleft$}}

进而

\setbeamertemplate{itemize item}[mytriangle]

一个完整示例:

\documentclass{beamer}

\defbeamertemplate{itemize item}{mytriangle}
    {\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleleft$}}

\begin{document}

\begin{frame}
\setbeamertemplate{itemize item}[ball]

\begin{itemize}
\item 
text 
\item 
text
\end{itemize}

\setbeamertemplate{itemize item}[mytriangle]

\begin{itemize}
\item 
text 
\item 
text
\end{itemize}

\end{frame}

\end{document}

得到的列表:

在此处输入图片描述

如果您使用带星号的版本,那么除了设置预定义模板选项外,\setbeamertemplate还会立即使用此选项。所以

\defbeamertemplate*{itemize item}{mytriangle}
{\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleleft$}}       

相当于

\defbeamertemplate{itemize item}{mytriangle}
{\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleleft$}}       
\setbeamertemplate{itemize item}[mytriangle]

看看下面的例子

\documentclass{beamer}

\defbeamertemplate*{itemize item}{mytriangle}
    {\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleleft$}}

\begin{document}

\begin{frame}

\begin{itemize}
\item 
text 
\item 
text
\end{itemize}

\setbeamertemplate{itemize item}[ball]

\begin{itemize}
\item 
text 
\item 
text
\end{itemize}

\end{frame}

\end{document}

结果:

在此处输入图片描述

另一种选择是,如果你想覆盖元素的原始部分,首先取消定义冲突的命令。例如,当你使用

\defbeamertemplate{itemize item}{triangle}{<definition>}

该命令\beamer@@tmpop@itemize item@triangle(注意名称中的空格)使用 \newcommand 进行内部定义(这就是为什么简单地尝试执行另一个

\defbeamertemplate{itemize item}{triangle}{<definition>}

将会触发错误)。您可以通过取消定义命令来防止错误:

\documentclass{beamer}

\expandafter\let\csname beamer@@tmpop@itemize item@triangle\endcsname\relax
\defbeamertemplate{itemize item}{triangle}
    {\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleleft$}}

\begin{document}

\setbeamertemplate{itemize item}[triangle]
\begin{frame}

\begin{itemize}
\item 
text 
\item 
text
\end{itemize}

\setbeamertemplate{itemize item}[ball]

\begin{itemize}
\item 
text 
\item 
text
\end{itemize}

\end{frame}

\end{document}

相关内容