Flotantes y colocación

La figura no aparece donde la escribiste; una tabla salta varias páginas más adelante. No es un error de LaTeX: ocurre porque figure y table son flotantes (floating objects). LaTeX los separa del flujo del texto y los deja “flotar” hasta el lugar donde la composición de la página queda mejor. Esta página explica hasta dónde puedes dirigir esa colocación: los especificadores de posición de [htbp], los comandos \FloatBarrier y \clearpage que frenan el flujo, las formas de poner dos figuras en paralelo y el paquete wrapfig para rodear una figura con texto.

Qué es un flotante

Una figura o una tabla que cruza un salto de página queda mal: no se puede mostrar media aquí y el resto en la página siguiente. Por eso LaTeX trata cada una como una caja única y, cuando ya ha compuesto un tramo de texto, elige automáticamente un lugar: la parte superior o inferior de una página, o una página dedicada a flotantes. Eso es un flotante. Los dos entornos flotantes estándar son figure y table.

Los flotantes tienen una ventaja y un lado desconcertante. La ventaja: una figura no se parte entre páginas, y su numeración (“Figure 1”, “Table 2”) y las referencias cruzadas con \caption, \label y \ref quedan coordinadas automáticamente. Lo desconcertante: el lugar donde la escribiste y el lugar donde se imprime pueden diferir. El diseño se apoya en que puedes escribir “véase Figure 1” con \ref{fig:foo}, así que la figura no tiene por qué estar justo junto a esa frase. La regla es referir por número, no por posición. La creación de imágenes y los proyectos con \input pertenecen a otras páginas; aquí nos centramos solo en dónde cae un flotante.

Los especificadores de posición [htbp]

Los entornos figure y table aceptan un argumento opcional llamado especificador de posición: corchetes, como en \begin{figure}[htbp], que indican a LaTeX qué posiciones puede usar. Se combinan las letras siguientes.

EspecificadorSignificaNotas
hhereCerca del punto actual del texto. h solo no está permitido; LaTeX añade t automáticamente
ttopEn la parte superior de una página de texto
bbottomEn la parte inferior de una página de texto
ppageUna página separada de flotantes: solo flotantes, sin texto
!overrideSolo para este flotante, ignora los límites de número y de proporción flotante/texto
Hexactamente aquí (sin flotar)Lo añade el paquete float; lo fija en su lugar, sin flotación

Si omites el especificador, clases como article y book usan por defecto tbp (sin h). Si escribes varias letras, LaTeX busca cualquiera de esas posiciones que pueda usar. Hay dos trampas importantes. Primero, h por sí solo se ignora casi siempre: LaTeX no permite un h desnudo y añade t en silencio, así que [h] a menudo salta igualmente a la parte superior. Cuando necesites “aquí exactamente”, usa [H] del paquete float, descrito abajo.

Segundo, el orden de las letras no cambia el orden en que LaTeX las prueba. Escribas [bt] o [tb], LaTeX prueba sus candidatos en la misma secuencia (aproximadamente aquí → arriba → abajo → página de flotantes). Piensa en las letras como el *conjunto* de posiciones permitidas, nada más. LaTeX también procesa los flotantes en el orden en que aparecen en el código fuente, de modo que una figura posterior puede adelantar a una anterior. En la práctica, no conviene restringir demasiado: cuanto más amplio permitas, como [tbp] o [htbp], más fácilmente colocará LaTeX el flotante cerca. Reducirlo a una sola letra, sobre todo [h], suele hacerlo alejarse más.

latex
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.6\textwidth]{plot}
  \caption{実験結果}
  \label{fig:result}
\end{figure}

図~\ref{fig:result} に結果を示す。

Aquí [htbp] permite el punto actual, la parte superior, la inferior o una página de flotantes, y LaTeX elige lo mejor. \centering para centrar la imagen, \caption para el título y el número, y \label para referenciar son el contenido habitual de un flotante. El cuerpo lo refiere por número con 図~\ref{fig:result}, así que el texto sigue teniendo sentido aunque la figura se imprima algo lejos (~ es un espacio indivisible que mantiene juntos la palabra y el número al final de una línea).

Forzarlo aquí — [H]

Cuando de verdad necesitas mantener un flotante “exactamente donde lo escribí”, carga el paquete float en el preámbulo y usa la mayúscula [H]. [H] no es una letra de posición ordinaria: desactiva por completo la flotación y fija la figura o tabla en su sitio. Se comporta casi como colocar una caja grande justo ahí.

latex
\usepackage{float}
% ...
\begin{figure}[H]
  \centering
  \includegraphics[width=0.6\textwidth]{diagram}
  \caption{処理の流れ}
\end{figure}

Aun así, trata [H] como último recurso. Fijar un flotante puede dejar un gran hueco si no cabe al pie de una página, o empujar el flotante a la parte superior de la página siguiente y vaciar la parte inferior de esta. Confiar en LaTeX con un [htbp] amplio suele dar un resultado más ordenado. [H] solo merece la pena para figuras pequeñas que de verdad deben estar en un punto exacto del texto, como un diagrama paso a paso. Puedes hacer que [H] sea el valor por defecto del documento con \floatplacement{figure}{H}, pero por las razones anteriores no se recomienda.

Frenar el flujo — \FloatBarrier y \clearpage

El problema más molesto con los flotantes es una figura que no cabe en su sección y deriva a la siguiente o al capítulo siguiente. Cuando la Figure 3 de la sección 2 aparece a mitad de la sección 3, el lector se pierde. Para evitarlo, se coloca una barrera que los flotantes no pueden cruzar.

Esa barrera es \FloatBarrier, del paquete placeins. Donde colocas este comando, todos los flotantes pendientes se emiten antes de él, y los flotantes posteriores no pueden cruzarlo. Para separar flotantes por sección, escribe \FloatBarrier antes de cada \section, o carga \usepackage[section]{placeins}, que inserta una barrera al comienzo de cada \section.

latex
\usepackage{placeins}
% ...
\section{実験}
% ... 図や表 ...
\FloatBarrier   % ここより先へフロートを越えさせない
\section{考察}

\clearpage es un pariente cercano, pero la diferencia es el salto de página. \clearpage emite todos los flotantes pendientes y luego empieza una página nueva, mientras que \FloatBarrier emite los flotantes pero no cambia de página. Así que usa \FloatBarrier para contener flotantes dentro de la misma página, y \clearpage cuando un salto completo, por ejemplo al final de un capítulo, sea aceptable. La barrera [section] es estricta por defecto: impide que un flotante se salga siquiera un poco de su sección; las opciones [above] y [below] la relajan.

Un paso más abajo, la colocación automática de LaTeX obedece a unos parámetros de colocación de flotantes: números internos, expresados como fracciones, que deciden qué parte de una página pueden ocupar los flotantes. Son un ajuste de último recurso cuando nada más funciona, aunque normalmente conviene revisar antes [htbp].

ParámetroValor por defectoSignifica
\topfraction0.7Fracción máxima de la parte superior de una página que pueden ocupar los flotantes
\bottomfraction0.3Fracción máxima de la parte inferior de una página que pueden ocupar los flotantes
\textfraction0.2Fracción mínima de una página de texto que debe seguir siendo texto
\floatpagefraction0.5Ocupación mínima antes de crear una página separada de flotantes
topnumber2Número máximo de flotantes en la parte superior de una página
bottomnumber1Número máximo de flotantes en la parte inferior de una página
totalnumber3Número máximo de flotantes en una sola página

Cambia las fracciones con \renewcommand{\topfraction}{0.85} y los contadores enteros con \setcounter{totalnumber}{5}. Por ejemplo, subir \topfraction y bajar \textfraction permite que más flotantes se coloquen en la parte superior de una página y reduce los desplazamientos de “no cabe aquí, pasa a la página siguiente”. El especificador ! anterior es, en la práctica, la versión local de este ajuste: le dice a LaTeX que ignore esos límites solo para un flotante.

Poner dos en paralelo

A menudo quieres poner dos figuras o tablas una junto a la otra. Como un flotante puede contener cualquier contenido, la idea básica es poner dos cajas en paralelo dentro de un solo figure. La forma con LaTeX básico es minipage; para dar a las subfiguras sus propias etiquetas (a), (b), usa el paquete subcaption.

minipage es un entorno que crea una “pequeña página” del ancho que elijas. Coloca dos en paralelo con \hfill entre ellas, un espacio horizontal elástico, y se distribuirán a izquierda y derecha. El truco es hacer cada una un poco menor que la mitad del ancho de texto, por ejemplo 0.48\textwidth, para que la suma quede justo por debajo del ancho completo.

latex
\begin{figure}[htbp]
  \centering
  \begin{minipage}{0.48\textwidth}
    \centering
    \includegraphics[width=\linewidth]{left}
    \caption{左の図}
    \label{fig:left}
  \end{minipage}
  \hfill
  \begin{minipage}{0.48\textwidth}
    \centering
    \includegraphics[width=\linewidth]{right}
    \caption{右の図}
    \label{fig:right}
  \end{minipage}
\end{figure}

Aquí dos minipage de ancho 0.48\textwidth están dentro del figure, y el \hfill entre ellas empuja el espacio sobrante hacia fuera para que se acerquen a los márgenes. Dentro de cada minipage, \linewidth se refiere al ancho de esa minipage, así que \includegraphics[width=\linewidth] llena la caja. Como cada minipage tiene su propia \caption, reciben números separados, “Figure 1”, “Figure 2”. Para tratar el par como una sola figura, pon una única \caption directamente dentro de figure.

Para numerarlas como subfiguras de una sola figura, por ejemplo “Figure 2(a)” y “Figure 2(b)”, usa el entorno subfigure del paquete subcaption. Se escribe de forma muy parecida a minipage, con \subcaption o \caption dentro para producir las etiquetas (a)/(b). Las subfiguras y las captions se explican con detalle en la página separada “Captions & subfigures”. Para poner dos tablas en paralelo, la idea es la misma: colocar un tabular dentro de cada minipage.

Rodear una figura con texto — wrapfig

Para hacer que el texto rodee el lado de una figura pequeña, el diseño típico de una revista, usa el entorno wrapfigure del paquete wrapfig (o wraptable para tablas). La sintaxis es:

latex
\usepackage{wrapfig}
% ...
\begin{wrapfigure}[12]{r}[34pt]{0.4\textwidth}
  \centering
  \includegraphics[width=0.38\textwidth]{portrait}
  \caption{人物像}
\end{wrapfigure}

Toma cuatro argumentos, dos de ellos obligatorios. {r} es la posición (qué lado), y el último {0.4\textwidth} es el ancho de la figura. El [12] opcional es el número de líneas que rodean la figura, y el [34pt] opcional es el saliente (overhang), cuánto se mete la figura en el margen. Las letras de posición vienen en pares: la minúscula la fija en el sitio, la mayúscula permite que flote.

LetraLadoNotas
r / Rderechar = aquí, R = puede flotar
l / Lizquierdal = aquí, L = puede flotar
i / IinteriorHacia la encuadernación; para documentos twoside
o / OexteriorLejos de la encuadernación; para documentos twoside

En el ejemplo, una figura de ancho 0.4\textwidth se coloca a la derecha del texto y las 12 líneas siguientes la rodean por la izquierda; [34pt] hace que sobresalga hacia el margen derecho. Si omites el recuento [12], wrapfig lo estima a partir de la altura de la figura. Escríbelo explícitamente cuando la estimación falle y el ajuste quede irregular. Para impresión a doble cara, si quieres la figura lejos de la encuadernación, usa o (outer) y alternará lados automáticamente entre páginas izquierdas y derechas.

wrapfig es útil, pero delicado, así que conviene tener presentes sus advertencias. El manual, en esencia, avisa:

  • No lo uses dentro de una lista, ni justo antes o después. Manténlo fuera de itemize, enumerate, description y entornos similares.
  • No dejes que cruce un salto de página. Coloca el entorno de modo que el rodeo no se parta entre páginas; evita la zona cercana a un límite de página.
  • No rodees con encabezados ni ecuaciones grandes. Por estética, solo debería rodear texto normal; los títulos de sección y las ecuaciones destacadas quedan mal.
  • Empezar en un límite de párrafo, no a mitad de párrafo, da resultados más estables. Dentro de minipage o parbox, asegúrate de que el rodeo termine antes de que termine el grupo.

Cuando el rodeo se comporta mal, suele bastar con estrechar un poco la figura, indicar el número de líneas o desplazar el comienzo un párrafo. Si aun así no se estabiliza, abandonar wrapfig por un flotante normal ([htbp] encima o debajo del texto) puede acabar leyéndose mejor.