要修改命令的定义,我们使用\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}