处理长描述环境项

处理长描述环境项

我在 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

使用enumitembeameris 的包不是一个好主意;例如,仅通过加载enumitem,默认的 beamer 字体和颜色规范就会description丢失;此外\setbeamercolor\setbeamerfont不会对产生任何影响description item;更糟糕的是,enumitem 包还会干扰和beamer 的布局;事实上,它会对环境产生错误(参见底部的示例)。itemizeenumerateenumerate

在下面的例子中,我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}

产生以下(预期)输出:

在此处输入图片描述

现在取消注释行enumitemloading.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!

道理很明显:enumitembeamer是不相容的。也许使用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 的评论也可以作为另一种选择。

相关内容