这个问题与为 itemize 环境设置默认覆盖规范。
在上述链接的问题中,沃纳\LetLtxMacro
提供了一个使用和的解决方案\renewcommand
。然而,\renewcommand
必须把后 \begin{document}
。有趣的是,\AtBeginDocument{\renewcommand...}
在序言中使用也不起作用。
\alert
相反,无论命令在何处发布,更新命令都有效。
问题
- 为什么
\renewcommand\itemize...
需要放在\begin{document}
while\renewcommand\alert...
does not之后? - 为什么
\AtBeginDocument{\renewcommand\itemize...}
更新可以但是不生效呢\alert
?
平均能量损失
\documentclass{beamer}
\usepackage{letltxmacro}
\LetLtxMacro\olditemize\itemize
% \renewcommand{\itemize}[1][<+(1)->]{\olditemize[#1]} % doesn't work
% \AtBeginDocument{\renewcommand{\itemize}[1][<+(1)->]{\olditemize[#1]}} % doesn't work
\AtBeginDocument{\renewcommand\alert[1]{\textcolor{blue}{#1}}} % works
% \renewcommand\alert[1]{\textcolor{blue}{#1}} % works
\begin{document}
% Update itemize to have a default overlay
\renewcommand{\itemize}[1][<+(1)->]{\olditemize[#1]} % works
% \renewcommand\alert[1]{\textcolor{blue}{#1}} % works
\begin{frame}
Some question ...
(a) Part a of question
\begin{itemize}
\item Step 1 of \alert{solution}
\item Step 2 of solution
\end{itemize}
(b) Part b of question
\begin{itemize}
\item Step 1 of solution
\item Step 2 of solution
\end{itemize}
\end{frame}
\end{document}
答案1
原因是该方式beamer
修改了标准环境的定义,例如itemize
。该文件beamerbasecompatibility.sty
包括:
\AtBeginDocument{% fix frenchb.ldf's meddling with itemize and :
\let\labelitemi\beamer@labelitemi
\let\labelitemii\beamer@labelitemii
\let\itemize\beamer@itemize
\let\list\beamer@list
\let\@trivlist\beamer@@trivlist%
\catcode`<=12\catcode`>=12}
作为对 重新定义的一部分\begin{document}
。具体来说,这意味着 将beamer
重新定义延迟\itemize
到文档正文的开头。因此,您在此之前所做的任何更改都将被覆盖。
实际上\AtBeginDocument
定义如下
\def\AtBeginDocument{\g@addto@macro\@begindocumenthook}
并且beamer
s 版本在末尾附近(和开头附近)\begin{document}
包含宏。因此,您可以将定义放入来自序言的后期命令列表中,如下所示:\beamer@lastminutepatches
\beamer@firstminuteptaches
\makeatletter
\g@addto@macro\beamer@lastminutepatches{\renewcommand{\itemize}[1][<+(1)->]{\olditemize[#1]}}
\makeatother
事情变得更直接了,因为只需在读取文件时提供定义即可。因此,您可以将重新定义放在序言中,如下所示\alert
:beamerbaselocalstructure.sty
\documentclass{beamer}
\usepackage{letltxmacro}
\LetLtxMacro\olditemize\itemize
\makeatletter
\g@addto@macro\beamer@lastminutepatches{\renewcommand{\itemize}[1][<+(1)->]{\olditemize[#1]}}
\makeatother
\renewcommand\alert[1]{\textcolor{blue}{#1}} % works
\begin{document}
\begin{frame}
Some question ...
(a) Part a of question
\begin{itemize}
\item Step 1 of \alert{solution}
\item Step 2 of solution
\end{itemize}
(b) Part b of question
\begin{itemize}
\item Step 1 of solution
\item Step 2 of solution
\end{itemize}
\end{frame}
\end{document}