我习惯\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}