La figure ne s'imprime pas là où vous avez écrit \begin{figure}. LaTeX la détache du fil du texte, la garde dans une file d'attente de boîtes et ne la dépose que lorsque la mise en page le permet. C'est cela, un flottant, et les quatre lettres de [htbp] ne sont qu'un permis indiquant où LaTeX a le droit de le poser. Écrire [h] sans le savoir tend à éloigner la figure plutôt qu'à la rapprocher. Cette page traite des raisons pour lesquelles les flottants se déplacent, du sens réel de chaque lettre de [htbp], de la différence décisive entre [H] et [h!], de la manière dont \FloatBarrier et \clearpage barrent le flux, des paramètres de placement, et des conditions véritables qui produisent ! LaTeX Error: Too many unprocessed floats.
Pourquoi la figure n'est pas là où vous l'avez mise
Une figure coupée en deux par un saut de page est illisible : on ne peut pas en montrer le haut ici et le bas à la page suivante. LaTeX traite donc chaque figure ou tableau comme une boîte indivisible et, une fois un peu de texte composé, choisit où la déposer : en haut d'une page, en bas, ou sur une page entièrement réservée aux flottants. C'est cela, un flottant ; les deux environnements standard sont figure et table. Plutôt que de vous faire placer les choses à la main, LaTeX résout le placement comme un problème d'optimisation, exactement comme la coupure des lignes. On y reconnaît en miniature la philosophie de TeX.
Cette conception a deux visages. D'un côté : une figure ne se coupe jamais, et son numéro (« Figure 1 », « Table 2 ») comme tous les renvois via \caption, \label et \ref s'accordent sans effort. De l'autre : l'endroit où vous l'écrivez et l'endroit où elle s'imprime divergent. Ce second visage n'est pas un défaut mais un postulat. Puisque le texte peut dire « voir la figure 1 » par le numéro, la figure n'a pas à jouxter la phrase — d'où la règle : renvoyer par le numéro, jamais par la position. LaTeX traite en outre les flottants dans l'ordre du source, si bien qu'une figure ultérieure peut en dépasser une antérieure. C'est précisément pourquoi écrire « la figure ci-dessus » dans le corps du texte est risqué.
Ce que h, t, b et p signifient vraiment dans [htbp]
Les environnements figure et table acceptent en argument optionnel un spécificateur de placement — les crochets de \begin{figure}[htbp] — qui remet à LaTeX un ensemble d'autorisations : ces positions-là sont permises. Sans rien écrire, des classes comme article et book appliquent leur défaut tbp, où h ne figure pas. Autrement dit, une figure sans spécificateur n'a jamais eu « ici » parmi ses candidats.
| Lettre | Sens | Comportement réel |
|---|---|---|
h | here | Jamais admis seul ; LaTeX ajoute t et signale LaTeX Warning: 'h' float specifier changed to 'ht'. |
t | top | Le haut d'une page de texte ; par défaut deux flottants au plus et 70 % de la hauteur du texte |
b | bottom | Le bas d'une page de texte ; par défaut un flottant et 30 % de la hauteur du texte |
p | page | Une page réservée aux flottants, sans texte ; créée seulement si les flottants en remplissent au moins 50 % |
! | override | Pour ce flottant seulement, ignorer les limites de nombre et de hauteur ; aucune position nouvelle |
H | package float uniquement | Cesse d'en faire un flottant ; sans le package, ! LaTeX Error: Unknown float option 'H'. |
La plupart des exposés disent que [h] est « ignoré » ; en réalité LaTeX avertit et réécrit l'indication. Avec \begin{figure}[h], le journal enregistre LaTeX Warning: 'h' float specifier changed to 'ht'. et le spécificateur vaut ht. [h!] se comporte de même et donne LaTeX Warning: '!h' float specifier changed to '!ht'. Lire cet avertissement, c'est comprendre sur-le-champ pourquoi la figure a sauté en haut de page. L'autre idée fausse porte sur l'ordre des lettres : écrire [bt] ou [tb] ne change rien. Le spécificateur est un ensemble de positions permises, non une séquence ; l'ordre des tentatives internes est fixe. En pratique, il ne faut donc pas trop contraindre : plus l'autorisation est large, [tbp] ou [htbp], plus la figure se pose près ; plus elle est étroite, surtout un [h] isolé, plus elle s'éloigne.
\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] contre [h!] : l'un des deux n'est pas un flottant
[H] n'est pas « un here encore plus fort que [h!] ». Il ne passe tout simplement pas par la machinerie des flottants. Le package float remplace le \@xfloat interne de LaTeX et bifurque vers un autre code dès qu'il voit un H en tête de spécificateur. H n'est donc jamais évalué comme lettre de placement ; la figure ou le tableau est simplement composé sur place comme une grande boîte. C'est pourquoi écrire [H] sans charger float s'arrête sur ! LaTeX Error: Unknown float option 'H'. [h!], au contraire, reste un flottant d'un bout à l'autre ; il ignore seulement les limites internes et, s'il ne peut être posé, il dérive comme d'habitude.
Compilez les deux et la différence saute aux yeux. Placez au même endroit une figure de la moitié de la hauteur du bloc de texte, une fois avec [H], une fois avec [!h] : la figure [H] ne bouge pas et, si elle ne tient plus, le texte environnant part avec elle à la page suivante. La figure [!h] émet son avertissement puis dépasse le texte qui suit pour aller en haut de la page suivante. [H] dit donc « ici, absolument, quitte à casser la page », [!h] dit « ici si possible, sinon je bouge ». [H] convient aux petites figures liées à l'ordre des phrases — un schéma d'étapes, une esquisse d'algorithme — mais sur une grande figure il peut vider toute la moitié inférieure de la page précédente. On peut en faire le défaut du document avec \floatplacement{figure}{H} ; le prix en est presque toujours beaucoup de blanc.
\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}Barrer les flottants : \FloatBarrier et \clearpage
Le cas le plus exaspérant est celui d'une figure qui ne tient pas dans sa propre section et déborde sur la suivante. Quand la figure 3 de la section 2 surgit au milieu de la section 3, le lecteur perd le fil. Le remède est \FloatBarrier, du package placeins, écrit par Donald Arseneau et versé au domaine public. Pour cloisonner par section, placez-le avant chaque \section, ou chargez \usepackage[section]{placeins} : il est alors inséré en tête de chaque \section.
Une idée reçue mérite ici d'être corrigée : « \FloatBarrier ne coupe pas la page ». C'est faux. Le source de placeins montre que \FloatBarrier émet un \newpage et se rappelle lui-même tant que des flottants restent en attente, avec repli sur \clearpage s'ils ne s'écoulent toujours pas. Dans une compilation réelle, une barrière franchie alors qu'une grande figure [b] est en attente pose la figure sur la page suivante et reprend le texte sur celle d'après — deux sauts de page. Elle laisse la page tranquille seulement quand rien n'est en attente. La vraie distinction n'est donc pas « coupe ou ne coupe pas », mais « coupe sans condition (\clearpage) contre coupe seulement s'il le faut (\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}Quand on veut l'effet de \clearpage sans pouvoir couper la page ici même, le package afterpage fournit \afterpage{\clearpage}. Il exécute le \clearpage une fois que la page en cours de construction s'est achevée naturellement, si bien qu'aucun trou ne s'ouvre au milieu du texte. Un outil plus local est \suppressfloats[t] : « plus de flottants en haut de cette page » — c'est précisément ce qu'emploie en interne l'option [section] de placeins, juste après un titre. À noter : [section] est assez strict par défaut, il interdit même à un flottant de remonter au-dessus du début de sa section. Les options [above] et [below] assouplissent cela.
Les paramètres de placement : pourquoi LaTeX dit que ça ne tient pas
La réponse à « ça devrait tenir en haut, pourquoi non ? » se trouve le plus souvent dans les paramètres de placement. LaTeX conserve des fractions et des compteurs réglant la part d'une page qu'il cède aux flottants ; dans la classe article, les valeurs par défaut sont \topfraction = 0,7, \bottomfraction = 0,3, \textfraction = 0,2, \floatpagefraction = 0,5, avec topnumber = 2, bottomnumber = 1 et totalnumber = 3. Une figure plus haute que 70 % de la hauteur du texte ne peut donc jamais aller en haut, par aucun chemin. Si son spécificateur ne porte que [t], elle n'a nulle part où aller et se fait repousser indéfiniment.
| Paramètre | Défaut dans article | Ce qu'il régit |
|---|---|---|
\topfraction | 0.7 | Part maximale du haut de page que les flottants peuvent occuper |
\bottomfraction | 0.3 | Part maximale du bas de page que les flottants peuvent occuper |
\textfraction | 0.2 | Part minimale d'une page de texte qui doit rester du texte |
\floatpagefraction | 0.5 | Remplissage minimal avant de créer une page de flottants |
topnumber | 2 | Nombre maximal de flottants en haut d'une page |
bottomnumber | 1 | Nombre maximal de flottants en bas d'une page |
totalnumber | 3 | Nombre maximal de flottants sur une page au total |
\dbltopfraction | 0.7 | Part du haut de page qu'un figure* sur deux colonnes peut occuper |
On modifie les fractions avec \renewcommand{\topfraction}{0.85} et les entiers avec \setcounter{totalnumber}{5}. Augmenter \topfraction en abaissant \textfraction laisse plus de flottants en haut et réduit les expulsions du type « ça ne tient pas, on repousse ». Le ! de [htbp] est en fait la version locale et ponctuelle de ce réglage. La composition sur deux colonnes a ses propres valeurs, et figure* obéit à \dbltopfraction. Un fait compte ici plus que les chiffres : un figure* sur deux colonnes ne peut aller qu'en t ou p. LaTeX ne tient aucune liste de bas de page pour les flottants pleine largeur, et leur spécificateur par défaut est tp. Écrivez \begin{figure*}[hb] et vous n'obtenez pas le moindre avertissement : il part discrètement en haut d'une page.
Too many unprocessed floats : la limite est 52, pas 18
Quand la file déborde, on obtient ! LaTeX Error: Too many unprocessed floats. Le chiffre souvent répété de « 18 flottants au maximum » est périmé. latex.ltx alloue bien dix-huit boîtes, \bx@A à \bx@R, mais là où e-TeX est disponible — c'est-à-dire sur tous les moteurs actuels — il ajoute encore \bx@S à \bx@Z et \bx@AA à \bx@ZZ, soit 52 au total. Cette extension est arrivée avec la version de LaTeX du 2015/10/01. Alignez des flottants réellement impossibles à placer et l'erreur apparaît exactement au cinquante-troisième.
L'erreur ne signifie pas qu'il faut supprimer des figures. \extrafloats{n}, apparu à la même époque, alloue davantage de boîtes depuis le préambule ; à l'essai, un document qui débordait à 52 s'est tu dès l'ajout de \extrafloats{40}. Mais le manque de boîtes est le plus souvent un symptôme, pas une cause. Un document qui déborde accumule d'ordinaire des flottants impossibles à poser : une figure plus haute que 70 % de la hauteur du texte dont le spécificateur ne porte que [t], ou une suite de flottants séparés par si peu de texte qu'aucun saut de page ne survient. Élargir le spécificateur à [htbp] et glisser çà et là un \clearpage pour vider la file mène plus vite à une vraie solution. Dans le même ordre d'idées, LaTeX Warning: Float too large for page by ...pt signifie « celle-ci ne tient pas sur une page, je l'ai exilée sur une page à elle » : le signal qu'il faut réduire la figure ou changer de format de papier.
% 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}Placer deux figures côte à côte
Un flottant se moque de son contenu ; mettre deux figures côte à côte revient donc simplement à fabriquer deux boîtes dans un seul figure. En LaTeX pur, c'est minipage, un environnement qui construit une « petite page » de la largeur choisie. Placez-en deux avec un \hfill — espace horizontal extensible — entre elles, et le mou est poussé vers l'extérieur : elles se collent aux marges. Donnez à chacune un peu moins de la moitié de la largeur du texte ; 0.48\textwidth est la valeur habituelle. Si le total dépasse \textwidth, un Overfull \hbox apparaît et la seconde boîte passe à la ligne.
\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}Dans chaque minipage, \linewidth désigne la largeur de cette minipage, si bien que \includegraphics[width=\linewidth] remplit exactement la boîte. Comme chaque minipage porte ici sa propre \caption, les deux deviennent « Figure 1 » et « Figure 2 », avec des numéros distincts. Pour en faire les (a) et (b) d'une seule figure, il faut le package subcaption, dont s'occupe la page sœur. Et lorsqu'une mise en page à deux colonnes exige une figure sur toute la largeur, on emploie figure* (ou table*) — en se rappelant que, comme dit plus haut, elle ne peut se poser qu'en haut d'une page ou sur une page de flottants.
Faire couler le texte autour d'une figure : wrapfig
Pour la mise en page de magazine où le texte longe une petite figure, on emploie l'environnement wrapfigure (ou wraptable) du package wrapfig — également signé Donald Arseneau, l'auteur de placeins. Il prend quatre arguments, dont deux obligatoires : {r} indique de quel côté poser la figure, et le dernier {0.4\textwidth} sa largeur. L'optionnel [12] est le nombre de lignes habillées, l'optionnel [34pt] le débord, c'est-à-dire de combien la figure sort du bloc de texte. Les lettres de placement vont par paires : la minuscule fixe sur place, la majuscule autorise le flottement.
\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}| Lettre | Côté | Notes |
|---|---|---|
r / R | droite | r minuscule fixe ici, R majuscule autorise le flottement |
l / L | gauche | l minuscule fixe ici, L majuscule autorise le flottement |
i / I | intérieur (côté reliure) | alterne entre pages gauches et droites en twoside |
o / O | extérieur (gouttière) | alterne entre pages gauches et droites en twoside |
Dans l'exemple, une figure large de 0.4\textwidth se place à droite du texte, les 12 lignes suivantes l'habillent par la gauche, et [34pt] la fait dépasser dans la marge droite. Sans le nombre de lignes, wrapfig l'estime d'après la hauteur de la figure ; quand l'estimation tombe à côté, l'habillage devient irrégulier, et le préciser est le remède le plus rapide. wrapfig reste toutefois un package capricieux, et son propre manuel en restreint les usages.
- Ne pas l'utiliser dans une liste, ni juste avant ou après. Le mettre dans ou contre
itemize,enumerate,descriptionle casse. - Ne pas le laisser traverser un saut de page. Le placer pour que l'habillage ne se scinde pas sur deux pages ; éviter les abords des limites de page.
- Ne pas faire habiller des titres ni des équations hors texte. Seul le texte courant ordinaire doit couler autour.
- Commencer à une limite de paragraphe, pas en plein paragraphe. Dans une
minipageou uneparbox, l'habillage doit se terminer avant la fin du groupe.
Quand l'habillage déraille, réduire un peu la largeur de la figure, indiquer le nombre de lignes ou décaler le début d'un paragraphe suffit généralement. Si rien n'y fait, renoncer à wrapfig pour un flottant ordinaire ([htbp], au-dessus ou au-dessous du texte) donne souvent, au bout du compte, une page plus lisible. Une fois décidé où atterrit la figure, il reste à lui donner un numéro et une description.