Las columnas no son una cuestión de estilo de la casa: son una ayuda a la lectura. Una línea de texto en un article a 10 puntos mide 345pt de ancho, unos 78 caracteres en inglés, mientras que el tipógrafo Robert Bringhurst sitúa el rango cómodo entre 45 y 75 caracteres y considera ideal la línea de 66. Basta partir esa página en dos columnas para que cada línea vuelva a caer dentro del rango. Por eso revistas, actas de congresos y periódicos se componen a varias columnas, y LaTeX ofrece para ello dos herramientas de carácter muy distinto: la opción de clase twocolumn y el entorno multicols del paquete multicol. Parecen intercambiables y no lo son. Esta página sigue las diferencias que de verdad duelen: cuántas columnas caben, si la última página queda equilibrada, y las dos maneras muy distintas en que una figura puede desaparecer sin avisar.
twocolumn o multicol: cuál usar
twocolumn sirve cuando el documento entero va a dos columnas y lleva figuras; multicol sirve cuando solo una parte va en columnas, cuando hacen falta tres o más, o cuando la última página debe terminar pareja. La línea divisoria son los flotantes. twocolumn deja intacta la maquinaria de flotantes de LaTeX: una figure sigue flotando dentro de su columna y figure* abarca la página. multicol, en cambio, sustituye por completo la rutina de salida y, a cambio del equilibrado, renuncia del todo a los flotantes dentro de las columnas. Casi todo lo que sigue en esta página desciende de ese único intercambio.
| Forma | Columnas | Efecto |
|---|---|---|
twocolumn | 2 | Opción de clase; todo el cuerpo va a dos columnas y la última página queda despareja |
\twocolumn[⟨text⟩] | 2 | Se usa en el cuerpo; fuerza un salto de página y compone ⟨text⟩ a ancho completo sobre las columnas |
\onecolumn | 1 | Se usa en el cuerpo; fuerza un salto de página y vuelve a una sola columna |
multicols | 2 a 10 | Entorno; empieza y acaba a mitad de página y equilibra las columnas finales |
multicols* | 2 a 10 | Igual, pero las columnas finales se llenan desde la izquierda y quedan desparejas |
Componer todo el documento a dos columnas con twocolumn
Basta con añadir twocolumn a las opciones de clase: \documentclass[twocolumn]{article} compone todo el cuerpo a dos columnas (el valor por defecto es onecolumn). Muchas clases académicas están diseñadas internamente en torno a esta opción. Para cambiar de modo a mitad del documento se llaman \twocolumn y \onecolumn en el cuerpo, con dos salvedades. Ambos comandos empiezan una página nueva, de modo que el número de columnas nunca cambia a mitad de página. Y \twocolumn produce siempre exactamente dos columnas. En cuanto hace falta una tercera, esta herramienta se ha quedado corta.
\documentclass[twocolumn]{article}Ese \twocolumn admite un argumento opcional, y suele ser él quien da la cara a un artículo. \twocolumn[⟨material a ancho completo⟩] compone solo ese material en una columna, a todo el ancho por encima del texto a dos columnas. Título, autores, filiación y resumen extendidos sobre la página, y el cuerpo fluyendo debajo en dos columnas: la maquetación que lleva todo artículo de congreso cabe en esta línea.
\documentclass[twocolumn]{article}
\begin{document}
\twocolumn[%
\begin{center}
{\LARGE A Study of Narrow Measures}\\[4pt]
A. Author \quad Institute of Typography
\end{center}
\vspace{1em}
]
The body starts here and is set in two columns.
\end{document}El hueco entre las columnas es la longitud \columnsep y el grosor de la regla que se aloja en él es \columnseprule. En las clases estándar \columnsep vale 10pt por defecto y \columnseprule vale 0pt, es decir, sin regla. Con números el argumento inicial se vuelve concreto: un article a 10 puntos tiene una \textwidth de 345pt, así que una columna mide (345 − 10) ÷ 2 = 167.5pt, unos 38 caracteres en inglés. Queda justo por debajo de la franja de 40 a 50 que Bringhurst recomienda para el trabajo a varias columnas: cada punto añadido a \columnsep se le quita a una medida que no tiene nada de sobra. La regla suele ser el mejor canje: separa las columnas a la vista y permite que el hueco siga siendo estrecho.
\setlength{\columnsep}{20pt} % wider gap between the columns
\setlength{\columnseprule}{0.4pt} % thin vertical rule inside the gapExtender una figura sobre las dos columnas: figure* y table*
Se usan los entornos con estrella. \begin{figure*} y \begin{table*} producen un flotante que abarca ambas columnas a todo el ancho de la página. Una distinción interna evita casi todos los accidentes: \columnwidth es el ancho de una columna, mientras que \textwidth es el del bloque de texto entero, ambas columnas más el hueco. Una imagen pensada para una columna lleva width=\columnwidth; una que abarca las dos lleva width=\textwidth. Al revés se obtiene o bien una caja desbordada, o bien una figura extrañamente pequeña.
\documentclass[twocolumn]{article}
\usepackage{graphicx}
\begin{document}
% one column wide: an ordinary float
\begin{figure}
\centering
\includegraphics[width=\columnwidth]{plot}
\caption{Fits inside a single column.}
\end{figure}
% spans both columns: starred float, default placement is [tp]
\begin{figure*}[t]
\centering
\includegraphics[width=\textwidth]{wide-plot}
\caption{Spans the full text width.}
\end{figure*}
\end{document}La queja de que un figure* «no sale donde lo escribí» o «se fue tres páginas más allá» cobra sentido en cuanto se conoce su valor por defecto. Las fuentes del núcleo de LaTeX afirman con claridad que todos los flotantes a doble columna tienen como colocación predeterminada tp. Así que \begin{figure*} se trata en silencio como [tp] —cabecera de página o página de flotantes dedicada— y nunca como htbp. Además, como señala el manual de referencia de LaTeX2e, b no está permitido para los flotantes de ancho completo en salida a dos columnas. Si la cabecera de la página siguiente ya está ocupada, el flotante sigue deslizándose. Cuando de verdad hace falta uno al pie, cargar stfloats o dblfloatfix habilita b.
Esa cola albergó durante mucho tiempo un fallo bastante simpático. Antes de la versión de 2015, LaTeX guardaba los flotantes pendientes en dos listas de aplazamiento separadas: una para los de una columna y otra para los de dos. Dos colas significan adelantamientos: una Figura 3 de una columna podía rebasar a una Figura 2 de ancho completo escrita antes e imprimirse delante de ella. La corrección apareció primero como el paquete fixltx2e, que fundía las dos listas en una. En 2015 todas las correcciones de fixltx2e se incorporaron al propio núcleo, así que en cualquier instalación de TeX actual no queda nada que cargar. Si encuentras una entrada antigua sobre figuras desordenadas, mira primero su fecha.
Tres columnas o más, y columnas que acaban parejas: multicol
Se carga \usepackage{multicol}, se envuelve la región en un entorno multicols y se pasa el número de columnas como argumento. Solo con eso se dispone de 2 a 10 columnas (el techo de diez existe desde la versión 1.5); el entorno empieza y termina a mitad de página y, al cerrarse, iguala él mismo las alturas. Los entornos multicols incluso pueden anidarse. Como nada fuerza un salto de página, insertar un glosario o un índice a tres columnas en medio de un texto a una columna resulta de lo más natural.
\usepackage{multicol}
% ... later, in the body
\begin{multicols}{3}
This text is broken into three balanced columns.
\end{multicols}multicol existe por culpa de un índice. En 1989, mientras escribía las macros del paquete doc, Frank Mittelbach quería que el índice y la bibliografía de un archivo de documentación compartieran página. El modo a dos columnas estándar no lo permite: \twocolumn siempre empieza una página nueva, y la última acaba con la columna derecha medio vacía. En la documentación del paquete deja constancia de que la primera versión le costó un fin de semana entero y de que partió del algoritmo de la página 417 de The TeXbook, añadiendo que ese comentario procede de la publicación inicial y que desde entonces se han invertido varios cientos de horas más. El equilibrado, pues, no se concibió como un adorno, sino como una forma de ahorrar papel.
multicols admite dos argumentos opcionales tras el número de columnas. El primero, [⟨texto previo⟩], es un título o entradilla compuestos a ancho completo justo encima de las columnas. El segundo, [⟨longitud⟩], es el espacio libre mínimo que debe quedar al pie de la página para que las columnas empiecen allí, y sustituye por esta única vez el valor predeterminado \premulticols (50pt). Si queda menos, el entorno comienza en una página nueva. Omitirlo tras un preámbulo largo puede detener al paquete con el error Error saving partial page, seguido de Some text may be lost! y de la indicación de aumentar \premulticols.
\begin{multicols}{3}
[\section{Glossary}
This heading and this sentence run the full text width.]
[6cm]
Everything after the optional arguments is split into three columns.
\end{multicols}Por qué la última página de un documento twocolumn no se equilibra
Porque LaTeX termina cada columna antes de saber que habrá otra. En modo a dos columnas, la rutina de salida \@outputdblcol se ejecuta una vez por columna: cuando la columna izquierda se llena, su contenido se guarda en una caja llamada \@leftcolumn y la composición continúa; solo cuando se llena la derecha se monta la página y se expide. En ningún momento LaTeX tiene en la mano el texto restante ni puede decidir cómo partirlo en dos. Así que lo que quede en \end{document} se vierte en la columna izquierda y se detiene ahí, dejando corta la derecha. No es un fallo: es lo que produce por fuerza una construcción de página secuencial.
multicol invierte ese orden, y en la inversión está todo el truco. Su documentación describe dos pasos: reunir primero el material del entorno y, al llegar al final, equilibrar. Como la recolección va primero, el paquete puede cortar la caja resultante con \vsplit y probar distintas alturas hasta que las columnas queden casi iguales. La versión 1.5 añadió encima un control de calidad: cada candidata se mide en la escala de badness de TeX (0 es perfecto, 10000 infinitamente malo) y se descartan las soluciones peores que el contador columnbadness, cuyo valor por defecto es 10000. Un contador gemelo, finalcolumnbadness con 9999, decide que una última columna poco llena queda mejor corta que estirada hasta la fealdad.
\raggedcolumns— no alinear el pie de las columnas; el valor por defecto,\flushcolumns, sí lo alinea- contador
unbalance— alargar N líneas todas las columnas salvo la última; se reinicia al final de cada entorno - contador
minrows(por defecto 1) — número mínimo de líneas en la primera columna, para evitar columnas de una línea - contador
columnbadness(por defecto 10000) — descartar toda solución cuya badness supere este valor - contador
finalcolumnbadness(por defecto 9999) — por encima de este valor, una última columna corta se deja corta en vez de estirarse \maxbalancingoverflow(por defecto 12pt) — si las columnas equilibradas se exceden más que esto, se abandona el equilibrado y se compone una página normal
En la práctica quedan tres movimientos. Para seguir con twocolumn y emparejar solo la última página, los paquetes balance y flushend parchean la rutina de salida con ese fin. La TeX FAQ advierte, eso sí, que ambos tienden a desorientarse cuando hay flotantes y que entonces puede hacer falta ajustar las figuras a mano. Las opciones más sólidas son envolver solo la cola del documento en un entorno multicols, o aceptar una columna derecha corta: la mayoría de los estilos de revista lo hacen.
Elegir dónde se corta una columna: \columnbreak y la regla entre columnas
\columnbreak termina la columna actual justo donde se coloca y empuja el resto a la siguiente; llegó en la versión 1.5u. Desde la 1.9 admite un argumento opcional calcado del de \pagebreak, desde \columnbreak[0] (preferencia leve) hasta \columnbreak[4] (forzado). Esa misma 1.9 añadió \newcolumn, que corta la columna y la deja terminar corta. El motivo de no recurrir aquí a \pagebreak es igual de nítido: dentro de multicols acabaría con la propia fase de recolección, cerrando de golpe todas las columnas de esa página.
\setlength{\columnsep}{1.5em} % gap between columns
\setlength{\columnseprule}{0.4pt} % show a rule in the gap
\renewcommand{\columnseprulecolor}{\color{gray}}
\begin{multicols}{2}
Text of the left column.
\columnbreak % push the rest into the next column
Text of the right column.
\end{multicols}El hueco y la regla obedecen a los mismos \columnsep y \columnseprule que en twocolumn, y multicol añade encima \columnseprulecolor (por defecto \normalcolor, el color del texto). Conviene fijarlos antes de entrar en el entorno. El paquete cambia además un ajuste sin anunciarlo: la tolerancia al partir líneas. La \tolerance habitual de LaTeX es 200, el valor que hay tras \fussy, demasiado estricto para una medida de 38 caracteres. Por eso, dentro del entorno, multicol pasa a \multicoltolerance (por defecto 9999), a un paso de los 10000 que significan «todo vale»: un compromiso pragmático para columnas estrechas. Si el texto justificado sigue abriéndose, los remedios habituales son \raggedright dentro del entorno o mejores patrones de guionado para el idioma en uso.
Por qué una figura desaparece dentro de multicols
Porque allí los flotantes ordinarios no están implementados y lo que se mete se descarta. Escribe un entorno figure o table —o un \marginpar— dentro de multicols y el registro llevará la advertencia Floats and marginpars not allowed inside 'multicols' environment!. La documentación del paquete es tajante sobre la consecuencia: esos flotantes desaparecen. También explica el motivo. Implementar los flotantes exigiría reescribir por completo la rutina de salida de LaTeX, mucho más de lo que daba de sí el fin de semana que costó la primera versión. Como es una advertencia y no un error, el documento compila igualmente. Cuando falta una figura y nada más chirría en el registro, esa línea es lo primero que hay que buscar.
| Construcción | en modo twocolumn | dentro de multicols |
|---|---|---|
figure / table | flota con normalidad dentro de su columna | no permitido; sale una advertencia y el flotante desaparece |
figure* / table* | abarca la página; por defecto [tp], y b no está disponible | funciona; t, b y p se aplican, pero nunca en la página donde se escribe |
\marginpar | funciona | no permitido; se esfuma con la misma advertencia |
\columnbreak | no existe; solo queda el salto de página | termina la columna en ese punto (desde 1.5u) |
\pagebreak | cierra la página | termina la fase de recolección, así que todas las columnas de la página se cierran a la vez |
\columnseprule | regla vertical en el hueco; por defecto 0pt | igual, más \columnseprulecolor para su color |
Los flotantes con estrella sí funcionan dentro de multicols, pero no como bajo twocolumn. Según la documentación, allí un figure* se trata casi como un flotante ordinario en una página de una columna: t, b y p se aplican todos, y lo que consulta es \topfraction, no \dbltopfraction. Hay, eso sí, una restricción absoluta: nunca aparecerá en la página donde se escribió. El primer hueco posible es la cabecera de la página siguiente, lo que deja a h sin sentido. De ahí procede la curiosa inversión: b no está disponible bajo twocolumn y sí dentro de multicols.
¿Cómo meter entonces una imagen pequeña dentro de una columna? La respuesta es: no la conviertas en flotante. Un \includegraphics colocado directamente en un entorno center se queda justo donde se escribió (dentro del entorno \linewidth es el ancho de columna, así que width=\linewidth es lo natural). Si necesita un pie numerado, \captionof{figure}{…} del paquete caption lo proporciona conservando numeración y referencias cruzadas. Para que el texto la rodee queda la otra vía, wrapfig. Pero en cuanto se ve que hacen falta flotantes dentro de las columnas en todo el documento, esa es la señal para elegir twocolumn en lugar de multicol.
\usepackage{multicol}
\usepackage{graphicx}
\usepackage{caption} % provides \captionof
% ... in the body
\begin{multicols}{2}
Text before the picture.
\begin{center}
\includegraphics[width=\linewidth]{plot}
\captionof{figure}{Not a float, so it stays where it is written.}
\end{center}
Text after the picture.
\end{multicols}