Setting Itemize Spacing in Beamer – How to Avoid Breaking Overlay Specifications

beameritemizeoverlaysspacing

This minimal example

\documentclass{beamer}

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

yields a presentation with three bullet points that are revealed one by one. I would like to globally increase the vertical spacing between the items. The following ideas do not provide a satisfactory solution.

  • \addtolength{\itemsep}{10pt} works, but the command has to be added to each itemize environment individually.
  • \usepackage{enumitem} makes the bullet points invisible.
  • Redefining the itemize environment or item command as well as defining a new list environment as suggested here breaks the beamer overlay specifications ([<...>]) for the respective environment or command.

Is there anything else I could try? Is it possible to pass through overlay specifications when redefining an environment?

Best Answer

The base question was solved by Gonzalo Medina here. Since then, I refined it a bit to have a command that you can use globally or inside a specific frame (see the comments and the example):

\documentclass{beamer}

\usepackage{xpatch}
\makeatletter
\newlength{\my@beamer@itemsepi}\setlength{\my@beamer@itemsepi}{3ex}
\newlength{\my@beamer@itemsepii}\setlength{\my@beamer@itemsepii}{1.5ex}
\newlength{\my@beamer@itemsepiii}\setlength{\my@beamer@itemsepiii}{1.5ex}
\newcommand{\my@beamer@setsep}{%
\ifnum\@itemdepth=1\relax
     \setlength\itemsep{\my@beamer@itemsepi}% separation for first level
   \else
     \ifnum\@itemdepth=2\relax
       \setlength\itemsep{\my@beamer@itemsepii}% separation for second level
       % \setlength\topsep{\my@beamer@itemsepi}% separation for second level
     \else
       \ifnum\@itemdepth=3\relax
         \setlength\itemsep{\my@beamer@itemsepiii}% separation for third level
         % \setlength\topsep{\my@beamer@itemsepii}% separation for second level
   \fi\fi\fi}
\xpatchcmd{\itemize}
  {\def\makelabel}{\my@beamer@setsep\def\makelabel}{}{}
\xpatchcmd{\beamer@enum@}
  {\def\makelabel}{\my@beamer@setsep\def\makelabel}{}{}
\newcommand\setlistsep[3]{%
    \setlength{\my@beamer@itemsepi}{#1}%
    \setlength{\my@beamer@itemsepii}{#2}%
    \setlength{\my@beamer@itemsepiii}{#3}%
}
\makeatother

% This will set the separations in the whole document. You can override
% it for each frame by putting it at the start of the frame.

\setlistsep{10ex}{5ex}{5ex}

\begin{document}
  \begin{frame}
    \begin{itemize}[<+->]
      \item item 1
      \item item 2
      \item item 3
    \end{itemize}
  \end{frame}
  \begin{frame}
    \setlistsep{3ex}{3ex}{3ex}
    \begin{itemize}[<+->]
      \item item 1
      \item item 2
      \item item 3
    \end{itemize}
  \end{frame}
    \begin{frame}
    \begin{itemize}[<+->]
      \item item 1
      \item item 2
      \item item 3
    \end{itemize}
  \end{frame}

\end{document}

enter image description here