Pour une image donnée, l'interpréteur postscript possède son propre système de coordonnées (dans un repère orthonormal). Celui-ci est entièrement déterminé par ce que l'on appelle la {\sl Bounding Box}, qui est une boîte contenant complètement le dessin, ce qui permet sa manipulation par des logiciels externes. Cette boîte est définie par la donnée de 4~nombres positifs correspondant respectivement aux co\-or\-don\-nées du coin inférieur gauche et du coin supérieur droit. Ces coordonnées sont exprimées en points postscript, ce qui nous donne la taille et le format de l'image. De façon empirique, il me semble que $722, 7$ points postscript correspondent à un pouce, qui correspond lui-même à $254\mm $. (Moralité~: il faut $10\times 722, 7/ 254 \approx 28, 452\, 7$ points postscript pour faire $10\mm $.) La Bounding Box est toujours calculée par le script |jps2ps|, alors que la plupart des autres calculs sont effectués par l'interpréteur postscript. Une des conséquences en est la syntaxe particulièrement rigide des quelques commandes concernant le format de l'image produite (|setxrange|, |setyrange|, |setwidth|, |setheight|, |setxyrapport|, |setformat|, |setrotate|, |setborder| et |setangle_repere|). En effet, ces commandes sont lues puis traduites par le script afin d'en extraire les informations utiles, et mon niveau actuel concernant les expressions régulières en Perl ne me permet pas de faire des prouesses. En particulier, chacune de ces commandes doit se trouver seule sur une ligne, et les arguments de ces commandes doivent être strictement numériques (pas de résultat de calcul ou de variable). Pour toutes ces commandes, merci de vous conformer aux exemples donnés dans ce document ou sur le site |http://melusine.eu.org/syracuse/bbgraf/|. Le format $jps$ prévoit deux façons de définir le format de l'image produite~: une méthode globale où l'utilisateur définit explicitement les dimensions voulues, et une méthode locale (souvent plus pratique) où l'utilisateur définit les échelles sur les axes et l'amplitude sur chacun des axes. Par défaut c'est la méthode globale qui est employée, de telle façon que la plus grande des dimensions largeur$/$hauteur soit de 250 points postcript. \ssparagraphe {Définir les unités} Les commandes |setxunit| et |setyunit| servent à indiquer explicitement l'échelle sur chacun des axes. Ainsi, la commande |20 setxunit| va affecter 20 points postcript par unité sur l'axe $Ox$. Dès que l'une des échelles est fixée, l'autre est calculée en tenant comptre du paramètre $xyrapport$ (égal à $1$ par défaut). La taille de l'image est alors déterminée par les amplitudes $xrange$ et $yrange$. \ssparagraphe {Imposer les dimensions externes} \epsfxsize 80mm $$ \epsillustrate {BB_02.ps} $$ Le format de l'image est déterminé par 3~paramètres~: $width$ et $height$ qui correspondent à la fenêtre de dessin, et $border$ qui indique la taille (en points postscript) de la bordure blanche à insérer autour de la fenêtre de dessin. La variable $border$ est initialisée à $7, 5$ par défaut. Les commandes |setwidth|, |setheight| et |setborder| permettent à l'utilisateur d'imposer la valeur de tel ou tel paramètre. Ainsi la séquence |400 setwidth 400 setheight| (sur 2~lignes distinctes\dots ) va imposer une fenêtre de dessin aussi large que haute, de côté $400$~points postscript. Si l'utilisateur ne fixe pas les valeurs de $width$ et $height$, et si les échelles sur $Ox$ et $Oy$ ne sont pas imposées, alors le script calculera les valeurs des variables $width$ et $height$ en imposant que la plus petite des deux soit égale $250$, et en tenant compte des contraintes sur la fenêtre de dessin (amplitudes sur $Ox$ et $Oy$ et rapport des échelles). Pour aider à la gestion des variables $height$ et $width$, on dispose également de la commande |setformat|, qui permet d'imposer un rapport entre les dimensions horizontales et verticales (hors bordure) de l'image produite. Ainsi, la commande |2 setformat| permettra d'obtenir une image dont le rapport $width/height$ sera égal à $2$. Enfin la commande |setrotate| permet de faire effectuer une rotation à l'image produite. Elle prend un argument numérique indiquant l'angle en degré de cette rotation, dont le centre est le coin inférieur gauche de l'image produite. Si on utilise cette option, la Bounding Box est recalculée pour contenir la totalité de l'image \og rotationnée\fg . %\rightepsillustrate{ex_16.ps}{-11} % Voyons maintenant les ordres de priorité. Une fois récupéré les informations dans le source $jps$, l'algorithme est le suivant~: \item {$\bullet $} si $width$ et $height$ sont définis, c'est fini. \item {$\bullet $} si on a $format$ et $width$, on calcule $height$ et c'est fini. \item {$\bullet $} si on a $format$ et $height$, on calcule $width$ et c'est fini. \item {$\bullet $} si on a seulement $format$, le script choisit $height$ et $width$ en imposant qu'ils soient tous deux supérieurs ou égaux à $250$, et c'est fini. \item {$\bullet $} sinon on calcule les données manquantes en utilisant les valeurs fournies pour le repère $jps$ et les valeurs par défaut (voir le paragraphe sur la fenêtre de dessin). Une fois cela accompli, on limite $width$ et $height$ à $1\, 000$ pour éviter des images trop grandes lors de l'utilisation via le web (la convertion au format jpeg alourdit sérieusement le fichier), puis on effectue éventuellement la rotation spécifiée par |setrotate|. \exemple {BB} En résumé~: \syntaxe \longref {$u$} {setxunit} {$-$} {Spécifie, en nombre de points postcripts par unité, l'échelle sur l'axe $Ox$. La première occurence de cette instruction dans le fichier $jps$ est interprétée par le script pour déterminer la BoundingBox.} \longref {$v$} {setyunit} {$-$} {Spécifie, en nombre de points postcripts par unité, l'échelle sur l'axe $Oy$. La première occurence de cette instruction dans le fichier $jps$ est interprétée par le script pour déterminer la BoundingBox.} \longref {$b$} {setborder} {$-$} {Indique, en points postripts, a taille de la bordure entourant l'image. Cette instruction est interprétée par le script $jps2ps$ pour déterminer la BoundingBox.} \longref {$L$} {setwidth} {$-$} {Affecte la valeurs $L$ à la variable $width$ (taille horizontale, en points postscript, de la fenêtre de dessin). La première occurence de cette instruction dans le fichier $jps$ est interprétée par le script pour déterminer la BoundingBox.} \longref {$\ell $} {setheight} {$-$} {Affecte la valeurs $\ell $ à la variable $height$ (taille verticale, en points poscripts, de la fenêtre de dessin). La première occurence de cette instruction dans le fichier $jps$ est interprétée par le script pour déterminer la BoundingBox.} \longref {$k$} {setformat} {$-$} {Instruction destinée au script $jps2ps$. Elle indique que $k$ est le rapport entre largeur et hauteur de l'image. Attention, $k$ doit être lisible en clair par le script} \longref {$\alpha $} {setrotate} {$-$} {Instruction destinée au script $jps2ps$. Elle indique que l'image finale devra subir une rotation d'angle $\alpha $ (en degrés). Le calcul de la BoundingBox tient compte de cette rotation. Attention, $\alpha $ doit être lisible en clair par le script} \endsyntaxe