Positionner un objet de façon absolu sur une page

Fleuron

Pour positionner un objet de façon absolu sur une page, c'est à dire à des coordonnées bien précises et indépendamment du texte il faut, sous ConTeXt utiliser un système de calques (layer en anglais).

Voici le code qui affiche la page suivante :

\definepapersize[fiche][width=18cm,height=10cm]
\setuppapersize[fiche]
\starttext
\showframe
\input tufte
\stoptext


Pour ne pas à avoir des images trop grandes à insérer dans cette fiche j'ai créé une petite feuille de 18cm de large et 10cm de haut.

\showframe permet de visualiser les marges du document et le bord de la feuille, en vert, \input tufte affiche un faux texte pour faire du remplissage.

Maintenant si j'insère par exemple un rectangle de couleur il se positionne à la suite du texte :

\definepapersize[fiche][width=18cm,height=10cm]
\setuppapersize[fiche]
\starttext
\showframe
\input tufte
\blackrule[height=3cm,width=6cm,color=red]
\stoptext


Pour le positionner à un endroit précis de la page il faut créer un calque.

\definelayer[nomducalque]

Par défaut l'origine du calque est le coin supérieur gauche de la feuille et ses dimensions sont celles de la page.

Pour positionner un objet sur notre calque il faut utiliser :

\setlayer[nomducalque][x=1cm,y=1cm]{objet à placer}

x et y indique la position de l'objet par rapport au coin en haut à gauche du calque.

Pour afficher le résultat il faut considérer le calque comme le fond de la page :

\setupbackgrounds[page][background=nomducalque]

Si on applique ces commandes à notre page et notre rectangle rouge :

\definepapersize[fiche][width=18cm,height=10cm]
\setuppapersize[fiche]
\definelayer[rectangle]
\setlayer[rectangle][x=1cm,y=1cm] {\blackrule[height=2cm,width=6cm,color=red]}
\setupbackgrounds[page][background=rectangle]
\starttext
\showframe
\input tufte
\stoptext


Si l'on modifie la position de l'objet en modifiant x et y

\definepapersize[fiche][width=18cm,height=10cm]
\setuppapersize[fiche]
\definelayer[rectangle]
\setlayer[rectangle][x=3cm, y=3cm] {\blackrule[height=2cm,width=6cm,color=red]}
\setupbackgrounds[page][background=rectangle]
\starttext
\showframe
\input tufte
\stoptext


Si tu veux que ton calque se retrouve sur toute les pages tu ajoutes repeat=yes à la définition du calque.

\definelayer[rectangle][repeat=yes]

Tu peux mettre dans un calque autant d'objets que nécessaires et tu peux créer autant de calques que voulus.

\definepapersize[fiche][width=18cm,height=10cm]
\setuppapersize[fiche]
\definelayer[rectangle]
\setlayer[rectangle][x=3cm,y=1cm] {\blackrule[height=2cm,width=6cm,color=red]}
\setlayer[rectangle][x=2cm,y=2cm] {\blackrule[height=2cm,width=6cm,color=green]}
\setupbackgrounds[page][background={rectangle}]
\starttext
\showframe
\input tufte
\stoptext


\definepapersize[fiche][width=18cm,height=10cm]
\setuppapersize[fiche]
\definelayer[rouge]
\setlayer[rouge][x=3cm,y=1cm] {\blackrule[height=2cm,width=6cm,color=red]}
\definelayer[vert]
\setlayer[vert][x=2cm,y=2cm] {\blackrule[height=2cm,width=6cm,color=green]}
\setupbackgrounds[page][background={rouge,vert}]
\starttext
\showframe
\input tufte
\stoptext


L'ordre de placement des calques dans background est important :

\setupbackgrounds[page][background={vert,rouge}]


En fait background possède deux autres niveaux implicites :

Regarde ce qui ce passe si je positionne foreground entre mes deux calques :

\setupbackgrounds[page][background={vert,foreground,rouge}]


Pour définir la couleur du fond :

\setupbackgrounds[page][backgroundcolor=yellow,background={color,vert,rouge}]


On vient de voir les principes de base, mais il est possible d'affiner encore plus le placement des objets.

Tu peux modifier l'origine et la taille de ton calque avec les options suivantes :

\definelayer[rouge][x=0mm,y=0mm,width=\paperwidth, height=\paperheight]

Ici j'ai mis les valeurs par défaut mais tu mets ce que tu veux comme dimensions. Si tu changes l'origine de ton calque, tu dois employer hoffset et voffset dans \setlayer qui permettent de décaler, si nécessaire ton objet par rapport à la nouvelle origine.

\setlayer[vert][hoffset=2cm,voffset=2cm] {\blackrule[height=2cm,width=6cm,color=green]}

Une autre option pour modifier l'origine du calque est corner à l'aide des combinaisons de top, bottom, left, right. Pour utiliser cette option il faut définir la taille du calque.

Par exemple pour notre rectangle rouge on peut définir l'origine du calque en bas à droite par :

\definelayer[rouge] [width=\paperwidth, height=\paperheight,corner={right,bottom}]

Tu peux utiliser à la place de \setlayer, \setlayerframed qui dessine un cadre autour de l'objet. Un exemple avec du texte :

\definepapersize[fiche][width=18cm,height=10cm]
\setuppapersize[fiche]
\definelayer[texte] [x=0mm y=0mm, width=\paperwidth, height=\paperheight,corner={left,bottom},location={top,right}]
\setupbackgrounds[page][background=texte]
\starttext
\setlayerframed[texte][hoffset=2cm,voffset=5cm] {\red\tfd C'est qui le plus fort? c'est Bébert !}
\input tufte
\stoptext


Tu dois placer le \setlayerframed après le \starttext sinon tu n'as pas de formatage du texte. Je te laisse revoir la fiche suivante pour voir les options de framed, au paragraphe 5. Tu peux enlever le cadre avec l'option frame=off.

L'un des avantages de \setlayerframed est qu'il accepte les sauts de paragraphe et que tu peux contenir le texte dans une boite dimensionnée.

\definepapersize[fiche][width=18cm,height=10cm]
\setuppapersize[fiche]
\definelayer[texte] [x=0mm, y=0mm, width=\paperwidth, height=\paperheight,corner={left,bottom},location={top,right}]
\setupbackgrounds[page][background=texte]
\starttext
\setlayerframed[texte][hoffset=2cm,voffset=5cm,rotation=42,width=5.5cm,align=right,frame=off] {\red\tfd C'est qui le plus fort ? \crlfc'est Bébert !}
\input tufte
\stoptext

N'oublie pas l'option align (qui peut prendre diverse valeurs, left, right, middle, hilo) sinon tu n'obtiens pas le résultat escompté.


Tu peux contrôler la position du texte ou de l'objet par rapport au point défini dans \setlayer ou \setlayerframed avec l'option location={} qui prend les valeurs top, bottom, left, right. Par défaut l'objet ou le texte est placé en dessous à droite. Dans l'exemple ci-dessous j'ai marqué la position en rouge, le cadre bleu est la position par défaut et le vert est placé au-dessus à gauche.

\definepapersize[fiche][width=18cm,height=10cm]
\setuppapersize[fiche]
\definelayer[moncalque] [width=\paperwidth, height=\paperheight]
\definelayer[origine]
\setlayer[origine][x=9cm,y=5cm] { \blackrule[height=2mm,width=2mm,color=red]}
\setupbackgrounds[page][background={moncalque,origine} ]
\starttext
\setlayer[moncalque][x=9cm,y=5cm,location={top,left}] {\blackrule[height=1cm,width=2cm,color=green]}
\setlayer[moncalque][x=9cm,y=5cm] {\blackrule[height=1cm,width=2cm,color=blue]}
\input tufte
\stoptext


Si tu mets l'option location={} dans \definelayer tous les objets du calque auront le même positionnement.

\setupbackgrounds peut te permettre de placer des objet dans des zones spécifiques de la page. Le premier paramètre définit la zone de mise en page principale; la seconde facultative spécifie la ou les sous-zones liées. Toutes les zones principales ne disposent pas de telles sous-zones.

Les zone principale sont : top header text footer bottom page paper leftpage rightpage

Les sous-zones : leftedge leftmargin text rightmargin rightedge

\setuppapersize[A10]
\showframe
\setupbackgrounds[footer] [background=color, backgroundcolor=blue]
\setupbackgrounds[footer] [leftmargin] [background=color, backgroundcolor=red]
\setupbackgrounds[text] [background=color, backgroundcolor=lightgray]
\setupbackgrounds[text] [rightmargin] [background=color, backgroundcolor=yellow]
\starttext
La zone de texte de \\mon \\document.
\stoptext


Avec l'option state de \setupbackgrounds tu peux controler l'affichage des calques dans ton document :

Il faut bien entendu placer le \setupbackgrounds au bon endroit dans le texte et pas forcement dans l'entête.

Reste à faire un chapitre sur le groupement d'objet et un autre sur les objets dynamique tel le numéro de page.