用于 beamer 的 itemize 环境中项目之间间距的全局设置

用于 beamer 的 itemize 环境中项目之间间距的全局设置

我想修改 itemize 环境中项目之间的间距。 帖子展示了如何修改特定的 itemize 环境 ( \addtolength{\itemsep}{0.5\baselineskip})。但是,我想对整个文档进行全局修改。 帖子建议使用 enumitem 包。但是,当我使用此包(仅声明它)时,我在 beamer 中收到错误。有什么建议吗?我目前在所有 itemize 环境中都使用 addtolength 方法。我想要一个全局解决方案。谢谢。

答案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}

获得框架中使用的所有itemizeenumerate和环境的“更宽”、更宽敞的版本。这实际上只是来自 beamer 已定义的另一个选项的副本,所以我猜这是实现这一点而不破坏任何东西的“正确”方法。descriptionsqueeze


设为默认

可能还希望有一个选项,将其设为默认选项全部帧。不幸的是,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 的方法是让模板来处理这些设置。

有预定义的模板可用,允许我们修改itemizeenumerate环境的行为。以下 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- 特定的(因此是itemizeenumerate特定的)设置。显然,这个宏正是为我们正在寻找的目的而引入的!

这意味着我们不太可能通过修改这个宏来破坏任何东西。我们可以像这样编写模板:

\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”的重新定义仅对特定环境及其嵌套环境有效,我没有调查。

相关内容