El entorno description de LaTeX es el tercero de los tres tipos de lista, junto a itemize y enumerate, pero su diseño no se parece en nada al de aquellos. Abra la definición en las clases estándar y verá que description fija \labelwidth en 0pt y \itemindent en menos \leftmargin. Dicho de otro modo, la columna que aloja el término no tiene anchura alguna, y es a propósito. Esa única línea explica a la vez la virtud de description (se compone un término de cualquier longitud) y su fastidio más conocido (un término largo empuja la explicación a un lado). Esta página examina para qué sirve realmente el entorno, de dónde sale la negrita y cómo el style= de enumitem domina ese empujón.
Para qué sirve realmente description
description existe para componer pares formados por una palabra y la explicación de esa palabra. Donde itemize y enumerate aportan ellos mismos el marcador —una viñeta, un número—, description espera que sea usted quien dé la etiqueta con palabras: lo que escriba en el argumento opcional [...] de \item se convierte en el término. En itemize y enumerate, ese [...] es una función lateral para sustituir el marcador de una entrada; en description es toda la razón de ser. Glosarios, listados de opciones, documentación de parámetros, un reparto de personajes: siempre que la estructura sea «un nombre, del que cuelga una explicación», este es el entorno correcto.
\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}Esta estructura corresponde exactamente a la lista de definiciones <dl> / <dt> / <dd> de HTML. Elegir description significa, pues, algo más que apariencia: usted declara en el manuscrito que eso es una definición, y las herramientas de conversión o los generadores de índices saben leer esa intención. Componga lo mismo a mano como \textbf{término}\quad explicación y el resultado se parecerá, pero la información estructural habrá desaparecido. Como en itemize y enumerate, hace falta al menos un elemento; cerrar el entorno vacío provoca ! LaTeX Error: Something's wrong--perhaps a missing \item.
De dónde sale la negrita (\descriptionlabel)
Un término sale en negrita no por \item[...], sino por un comando propio de description: \descriptionlabel. Su definición en las clases estándar es la única línea \hspace\labelsep \normalfont\bfseries #1, y ahí está el \bfseries. La distinción se comprueba: escriba \item[Word] dentro de un itemize y el PDF resultante solo incrusta la redonda del texto; no aparece ninguna negrita. \item[...] se limita a sustituir el marcador; no tiene poder alguno para engrosar nada. La negrita de una description nace solo porque el entorno entrega \descriptionlabel a \makelabel.
Así pues, si solo quiere cambiar la tipografía, sin enumitem, la vía directa es redefinir \descriptionlabel con \renewcommand; su argumento #1 es el término. He aquí una versión que compone cada término en versalitas, conservando el \hspace{\labelsep} inicial para que el espaciado coincida con la definición original. Cambie \textsc por \texttt (monoespaciada) o \textit (cursiva) para otro aspecto. Fíjese además en que, mientras itemize cambia de marcador y enumerate de forma de número según la profundidad, description conserva el mismo estilo de término en todos los niveles de anidamiento. Solo hay un \descriptionlabel, de modo que esta redefinición se aplica por igual a todos los niveles del documento.
% the standard-class definition is:
% \newcommand*\descriptionlabel[1]{\hspace\labelsep \normalfont\bfseries #1}
\renewcommand{\descriptionlabel}[1]{%
{\hspace{\labelsep}\textsc{#1}}}Por qué un término largo empuja el texto: labelwidth vale cero
Un término largo no se parte: empuja hacia la derecha la primera línea de la explicación, en su propia anchura. La causa cabe en una sola bifurcación de latex.ltx: si la caja de la etiqueta es más ancha que \labelwidth —\ifdim \wd\@tempboxa >\labelwidth—, LaTeX renuncia a la caja de anchura fija y compone la etiqueta en su anchura natural. Y como description fija \labelwidth en 0pt, hasta la palabra más corta toma siempre esa rama. Un término de description nunca está, pues, en una columna de anchura fija. Medido en article: \labelwidth 0pt, \itemindent −25,00003pt (es decir, −\leftmargin), \labelsep 5pt.
Compuesto y medido, tras el término queda siempre un blanco de 5pt —exactamente \labelsep— y cae en el mismo sitio tanto si escribe \item[Term]body pegado como \item[Term] body con espacio. Ese blanco lo produce \labelsep, no el espacio de su código fuente, así que pegarlo no ayuda. A partir de la segunda línea el texto retrocede a \leftmargin (25pt), de modo que el término y la segunda línea de la explicación no comparten borde izquierdo y la entrada se ve escalonada. Fuércelo bastante —un término más ancho que el bloque de texto— y se derramará en el margen derecho con un aviso Overfull \hbox. La regla práctica: en cuanto un término pase de tres o cuatro palabras, cambie la disposición misma con la clave style= que se describe a continuación.
Cambiar la disposición con font= y style= de enumitem
Con enumitem cargado, pueden pasarse opciones directamente a description: font= fija la tipografía del término y style= decide la disposición misma de término y cuerpo. Escriba font=\sffamily\bfseries para una sans-serif negrita, o font=\ttfamily para monoespaciada: más corto que reescribir \descriptionlabel y variable lista por lista, que es la ventaja real. Las claves comunes a los demás tipos de lista, como leftmargin=, labelsep= e itemsep=, funcionan aquí sin cambios. Es style= lo que resuelve el problema de empuje de la sección anterior.
| Valor de style | Qué ocurre cuando el término es largo |
|---|---|
standard | Como en las clases estándar: la etiqueta va encajonada y lo que desborda empuja el cuerpo a la derecha |
unboxed | Cercano a standard, pero la etiqueta no va encajonada: un término largo no queda apretado y puede partirse |
nextline | Si la etiqueta no cabe en el margen, el cuerpo empieza en la línea siguiente; nunca invade el margen izquierdo |
sameline | Como nextline, pero si la etiqueta no cabe, el cuerpo continúa igualmente en la misma línea |
multiline | Pliega el término dentro de labelwidth, partiéndolo si hace falta, y mantiene el cuerpo alineado a su derecha |
Componga el mismo término largo bajo los cinco valores de style= y las diferencias saltan a la vista. Con nextline, el cuerpo cae a la línea siguiente tras un término largo; con sameline, continúa en la misma. Para un término corto, ambos mantienen el cuerpo en la misma línea, de modo que la diferencia solo aparece cuando el término no cabe. multiline es el llamativo: pliega un término largo dentro de labelwidth, partiéndolo si es preciso, y lo apila en vertical; útil en un glosario técnico de términos largos cuando se quiere que el cuerpo conserve un borde izquierdo recto. En tal caso hay que indicar labelwidth= de forma explícita, o no habrá anchura sobre la que plegar; especifíquela junto con leftmargin=.
\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}La trampa de los corchetes y la omisión de la etiqueta
Como [ y ] delimitan el argumento opcional, se ocultan entre llaves cuando se quiere un corchete como carácter. Para convertir en término la clase de caracteres [a-z] de una expresión regular, escriba \item[\texttt{[a-z]}]; un corchete de cierre exige aún más cuidado y se escribe {]}, como en \item[Corchete de cierre {]}]. El caso inverso es igual de peligroso: si la explicación empieza ella misma por [, envuélvala como \item {[}, o LaTeX leerá ahí el comienzo de una etiqueta. En un documento que explique la sintaxis de un lenguaje de programación, ambos casos aparecen sin cesar.
\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}Omita la etiqueta y el elemento sencillamente no tendrá ninguna: obtendrá una entrada con forma de párrafo colgante, sin marcador ni pista de sangría. Puesto que la etiqueta es toda la razón de ser de description, evítelo salvo que sea deliberado. No hay un valor por defecto sensato al que LaTeX pueda recurrir, así que dar la etiqueta es siempre cosa suya. Un punto más: un comando de cambio de fuente escrito en forma de declaración dentro de una etiqueta sobrescribe la negrita por defecto, así que envolverlo todo entre llaves, como en \item[{\ttfamily label}], es la costumbre segura.
description o tabla de dos columnas: cuál usar
La línea divisoria práctica: si las explicaciones pasan de una línea, use description; si los valores son cortos, uniformes y están pensados para recorrerse en vertical, use una tabla. Dos columnas de tabular parecen ideales para término y explicación, pero tienen tres debilidades. Primera, no pueden partirse entre páginas: hay que recurrir a algo como longtable. Segunda, debe decidir usted mismo las anchuras de columna, y un p{5cm} fijo se derrumba en cuanto cambia la anchura del texto. Tercera, cuanto más largas son las explicaciones, más se estira solo la columna derecha hacia abajo, hasta que la frontera entre filas desaparece. description no padece nada de esto: fluye con naturalidad en párrafos, se parte solo entre páginas y sigue a \textwidth.
A la inversa, en cuanto un valor lleva varios atributos —tipo, valor por defecto, rango—, ya no es una lista de definiciones sino una tabla. description sirve para una correspondencia estrictamente biunívoca entre nombre y explicación, y nada más. En el momento en que desee una tercera columna, pasar a tabular es la decisión correcta; embutirlo como \item[nombre (tipo, defecto)] solo alarga el término y le devuelve de lleno al problema de empuje visto más arriba.