答案1
在大多数文档中,您可以这样做,从而避免使用额外的包。
\let\tempone\itemize
\let\temptwo\enditemize
\renewenvironment{itemize}{\tempone\addtolength{\itemsep}{0.5\baselineskip}}{\temptwo}
(Stufazi 在他的回答中提出了一种更简洁的方法,我将在下面使用它。)
但是,我认为frame
中的环境beamer
会重置 的属性itemize
。您可以执行类似的操作,但这会阻止 的frame
可选参数起作用。
\documentclass{beamer}
\let\oldframe\frame
\renewcommand{\frame}{%
\oldframe
\let\olditemize\itemize
\renewcommand\itemize{\olditemize\addtolength{\itemsep}{100pt}}%
}
%
\begin{document}
\begin{frame}
\begin{itemize}
\item The first.
\item The second.
\item The third.
\end{itemize}
\end{frame}
%
\begin{frame}
\begin{itemize}
\item The fourth.
\item The fifth.
\item The sixth.
\end{itemize}
\end{frame}
%
\end{document}
或者,您可以尝试这个,但我不能保证它不会破坏其他东西。
\documentclass{beamer}
\newlength{\wideitemsep}
\setlength{\wideitemsep}{\itemsep}
\addtolength{\wideitemsep}{100pt}
\let\olditem\item
\renewcommand{\item}{\setlength{\itemsep}{\wideitemsep}\olditem}
%
\begin{document}
\begin{frame}
\begin{itemize}
\item The first.
\item<2-> The second.
\item<3-> The third.
\end{itemize}
\end{frame}
%
\begin{frame}[shrink=50]
\begin{itemize}
\item The fourth.
\item The fifth.
\item The sixth.
\end{itemize}
\end{frame}
%
\end{document}
根据 itemize 定义自己的列表环境并在将来使用它可能会更安全;因此
\newenvironment{wideitemize}{\itemize\addtolength{\itemsep}{100pt}}{\enditemize}
这将避免产生不良副作用的黑客攻击的必要性。
答案2
只需将两行放在您的文档中(将 100pt 更改为您想要的任何值):
\let\OLDitemize\itemize
\renewcommand\itemize{\OLDitemize\addtolength{\itemsep}{100pt}}
如果您下次使用该enumitem
软件包编写文档(推荐!),您可以
\usepackage{enumitem}
\setitemize{itemsep=100pt}
答案3
在深入研究了 beamer 的源文件之后,我认为我找到了实现这一点的最佳方法,而不会破坏或itemize
环境的其他选项或高级功能frame
。解决方案是定义一个新的框架选项,例如:
\makeatletter
\define@key{beamerframe}{wide}[30pt]{%
\def\beamer@cramped{\itemsep #1\topsep0.5pt\relax}}
\makeatother
这样以后就可以写:
\begin{frame}[wide]
% ...
\end{frame}
获得框架中使用的所有itemize
、enumerate
和环境的“更宽”、更宽敞的版本。这实际上只是来自 beamer 已定义的另一个选项的副本,所以我猜这是实现这一点而不破坏任何东西的“正确”方法。description
squeeze
设为默认
可能还希望有一个选项,将其设为默认选项全部帧。不幸的是,beamer 似乎不支持设置默认帧选项。以下是有点 hack 的感觉,但我希望它不会破坏任何东西。将所有代码放入样式文件中(例如beamer-extra.sty
):
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{beamer-extra}[2013/08/22 Some extra beamer features]
\RequirePackage{etoolbox}
% A command to set default frame options:
% \defaultframeoptions{<options>} % append some more defaults options
% \defaultframeoptions*{<options>} % clear past defaults, set some new
\def\beamer@extra@frameoptions{}
\def\beamer@extra@setframeoptions#1%
{\appto\beamer@extra@frameoptions{\setkeys{beamerframe}{#1}}}
\def\defaultframeoptions{\@ifstar
{\def\beamer@extra@frameoptions{}\beamer@extra@setframeoptions}
{\beamer@extra@setframeoptions}}
\define@key{beamerframe}{environment}%
{\def\beamer@frameenvironmentsubst{#1}\beamer@extra@frameoptions}
% A new frame option for wider items
\define@key{beamerframe}{wide}[30pt]{%
\def\beamer@cramped{\itemsep #1\topsep0.5pt\relax}}
然后像这样使用它:
\documentclass{beamer}
\usepackage{beamer-extra}
\defaultframeoptions{wide=15pt}
\begin{document}
\begin{frame}
\frametitle{Example}
\begin{itemize}
\item One
\item Two
\item Three
\end{itemize}
\end{frame}
\end{document}
答案4
正如其他答案所示,重新定义环境以符合您的喜好是相当可行的。更适合 Beamer 的方法是让模板来处理这些设置。
有预定义的模板可用,允许我们修改itemize
和enumerate
环境的行为。以下 6 个模板(每行一个)可用于修饰这些环境。
itemize/enumerate body begin
itemize/enumerate body end
itemize/enumerate subbody begin
itemize/enumerate subbody end
itemize/enumerate subsubbody begin
itemize/enumerate subsubbody end
sub
和模板subsub
用于嵌套这些环境。body begin
模板,尤其是itemize/enumerate body begin
模板,可用于“全局”设置 beamer 的 itemize(和 enumerate)环境中的 item-spacing。
(目前)Beamer 像这样启动我们的主题环境
\usebeamertemplate{itemize/enumerate body begin}
\list{redacted}{redacted}
\beamer@cramped
\raggedright
\beamer@firstlineitemizeunskip
对于嵌套环境,它使用subbody
模板的-versions。
让我们关注内部宏\beamer@cramped
:目前,仅使用 beamer 包提供的 beamer 类和样式,此宏要么为空,要么为\itemsep0pt\topsep0.5pt\relax
。至少是\itemsep
我们正在寻找的设置之一,并且它是一个list
- 特定的(因此是itemize
和enumerate
特定的)设置。显然,这个宏正是为我们正在寻找的目的而引入的!
这意味着我们不太可能通过修改这个宏来破坏任何东西。我们可以像这样编写模板:
\defbeamertemplate*{itemize/enumerate body begin}{myAwesome theme}
{
\let\this@beamer@cramped\beamer@cramped
\renewcommand{\beamer@cramped}{
\this@beamer@cramped
\addtolength{\itemsep}{.5\baselineskip}
}
}
\defbeamertemplate*{itemize/enumerate body end}{myAwesome theme}
{
\let\beamer@cramped\this@beamer@cramped
}
我构建了此代码以适应问题。就我个人而言,我不做\let
和的\addtolength
事情。我只是定义\beamer@cramped
设置\itemsep
为绝对值,即
\renewcommand{\beamer@cramped}{\itemsep2em\relax}
我将 保留\relax
在定义的末尾\beamer@cramped
,因为 的原作者\beamer@cramped
可能有理由将它放在那里。
比较棘手的是,我们需要在调用\itemsep
之后进行设置\list
,也就是说,我们不能简单地\itemsep
在模板中设置。通过修改,\beamer@cramped
我们可以将代码放在有用的位置。
所有这些都可能发生在群体内部,因此我们对“\beamer@cramped”的重新定义仅对特定环境及其嵌套环境有效,我没有调查。