Il y a plusieurs façon de saisir du code MetaPost dans ConTeXt. La plus simple est :
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 :
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).
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.
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).
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é.
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) :
.
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 :
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 :
Cette fois le graphique fait 3 mm sur 2 mm.
On peut tracer plusieurs traits à la suite :
On appelle ceci un path (chemin).
La commande --cycle permet de fermer le path :
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 :
Tu peux mélanger les --
et les ..
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
) .
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).
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.
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 :
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.
METAFUN reconnait 9 types différents de variables
" "
, ça peut être un mot ou une/des phrase(s) mais sans qaut de ligne ;
Tu déclares une variable de la façon suivante :
Un nombre que l'on appelle age
Une couleur monrouge
Une chaîne de caractère prenom
Une chemin p
Si tu dois déclarer plusieurs variable du même type tu les sépare par une virgule :
.
.
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 :
Un autre exemple :
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 :
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é).