我在 Beamer 中有很多描述环境,其中既有长项也有短项,因此输出如下
veryverylongitem description 1
shortitem description 2
这实在不太好。
所以我尝试将标签和描述放在不同的行上,例如
veryverylongitem
description 1
shortitem
description 2
为此,我尝试了两件事:
\let\origdescription\description
\renewenvironment{description}{
\setlength{\leftmargini}{0em}
\origdescription
\setlength{\itemindent}{0em}
\setlength{\labelsep}{\textwidth}
}
{\endlist}
这似乎做了我想要做的事情,只是在使用两个嵌套描述环境时事情完全出问题了
另一方面,把类似的东西
\begin{description}
\item[veryveryveryverylongitem]\hfill\\
description 1
\item[shortitem]\hfill\\
description 2
\end{description}
将完美地完成工作,只是我找不到方法来更新项目命令,以便 hfill 可以应用于整个文档。
还有其他方法来处理长描述吗,或者我在这两个解决方案中做错了什么?
答案1
使用enumitem
包beamer
is 的包不是一个好主意;例如,仅通过加载enumitem
,默认的 beamer 字体和颜色规范就会description
丢失;此外\setbeamercolor
和\setbeamerfont
不会对产生任何影响description item
;更糟糕的是,enumitem 包还会干扰和beamer
的布局;事实上,它会对环境产生错误(参见底部的示例)。itemize
enumerate
enumerate
在下面的例子中,我Ldescription
根据标准的 beamer 定义定义了一个环境description
;由于新定义遵循“beamer 方式”,它将按预期运行(例如,它具有过度意识,并尊重颜色和字体模板)并为您提供所需的布局(请根据需要随意调整长度):
\documentclass{beamer}
\usepackage{lipsum}
\makeatletter
\def\Ldescription{%
\@ifnextchar[{\beamer@testforospec}{\beamer@descdefault\beamer@descriptionwidth\@@Ldescription}%
}
\def\beamer@testforospec[{\@ifnextchar<{\beamer@scandefaultospec[}{\@Ldescription[}}%
\def\beamer@scandefaultospec[#1]{\def\beamer@defaultospec{#1}\Ldescription}
\def\@Ldescription[#1]{%
\setbox\beamer@tempbox=\hbox{\def\insertdescriptionitem{#1}
\usebeamertemplate**{description item}}%
\beamer@descdefault\wd\beamer@tempbox\@@description%
}%
\def\@@Ldescription{%
\beamer@descdefault35pt%
\list
{}
{\labelwidth\beamer@descdefault\leftmargin2.8em\let\makelabel\beamer@Ldescriptionitem}%
\beamer@cramped%
\raggedright
\beamer@firstlineitemizeunskip%
}
\def\endLdescription{\ifhmode\unskip\fi\endlist}
\long\def\beamer@Ldescriptionitem#1{%
\def\insertdescriptionitem{#1}%
\hspace\labelsep{\parbox[b]{\dimexpr\textwidth-\labelsep\relax}{%
\usebeamertemplate**{description item}%
}}}
\makeatother
\begin{document}
\begin{frame}
\begin{Ldescription}
\item<1->[very very very very long item] \lipsum[2]
\item<2,4>[short titem] description 2
\item<3->[another very very very very long item] description 3
\item<4->[short item] description 4
\end{Ldescription}
\end{frame}
\end{document}
第四帧的图像:
为什么 enumitem 不应与 beamer 一起使用
处理以下代码:
\documentclass{beamer}
%\usepackage{enumitem}
\setbeamercolor{description item}{fg=olive!80!black}
\setbeamerfont{description item}{size=\footnotesize}
\begin{document}
\begin{frame}
\begin{description}
\item[item] description
\end{description}
\begin{itemize}
\item description
\end{itemize}
\end{frame}
\end{document}
产生以下(预期)输出:
现在取消注释行enumitem
loading.reprocess ,现在您将得到以下不想要的结果:
现在,尝试这个简单的文档:
\documentclass{beamer}
\usepackage{enumitem}
\begin{document}
\begin{frame}
\begin{enumerate}
\item test
\end{enumerate}
\end{frame}
\end{document}
您将收到:
! TeX capacity exceeded, sorry [grouping levels=255].
\labelenumi ->{
\labelenumi }
l.10 \end{frame}
! ==> Fatal error occurred, no output PDF file produced!
道理很明显:enumitem
和beamer
是不相容的。也许使用loadonly
包选项来创建自己的列表可能是安全的:
\usepackage[loadonly]{enumitem}
答案2
您可以使用枚举项包中。它已定义为描述类下的样式,nextline
\documentclass{beamer}
\usepackage{enumitem}
\begin{document}
\begin{frame}
\begin{description}[style=nextline]
\item<1->[veryveryveryverylongitem] description 1
\item<2-3>[shortitem] description 2
\item<3->[shortitem2] description 3
\item<4->[shortitem3] description 4
\end{description}
\end{frame}
\end{document}
对于覆盖规范声明,可以使用
\documentclass{beamer}
\usepackage{enumitem}
\begin{document}
\begin{frame}
\beamerdefaultoverlayspecification{<+->}
\begin{description}[style=nextline]
\item[veryveryveryverylongitem] description 1
\item[shortitem] description 2
\item[shortitem] description 2
\item[shortitem] description 2
\end{description}
\beamerdefaultoverlayspecification{}
\end{frame}
\begin{frame}[fragile]
\begin{description}[style=nextline]
\item[Any overlay?] No overlay!
\item[Yes] I see them all...
\item[Can make the command] {\verb|\beamerdefaultoverlayspecification{<+->}|}
\item[something] shorter
\end{description}
\end{frame}
\end{document}
感谢 Marco Daniel,enumitem 在 beamer 中的使用似乎并不那么简单。cmhughes 的评论也可以作为另一种选择。