Encadrement de texte avec MetaFun

Bien que ConTeXt possède des outils comme \framed pour entourer du texte, le type d'encadrement reste limité et MetaFun permet de faire des boites beaucoup plus originales et fun.

Il peut être utile de relire les fiches consacrées aux frame (Mettre un paragraphe en évidence) et à overlay (Superposer des textes ou des images).

Une autre remarque : dans le manuel de MetaFun Hans Hagen précise qu'il vaut mieux dans ce cas utiliser \startuniqueMPgraphic {nom } à la place de \startuseMPgraphic {nom}, je n'ai pas vraiment compris pourquoi mais dans les exemples suivants, souvent repris du manuel, je vais utiliser \startuniqueMPgraphic {nom}.

Pour expliquer le fonctionnement de la méthode on ne va pas faire preuve de beaucoup d'originalité on va se contenter d'un cercle rouge à fond gris. Nous allons d'abord fabriquer la forme à l'aide de MetaFun et de la commande \startuseMPgraphic {nom} :

\startuniqueMPgraphic{maboite}
path p ;
p := fullcircle xscaled 4cm yscaled 1cm ;
fill p withcolor .85white ;
draw p withpen pencircle scaled 2pt withcolor .625red ;
\stopuniqueMPgraphic
\starttext
\startuniqueMPgraphic{maboite}
\stoptext

Pour te montrer à quoi aller ressembler notre boite je lui ai attribué des dimensions arbitraires (4cm et 1cm) mais si l'on veut que notre boite soit adaptée à notre texte, il faut lui fournir les dimensions du texte. On le fait avec les commandes \overlaywidth et \overlayheight qui sont fourni par la commande \framed et qui correspondent respectivement à la longueur et la hauteur du texte (ou tout autre objet) à encadrer. Donc le véritable code est :

\startuniqueMPgraphic{maboite}
path p ;
p := fullcircle xscaled \overlaywidth yscaled \overlayheight ;
fill p withcolor .85white ;
draw p withpen pencircle scaled 2pt withcolor .625red ;
\stopuniqueMPgraphic

La seconde étape consiste à enregistrer note dessin comme une superposition (overlay)

\startuniqueMPgraphic{maboite}
path p ;
p := fullcircle xscaled \overlaywidth yscaled \overlayheight ;
fill p withcolor .85white ;
draw p withpen pencircle scaled 2pt withcolor .625red ;
\stopuniqueMPgraphic

\defineoverlay[maboite][\uniqueMPgraphic{maboite}]

Ce code est à mettre dans le préambule du document. Maintenant on peut utiliser notre encadrement :

\startuniqueMPgraphic{maboite}
path p ;
p := fullcircle xscaled \overlaywidth yscaled \overlayheight ;
fill p withcolor .85white ;
draw p withpen pencircle scaled 2pt withcolor .625red ;
\stopuniqueMPgraphic

\defineoverlay[maboite][\uniqueMPgraphic{maboite}]
\starttext
\framed[background=maboite]{Mon texte joliment encadré.}
\stoptext

Finalement elle n'est pas aussi belle que souhaitée. Le premier problème est le cadre noir. En effet on a fait une superposition de notre beau cadre mais on a pas remplacer le cadre fait par \framed pour ce faire il faut utiliser l'option frame=off

\startuniqueMPgraphic{maboite}
path p ;
p := fullcircle xscaled \overlaywidth yscaled \overlayheight ;
fill p withcolor .85white ;
draw p withpen pencircle scaled 2pt withcolor .625red ;
\stopuniqueMPgraphic

\defineoverlay[maboite][\uniqueMPgraphic{maboite}]
\starttext
\framed[background=maboite,frame=off]{Mon texte joliment encadré.}
\stoptext

Le texte est toujours trop colé au cadre. Pour améliorer cet aspect il faut jouer avec l'option offset= de \framed

\startuniqueMPgraphic{maboite}
path p ;
p := fullcircle xscaled \overlaywidth yscaled \overlayheight ;
fill p withcolor .85white ;
draw p withpen pencircle scaled 2pt withcolor .625red ;
\stopuniqueMPgraphic

\defineoverlay[maboite][\uniqueMPgraphic{maboite}]
\starttext
\framed[background=maboite,frame=off,offset=3mm]{Mon texte joliment encadré.}
\stoptext

À la place de offset= tu peux également utiliser frameoffset= et backgroundoffset= qui ne donne pas exactement les mêmes résultats.

Si ton cadre n'a pas de fond n'oublies pas que tu peux jouer avec le calque foreground pour placer ton texte au-dessus ou en-dessous du cadre (revoir la fiche Superposer des textes ou des images).

De la même façon que tu passes les dimensions de ton objet à MetaPost par les commandes \overlaywidth et \overlayheight tu peux transmettre les couleurs de fond et de trait ainsi que son l'épaisseur avec les commandes suivantes :

Voici l'exemple du manuel MetaFun :

\startuniqueMPgraphic{maboite}
path p ;
p := unitsquare xscaled \overlaywidth yscaled \overlayheight superellipsed .85 ;
pickup pencircle scaled \overlaylinewidth ;
fill p withcolor \MPcolor{\overlaycolor} ;
draw p withcolor \MPcolor{\overlaylinecolor} ;
\stopuniqueMPgraphic

\defineoverlay[maboite][\uniqueMPgraphic{maboite}]
\starttext
\framed[background=maboite,frame=off,with=3cm,align=middle, framecolor=darkyellow, rulethickness=2pt,backgroundcolor=darkgray]{Mon texte joliment encadré.}
\blank[2*big]
\framed[background=maboite,frame=off,with=3cm,align=middle, framecolor=red, rulethickness=2pt,backgroundcolor=darkgren]{Mon texte joliment encadré.}
\stoptext