Attention, ceci ne constitue en aucun cas une documentation exhaustive ni rigoureuse.
Le but est d'aider les personnes ayant une culture informatique minimale de comprendre et de réaliser certains fichiers écrits en PostScript.
Pour plus d'infos, voir PostScript Language Tutorial and Cookbook, Addison-Wesley, 1990, ou le Web.
1 Fichiers PostScript élémentaires
1.1 Introduction
Pour expérimenter cette brève documentation, il suffit d'un éditeur, et d'un visualisateur de PostScript (GhostScript et ses variantes: gs, gv, sur Unix, Linux, Mac, Windows).
Pour les cartographes des sciences humaines, Illustrator peut êre utilisé afin de desiner des fonds de carte. Le fait de donner une extension <<.ps>> à un fichier PostScript est une tradition qui vient du monde Unix.
En annexe sont disponibles quelques exemples.
1.1.1 Les commentaires en PostScript
Ils commencent par le symbole % Évidemment, certains commentaires servent à définir le type du fichier (cf. point
suivant).
1.1.2 Début et fin du fichier
Ils ne sont pas indispensables mais fortement conseillés! %!PS-Adobe-3.0 en première ligne pour définir l'en-tête, et %EOF en fin de fichier.
1.2 Exemples
Voir le fichier basique.ps disponible en annexe. Les coordonnées partent du bas à gauche de l'écran ou de la feuille, et sont définies en points
(=1/72 de pouce, soit environ 1/3 mm)
1.2.1 Cercle
Il suffit de taper (ou de copier): %!PS-Adobe-3.0 100 100 50 0 360 arc % décrit un arc centré en 100 100 de rayon 50 % allant de 0 à 360 degrés; c'est donc un cercle complet stroke % dessine le <<trait>> demandé showpage %EOF
1.2.2 Triangle ou polygone
C'est assez élémentaire: %!PS-Adobe-3.0 newpath % nouveau polygone 50 200 moveto % on part des coordonnées 50 200 50 100 rlineto % on fait un déplacement relatif (r) de 50 en x et de 100 en y 50 -100 rlineto % idem % on pourrait continuer ainsi s'il faut définir d'autres segments closepath % fermer le polygone stroke showpage %EOF
Note: ces exemples sont reproduits en annexe sous un format gif afin d'en permettre la visualisation sur le Web. Pour respecter au mieux la position des images dans la page, une bordure noire a été insérée sur les figures.
Cette bordure correspondrait à la commande suivante: newpath
0 0 moveto
0 842 rlineto
595 0 rlineto
0 -842 rlineto
closepath
stroke
Dans les faits, pour éviter des images trop grandes, la taille de la page est réduite à 400 points de large et 450 points en hauteur.
1.2.3 Ligne (éventuellement brisée)
Se déduit du point précédent. x y moveto z t lineto % etc. stroke Fait ce qu'on veut. Note: z t lineto est équivalent à a b rlineto
avec a=z-x et b=t-y
1.3 Couleurs, contours, fonds
Si rien n'est mentionné, la couleur est le noir, ou la couleur précédemment sélectionnée. De même pour le contour, valant par défaut 1 point d'épaisseur.
1.3.1 Couleur et épaisseur du contour
Exemple complétant la description du triangle: %!PS-Adobe-3.0 newpath 50 200 moveto 50 100 rlineto 50 -100 rlineto closepath 0 1 0 setrgbcolor % définit la couleur en Rouge Vert Bleu en fraction: ici
Vert 0.2 setlinewidth % épaisseur de la ligne (1/5 point) stroke showpage %EOF
1.3.2 Précisions sur la couleur
Avec des valeurs identiques pour le RVB, on obtient des niveaux de gris: 0 0 0 setrgbcolor = noir 1 1 1 setrgbcolor = blanc x x x setrgbcolor = gris clair si x proche de 1, sombre si x proche de 0.
On peut aussi choisir des couleurs d'imprimerie: x y z t setcmykcolor définit les couleurs en Cyan, Magenta, Yellow, K comme black, avec les indices toujours compris entre 0 et 1. Si t vaut 1, le noir l'emporte.
1.3.3 Fond
Il faut intégrer les commandes suivantes juste après la commande closepath (ou la commande
arc): gsave x y z setrgbcolor fill % ainsi l'objet aura comme fond la couleur désignée grestore
Pourquoi? Les commandes PostScript doivent être imaginées posées sur une
pile: c'est toujours la commande au dessus de la pile qui est réalisée,
ensuite elle est <<jetée>>. Si on veut faire un stroke après un
fill, l'objet sur lequel on travaillait sera perdu après
l'imposition des couleurs du fond. D'où le gsave: sauvegarder l'objet; ensuite on effectue la
coloration du fond, enfin on restore l'objet sauvegardé (ici, le
contour).
Exemple %!PS-Adobe-3.0 100 100 50 0 270 arc % arc centré en 100 100 de rayon 50 allant %de 0 à 270 degrés gsave 0 0 1 setrgbcolor fill grestore 0 1 .5 setrgbcolor 5 setlinewidth stroke showpage %EOF
Cet exemple permet de voir comment se <<remplit>> l'arc de cercle. Note: ces options sauvegarder et restaurer sont souvent utilisées dans les fichiers PostScript.
1.3.4 Superposition
C'est, en vertu de cette logique de pile, le dernier objet défini qui l'emporte, et qui risque donc de masquer les précédents.
Mais un objet sans fond défini (ce qui est différent d'un fond blanc!) restera transparent et laissera ceux dessous visibles.
1.4 Raccourcis
Certaines commandes risquant d'être appliquées souvent, on peut les redéfinir de façon à gagner du temps: au début du fichier (l'idéal, sinon quand on en a besoin), on rédige la définition, comme ainsi: /raccourci {la longue commande} def Exemple /m {moveto} def alors 50 200 m sera interprété comme 50 200 moveto Le PostScript ne s'embarrassant pas des passages à la ligne, on peut écrire /co {gsave 0 1 1 setrgbcolor fill grestore} def ou bien /co {gsave 0 1 1 setrgbcolor fill grestore} def ainsi: %!PS-Adobe-3.0 /co {gsave 0 1 1 setrgbcolor fill grestore} def 100 200 50 0 360 arc co 0 1 .5 setrgbcolor 5 setlinewidth stroke showpage %EOF fera ce à quoi on s'attend.
Note: il existe aussi des possibilités d'insérer des variables, d'opérer des homothéties...
1.5 Texte
Ce n'est pas si simple: problèmes d'accent, de longueur de ligne, de centrage, etc. Pour les accents, caractères spéciaux, etc., voir une prochaine leçon, en cas de besoin.
1.5.1 Exemple simple
Alignement standard %!PS-Adobe-3.0 100 300 moveto /Helvetica findfont 18 scalefont setfont % prendre du helvetica 18 (Du texte noir) % le contenu du texte est entre parenthèses 0 setgray % ou 0 0 0 setrgbcolor; si on oublie cette
ligne, % c'est la dernière couleur sélectionnée qui sera utilisée show showpage %EOF % Le texte part donc vers la droite à partir des coordonnées 100 300
1.5.2 Texte centré
Exemple: %!PS-Adobe-3.0 100 350 moveto /Helvetica findfont 18 scalefont setfont (Du texte noir) dup stringwidth pop 2 div 0 exch sub 0 rmoveto show showpage %EOF
Bref commentaire: on calcule la largeur du texte, on la divise par 2, on
<<joue>> avec la pile pour translater les coordonnées
prédéfinies (100 300) de la moitié de la longueur du texte.
1.5.3 Texte aligné à droite
Il suffit d'enlever la ligne 2 div
2 Logiques de la cartographie
2.1 Fichiers
On dispose de deux fichiers, l'un, statistique, dont chaque ligne décrit un objet géographique (ville, département, pays, etc.) et chaque colonne une variable.
L'autre sera le fichier graphique.
2.1.1 Exemple de fichier statistique
Cf. le <<Tableau simple>>
Pays
Population
taux-personnes-de-+-de-60ans
etc.
France
60
20
Allemagne
80
23
etc.
Table 1: Tableau simple
Ce fichier subit un traitement... statistique, après lequel on désire souvent obtenir (au moins) deux types de représentations qui traduisent graphiquement les variations mesurées: - plages de couleurs traduisant une discrétisation (description de pourcentages) - cercles (ou carrés, etc.) de surface proportionnelle à une variable donnée (entière).
Exemple: On peint la France en jaune, l'Allemagne en rouge, car on a décidé
que tout taux supérieur à 22 serait représenté en rouge
(variable <<taux-personnes-de-+-de-60ans>>). On dessine à l'emplacement du <<centre de
la France>> (Paris) un cercle de rayon 60 et à l'emplacement de Berlin un
cercle de rayon... 69,2 (et non pas 80!!!) pour décrire la variable <<Population>>; en effet, on
se rappelle que l'on préfère que la surface des cercles soit proportionnelle
à une variable donnée plutôt que leur diamètre).
2.1.2 Objets graphiques
On comprend bien que pour réaliser un traitement graphique, il faut
manipuler des objets (contour de la France, de l'Allemagne, localisation du
point Paris, idem pour Berlin) qu'il vaut mieux regrouper en classes: ici,
<<Pays>> et <<Capitales>>.
Il suffit d'introduire un commentaire dans le
fichier PostScript pour repérer les objets en question. Ces faits sont détaillés dans les exemples suivants.
Ce sont en fait les logiques de
superposition (cf. partie 1) qui imposent de regrouper les objets en classes (sinon,
par exemple, le cercle associé à Paris risquera d'être caché par la carte de France).
Les classes sont communément appelées <<calques>> (<<layers>> en anglais).
2.1.3 Exemple
Le fichier Fr-All.ps (cf. Annexe) donne un exemple d'un fichier considérablement simplifié issu du logiciel Illustrator (qui est très bavard). Il est composé de 3 calques: Pays, Capitales et Cercles.
Il n'y a en fait que 2 objets (France et Allemagne), comme dans la base statistique, mais répliqués dans chaque calque. Ceci appelle quelques commentaires: - Il vaut mieux prévoir (au moins) autant de calques que de représentations graphiques potentielles,
afin que toutes les localisations soient bien prévues. - On peut ajouter des calques qui ne serviront que de décoration (on dit
<<habillage>>). Par exemple un calque pour les objets de dimension 1
(rivières, routes, etc.), un pour des surfaces telles que les lacs, un
pour le fond, le cadre, etc. - Dans le fichier Fr-All.ps, les
points qui représentent les capitales des pays ne sont pas visibles. C'est
pourquoi est ajouté un calque a priori inutile, le calque
<<Cercles>>, qui permet de visualiser la localisation des capitales. - Composantes connexes: la Corse étant un polygone appartenant à l'objet
statistique France, il convient donc que les deux polygones aient la même
couleur. On définit souvent par Objet, Objet-2,
Objet-n les intitulés des différentes composantes connexes
d'Objet.
2.1.4 Conventions
Elles sont définies pour <<coller>> au mieux aux normes du logiciel Illustrator (versions <=8). Dans la version 9, le nom des objets est placé sous leur description...
On définit un calque de la façon suivante: %AI5_BeginLayer-- %(Nom du calque) Ln ...description des objets... %AI5_EndLayer--
Note pour la documentation en LATEX: la rapidité d'écriture en LATEXfait que les deux tirets consécutifs
après BeginLayer ou EndLayer (- -) apparaissent
sous forme d'un seul tiret long, ce qui n'est pas si grave...
et les objets d'un calque ainsi: %AI3_Note:Nom-de-l-Objet1 sa description %AI3_Note:Nom-de-l-Objet2 sa description etc.
2.1.5 Exemple de fichier résultat
Le fichier Fr-All2.ps (cf. Annexe) donne un exemple de ce que l'on pourrait faire par programmation en manipulant les objets en fonction des variables à décrire (le calque <<Cercles>> a été supprimé, puisqu'on a vu qu'il est en fait inutile).
Qu'a-t-on fait?
Pour une représentation donnée (ex: cercles proportionnels), on choisit une variable et un calque (ex: variable <<Population>> et calque <<Capitales>>). Le programme consiste alors à repérer les objets graphiques (objets <<France>> et <<Allemagne>> du bon calque) et à les
transformer:
si on rencontre l'expression %AI5_BeginLayer-- %(Capitales) Ln alors, quand on lit %AI3_Note:Objet remplacer, à la ligne suivante coord_x coord_y m par coord_x coord_y rayon-calculé-de-l-objet 0 360 arc puis remplacer la suite (jusqu'au prochain %AI3_Note:) par stroke (ou par des choses un peu plus compliquées si on désire des cercles d'une couleur donnée, d'une épaisseur donnée, évidés ou pas, etc.).
On peut multiplier les représentations, par exemple, décider aussi de modifier le fond des pays en fonction de la variable <<taux-personnes-de-+-de-60ans>>: voir toujours le fichier Fr-All2.ps.
2.1.6 Conclusion
- En bref, il suffit de repérer des chaînes de caractères, de faire quelques calculs élémentaires, d'intégrer des modifications dans un fichier PostScript, et de penser à la gestion des calques, ceux qui apparaîtront en fond étant décrits les premiers. - On remarque qu'il n'est pas obligatoire d'avoir une description PostScipt du fichier graphique initial. Des fichiers ascii, décrivant d'une façon ou d'une autre points et polygones, sont tout-à-fait adaptés. - D'autres travaux sont possibles: flèches de couleur et d'épaisseur associées à des variables données, animations (en d'autres formats que le PostScript), etc.
3 Annexes: fichiers d'exemples
3.1 Le fichier basique.ps
Le plus simple est de le visualiser: %!PS-Adobe-3.0 100 100 50 0 360 arc stroke /m {moveto} def
100 300 m /Helvetica findfont 18 scalefont setfont (Du texte noir) 0 setgray show
showpage %EOF
Sa visualisation en gif
3.2 Le fichier Fr-All.ps
C'est en quelque sorte un <<fond de carte>>, avec une visualisation spécifique pour des points qui en théorie n'apparaissent pas. A visualiser lui aussi.
%AI5_BeginLayer-- %(Pays) Ln %AI3_Note:Allemagne newpath 266.6094 404.9883 m 294.0967 409.1528 l 287.6865 434.4482 l 346.1563 424.979 l 381.9736 339.6016 l 343.6533 319.834 l 370.3115 279.6289 l 357.8174 255.0566 l 267.627 255.6777 l 278.687 290.041 l 251.1997 307.5322 l 245.9785 360.2422 l 266.6094 404.9883 l s %AI3_Note:France newpath 191.5752 345.9434 m 175.752 341.6104 l 171.5249 323.0166 l 150.915 316.2471 l 145.8311 307.9492 l 127.5063 311.2813 l 126.7188 318.6816 l 117.1211 320.2959 l 118.7603 293.7891 l 88.3574 303.7842 l 65.4512 297.1211 l 69.1992 281.2949 l 99.1855 261.3037 l 116.2612 221.3223 l 98.3525 166.3477 l 181.6479 133.8623 l 193.7261 155.1025 l 203.1533 158.8379 l 241.6206 146.3564 l 264.625 162.2148 l 251.6162 194.251 l 254.7998 227.8662 l 242.0371 229.2354 l 259.1128 254.2236 l 267.627 255.6777 l 278.687 290.041 l 191.5752 345.9434 l s %AI3_Note:France-2 % C'est en fait la Corse newpath 299.4004 143 m 297.3862 135.501 l 283.2681 129.6973 l 294.5132 103.876 l 299.4004 143 l s %AI5_EndLayer--
%AI5_BeginLayer-- %(Capitales) Ln %AI3_Note:France % En fait, Paris 185.3965 288.791 m S %AI3_Note:Allemagne 329.0674 378.75 m S %AI5_EndLayer--
%AI5_BeginLayer-- % Ce calque inutile sera supprimé par la suite. %(Cercles) Ln %AI3_Note:France 329.0674 378.75 2 0 360 arc S %AI3_Note:Allemagne 185.3965 288.791 2 0 360 arc S %AI5_EndLayer--
showpage %EOF
Sa visualisation en gif
3.3 Le fichier modifié Fr-All2.ps
Là encore, une visualisation aide à la lecture %!PS-Adobe-3.0 /m {moveto} def /l {lineto} def /s {closepath stroke} def /S {stroke} def /g {closepath gsave} def /coul {setrgbcolor fill} def % coul pour <<couleur>> /contour {grestore 2 setlinewidth 0 setgray stroke} def
%AI5_BeginLayer-- %(Pays) Ln %AI3_Note:Allemagne newpath 266.6094 404.9883 m 294.0967 409.1528 l 287.6865 434.4482 l 346.1563 424.979 l 381.9736 339.6016 l 343.6533 319.834 l 370.3115 279.6289 l 357.8174 255.0566 l 267.627 255.6777 l 278.687 290.041 l 251.1997 307.5322 l 245.9785 360.2422 l 266.6094 404.9883 l g 1 0 0 coul contour %AI3_Note:France newpath 191.5752 345.9434 m 175.752 341.6104 l 171.5249 323.0166 l 150.915 316.2471 l 145.8311 307.9492 l 127.5063 311.2813 l 126.7188 318.6816 l 117.1211 320.2959 l 118.7603 293.7891 l 88.3574 303.7842 l 65.4512 297.1211 l 69.1992 281.2949 l 99.1855 261.3037 l 116.2612 221.3223 l 98.3525 166.3477 l 181.6479 133.8623 l 193.7261 155.1025 l 203.1533 158.8379 l 241.6206 146.3564 l 264.625 162.2148 l 251.6162 194.251 l 254.7998 227.8662 l 242.0371 229.2354 l 259.1128 254.2236 l 267.627 255.6777 l 278.687 290.041 l 191.5752 345.9434 l g 1 1 0 coul contour %AI3_Note:France-2 newpath 299.4004 143 m 297.3862 135.501 l 283.2681 129.6973 l 294.5132 103.876 l 299.4004 143 l g 1 1 0 coul contour %AI5_EndLayer--
%AI5_BeginLayer-- %(Capitales) Ln %AI3_Note:France 185.3965 288.791 60 0 360 arc S %AI3_Note:Allemagne 329.0674 378.75 69.2 0 360 arc S %AI5_EndLayer--