description

LaTeX's description environment is the third of the three list types, alongside itemize and enumerate, but its design is nothing like theirs. Open the definition in the standard classes and you find description setting \labelwidth to 0pt and \itemindent to minus \leftmargin. In other words, the column that holds the term has no width at all — by design. That single line explains both what description is good at (a term of any length can be set) and its best-known nuisance (a long term shoves the explanation sideways). This page looks at what the environment is actually for, where the bold comes from, and how enumitem's style= takes control of that shove.

What description is actually for

description exists to set pairs of a word and an explanation of that word. Where itemize and enumerate supply the marker for you — a bullet, a number — description expects you to give the label in words: whatever you write in the optional argument [...] of \item becomes the term. In itemize and enumerate that [...] is a side feature for overriding one entry's marker; in description it is the whole point. Glossaries, option listings, parameter documentation, a cast of characters — whenever the structure is “a name, with an explanation hanging off it,” this is the right environment.

latex
\begin{description}
  \item[TeX] The typesetting system Knuth wrote.
  \item[LaTeX] A document language built on top of TeX.
  \item[CTAN] The worldwide archive network that distributes packages.
\end{description}

The structure maps exactly onto HTML's <dl> / <dt> / <dd>, the definition list. Choosing description therefore means something beyond appearance: you are declaring in the manuscript that this is a definition, and conversion tools and index generators can read that intent. Set the same thing by hand as \textbf{term}\quad explanation and the output may look similar while the structural information is gone. As with itemize and enumerate, at least one item is required; closing the environment empty raises ! LaTeX Error: Something's wrong--perhaps a missing \item.

Where the bold comes from (\descriptionlabel)

A term is set bold not because of \item[...] but because of a command that belongs to description alone: \descriptionlabel. Its definition in the standard classes is the single line \hspace\labelsep \normalfont\bfseries #1, and the \bfseries sits right there. The distinction is testable: write \item[Word] inside an itemize and the resulting PDF embeds only the roman text font — no bold face appears at all. \item[...] merely replaces the marker; it has no power to embolden anything. The bold in a description exists only because the environment hands \descriptionlabel to \makelabel.

So if you want to change only the typeface, without enumitem, the straightforward route is to redefine \descriptionlabel with \renewcommand; its argument #1 is the term. Here is a version that sets every term in small capitals, keeping the leading \hspace{\labelsep} so the spacing matches the original definition. Swap \textsc for \texttt (monospace) or \textit (italic) for a different look. Note also that while itemize changes its marker with depth and enumerate changes its number style with depth, description keeps the same term style at every nesting level. There is only one \descriptionlabel, so this redefinition applies uniformly to all levels in the document.

preamble
% the standard-class definition is:
%   \newcommand*\descriptionlabel[1]{\hspace\labelsep \normalfont\bfseries #1}
\renewcommand{\descriptionlabel}[1]{%
  {\hspace{\labelsep}\textsc{#1}}}

Why a long term shoves the text: labelwidth is zero

A long term does not wrap; it pushes the first line of the explanation to the right by its own width. The cause is a single branch in latex.ltx: if the label box is wider than \labelwidth\ifdim \wd\@tempboxa >\labelwidth — LaTeX abandons the fixed-width box and sets the label at its natural width instead. And because description sets \labelwidth to 0pt, even the shortest word takes that branch, always. A description term is therefore never in a fixed-width column at all. Measured in article: \labelwidth 0pt, \itemindent −25.00003pt (that is, −\leftmargin), \labelsep 5pt.

Typeset and measured, there is always a 5pt gap after the term — exactly \labelsep — and it lands in the same place whether you write \item[Term]body closed up or \item[Term] body with a space. The gap is made by \labelsep, not by whitespace in your source, so closing it up does not help. From the second line onward the text drops back to \leftmargin (25pt), so the term and the second line of the explanation do not share a left edge and the entry looks stepped. Push it far enough — a term wider than the text block — and it spills into the right margin with an Overfull \hbox warning. The practical rule: once a term runs past three or four words, change the layout itself with the style= key described next.

Changing the layout with enumitem's font= and style=

Load enumitem and you can pass options straight to description: font= sets the typeface of the term and style= decides the arrangement of term and body itself. Write font=\sffamily\bfseries for sans-serif bold, or font=\ttfamily for monospace — shorter than rewriting \descriptionlabel, and variable per list, which is the real advantage. Keys shared with the other list types, such as leftmargin=, labelsep= and itemsep=, work here unchanged. It is style= that solves the shoving problem from the previous section.

Value of styleWhat happens when the term is long
standardAs in the standard classes: the label is boxed, and whatever overflows pushes the body right
unboxedClose to standard, but the label is not boxed, so a long term is not cramped and can break
nextlineIf the label does not fit the margin, the body starts on the next line; the body never eats into the left margin
samelineLike nextline, but when the label does not fit, the body still continues on the same line
multilineWraps the term inside the labelwidth, hyphenating if it must, and keeps the body aligned to its right

Set the same long term under all five values of style= and the differences show plainly. With nextline the body drops to the following line after a long term; with sameline it continues on the same one. For a short term both keep the body on the same line, so the difference only appears when the term does not fit. multiline is the dramatic one: it wraps a long term within labelwidth, hyphenating if it must, and stacks it vertically — useful in a technical glossary with long terms when you want the body text to keep one straight left edge. In that case you must give labelwidth= explicitly, otherwise there is no width to wrap into; specify it together with leftmargin=.

document.tex
\usepackage{enumitem}
% one list only
\begin{description}[font=\bfseries\sffamily, style=nextline, leftmargin=1.5cm]
  \item[A term long enough to overrun its line]
    the explanation begins on the next line instead of being shoved sideways
  \item[Short] the explanation stays on this line
\end{description}

% or once in the preamble, for every description in the document
\setlist[description]{font=\sffamily\bfseries, style=nextline}

The square-bracket trap, and omitting the label

Because [ and ] delimit the optional argument, you hide them in braces when you want a bracket as a character. To make the regular-expression character class [a-z] a term, write \item[\texttt{[a-z]}]; a closing bracket needs more care still, spelled {]} as in \item[Closing bracket {]}]. The reverse case is equally dangerous: when the explanation itself begins with [, wrap it as \item {[}, or LaTeX will misread it as the start of a label. In a document that explains the syntax of a programming language, both come up constantly.

latex
\begin{description}
  \item[\texttt{[a-z]}] a character class; brackets in a label need braces
  \item {[}this is how a body starting with a bracket is written
\end{description}

Omit the label and the item simply has none — you get an entry like a hanging paragraph, with no marker and no cue about indentation. Since the label is the whole point of description, avoid this unless it is deliberate. There is no sensible default for LaTeX to fall back on, so treat supplying the label as your job, always. One more thing: a font-changing command written in declaration form inside a label overrides the default bold, so wrapping the whole thing in braces, as in \item[{\ttfamily label}], is the safe habit.

description or a two-column table: which to use

The practical dividing line: if the explanations run past a single line, use description; if the values are short and uniform and meant to be scanned vertically, use a table. Two columns of tabular look ideal for terms and explanations, but they have three weaknesses. First, they cannot break across pages — you have to bring in something like longtable. Second, you must decide the column widths yourself, and a fixed p{5cm} collapses the moment the text width changes. Third, the longer the explanations, the more only the right column stretches downward until the boundary between rows disappears. description suffers none of these: it flows naturally as paragraphs, breaks across pages by itself, and follows \textwidth.

Conversely, once a value carries several attributes — type, default, range — it is no longer a definition list but a table. description suits a strict one-to-one mapping of name to explanation and nothing more. The moment you find yourself wanting a third column, moving to tabular is the right call; cramming it in as \item[name (type, default)] only lengthens the term and drops you straight back into the shoving problem from earlier on this page.