问题

问题

我习惯\setlength\itemsep{\fill}在 itemize 环境中垂直拉伸项目。如果我没有子列表,这个方法很有效:

在此处输入图片描述

但是,如果有子列表,子列表后面的项不会被拉伸。如下面的屏幕截图所示,前两个一级项之间的间距小于后两个一级项之间的间距。

在此处输入图片描述

问题

我该如何解决这个问题,而不需要设置固定长度\itemsep(例如10pt)或\vfill在每个级别 1 之前手动添加\item

平均能量损失

\documentclass{beamer}
\begin{document}
\begin{frame}{Title}
  \begin{itemize}
    \setlength\itemsep{\fill}
    \item item 
    \begin{itemize}
      \item subitem 
    \end{itemize}
    \item item
    \item item
  \end{itemize}
\end{frame}
\end{document}

答案1

要将列表扩展到整个空间,我发现两个问题:

  • 要自动设置\setlength\itemsep{\fill}所有项目,可以将其添加到定义中\itemize

  • 要在父列表和子列表的项目之间添加相同的空间,可以使用

    \ifnum \@itemdepth >1
        \vfill
    \fi%
    

    在此子列表的开始和结束处。


\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}}
      {\def\makelabel##1{%
          {%
            \hss\llap{{%
                \usebeamerfont*{itemize \beameritemnestingprefix item}%
                \usebeamercolor[fg]{itemize \beameritemnestingprefix item}##1}}%
          }%
        }%
      }
  \fi%
  \setlength\itemsep{\fill}
    \ifnum \@itemdepth >1
        \vfill
    \fi%  
  \beamer@cramped%
  \raggedright%
  \beamer@firstlineitemizeunskip%
}

\def\enditemize{\ifhmode\unskip\fi\endlist%
  \usebeamertemplate{itemize/enumerate \beameritemnestingprefix body end}
  \ifnum \@itemdepth >1
        \vfil
  \fi%  
  }
\makeatother

\begin{document}
\begin{frame}{Title}
  \begin{itemize}
    \item item 
    \begin{itemize}
      \item subitem 
      \item subitem 
    \end{itemize}
    \item item
    \item item
  \end{itemize}
\end{frame}
\end{document}

在此处输入图片描述

答案2

按照@samcarter的示例,我设法调整代码以产生我想要的输出。使用包\xpatchcmd中的代码xpatch,我能够使代码更简洁、更不令人生畏:

在此处输入图片描述

代码

\documentclass{beamer}

\usepackage{xpatch}
\xpatchcmd{\itemize}
  {\def\makelabel}
  {\ifnum\@itemdepth=1\relax
     \setlength\itemsep{\fill}% separation for first level
   \fi\def\makelabel
  }{}{}
\xpatchcmd{\enditemize}
  {\endlist}
  {\endlist\ifnum\@itemdepth<2\else\vfil\fi}{}{}

\begin{document}
\begin{frame}{Title}
  \begin{itemize}
    \item item 
    \begin{itemize}
      \item subitem 
      \begin{itemize}
        \item subsubitem
        \item subsubitem
      \end{itemize}
      \item subitem 
      \begin{itemize}
        \item subsubitem
        \item subsubitem
      \end{itemize}
    \end{itemize}
    \item item
    \item item
  \end{itemize}
\end{frame}
\end{document}

相关内容