~ / howtos /

HOWTO PostScript

© 2007—2018 - Renaud Blanch

PostScript ?

PostScript est un langage graphique 2D. S'il est utilisé principalement pour décrire des documents imprimés, PostScript a aussi été utilisé pour l'interface graphique des machines NeXT. La société NeXT Software a été rachetée en 1996 par Apple pour mettre au point Mac OS X (qui de manière similaire utilise PDF, très proche de PostScript, pour son interface graphique).

Premiers pas

Le langage PostScript peut s'expérimenter interactivement grâce à l'interpréteur Ghostscript qui s'invoque par la commande gs tapée dans une console, la page dans laquelle on va dessiner s'affichant alors à l'écran.

mandelbrot:~> gs
GPL Ghostscript 8.54 (2006-05-17)
Copyright (C) 2006 artofcode LLC, Benicia, CA.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>help
Enter PostScript commands.  '(filename) run' runs a file, 'quit' exits.
GS>version ==
(3010)
GS>% ceci est un commentaire et ça ne fait rien
GS>

Le symbole % démarre un commentaire : le reste de la ligne est ignoré de l'interpréteur.

PostScript est un langage à pile, c'est à dire que quand il rencontre une valeur —un nombre ou une chaîne de caractère (délimitée par des parenthèses)—, il l'empile en mémoire. La valeur au sommet de la pile est la dernière empilée et la plus accessible.

GS>(zero) % empile la chaîne "zero"
GS<1>

Manipulation de la pile

L'invite (GS<1>) a changée, le nombre qu'elle contient indique le nombre d'éléments sur la pile. Certains opérateurs (nommés par des chaînes de caractères) permettent de manipuler la pile.

GS<1>1 % empile 1
GS<2>pstack % affiche le contenu de la pile
1
(zero)

GS<2>dup % duplique le sommet
GS<3>pstack
1
1
(zero)

GS<3>pop % enlève le sommet de la pile (et le perd)
GS<2>pstack
1
(zero)

GS<2>2 (trois) pstack % 2 empilements et 1 affichage enchaînés
(trois)
2
1
(zero)

GS<4>clear % vide la pile (noter l'invite à la ligne suivante)
GS>

Calcul

Certains opérateurs permettent de faire les calculs usuels. Ils vont chercher leurs arguments sur la pile et les remplacent par le résultat du calcul. Il s'agit d'une notation post-fixée (les arguments d'abord, puis les opérateurs) qui ne nécessite donc pas de parenthèses. Cette notation est aussi connue sous le nom de notation polonaise inverse, prisée des possesseurs de calculatrices Hewlett-Packard.

GS>1 2 add % empile 1 puis 2 puis les utilise pour une addition et empile le résultat
GS<1>pstack % qui est confirmé par l'examen de la pile
3
GS<1>4 5 add mul % (4+5)*3, le 3 étant récupéré sur la pile
GS<1>== % dépile et affiche la valeur dépilée
27
GS>

Les opérateurs permettant les calculs sont : add, mul, div, sub, neg.

Dessin

Pour dessiner, on définit des chemins reliant des points spécifiés dans un repère ayant initialement son origine en bas à gauche, et dont l'unité est le point, soit 1/72ème de pouce (environ 2.835 point pour 1 mm). Une fois un chemin défini, on peut le tracer ou le remplir.

GS>newpath
GS>100 100 moveto % aller en x=100, y=100
GS>200 150 lineto % relier ce point à x=200, y=150
GS>100 200 lineto % relier à ce nouveau point
GS>stroke         % trace

Le résultat s'affiche alors :

GS>newpath
GS>150 50 moveto
GS>150 0 rlineto  % mouvement relatif
GS>0 50 rlineto   % idem
GS>-100 0 rlineto % idem
GS>closepath      % retour au 1er point
GS>.5 setgray
GS>fill           % remplit

On peut écrire du texte :

GS>/Times-Roman findfont % trouve une police et l'empile
GS<1>20 scalefont        % la passe en taille 20 point
GS<1>setfont             % la choisit pour le texte à venir
GS>newpath      % du texte, c'est aussi un chemin
GS>10 10 moveto % dont il faut placer l'origine,
GS>(Hello) show % choisir le contenu, et l'afficher

Un peu plus loin

Fonctions

On peut définir donner un nom à des morceaux de code pour les réutiliser plus tard.

GS>/cm {
    28.3464567 mul
} def             % définit cm comme "28.3464567 mul"
GS>2 cm ==        % calcule 2*28.3464567 (le nombre de points dans 2 centimètres)
56.6929131
GS>/repere {
    /Arial findfont
    .5 cm scalefont
    setfont
    newpath
    0 0 moveto
    1 cm 0 lineto
    (x) show
    0 0 moveto
    0 1 cm lineto
    (y) show
    stroke    
} def
GS>repere % trace un repère à l'origine

On peut remarquer que dans le cas de la définition de cm, il manque un opérande à mul. Celui-ci sera donc pris sur la pile, et nous avons en fait ainsi défini une nouvelle fonction qui convertit les centimètres en points.

Changement de repère

On peut modifier le repère par des translations, des rotations et des homothéties.

GS>repere
GS>5 cm 2 cm translate
GS>repere
GS>45 rotate
GS>2 2 scale
GS>repere
GS>0 2 cm translate
GS>repere

Structures de contrôle

On peut faire des boucles :

GS>0 2 10 {  % de 0 à 10 inclus, par pas de 2, la valeur est empilée,
    ==       % le code est exécuté (ici, dépiler et afficher)
} for        % c'est parti !
0
2
4
6
8
10
GS>

Enfin, on peut mettre les commandes dans un fichier texte avec une extension .ps, et en ajoutant au début une ligne avec %! et à la fin showpage, et ça donne un fichier qui peut s'ouvrir dans la plupart des logiciels permettant d'afficher des fichiers graphiques. Par exemple, repere.ps :

%!
/cm { 28.3464567 mul } def
/repere {
    /Arial findfont
    .5 cm scalefont
    setfont
    newpath
    0 0 moveto
    1 cm 0 lineto
    (x) show
    0 0 moveto
    0 1 cm lineto
    (y) show
    stroke    
} def

repere
5 cm 2 cm translate
repere
45 rotate
2 2 scale
repere
0 2 cm translate
repere

showpage

Plus loin

Pour aller plus loin, vous pourrez consulter ce tutorial (pdf en anglais), cette référence (pdf en anglais) ou encore ce guide (html en anglais).

mise à jour : septembre 2018