MetaPost/Metafun : Premiers pas

spécial Mme/Mr Michu étudiant.e en sciences humaines

Fleuron

Intégration dans ConTeXt

Il y a plusieurs façon de saisir du code MetaPost dans ConTeXt. La plus simple est :

\starttext
Du texte …
\startMPcode
Le code Metapost …
\stopMPcode
La suite du texte …
\stoptext

Dans ce cas le graphique résultant du code Metapost est inséré immédiatement.

Si tu dois utiliser ton graphique à plusieurs endroits dans ton document il est préférable d'utiliser les commandes suivantes :

\startuseMPgraphic{lenomdugraphic}
Le code Metapost …
\stopuseMPgraphic
\starttext
Du texte …
\useMPgraphic{lenomdugraphic}
La suite du texte …
\useMPgraphic{lenomdugraphic}
Encore du texte …
\stoptext

Avec \startuseMPgraphic le graphique est recompilé à chaque \useMPgraphic

Je te donne un exemple, issu de la documentation de ConTeXt, ne t'occupe pas du code MetaPost pour l'instant, on trace juste un cercle coloré dont la couleur est défini par \macouleur (voir cette page pour la définition des couleurs).

\def\macouleur{.625red}
\startuseMPgraphic{moncercle}
fill fullcircle scaled 20pt withcolor \macouleur;
\stopuseMPgraphic
\starttext
Un cercle rouge :
\useMPgraphic{moncercle}
\def\macouleur{.625blue}
Un cercle qui a changé de couleur :
\useMPgraphic{moncercle}
\stoptext

Il existe une commande qui ne compile qu'une seule foi le graphique qui sera réutilisé tel quel à chaque nouvel appel quelque soit les modifications apportés ultérieurement. Il s’agit de \startreusableMPgraphic avec pour appel \reuseMPgraphic

Le même exemple que ci-dessus avec \startreusableMPgraphic.

\def\macouleur{.625red}
\startreusableMPgraphic{moncercle}
fill fullcircle scaled 20pt withcolor \macouleur;
\stopreusableMPgraphic
\starttext
Un cercle rouge :
\reuseMPgraphic{moncercle}
\def\macouleur{.625blue}
Un cercle qui n'a pas changé de couleur :
\reuseMPgraphic{moncercle}
\stoptext

Les coordonnées

Pour nous repérer sur notre feuille de papier, nous allons utiliser un systèmes de coordonnées, représenté par un couple (x,y) dans un repère cartesien orthonormé. Pour dessiner sur notre feuille de papier il nous faut une origine, ce sera donc le coin en bas à gauche de notre feuille. Notre feuille, prenons par exemple une feuille A4 en mode portrait, à pour largeur 21 cm. On se déplace sur la largeur de droite à gauche. En mathématique on l'appelle l'abcisse et ses valeurs sont représentées par un x. Dans notre exemple x va de 0 à 21 si on s'expime en cm de 0 à 210 en mm,…

La hauteur de notre feuille vaut 29,7 cm. On s'y déplace de bas en haut. En mathématique on l'appelle l'ordonnée et ses valeurs sont représentées par un y. Dans notre exemple y va de 0 à 29.7 si on s'expime en cm de 0 à 297 en mm,…

Attention comme dans la plupart des langages informatiques on écrit les chiffres à l'anglo-saxonne, donc les décimales sont notées avec un point et non une virgule comme en France.

Orthonormé signifie que l'angle formé par les abscisses et les ordonnées est un angle droit et qu'elles ont le même système de graduation. Donc notre feuille de papier est un repère cartésien orthonormé. N'importe quel point que tu vas dessiner sur ta feuille peut être représente par un couple (x,y). Par exemple l'angle en bas à gauche qui est l'origine à pour coordonnées le couple (0,0), le coin en bas à droite (21,0), l'angle en haut à droite (21,29.7), le coin en haut à gauche (0,29.7) et le centre de la feuille (10.5,14.85).

Un petit dessin pour clarifier tout cela :

Par exemple voici un point rouge à 2 en x et 1 en y (2,1), un point bleu à (1.3,2.75).

Les unités

L'unité par défaut dans METAFUN est le point postscript, une unité typographique, notée bp qui vaut 0.352 mm. Il est appelé gros point, par opposition au point typograhique (pt). Leurs définitions sont les suivantes :

Tu peux utiliser d'autres unités comme le centimètre, le millimètre, les pouces (inches, en anglais valant 2,54 cm et dont l'unité est in) le point d'impression (pt) et le pica (1 pc = 1/6 in), mais dans ce cas il faut préciser l'unité :

(2cm,1cm) ou (0,3mm) …

Pour récapituler :

Si tu ne précises pas l'unité METAFUN travaille en point postscript et c'est très petit. Les unités sont un raccourci pour une multiplication. Par exemple 3mm équivaux à 3x0,352 soit 1,056 point postcript. Pour le zéro tu n'est pas obligé de préciser car 0 x 0,352 = 0.

Comme 3mm est un raccourci pour une multiplication tu ne dois pas mettre de blanc entre le chiffre et les unités (3 mm).

Les longueurs que peut gérer METAFUN vont de 1/65536 bp soit environ 5,38 nm (nanomètres) jusqu'à 4096 bp soit 1,4 m. À titre de comparaison la longueur d'onde de la lumière visible est comprise entre de 380 nm et 780 nm et une feuille de papier standard (A4) fait 0.21 m x 0.297 m. Tu devrais pouvoir dessiner tout ce que tu veux.

En bon enfant de la révolution de 1789, nous allons travailler par la suite avec des centimètres ou des millimètres. On utilisera peut-être le cadratin (em) qui est une unité de mesure relative et qui dépend de la taille de la fonte utilisée. Si tu utilise une fonte de 12 pt (fonte par défaut de ConTeXt) le cadratin vaut 12 pt, pour une fonte de 8 pt, 1 cadratin vaut 8 pt,… Le em est le nom anglais pour cette mesure qui vient du fait que le M majuscule à la taille de la fonte utilisée. Cette mesure est très pratique pour placer du texte par rapport à un autre texte, car si tu changes de fonte ton texte est toujours bien placé.

Premier dessin

draw est la commande qui permet de dessiner. -- (2 traits d'union) est la commande qui relie deux coordonnées par un trait. Pour dessiner un trait du point d'origine au point (3cm,2cm) :

draw (0,0) -- (3cm,2cm);

.

Toutes les instructions Metapost/MetaFun se terminent par un point virgule ; ne l'oublie pas.

Dans un premier temps pour intégrer du code (un programme) Metapost/MetaFun dans ConTeXt, on va utiliser l'environnement \startMPcode\stopMPcode. Voici le code complet :

\starttext
Voici mon premier dessin avec Metapost
\startMPcode
draw (0,0) -- (3cm,2cm);
\stopMPcode
Il est bien modeste.
\stoptext

Que tu compiles avec ConTeXt et tu obtient :

Le graphique généré par MetaPost à strictement la taille du dessin dans cet exemple, il fait 3 cm de large sur 2 cm de haut (je parle des dimensions du graphique dans « Les boîtes : boundingbox »). Si l'on change les unités, on obtient :

\starttext
Voici mon premier dessin avec Metapost
\startMPcode
draw (0,0) -- (3mm,2mm);
\stopMPcode
Il est bien modeste.
\stoptext

Cette fois le graphique fait 3 mm sur 2 mm.

On peut tracer plusieurs traits à la suite :

draw (0,0) -- (3cm,2cm) -- (3cm,4cm) -- (0,4cm);

On appelle ceci un path (chemin).

\starttext
\startMPcode
draw (0,0) -- (3cm,2cm) -- (3cm,4cm) -- (0,4cm);
\stopMPcode
\stoptext

La commande --cycle permet de fermer le path :

\starttext
\startMPcode
draw (0,0) -- (3cm,2cm) -- (3cm,4cm) -- (0,4cm)--cycle;
\stopMPcode
\stoptext

Attention la commande suivante ne ferme pas le path :
draw (0,0) -- (3cm,2cm) -- (3cm,4cm) -- (0,4cm) -- (0,0);
même si à première vue les deux dessins se ressemblent, on verra par la suite que ce n'est pas la même chose.

Les blanc ne sont pas nécessaire dans les commandes tu peux écrire :
draw (0,0) -- (3cm,2cm) -- (3cm,4cm) -- (0,4cm) -- cycle;
ou
draw(0,0)--(3cm,2cm)--(3cm,4cm)--(0,4cm)--cycle;

Si tu emploies .. (2 points) à la place des -- tu obtiens un tracé courbe :

\starttext
\startMPcode
draw (0,0) .. (3cm,2cm) .. (3cm,4cm) .. (0,4cm)..cycle;
\stopMPcode
\stoptext

Tu peux mélanger les -- et les ..

\starttext
\startMPcode
draw (0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
\stopMPcode
\stoptext

L'autre commande pour dessiner est fill qui rempli la surface dessinée si et uniquement si la surface est fermée (avec un cycle) .

\starttext
\startMPcode
fill (0,0) .. (3cm,2cm) -- (3cm,4cm) -- (0,4cm)..cycle;
\stopMPcode
\stoptext

draw ne dessine que le contour du dessin, fill ne remplie que l'intérieur du dessin, si tu veux dessiner le contour et l'intérieur il faut utiliser filldraw. Voici le résultat de gauche à droite de draw avec une épaisseur de trait de 5mm et en rouge, le remplissage en gris avec fill et le résultat de filldraw.

Je ne te mets pas le code car il fait appelle à plusieurs notions que l'on verra dans d'autres fiches. J'ai augmenté la taille du trait pour que l'on puisse bien visualiser la différence entre fill et draw.

Tu dois également faire attention à l'ordre dans lequel tu donnes tes instructions :

draw p;
fill p;

ne donne pas le même résultat que

fill p;
draw p;

À gauche on a draw puis fill, à droite fill puis draw.

Dessiner un point est trivial et ce fait avec la commande drawdot mais demande une notion que l'on verra plus tard (dans cette page) en effet si tu tapes le code suivant tu as bien dessiné un point mais tu ne vois rien (ou presque rien).

\starttext
\startMPcode
drawdot (0,0);
\stopMPcode
\stoptext

Le code ci-dessus a bien dessiné un point mais comme la taille du stylo est par défaut dans MetaPost de 1bp, le point que tu a dessiné fait 0,3mm donc quasiment invisible. Pour dessiner un point il faut donc augmenter la taille du stylo, notion abordé dans cette page.

\starttext
\startMPcode
drawdot (0,0) withpen pencircle scaled 5mm ;
\stopMPcode
\stoptext

Les variables

Il est important de comprendre la notion de variable car avec Metapost/MetaFun on va en utiliser beaucoup. Une variable est un espace de stockage pour une donnée ou un résultat. C'est toi qui crée la variable et lui donne un nom qui est fixe. Par contre sa valeur peut varier à l'intérieur du programme Metapost/MetaFun, d'où son nom variable. Pour écrire le nom des tes variables tu peux utiliser tous les caractères suivant :

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz:<=>|#&@$/*\!?’‘ˆ{}[]1234567890

Par exemple |#&@$ est un nom autorisé, mais d'un intérêt très limité, il vaut mieux donner un nom qui évoque ce pour quoi la variable a été crée.

Les types de variables

METAFUN reconnait 9 types différents de variables

Tu déclares une variable de la façon suivante :

Un nombre que l'on appelle age

numeric age;

Une couleur monrouge

color monrouge;

Une chaîne de caractère prenom

string prenom;

Une chemin p

path p;

Si tu dois déclarer plusieurs variable du même type tu les sépare par une virgule :

color monrouge, monvert, monbleu;

.

path p, q;

.

L'affectation une valeur dépend de la nature de ta variable : pour les valeurs de types numeric et pair tu emplois le signe = pour toutes les autres le double signe :=

Par exemple :

age=24;
z0=(0,0);
monrouge:=(205,22,22);
prenom:="Raoul";
p:=(0,0) .. (3cm,2cm) .. (3cm,4cm) .. (0,4cm)..cycle;

Un autre exemple :

\starttext
\startMPcode
path p;
z0=(0,0) ;
z1=(3cm,2cm) ;
z2=(3cm,4cm) ;
z3= (0,4cm);
p:=z0 .. z1 -- z2 -- z3..cycle;
draw p;
\stopMPcode
\stoptext

Comme tu peux le voir dans cet exemple on est pas obligé de déclarer les variables de type numérique ou pair. On peut attribué directement une valeur à z0 sans passer par pair z0;

L'un des avantages d'utiliser des variables est de pouvoir les réutiliser dans la suite du dessin :

\starttext
\startMPcode
path p;
path q ;
z0:=(0,0) ;
z1:=(3cm,2cm) ;
z2:=(3cm,4cm) ;
z3:= (0,4cm);
p:=z0 .. z1 -- z2 -- z3..cycle;
q:=z3 -- z1 -- z0 ;
draw p;
draw q;
\stopMPcode
\stoptext

Un autre exemple très utile. Au lieux d'écrire les unités (cm, mm), il est préférable d'utiliser une variable que l'on appelle u par exemple (u pour unité).

\starttext
\startMPcode
path p;
u=1cm;
z0=(0,0) ;
z1=(3u,2u) ;
z2=(3u,4u) ;
z3= (0,4u);
p:=z0 .. z1 -- z2 -- z3..cycle;
draw p;
\stopMPcode
\stoptext

De cette façon en changeant uniquement la valeur de u ont modifie les unités ou l'échelle de la figure pour l'adapter facilement à notre document.
\starttext
\startMPcode
path p;
u=1mm;
z0=(0,0) ;
z1=(3u,2u) ;
z2=(3u,4u) ;
z3= (0,4u);
p:=z0 .. z1 -- z2 -- z3..cycle;
draw p;
\stopMPcode
\stoptext

\starttext
\startMPcode
path p;
u=1.5cm;
z0=(0,0) ;
z1=(3u,2u) ;
z2=(3u,4u) ;
z3= (0,4u);
p:=z0 .. z1 -- z2 -- z3..cycle;
draw p;
\stopMPcode
\stoptext