Les flottants

Première version le 3 avril 2020 (confinement Covid19)

Les objets flottants (flottants) sont placés (et numérotés) automatiquement. Ils sont placés à une position appropriée déterminée par l'algorithme de placement des flotteurs TeX. L'algorithme a un certain nombre d'options qui peuvent influencer le placement des flottants.

Pour comprendre ce qu'est un flottant et comment ça fonctionne je te renvoies au texte que j'ai écris il y a quelques année sur LaTeX et les flottants.. Les principes qui y sont énoncés sont également valable pour ConTeXt.

Il y a 3 commandes pour placer un flottant : \placefloat ; \placefigure et \placetable

Elles se comportent tous de la même façon, \placefloat est générique, \placefigure et \placetable sont faites comme leur nom l'indique, respectivement pour placer des figures et des tableaux. La différence se trouve au niveau de la légende où l'on a Figure : 1 pour \placefigure et Table : 1 pour \placetable. \placefloat se comporte par défaut comme \placefigure .

Dans cette fiche on va uniquement placer des images, mais le principe est le même pour des tableaux, des graphiques. Tu peux même créer tes propres flottants avec \definefloat, mais on en reparlera dans une autre fiche.

Les flottants sont automatiquement numérotés et ont une légende :

\placefloat[emplacement][référence]{le texte de la légende}{l'objet à placer}

Dans cette fiche on ne va pas s'occuper de [référence] (qui sert si tu dois faire une référence à ce document dans ton texte, voir ici) ni aux légendes qui feront l'objet d'une autre fiche. Pour cela on va ignorer le champ [référence] et utiliser none et laisser vide le champ {le texte de la légende} pour supprimer la légende.

\placefloat[none]{ }{l'objet à placer}
Si tu peux supprimer un champ [ ] tu ne peux le faire pour un champ { } que tu dois laisser, mais vide, sous peine d'erreur de compilation.

Pour illustrer mon propos, je vais utiliser un texte provenant d'un ouvrage du XIXe siècle «L'arboriculture fruitière de Gressent, 1894.

\starttext
\subject{ Groseillier}
Le groseillier est un charmant petit arbuste, un peu indiscipliné, mais très fertile, donnant des fruits indispensables pour les confitures, très agréables pour les sirops, et même pour la table, lorsqu'il fait chaud. Il a de grandes qualités, mais d'énormes défauts. C’est un vrai gamin de Paris, qui s’est permis de faire un geste indécent à l’inventeur des plantations rapprochées, quand il a voulu l'emprisonner dans des vases très jolis, sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands, et pas du tout de groseilles. C’est un drôle, d'accord. Il a d'immenses défauts, mais de grandes qualités, et mieux vaut essayer de vivre avec lui que d’en faire un insurgé ; on n’en viendrait pas à bout.

Le groseillier trouve une place excellente dans le jardin fruitier, entre les vases et dans les pointes des angles. La seule forme à lui donner est celle en cépée. Il réussit très mal en vases (très jolis sur le papier) et pas du tout en cordons verticaux, encore plus jolis (toujours sur le papier).

Près des grands centres de population, il y aura souvent bénéfice à cultiver le groseillier en grand dans le verger. Cet arbuste réussit toujours bien dans les sols un peu frais et calcaires surtout. La forme en cépée est la seule à lui donner dans toutes les acceptions, en ce qu'il produit toujours, par le pied, les drageons qui, en s’opposant à l’achèvement des formes, sont une ressource pour renouveler le vieux bois dans les cépées.

Lorsque le groseillier est bien enraciné, on le recèpe sur trois ou quatre yeux ({\it a}), afin d'obtenir des ramifications que l'on fait ramifier l'année suivante à l'aide d’une taille en {\it a}, puis les ramifications {\it b}, taillées à leur tour, pour en obtenir de nouvelles, achèvent de former la cépée.

Alors on tortille en deux un fil de fer n° 17, et l'on en forme un cercle que l'on place au centre du groseillier, afin d’écarter les branches qu'on palisse dessus ({\it a}); la lumière pénètre partout et l’on obtient un groseillier des plus fertiles.

On enlève avec soin toutes les pousses qui naissent au pied et à l'intérieur du groseillier. Le milieu doit être vide ; il faut que la lumière y pénètre; c’est la première condition de fertilité.

Un groseillier formé ainsi donne dix fois ce que produisent ceux en buissons, et de plus les grappes sont doubles en longueur et en grosseur.

Les rameaux à fruits du groseillier sont des plus faciles à obtenir : il suffit d'opérer un seul pincement ou cassement en vert sur la cinquième ou sixième feuille des bourgeons latéraux, suivant leur vigueur ; que l'opération soit faite un peu plus tôt ou un peu plus tard, l’empattement du rameau pincé se couvre de fleurs.

On taille sur les fleurs en conservant un ou deux yeux, pour obtenir de nouveaux bourgeons, qui, pincés à leur tour, donnent de nouvelles fleurs.

Lorsque les branches vieillissent et deviennent moins productives, on les rabat sur un bourgeon vigoureux de la base, on élève un drageon pour les remplacer, et on les supprime complètement.

Avec ces soins, on peut conserver des groseilliers, très productifs, pendant fort longtemps.

Le cassis et le groseillier épineux se traitent comme le groseillier à grappes ; il ne me reste plus qu’à indiquer les meilleures variétés à cultiver.

\stoptext

Dans le code des exemples qui vont suivre je n'indiquerais que la fin de la phrase supérieure et le début de la phrase inférieure encadrant l'image, tu n'auras plus qu'a te référer au texte ci-dessus pour connaître l'emplacement exact où j'ai inséré l'image pour pouvoir refaire les exemples.

On va placer notre première figure un fichier, une image .png nommée groseille-2.png. Je te renvoie à la fiche Insérer des petits Mickey pour les explication de la commande \externalfigure. Les images, sauf mention contraire, ont un fond transparent.

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefloat[none,here]{ }{\externalfigure[groseille-2][width=10cm]}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Image.

Pour placer un tableau ce n'est guère plus difficile. Le tableau n'a rien à voir avec le texte, c'est un tableau que j'avais fait pour Les tableaux complexe avec TABLE.

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placetable[none,here]{ }{
\bTABLE
\bTR \bTH Français \eTH \bTH Chti \eTH \bTH Anglais \eTH
\bTH Italien \eTH\eTR
\bTR \bTD Pantalon\eTD \bTD Marrone \eTD \bTD Pants \eTD\bTD Pantaloni \eTD \eTR
\bTR \bTD Serpillière\eTD \bTD Wassingue \eTD \bTD Swab \eTD
\bTD Strofinaccio \eTD \eTR
\bTR \bTD Boue\eTD \bTD Berdoule \eTD \bTD Mud \eTD\bTD Fangos \eTD \eTR
\eTABLE
}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…
avec

Tableau.

On a vu deux options pour \placefloat, here et none, voici un tableau qui indique les principales :

CodeFonction
none Supprimez la légende, y compris l'étiquette "Figure 1".
left À gauche du texte
right À droite du texte
here De préférence ici
force Forcer le placement ici
top En haut de la page
bottom Au bas de la page
inleft Dans la marge gauche
inright Dans la marge de droite
inmargin En marge (gauche ou droite)
margin En marge (marge flottante)
page sur une nouvelle page (vide)
opposite sur la page de gauche
always priorité sur les flottants stockés

Tu peux utiliser plusieurs options, il suffit de les séparer par des virgules. Par exemple \placefloat[here,force] pour forcer ConTeXt à placer ton image à cet endroit. On va en étudier quelques uns en détail car il y a quelques subtilités à connaître pour bien les utiliser.

left et right

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefloat[left,none]{ }{\externalfigure[groseille-2][width=10cm]}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Tableau.

Si tu estime que la distance entre l'image et le texte n'est pas suffisante, il va falloir jouer avec \setupfloats et \setupfloat. L'exemple qui suit va illustrer également la différence entre ces deux commandes.

On va utiliser les options roffset et loffset qui respectivement gèrent les espaces droit et gauche des images

Pour le premier exemple on va utiliser \setupfloats . Tu as deux façon de l'utiliser soit avant le \starttext et dans ce cas toutes les images de ton document seront affectées par celle-ci :

\setupfloats[roffset=1.5cm,loffset=.7cm]
\starttext
\subject{ Groseillier}
Le groseillier est un charmant petit arbuste, …

Soit dans une boite (délimitée par des { }) pour n'affecter qu'une seule image :

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

{\setupfloats[roffset=1.5cm,loffset=.7cm]
\placefloat[none,here]{ }{\externalfigure[groseille-2][width=10cm]}
}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Bon j'ai exagéré les marges pour plus de lisibilité, voici ce que cela donne :

Tableau.

Tu peux remplacer roffset et loffset par offset ce qui affecte toutes les espaces, droite, gauche, en haut et en bas.

Si on utilise \setupfloats avant le \starttext cela affecte tous les flottants, même le tableau par exemple. Si j'ajoute :

…sont une ressource pour renouveler le vieux bois dans les cépées.

\placetable[none,here]{ }{
\bTABLE
\bTR \bTH Français \eTH \bTH Chti \eTH\eTR
\bTR \bTD Pantalon\eTD \bTD Marrone \eTD \eTR
\bTR \bTD Serpillière\eTD \bTD Wassingue \eTD \eTR
\bTR \bTD Boue\eTD \bTD Berdoule \eTD \eTR
\eTABLE
}

Lorsque le groseillier est bien enraciné, on le recèpe sur trois ou quatre yeux…

On obtient :

Tableau.

Pour modifier de façon différente les images et les tableaux, il faut utiliser \setupfloat (sans s) comme ceci :

\setupfloats[roffset=1.5cm,loffset=.7cm]
\setupfloat[table][roffset=0cm,loffset=0cm]
\starttext
\subject{ Groseillier}
Le groseillier est un charmant petit arbuste, …

Ou bien comme ça :

\setupfloat[image][roffset=1.5cm,loffset=.7cm]
\setupfloat[table][roffset=0cm,loffset=0cm]
\starttext
\subject{ Groseillier}
Le groseillier est un charmant petit arbuste, …
avec

Tu obtiens :

Tableau.

Pour augmenter l'espace entre l'image et le texte tu peux également utiliser margin. Tu te demandes «Quelle différence entre margin et roffset ?».

Je te réponds «Excellente question !».

Et bien la différence est que roffset, loffset et roffset gèrent l'espace occupé par l'image, alors que margin gère la marge entre le texte et l'image. Pour mieux comprendre un petit dessin. Dans l'exemple suivant j'ai ajouté un cadre et coloré le fond de l'image en gris. J'ai utilisé pour la première image :

{\setupfloats[frame=on,background=color, backgroundcolor=gray]
\placefloat[none,left]{ }{\externalfigure[groseille-1][height=5cm]}
}

Pour la deuxieme :

{\setupfloats[frame=on,background=color, backgroundcolor=gray,margin=1cm]
\placefloat[none,left]{ }{\externalfigure[groseille-1][height=5cm]}
}

Et pour la troisième :

{\setupfloats[frame=on,background=color, backgroundcolor=gray,roffset=1cm]
\placefloat[none,left]{ }{\externalfigure[groseille-1][height=5cm]}
}

Tableau.

Placer un flottant à gauche ou à droite sans que le texte l'entoure

Pour cela il faut utiliser l'option location de \setupfloats et lui attribué les valeurs suivantes en fonction du côté choisi : left ou flushright et right ouflushleft

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

{\setupfloats[fleftmargindistance=-2cm]
\placefloat[none,inleft]{ }{\externalfigure[groseille-1][height=4cm]}
}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Tableau.

Placer un flottant dans la marge

Il y a 4 façons de placer du un flottant dans la marge : inleft (marge de gauche), inright (marge de droite), inmargin (dans la marge de droite ou de gauche c'est ConTeXt qui décide), margin (dans la marge mais n'importe où sur la page).

Pour les exemple qui suivent j'utilise une petite image qui tient dans la marge.

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefloat[none,inleft]{ }{\externalfigure[groseille-1][height=4cm]}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Tableau.

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefloat[none,inright]{ }{\externalfigure[groseille-1][height=4cm]}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Tableau.

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefloat[none,inmargin]{ }{\externalfigure[groseille-1][height=4cm]}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Tableau.

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefloat[none,margin]{ }{\externalfigure[groseille-1][height=4cm]}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Tableau.

Placer dans la marge une image trop grande pour y tenir n'est pas bien malin mais Bébert ne reculant devant rien, il l'a fait. Cela a quand même l'avantage de te montrer le comportement différent de ces commandes.

Pour cet exemple j'ai utilisé une image avec un fond coloré (la couleur de fond est dans l'image, pas généré par ConTeXt).

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefloat[none,inleft]{ }{\externalfigure[groseille-2b][width=10cm ]}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Tableau.

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefloat[none,inright]{ }{\externalfigure[groseille-2b][width=10cm ]}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Tableau.

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefloat[none,inmargin]{ }{\externalfigure[groseille-2b][width=10cm ]}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Tableau.

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefloat[none,margin]{ }{\externalfigure[groseille-2b][width=10cm ]}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Tableau.

Hop hop hop, je te vois venir avec tes gros sabots. Toi tu veux que ton image soit entourée de texte et qu'elle déborde dans la marge. Voila la solution il faut utiliser l'option leftmargindistance (ou rightmargindistance) de \setupfloat en lui attribuant une valeur négative.

{\setupfloats[fleftmargindistance=-2cm]
\placefloat[none,left]{ }{\externalfigure[groseille-2][width=7cm]}
}

Tableau.

Faire déborder une grande image dans une marge

Pour t'expliquer ce concept j'ai créé un document recto-verso avec de grandes marges, plus grande vers l'extérieur (6 cm) et un peu plus petite (3 cm) contre la reliure. J'y ai placé une grande image.

\mainlanguage[fr]
\language[fr]
\setuppagenumbering[alternative=doublesided]
\setuplayout[location=middle,backspace=4cm, width=10cm,leftmargin=3cm,rightmargin=6cm]
\setupfloats[figure][here,none]
\starttext
…papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.
\placefigure{ }{\externalfigure[raveneau-3][width=17cm]}
Il a eu l'irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur,…

Tableau.

Pour placer l'image dans la marge j’utilise location=inner qui placera l'image dans la marge de gauche pour les pages impaires et dans celle de droite pour les pages paires.

\mainlanguage[fr]
\language[fr]
\setuppagenumbering[alternative=doublesided]
\setuplayout[location=middle,backspace=4cm, width=10cm,leftmargin=3cm,rightmargin=6cm]
\setupfloats[figure][here,none,location=inner]
\starttext
…papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.
\placefigure{ }{\externalfigure[raveneau-3][width=17cm]}
Il a eu l'irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur,…

Tableau.

Tableau.

Pour sélectionner l'autre marge tu utilises location=outer

Regrouper plusieurs images dans un flottant.

On utilise pour cela \startcombination[x*y] où x représente le nombre d'images dans la largeur et y le nombre d'images dans la hauteur. Par exemple \startcombination[3*2] représente une matrice avec 3 images dans la largeur (par ligne) et 2 images en hauteur (soit 2 lignes) pour un total de 6 images (2 lignes et 3 colonnes), avec \startcombination[4*1] tu as 4 images sur une ligne (1 ligne et 4 colonnes) et avec \startcombination[1*4] 4 images disposées en vertical l'une en dessous de l'autre (4 lignes et 1 colonne).

…sur le papier, et dans des cordons verticaux, plus jolis encore, toujours sur le papier, mais impossibles, en vertu des lois végétales.

\placefigure[none,here]{ }{
\startcombination[3*2]
% Première ligne de 3 images
{\externalfigure[outil1][width=3cm ]}
{\externalfigure[outil2][width=3cm ]}
{\externalfigure[outil3][width=3cm ]}
% Deuxième ligne de 3 images
{\externalfigure[outil4][width=3cm ]}
{\externalfigure[outil5][width=3cm ]}
{\externalfigure[outil6][width=3cm ]}
\startcombination
}

Il a eu l’irrévérence d'ajouter à son geste, à l'adresse de l'éminent professeur, une foule de gourmands,…

Regroupe.

Les images sont peut-être un peu collées, la commande pour régler les combinaisons d'images est : \setupcombinations[ ]

Pour éloignée les images l'une de l'autre tu utilises l'option distance :

\setupcombinations[ distance=2cm]

Utilisée avec l'exemple précédant ça donne :

Regroupe.

Tu peux également utiliser l'option width qui règle la taille globale du flottant combinant les images. Du coup les images sont réparties sur l'ensemble de la place disponible

\setupcombinations[ width=\textwidth]

Regroupe.

Comme tu a pu le remarquer ces commandes n'ont aucune influence sur les distances verticales. Ceci est du a la gestion des légendes. Donc la solution, si comme ici, tu ne veux pas de légende est d'utiliser inbetween. Mais ceci ne marche pas quand tu as des légendes. On n'en reparlera dans la fiche consacrée aux légende

inbetween n'accepte que des commandes comme argument, tu ne peux donc pas directement lui indiquer une longueur (inbetween=2cm), tu dois passer par la commande \blank qui gère les espaces verticaux

\setupcombinations[ inbetween={\blank[20mm]}]

Regroupe.

De la même façon la commande height qui gère la hauteur de l'image combinée, ne marche pas pour augmenter l'espace vertical entre les images.

\setupcombinations[ height=10cm]

Regroupe.