无法将 enumitem 与 beamer 结合

无法将 enumitem 与 beamer 结合

我很难将两件事合并成一组幻灯片:

  1. 全局调整项目分离
  2. 在本地使用列表的默认覆盖(参数[<+->]

我使用enumitem1。但它似乎有点令人不安beamer。首先,我不得不使用一些诡计不要enumtitle覆盖选定的幻灯片样式。

在链接解决方案生效的情况下,添加[<+->]到 根本itemize没有任何效果。我期望它会覆盖全局设置,但显然它没有。

我如何才能同时实现 1. 和 2.?

最小失败示例:

\documentclass{beamer}

\usepackage{enumitem}
\setitemize{itemsep=1.5em,%
  label=\usebeamerfont*{itemize item}%
        \usebeamercolor[fg]{itemize item}%
        \usebeamertemplate{itemize item}%
}

\begin{document}

\begin{frame}
  \begin{itemize}[<+->]
    \item On slide 1
    \item On slide 2
  \end{itemize}
\end{frame}

\end{document}

答案1

正如你刚才提到的,enumitem“打扰”beamer。这是因为文档类(beamer在本例中)根据自己的喜好定义(或重新定义)了所有必要的命令/宏和环境。然后,每个加载的包按顺序执行相同的操作。因此,由于enumitem 关注文档类,它重新定义了itemize(和其他)环境,从而删除了beamer修改的覆盖规范。

可以通过修补命令来利用主级别列表环境参数\@listI。下面显示了包含在beamerbaselocalstructure.sty

%
% List stuff
%

\setlength\leftmargini  {2em}
\setlength\leftmarginii  {2em}
\setlength\leftmarginiii  {2em}
\setlength  \labelsep  {.5em}
\setlength  \labelwidth{\leftmargini}
\addtolength\labelwidth{-\labelsep}

\def\@listi{\leftmargin\leftmargini
            \topsep 3\p@ \@plus2\p@ \@minus2.5\p@
            \parsep 0\p@
            \itemsep3\p@ \@plus2\p@ \@minus3\p@}
\let\@listI\@listi
\def\@listii{\leftmargin\leftmarginii
              \topsep    2\p@ \@plus1\p@ \@minus2\p@
              \parsep    0\p@   \@plus\p@
              \itemsep   \parsep}
\def\@listiii{\leftmargin\leftmarginiii
              \topsep    2\p@ \@plus1\p@ \@minus2\p@
              \parsep    0\p@   \@plus\p@
              \itemsep   \parsep}

使用补丁\patchcmd,由etoolbox,更改\itemsep3\p@\itemsep2em(比如说)将命令全局从 修改3pt2em

\documentclass{beamer}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox

\makeatletter
\patchcmd{\@listI}{\itemsep3\p@}{\itemsep2em}{}{}
\makeatother

\begin{document}

\begin{frame}
\begin{itemize}[<+->]
  \item First.
  \item Second.
  \item Third.
\end{itemize}
\end{frame}

\end{document}

由于 的宏定义包含,因此必须使用\makeatletter/对。请注意,此修补程序不会修改 的收缩 ( ) 或拉伸 ( ) 。\makeatother\@listI@3pt2pt\itemsep

答案2

添加\tracingall表明 TeX 围绕一个循环定义旋转,\\description该定义是描述环境的内部保存版本。如果两个包都保存了某个东西的“原始”版本,这种情况很容易发生。

\\description [#1]->\beamer@origdescription 
#1<-

\beamer@origdescription ->\@protected@testopt \description \\description {}

\@protected@testopt #1->\ifx \protect \@typeset@protect \expandafter \@testopt 
\else \@x@protect #1\fi 

\@testopt #1#2->\kernel@ifnextchar [{#1}{#1[{#2}]}
#1<-\\description 
#2<-

\kernel@ifnextchar #1#2#3->\let \reserved@d =#1\def \reserved@a {#2}\def \reser


\@ifnch ->\ifx \@let@token \@sptoken \let \reserved@c \@xifnch \else \ifx \@let

\reserved@c ->\\description [{}]

\\description [#1]->\beamer@origdescription 
#1<-

虽然很容易看出 TeX 挂起的原因,但修复它取决于你想做什么。你可以重新声明 beamer 或 enumitem 版本。但如果你想要一个同时具有两者功能的环境,可能需要更多的协调和对这两个软件包的了解,而我今天早上都没有:-)

例如,这可以保持投影仪的定义并停止循环。

\let\olddescription\description
\let\oldenddescription\enddescription
\usepackage{enumitem}
\let\description\olddescription
\let\enddescription\oldenddescription

答案3

您可以\itemize按照 中的定义重新定义该命令beamerbaselocalstructure.sty;在下面的例子中,我为此命令定义了一个全局itemsep长度2em(用 标记的线):%NEW

\documentclass{beamer}

\makeatletter
\renewcommand{\itemize}[1][]{%
  \beamer@ifempty{#1}{}{\def\beamer@defaultospec{#1}}%
  \ifnum \@itemdepth >2\relax\@toodeep\else
    \advance\@itemdepth\@ne
    \beamer@computepref\@itemdepth% sets \beameritemnestingprefix
    \usebeamerfont{itemize/enumerate \beameritemnestingprefix body}%
    \usebeamercolor[fg]{itemize/enumerate \beameritemnestingprefix body}%
    \usebeamertemplate{itemize/enumerate \beameritemnestingprefix body begin}%
    \list
      {\usebeamertemplate{itemize \beameritemnestingprefix item}}
      {\setlength\itemsep{2em}% NEW
        \def\makelabel##1{%
          {%
            \hss\llap{{%
                \usebeamerfont*{itemize \beameritemnestingprefix item}%
                \usebeamercolor[fg]{itemize \beameritemnestingprefix item}##1}}%
          }%
        }%
      }
  \fi%
  \beamer@cramped%
  \raggedright%
  \beamer@firstlineitemizeunskip%
}
\makeatother

\begin{document}

\begin{frame}
\begin{itemize}[<+->]
  \item First.
  \item Second.
  \item Third.
\end{itemize}
\end{frame}

\end{document}

以下是第三张幻灯片的一部分:

在此处输入图片描述

相关内容