我很难将两件事合并成一组幻灯片:
- 全局调整项目分离
- 在本地使用列表的默认覆盖(参数
[<+->]
)
我使用enumitem
1。但它似乎有点令人不安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
(比如说)将命令全局从 修改3pt
为2em
:
\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
@
3pt
2pt
\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}
以下是第三张幻灯片的一部分: