问题

问题

这个问题与为 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}

并且beamers 版本在末尾附近(和开头附近)\begin{document}包含宏。因此,您可以将定义放入来自序言的后期命令列表中,如下所示:\beamer@lastminutepatches\beamer@firstminuteptaches

\makeatletter
\g@addto@macro\beamer@lastminutepatches{\renewcommand{\itemize}[1][<+(1)->]{\olditemize[#1]}}
\makeatother

事情变得更直接了,因为只需在读取文件时提供定义即可。因此,您可以将重新定义放在序言中,如下所示\alertbeamerbaselocalstructure.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}

相关内容