La figura no se imprime donde escribiste \begin{figure}. LaTeX la separa del hilo del texto, la guarda en una cola de cajas y solo la deposita cuando la composición de la página lo permite. Eso es un flotante, y las cuatro letras de [htbp] no son más que un permiso que indica dónde puede LaTeX depositarlo. Escribir [h] sin saber esto tiende a alejar la figura, no a acercarla. Esta página cubre por qué se mueven los flotantes, qué significa realmente cada letra de [htbp], la diferencia decisiva entre [H] y [h!], cómo \FloatBarrier y \clearpage frenan el flujo, los parámetros de colocación y las condiciones reales que producen ! LaTeX Error: Too many unprocessed floats.
Por qué la figura no está donde la pusiste
Una figura cortada por la mitad por un salto de página es ilegible: no se puede mostrar la parte de arriba aquí y la de abajo en la página siguiente. Por eso LaTeX trata cada figura o tabla como una única caja indivisible y, una vez compuesto algo de texto, elige dónde dejarla caer: en la parte superior de una página, en la inferior, o en una página dedicada por entero a flotantes. Eso es un flotante, y los dos entornos estándar son figure y table. En lugar de que coloques las cosas a mano, LaTeX resuelve la colocación como un problema de optimización, igual que hace con el corte de líneas. Ahí se ve en pequeño la filosofía de TeX.
El diseño tiene dos caras. Por un lado: una figura nunca se parte, y su número («Figura 1», «Tabla 2») y todas las referencias cruzadas mediante \caption, \label y \ref encajan sin esfuerzo. Por otro: el lugar donde la escribes y el lugar donde se imprime divergen. Esa segunda cara no es un defecto sino una premisa. Puesto que el texto puede decir «véase la figura 1» por el número, la figura no tiene que estar junto a la frase, de ahí la regla: referir por el número, nunca por la posición. LaTeX procesa además los flotantes en el orden del fuente, de modo que una figura posterior puede adelantar a una anterior. Por eso mismo escribir «la figura de arriba» en el texto corrido es arriesgado.
Qué significan de verdad h, t, b y p en [htbp]
Los entornos figure y table aceptan como argumento opcional un especificador de posición: los corchetes de \begin{figure}[htbp], que entregan a LaTeX un conjunto de permisos, esas posiciones están autorizadas. Si no se escribe nada, clases como article y book aplican su valor por omisión tbp, en el que h no aparece. Dicho de otro modo, una figura sin especificador nunca tuvo «aquí» entre sus candidatos.
| Especificador | Significa | Qué ocurre en realidad |
|---|---|---|
h | here | Nunca se admite solo; LaTeX añade t e informa LaTeX Warning: 'h' float specifier changed to 'ht'. |
t | top | La parte superior de una página de texto; por omisión dos flotantes como máximo y el 70 % de la altura del texto |
b | bottom | La parte inferior de una página de texto; por omisión un flotante y el 30 % de la altura del texto |
p | page | Una página solo de flotantes, sin texto; se crea solo si los flotantes llenan al menos el 50 % |
! | override | Solo para este flotante, ignora los límites de número y altura; no añade posiciones nuevas |
H | solo con el paquete float | Deja de ser un flotante; sin el paquete aparece ! LaTeX Error: Unknown float option 'H'. |
La mayoría de las explicaciones dicen que [h] «se ignora»; lo que ocurre en realidad es que LaTeX avisa y lo reescribe. Al componer \begin{figure}[h], el registro anota LaTeX Warning: 'h' float specifier changed to 'ht'. y el especificador pasa a valer ht. [h!] se comporta igual y da LaTeX Warning: '!h' float specifier changed to '!ht'. Leer ese aviso permite entender al instante por qué la figura saltó al principio de la página. El otro malentendido es el orden de las letras: escribir [bt] o [tb] no cambia nada. El especificador es un conjunto de posiciones permitidas, no una secuencia; el orden interno de intentos es fijo. La conclusión práctica es no restringir de más: cuanto más amplio sea el permiso, [tbp] o [htbp], más cerca aterriza la figura; cuanto más estrecho, sobre todo una [h] sola, más lejos viaja.
\begin{figure}[htbp]
\centering
\includegraphics[width=0.6\textwidth]{plot}
\caption{Measured values against the model}
\label{fig:result}
\end{figure}
% refer by number, not by position; ~ keeps word and number on one line
See Figure~\ref{fig:result} for the result.[H] frente a [h!]: uno de los dos ni siquiera es un flotante
[H] no es «un here todavía más fuerte que [h!]». Ni siquiera pasa por la maquinaria de flotantes. El paquete float sustituye el \@xfloat interno de LaTeX y se desvía a otro código en cuanto ve una H al principio de un especificador. Así que H nunca se evalúa como letra de posición; la figura o tabla se compone en el sitio como una caja grande, sin más. Por eso escribir [H] sin cargar float se detiene con ! LaTeX Error: Unknown float option 'H'. [h!], en cambio, sigue siendo un flotante de principio a fin; solo ignora los límites internos y, si no cabe, deriva como siempre.
Compila los dos y la diferencia se ve al instante. Coloca en el mismo punto una figura de la mitad de la altura del bloque de texto, una vez con [H] y otra con [!h]: la figura con [H] no se mueve y, si no cabe, el texto circundante se va con ella a la página siguiente. La figura con [!h] emite su aviso y luego adelanta al texto que sigue para ir al principio de la página siguiente. Así que [H] dice «aquí sin falta, aunque haya que romper la página», y [!h] dice «aquí si se puede, si no me muevo». [H] va bien con figuras pequeñas ligadas al orden de las frases —un esquema de pasos, un boceto de algoritmo—, pero en una figura grande puede vaciar toda la mitad inferior de la página anterior. Puedes convertirlo en el valor por omisión con \floatplacement{figure}{H}; el precio es casi siempre mucho blanco.
\usepackage{float}
% ...
\begin{figure}[H] % not a float any more: pinned, page breaks around it
\centering
\includegraphics[width=0.6\textwidth]{diagram}
\caption{Processing pipeline}
\end{figure}Contener flotantes: \FloatBarrier y \clearpage
El caso más exasperante es el de una figura que no cabe en su propia sección y se derrama en la siguiente. Cuando la figura 3 de la sección 2 aparece a mitad de la sección 3, el lector pierde el hilo. El remedio es \FloatBarrier, del paquete placeins, escrito por Donald Arseneau y cedido al dominio público. Para acotar por secciones, colócalo antes de cada \section, o carga \usepackage[section]{placeins} y se insertará al principio de cada \section.
Aquí hay una idea recibida que conviene corregir: «\FloatBarrier no corta la página». Es falso. El código de placeins muestra que \FloatBarrier emite un \newpage y se vuelve a llamar a sí mismo mientras queden flotantes pendientes, y recurre a \clearpage si aun así no se vacían. En una compilación real, una barrera cruzada mientras hay una figura [b] grande pendiente deja la figura en la página siguiente y reanuda el texto en la posterior: dos saltos de página. Solo deja la página en paz cuando no hay nada pendiente. La distinción real, pues, no es «corta o no corta», sino «corta sin condiciones (\clearpage) frente a corta solo cuando debe (\FloatBarrier)».
\usepackage{placeins} % or [section] to barrier every \section
\usepackage{afterpage}
% ...
\section{Experiment}
% ... figures and tables ...
\FloatBarrier % nothing may cross this line
\section{Discussion}
% flush pending floats at the END of the current page, not right here
\afterpage{\clearpage}Cuando se quiere el efecto de \clearpage pero no se puede cortar la página justo aquí, el paquete afterpage ofrece \afterpage{\clearpage}. Ejecuta el \clearpage una vez que la página que se está construyendo termina de forma natural, así que no se abre ningún hueco a mitad del texto. Una herramienta más local es \suppressfloats[t]: «no más flotantes en la parte superior de esta página», que es exactamente lo que usa por dentro la opción [section] de placeins, justo después de un encabezado. De paso: [section] es bastante estricto por omisión, e impide incluso que un flotante suba por encima del comienzo de su sección. Las opciones [above] y [below] lo relajan.
Los parámetros de colocación: por qué LaTeX dice que no cabe
La respuesta a «debería caber arriba, ¿por qué no?» suele estar en los parámetros de colocación. LaTeX guarda un conjunto de fracciones y recuentos que rigen cuánto de una página cede a los flotantes, y en la clase article los valores por omisión son \topfraction = 0,7, \bottomfraction = 0,3, \textfraction = 0,2, \floatpagefraction = 0,5, con topnumber = 2, bottomnumber = 1 y totalnumber = 3. Es decir, una figura más alta que el 70 % de la altura del texto no puede ir arriba por ninguna vía. Si su especificador solo dice [t], no tiene adónde ir y se la empuja indefinidamente.
| Parámetro | Valor por omisión en article | Qué gobierna |
|---|---|---|
\topfraction | 0.7 | Porción máxima de la parte superior que pueden ocupar los flotantes |
\bottomfraction | 0.3 | Porción máxima de la parte inferior que pueden ocupar los flotantes |
\textfraction | 0.2 | Porción mínima de una página de texto que debe seguir siendo texto |
\floatpagefraction | 0.5 | Llenado mínimo antes de crear una página solo de flotantes |
topnumber | 2 | Número máximo de flotantes en la parte superior |
bottomnumber | 1 | Número máximo de flotantes en la parte inferior |
totalnumber | 3 | Número máximo de flotantes en una página en total |
\dbltopfraction | 0.7 | Porción de la parte superior que puede ocupar un figure* a dos columnas |
Las fracciones se cambian con \renewcommand{\topfraction}{0.85} y los enteros con \setcounter{totalnumber}{5}. Subir \topfraction y bajar \textfraction permite que más flotantes se sitúen arriba y reduce los desalojos del tipo «no cabe, atrás». El ! de [htbp] es en realidad la versión local y de una sola vez de este ajuste. La composición a dos columnas tiene sus propios valores, y figure* obedece a \dbltopfraction. Aquí importa un hecho más que las cifras: un figure* a dos columnas solo puede ir en t o p. LaTeX no mantiene ninguna lista de pie de página para flotantes a todo el ancho, y su especificador por omisión es tp. Escribe \begin{figure*}[hb] y no obtienes ni un aviso: se envía en silencio a la parte superior de una página.
Too many unprocessed floats: el límite es 52, no 18
Cuando la cola se desborda aparece ! LaTeX Error: Too many unprocessed floats. La cifra tan repetida de «18 flotantes como máximo» está desfasada. latex.ltx sí reserva dieciocho cajas, de \bx@A a \bx@R, pero allí donde hay e-TeX —o sea, en todos los motores actuales— añade además \bx@S a \bx@Z y \bx@AA a \bx@ZZ, en total 52. Esa ampliación llegó con la versión de LaTeX del 2015/10/01. Alinea flotantes que de verdad no puedan colocarse y el error aparece exactamente en el quincuagésimo tercero.
El error no significa que haya que eliminar figuras. \extrafloats{n}, de la misma época, reserva más cajas desde el preámbulo; en las pruebas, un documento que se desbordaba en 52 dejó de quejarse en cuanto se añadió \extrafloats{40}. Pero la escasez de cajas suele ser un síntoma, no una causa. Un documento que se desborda acumula normalmente flotantes imposibles de colocar: una figura más alta que el 70 % de la altura del texto cuyo especificador solo dice [t], o una tanda de flotantes con tan poco texto entre ellos que nunca surge un salto de página. Ampliar el especificador a [htbp] y soltar de vez en cuando un \clearpage para vaciar la cola es el camino corto a un arreglo real. En la misma línea, LaTeX Warning: Float too large for page by ...pt significa «esta no cabe en una página, así que la he desterrado a una propia»: la señal para reducir la figura o cambiar el tamaño de papel.
% loosen the layout rules for the whole document
\renewcommand{\topfraction}{0.85}
\renewcommand{\textfraction}{0.1}
\renewcommand{\floatpagefraction}{0.75}
\setcounter{totalnumber}{5}
% allocate 40 more float boxes on top of the built-in 52
\extrafloats{40}Poner dos figuras en paralelo
A un flotante le da igual lo que contenga, así que poner dos figuras en paralelo se reduce a fabricar dos cajas dentro de un solo figure. En LaTeX puro eso es minipage, un entorno que construye una «pequeña página» del ancho que elijas. Coloca dos con un \hfill —espacio horizontal elástico— entre ellas y la holgura se empuja hacia fuera: quedan pegadas a los márgenes. Haz cada una un poco menor que la mitad del ancho de texto; 0.48\textwidth es el valor habitual. Si el total supera \textwidth, aparece un Overfull \hbox y la segunda caja cae a la línea siguiente.
\begin{figure}[htbp]
\centering
\begin{minipage}{0.48\textwidth}
\centering
\includegraphics[width=\linewidth]{left}
\caption{Left panel} % its own number
\label{fig:left}
\end{minipage}
\hfill
\begin{minipage}{0.48\textwidth}
\centering
\includegraphics[width=\linewidth]{right}
\caption{Right panel} % a second, separate number
\label{fig:right}
\end{minipage}
\end{figure}Dentro de cada minipage, \linewidth significa el ancho de esa minipage, así que \includegraphics[width=\linewidth] llena la caja con exactitud. Como aquí cada minipage lleva su propia \caption, las dos pasan a ser «Figura 1» y «Figura 2», con números separados. Para convertirlas en (a) y (b) de una sola figura hace falta el paquete subcaption, del que se ocupa la página hermana. Y cuando una composición a dos columnas necesita una figura a todo el ancho, se usa figure* (o table*), recordando que, como se dijo, solo puede aterrizar en la parte superior de una página o en una página de flotantes.
Rodear una figura con texto: wrapfig
Para la maquetación de revista en la que el texto discurre junto a una figura pequeña, se usa el entorno wrapfigure (o wraptable) del paquete wrapfig, también obra de Donald Arseneau, el autor de placeins. Toma cuatro argumentos, dos de ellos obligatorios: {r} indica de qué lado se coloca, y el último {0.4\textwidth} es el ancho de la figura. El [12] opcional es el número de líneas que rodean, y el [34pt] opcional es el saliente, cuánto sobresale la figura fuera del bloque de texto. Las letras de posición van en pares: la minúscula la fija en su sitio, la mayúscula le permite flotar.
\usepackage{wrapfig}
% [lines]{side}[overhang]{width}
\begin{wrapfigure}[12]{r}[34pt]{0.4\textwidth}
\centering
\includegraphics[width=0.38\textwidth]{portrait}
\caption{Portrait}
\end{wrapfigure}| Letra | Lado | Notas |
|---|---|---|
r / R | derecha | la r minúscula la fija aquí, la R mayúscula permite flotar |
l / L | izquierda | la l minúscula la fija aquí, la L mayúscula permite flotar |
i / I | interior (lado de encuadernación) | alterna entre páginas izquierdas y derechas en twoside |
o / O | exterior (canto delantero) | alterna entre páginas izquierdas y derechas en twoside |
En el ejemplo, una figura de 0.4\textwidth de ancho se sitúa a la derecha del texto, las 12 líneas siguientes la rodean por la izquierda, y [34pt] hace que sobresalga hacia el margen derecho. Si se omite el recuento de líneas, wrapfig lo estima a partir de la altura de la figura; cuando la estimación falla el rodeo queda irregular, y escribirlo explícitamente es el arreglo rápido. Con todo, wrapfig es un paquete delicado, y su propio manual acota dónde puede usarse.
- No lo uses dentro de una lista, ni justo antes o después. Ponerlo dentro o pegado a
itemize,enumerateodescriptionlo rompe. - No dejes que cruce un salto de página. Colócalo de modo que el rodeo no se parta en dos páginas; aléjate de los límites de página.
- No rodees encabezados ni ecuaciones destacadas. Solo el texto corrido ordinario debe fluir a su alrededor.
- Empiézalo en un límite de párrafo, no a mitad de párrafo. Dentro de una
minipageoparbox, el rodeo debe terminar antes que el grupo.
Cuando el rodeo se descontrola, estrechar un poco la figura, escribir el recuento de líneas o mover el comienzo un párrafo suele arreglarlo. Si aun así no cede, renunciar a wrapfig en favor de un flotante normal ([htbp], encima o debajo del texto) acaba dando, a menudo, una página más legible. Una vez decidido dónde aterriza la figura, queda darle número y descripción.