[Tex/LaTex] Dealing with long description environment items

beamerdescriptionlists

I have quite a lot of description environments in Beamer that are having both long and short items, leading to an output like

veryverylongitem description 1
    shortitem description 2

which is not really great.

So I'm trying to put labels and descriptions on different lines, in something like

veryverylongitem
            description 1
shortitem
            description 2

I've tried two things for that:

\let\origdescription\description
\renewenvironment{description}{
\setlength{\leftmargini}{0em}
\origdescription
\setlength{\itemindent}{0em}
\setlength{\labelsep}{\textwidth}
}
{\endlist}

which seem to do what I'd like, except that things are completely glitchy when using two nested description environment

On another hand, puting something like

\begin{description}
\item[veryveryveryverylongitem]\hfill\\
     description 1
\item[shortitem]\hfill\\
     description 2
\end{description}

will do the job perfectly, except that I can't find a way to do renew the item command so that the hfill would applied document-wide.

Is there other way to deal with long description, or have I done something wrong in the two solutions ?

Best Answer

Using the enumitem package with beamer is not a good idea; for example, just by loading enumitem, the default beamer font and color specifications for description are lost; moreover \setbeamercolor and \setbeamerfont will have no effect on description item; even worst, the enumitem package will also interfere with the beamer layout for itemize and enumerate; in fact, it will produce errors for the enumerate environment (See example at the bottom).

In the following example I defined a Ldescription environment based on the beamer definition of standard description; since the new definition follows the "beamer way", it will behave as expected (it's overaly aware, for exampe, and respects the color and font templates) and will give you the desired layout (feel free to adjust the lengths according to your needs):

\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}

An image of the fourth frame:

enter image description here

Why enumitem shouln't be used with beamer

Processing the following code:

\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}

produces the following (expected) output:

enter image description here

Now uncomment-out the line loading enumitem. reprocess and now you'll get the following undesired result:

enter image description here

Now, try this simple document:

\documentclass{beamer}
\usepackage{enumitem}

\begin{document}

\begin{frame}
\begin{enumerate}
\item test
\end{enumerate}
\end{frame}

\end{document}

and you'll receive:

! TeX capacity exceeded, sorry [grouping levels=255].
\labelenumi ->{
               \labelenumi }
l.10 \end{frame}
                
!  ==> Fatal error occurred, no output PDF file produced!

The moral is clear: enumitem and beamera are incompatible. Perhaps using the loadonly package option to create own lists could be safe:

\usepackage[loadonly]{enumitem}