[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home] [volume] [parte]


Capitolo 433.   Linguaggio PostScript: introduzione

Benché il linguaggio PostScript sia nato per le stampanti, disponendo di Ghostscript potrebbe essere usato anche per scrivere direttamente. Lo scopo di questo capitolo è quello di introdurre all'uso diretto del linguaggio PostScript, in modo molto semplice, facendo riferimento prevalentemente al livello 1, eventualmente con qualche annotazione sul livello 2, mentre il livello 3 diventa troppo complesso e non più utile per un utilizzo diretto.

A ogni modo, gli esempi che si fanno sono stati verificati con Ghostscript e non con una vera stampante PostScript.

433.1   Impostazione generale

Un file PostScript è un file di testo, in cui le righe sono terminate indifferentemente con <LF> oppure con <CR><LF>, che inizia con una riga simile al modello seguente:

%!PS-Adobe-livello_ps [EPSF-livello_eps]

Il livello è in pratica il numero di versione del linguaggio; per quanto riguarda il livello PostScript, si fa riferimento generalmente ai valori 1.0, 2.0 e 3.0. Il modello sintattico mostra la possibilità di aggiungere la stringa EPSF-livello_eps, con la quale si vuole specificare che si tratta di un file PostScript incapsulato. In altri termini, un file PostScript normale inizia più o meno come nell'esempio seguente, dove si fa riferimento al livello 2:

%!PS-Adobe-2.0
...

In tal caso si intende lavorare su una serie di pagine; al contrario, se si sta realizzando una sola immagine nell'ambito di uno spazio determinato, si aggiunge la dichiarazione del tipo incapsulato:

%!PS-Adobe-2.0 EPSF-1.2
...

In generale, il simbolo di percentuale (%) serve a introdurre dei commenti che non generano un risultato nella stampa; tuttavia, una sequenza di due simboli di percentuale ha un ruolo speciale per la dichiarazione di direttive importanti; inoltre, la stessa dichiarazione iniziale del tipo di file è preceduta da un simbolo percentuale. In generale, onde evitare equivoci, si indica un commento con un solo simbolo di percentuale seguito da almeno uno spazio:

% testo_commentato

Il commento può essere piazzato ovunque, tenendo presente che vale dal punto in cui appare, fino alla fine della riga.

Le direttive particolari che iniziano con due simboli di percentuale hanno la forma seguente:

%%direttiva[: argomenti]

In pratica, il nome delle direttive deve essere attaccato ai segni di percentuale; inoltre, se è prevista l'aggiunta di argomenti alla direttiva, dopo il nome della stessa appaiono due punti, seguiti da almeno uno spazio e dopo dagli argomenti previsti. Quello che segue è l'esempio di una struttura possibile per un file PostScript articolato su più pagine:

%!PS-Adobe-2.0
%%Creator: nome_del_redattore_del_file
%%DocumentPaperSizes: formato
%%EndComments
[%%BeginProlog
  prologo
%%EndProlog]
%%Page: numero_mostrato pagina_reale
istruzioni_ps
showpage
[%%Page: numero_mostrato pagina_reale
istruzioni_ps
showpage]...
%%Trailer
%%EOF

Il tutto dovrebbe essere abbastanza intuitivo: le prime istruzioni speciali, fino a %%EndComments, descrivono il documento specificando in particolare le dimensioni della pagina; le istruzioni racchiuse tra %%BeginProlog e %%EndProlog possono servire per dichiarare delle funzioni utilizzate nel documento; le istruzioni relative a ogni singola pagina sono introdotte da %%Page: m n; la visualizzazione della pagina, dopo la sua costruzione, si ottiene con l'istruzione showpage; il file termina con %%Trailer e %%EOF.

A questo punto, conviene vedere subito come si può articolare un file PostScript che non contiene pagine, ma una sola immagine:

%!PS-Adobe-2.0 EPSF-1.2
%%Creator: nome_del_redattore_del_file
%%BoundingBox: 0 0 larghezza_in_punti altezza_in_punti
%%EndComments
[%%BeginProlog
  prologo
%%EndProlog]
istruzioni_ps
showpage
%%Trailer
%%EOF

Si può osservare che la direttiva speciale %%BoundingBox va a sostituire %%DocumentPaperSizes, allo scopo di indicare l'area in cui vanno rappresentate le istruzioni.

A ogni modo, la direttiva %%BoundingBox può essere usata anche per un file PostScript diviso in pagine, quando si vuole indicare un formato non standard, oppure se si vuole essere precisi.

433.1.1   Piano di lavoro e unità di misura

Il linguaggio PostScript è predisposto per fare riferimento a oggetti su un piano cartesiano ideale, in cui l'unità di misura normale è il punto tipografico, corrispondente secondo questo linguaggio a 1/72-esimo di pollice, pari a circa 0,352 78 mm. In condizioni normali, la pagina è collocata sul piano cartesiano ideale come si vede nella figura 433.3, dove lo zero per x e y corrisponde esattamente con l'angolo inferiore sinistro; tuttavia, è consentita la definizione di pagine collocate in posizioni differenti, se questo può servire in qualche modo.

Figura 433.3. La pagina collocata su degli assi cartesiani ideali.

pagina su assi cartesiani

Gli oggetti grafici vengono disegnati sul piano cartesiano ideale; quello che risulta trovarsi sull'area della pagina può essere stampato.

433.1.2   Posizione corrente

Il PostScript può essere visto come un linguaggio per disegnare (tracciare curve, riempire delle aree e piazzare dei caratteri tipografici). Tutto questo avviene quasi sempre indicando delle coordinate, dove spesso la posizione di partenza ha importanza. Le coordinate iniziali si modificano con l'istruzione moveto:

x y moveto

In pratica, si indicano due numeri, seguiti dalla parola chiave moveto. Il significato è molto semplice: il primo numero esprime la coordinata orizzontale (asse X), il secondo la coordinata verticale (asse Y). I valori si esprimono in punti tipografici.

433.1.3   Istruzioni speciali più importanti

Le istruzioni più importanti che iniziano con due segni di percentuale sono elencate brevemente nella tabella 433.4. Tuttavia, è il caso di aggiungere qualche piccola indicazione a proposito di alcune di queste.

Nessuna delle istruzioni che iniziano con due segni di percentuale è indispensabile; tuttavia alcune sono importanti. L'inserimento corretto di queste istruzioni rende il file PostScript più facile da gestire con gli strumenti comuni.

Tabella 433.4. Alcune istruzioni che iniziano con due segni di percentuale.

Istruzione Descrizione
%%Creator: nome
Il nome del programma che ha composto il file.
%%DocumentPaperSizes: formato
Formato della carta.
%%BoundingBox: x_1 y_1 x_2 y_2
Collocazione e dimensione della carta: da x_1,y_1 a x_2,y_2.
%%Title: titolo
Titolo del documento.
%%CreationDate: data
Data e ora di creazione del documento.
%%Pages: n
Quantità di pagine contenuta.
%%PageOrder: Ascend|Descend
Ordine di apparizione delle pagine: ascendente o discendente.
%%EndComments
Fine dell'intestazione con le informazioni generali.
%%BeginProlog
Inizia un'area di definizione delle funzioni.
%%EndProlog
Termina l'area di definizione delle funzioni.
%%BeginSetup
Inizia un'area per l'inserimento di istruzioni di stampa.
%%EndSetup
Termina l'area delle istruzioni di stampa.
%%Page: x n
Inizia la pagina n-esima, rappresentata come x.
%%Trailer
Conclude la serie delle pagine.
%%EOF
Conclude definitivamente il file.

L'istruzione %%DocumentPaperSizes serve intuitivamente per elencare le dimensioni possibili delle pagine. In generale si indica una sola parola chiave che esprime sinteticamente la dimensione della pagina, come si vede nella tabella 433.5. Probabilmente non conviene andare al di fuori di pochi standard; eventualmente è preferibile indicare le coordinate esatte attraverso l'istruzione %%BoundingBox.

Tabella 433.5. Formati di stampa comuni, indicabili come argomento dell'istruzione %%DocumentPaperSizes. Le dimensioni non sono necessariamente quelle reali, ma quelle conosciute dal linguaggio PostScript.

formato larghezza altezza larghezza altezza larghezza altezza
punti punti pollici pollici centimetri centimetri
letter 612 792 8,50 11,00 21,59 27,94
legal 612 1 008 8,50 14,00 21,59 35,56
a3 842 1 190 11,694 4 16,527 8 29,7 42
a4 595 842 8,263 89 11,694 4 21 29,7
a5 421 595 5,847 22 8,263 89 14,85 21
b4 709 1 002 9,847 22 13,916 7 25,011 9 35,348 3
b5 501 709 6,958 33 9,847 22 17,674 2 25,011 9

%%BoundingBox consente di indicare la posizione dell'angolo inferiore sinistro e di quello superiore destro della pagina. Di solito, le prime due coordinate che esprimono proprio la posizione dell'angolo inferiore sinistro, sono azzerate, a indicare che si parte dallo zero degli assi cartesiani ideali della superficie.

433.1.4   Aspetto delle istruzioni normali

Le istruzioni PostScript sembrano non avere inizio e fine, perché si possono collocare su una o più righe indifferentemente, senza alcun segno di separazione. Per esempio, si può scrivere:

newpath
 100   100 moveto
 100   431 lineto
 350   431 lineto
 350   100 lineto
closepath

Oppure, indifferentemente:

newpath 100 100 moveto 100 431 lineto 350 431 lineto 350 100 lineto closepath

Naturalmente sono ammissibili tanti altri modi intermedi; comunque, è evidente che se si vuole scrivere del codice intelligibile occorre uno stile (come in tutti i linguaggi di programmazione).

La cosa che può apparire strana inizialmente è il fatto che i comandi che prevedono l'uso di argomenti, ricevono questi dati prima del nome del comando stesso. Per esempio, è già stata mostrata l'istruzione moveto, che riceve l'indicazione delle coordinate prima del suo nome.

433.2   Linee e aree

La cosa più semplice che si può fare per cominciare a comprendere il linguaggio è quella di disegnare delle linee. In generale, il disegno avviene partendo dalle coordinate correnti, per cui questa indicazione non appare in modo esplicito, ma se necessario si definisce con uno spostamento attraverso l'istruzione moveto. Per le linee rette si possono usano le istruzioni lineto e rlineto, dove la prima rappresenta un movimento con coordinate di destinazione assolute, mentre la seconda fa riferimento a coordinate di destinazione relative a quelle di partenza. Si osservino gli esempi seguenti, con cui si disegna lo stesso rettangolo largo 20 punti e alto 10 punti, a partire dalla coordinata x , y=0 , 0:

   0     0 moveto
   0    10 lineto
  20    10 lineto
  20     0 lineto
   0     0 lineto
   0     0 moveto
   0    10 rlineto
  20     0 rlineto
   0   -10 rlineto
 -20     0 rlineto

In pratica, l'istruzione lineto vuole l'indicazione del punto finale espresso come coordinata assoluta, mentre rlineto vuole una coordinata relativa alla posizione corrente.

Figura 433.10. Il rettangolo viene disegnato inserendo coordinate assolute, partendo dall'angolo inferiore sinistro e continuando con gli angoli successivi in senso orario.

figura

Figura 433.11. Il rettangolo viene disegnato inserendo coordinate relative.

figura

Il disegno non viene tracciato se alla fine non si aggiunge un'istruzione stroke, che non richiede argomenti. Dopo un'istruzione stroke viene perduto il riferimento alle coordinate correnti, per cui, se necessario, si deve ricominciare con un'istruzione moveto. Si osservi l'esempio seguente, in cui lo stesso rettangolo viene disegnato un segmento alla volta, riposizionando sempre le coordinate iniziali:

   0     0 moveto
   0    10 lineto stroke
   0    10 moveto
  20    10 lineto stroke
  20    10 moveto
  20     0 lineto stroke
  20     0 moveto
   0     0 lineto stroke

Naturalmente, se si preferisce questo modo di utilizzo dell'istruzione stroke, si può anche cambiare un po' lo stile di scrittura:

   0     0 moveto    0    10 lineto stroke
   0    10 moveto   20    10 lineto stroke
  20    10 moveto   20     0 lineto stroke
  20     0 moveto    0     0 lineto stroke

Le linee, oltre alla collocazione, hanno due caratteristiche importanti: lo spessore e il colore. Lo spessore predefinito dovrebbe essere di un punto, mentre il colore predefinito è il nero. Si modifica lo spessore delle linee con l'istruzione setlinewidth e la colorazione (grigia) con l'istruzione setgray. Entrambi ricevono un solo argomento numerico, che nel primo caso esprime lo spessore della linea e nel secondo rappresenta la luminosità, con un valore che va da zero a uno (zero rappresenta il nero e uno rappresenta il bianco).

Le istruzioni che alterano le caratteristiche delle linee, hanno effetto solo nel momento in cui appare l'istruzione stroke. In questo modo, si possono indicare le linee desiderate, quindi si possono cambiare le loro caratteristiche e infine si possono tracciare.

L'esempio seguente disegna lo stesso rettangolo già presentato, specificando un tratto di due punti tipografici di colore grigio (esattamente a metà tra il bianco e il nero). Si può osservare che le istruzioni setlinewidth e setgray sono state collocate subito prima dell'istruzione stroke:

   0     0 moveto
   0    10 lineto
  20    10 lineto
  20     0 lineto
   0     0 lineto

         2 setlinewidth
         0 setgray
           stroke

Si possono tracciare delle linee per disegnare un poligono. L'esempio già visto rappresenta proprio un rettangolo, ma non è stato dichiarato esplicitamente il fatto che le linee devono congiungersi. Per farlo occorre dichiarare un percorso, con l'istruzione newpath, che si conclude con closepath. Si osservi la variante seguente al disegno del rettangolo:

newpath
   0     0 moveto
   0    10 lineto
  20    10 lineto
  20     0 lineto
closepath

   2 setlinewidth
   0 setgray

stroke

In pratica, si tracciano le prime tre linee, mentre l'ultima viene indicata implicitamente con la richiesta di chiudere il percorso con l'istruzione closepath.

Il fatto di avere realizzato un poligono, consente di definire il colore di riempimento. In condizioni normali, quando non è stato fissato alcunché, il poligono è trasparente, mentre se si fissa un riempimento diventa opaco e il colore ricopre anche il bordo tracciato con le linee. Infatti, il bordo ha lo stesso colore fissato con l'istruzione setgray, per cui tutto diventa dello stesso colore. Il colore di riempimento si definisce con l'istruzione fill e il colore usato è quello già fissato con l'istruzione setgray.

newpath
   0     0 moveto
   0    10 lineto
  20    10 lineto
  20     0 lineto
closepath

%  2   setlinewidth
   0.5 setgray
       fill
stroke

L'esempio mostra l'utilizzo dell'istruzione fill per colorare il rettangolo di grigio. Dal momento che lo spessore delle linee non serve più, l'istruzione relativa è stata commentata. Volendo mettere un bordo a questo rettangolo, occorre ridisegnarne sopra un altro trasparente, con il tratto desiderato:

newpath
   0     0 moveto
   0    10 lineto
  20    10 lineto
  20     0 lineto
closepath

   0.5 setgray
       fill
       stroke

newpath
   0     0 moveto
   0    10 lineto
  20    10 lineto
  20     0 lineto
closepath

   2   setlinewidth
   0   setgray
       stroke

Per terminare l'argomento sulle linee e sui poligoni, conviene mostrare un esempio completo, che poi viene mostrato nella figura 433.19. Si osservi che il rettangolo viene disegnato da 1 , 1 a 21 , 11, utilizzando l'area da 0 , 0 a 22 , 12, che è lo stretto indispensabile per dare lo spazio allo spessore della linea che è di due punti.

%!PS-Adobe-2.0 EPSF-1.2
%%Creator: Daniele Giacomini
%%BoundingBox: 0 0 22 12
%%EndComments

% Disegna un rettangolo

newpath
   1     1 moveto
   1    11 lineto
  21    11 lineto
  21     1 lineto
closepath

   0.5 setgray
       fill
       stroke

newpath
   1     1 moveto
   1    11 lineto
  21    11 lineto
  21     1 lineto
closepath

   2   setlinewidth
   0   setgray
       stroke

showpage

%%Trailer
%%EOF

Figura 433.19. Il rettangolo riempito e bordato. Il contorno è molto largo, ma è proporzionato rispetto al rettangolo che è alto solo 10 punti.

rettangolo pieno bordato

433.2.1   Archi e curve

Si può disegnare un arco o un cerchio completo con l'istruzione arc. In questo caso, non c'è bisogno di fare riferimento a una posizione corrente; anzi, è meglio eliminare tale informazione con un'istruzione stroke preventiva. L'istruzione arc richiede l'indicazione delle coordinate del centro del cerchio, la lunghezza del raggio, l'angolo di partenza e l'angolo di destinazione in direzione antioraria. L'esempio seguente disegna un arco con centro nella posizione x , y=100 , 150, con raggio di 50 punti, da 0 a 90 gradi:

100 150 50 0 90 arc

In pratica, si tratta di quanto si vede nella figura 433.21.

Figura 433.21. Arco di cerchio disegnato da 0 a 90 gradi.

arco da 0 a 90 gradi

Se prima di disegnare il cerchio o l'arco di cerchio si tracciano altre linee, è conveniente chiudere i disegni precedenti con l'istruzione stroke, per evitare di avere delle coordinate correnti attive nel momento in cui si usa l'istruzione arc. Diversamente, si otterrebbe una linea che collega le coordinate iniziali con il punto di partenza dell'arco disegnato.

Per disegnare un cerchio completo, basta indicare l'intervallo di angoli da 0 a 360 gradi. Se si vuole riempire il cerchio, non è necessario utilizzare le istruzioni newpath e closepath, perché si ottiene sempre un riempimento, anche quando il cerchio non è completo.

Il disegno di una curva è invece più complicato: si usa l'istruzione curveto, ma oltre alle coordinate di destinazione, bisogna indicare la tangente del punto di inizio e del punto di destinazione. Prima di dare altre spiegazioni, conviene partire da un esempio visivo, come si vede nella figura 433.23. La curva da prendere in considerazione è rappresentata con un tratto più scuro. Si possono vedere due linee oblique, che partono rispettivamente dal punto di inizio e dal punto di arrivo della curva: si tratta delle tangenti che stabiliscono la curvatura di partenza e di arrivo della linea disegnata. L'istruzione necessaria a disegnare questa curva è la seguente:

    0   50  moveto
  200  100    0    0  200   50  curveto

Figura 433.23. Esempio di una curva in cui sono evidenti le tangenti.

curva con tangenti visibili

In pratica:

Naturalmente, la lunghezza delle linee indicate come tangenti rendono più o meno importante la curvatura relativa. Si osservi, nella figura 433.25, come si trasforma il disegno se si accorcia la linea tangente di arrivo come nell'esempio seguente:

    0   50  moveto
  200  100    100    25  200   50  curveto

Figura 433.25. Esempio di una curva in cui sono evidenti le tangenti.

curva con tangenti visibili

Il modello sintattico per l'utilizzo dell'istruzione curveto è quindi il seguente:

x_tangente_inizio y_tangente_inizio x_tangente_fine y_tangente_fine x_fine_curva y_fine_curva curveto

433.3   Salvare e recuperare le impostazioni grafiche

Le impostazioni grafiche, come quelle che si possono fissare con le istruzioni setlinewidth e setgray, possono essere salvate e recuperate da una pila apposita. Si utilizza l'istruzione gsave per salvare l'impostazione corrente e grestore per recuperare le ultime impostazioni salvate. Si osservi l'esempio seguente:

1 setlinewidth
gsave
2 setlinewidth
gsave
4 setlinewidth
 50 120  moveto
200 120  lineto
stroke
grestore
 50 125  moveto
200 125  lineto
stroke
grestore
 50 130  moveto
200 130  lineto
stroke

Vengono accumulati tre spessori differenti per le linee, quindi si procede disegnando tre linee, dopo ognuna delle quali viene recuperata l'ultima impostazione grafica. In pratica, la linea da 50 , 120 a 200 , 120 viene disegnata con un tratto di quattro punti; la linea da 50 , 125 a 200 , 125 viene disegnata con un tratto di tre punti; la linea da 50 , 130 a 200 , 130 viene disegnata con un tratto di un punto di spessore.

Quando si disegna qualcosa, può essere opportuno racchiudere le modifiche alle caratteristiche entro una coppia gsave-grestore, onde evitare di coinvolgere le impostazioni precedenti, che potrebbero riguardare il resto del file:

gsave
4 setlinewidth
 50 120  moveto
200 120  lineto
stroke
grestore

Nell'esempio che appare sopra, si inizia salvando le impostazioni e impostando uno spessore di quattro punti. Viene quindi indicata la linea e fissata con l'istruzione stroke. Al termine si recuperano le impostazioni grafiche. Nello stesso modo, si potrebbero salvare e modificare le impostazioni grafiche subito prima dell'istruzione stroke:

 50 120  moveto
200 120  lineto
gsave
4 setlinewidth
stroke
grestore

Attraverso la tecnica del salvataggio e del recupero delle caratteristiche grafiche, è possibile disegnare un poligono bordato senza dover ripetere due volte il tratto del contorno. In pratica, il comando di riempimento viene dato entro un ambiente protetto da gsave e grestore, come si vede nell'esempio seguente:

%!PS-Adobe-2.0 EPSF-1.2
%%Creator: Daniele Giacomini
%%BoundingBox: 0 0 22 12
%%EndComments

% Disegna un rettangolo

newpath
   1     1 moveto
   1    11 lineto
  21    11 lineto
  21     1 lineto
closepath

gsave
   0.5 setgray
       fill
grestore
   2   setlinewidth
   0   setgray
       stroke

showpage

%%Trailer
%%EOF

Il risultato è identico a quanto già visto nella figura 433.19.

433.4   Spostamento del piano cartesiano e modifica della scala

È possibile spostare la posizione della superficie prima di dare altre istruzioni di scrittura di qualunque tipo. Si tratta in particolare delle istruzioni translate e di rotate. La prima di queste due sposta le coordinate 0 , 0 in una posizione nuova, prendendo come riferimento le coordinate precedenti; la seconda ruota gli assi attorno alle coordinate 0 , 0. Per esempio, con le istruzioni seguenti si ottiene una linea orizzontale dalla posizione 100 , 150 alla posizione 150 , 150:

 50 100 translate
 50  50 moveto
100  50 lineto
stroke

Infatti, l'istruzione translate sposta le coordinate 0 , 0 verso 50 , 100, secondo la collocazione precedente. La figura 433.31 mostra la collocazione iniziale e lo spostamento; la linea disegnata è quella che appare con tratto più scuro.

Figura 433.31. Esempio riferito a uno spostamento degli assi.

spostamento di assi

L'istruzione rotate fa ruotare il piano cartesiano sul centro delle coordinate 0 , 0. La figura 433.33 mostra cosa accade se si sposta lo zero nella posizione 0 , 0 e poi si ruota di 30 gradi, con le istruzioni seguenti:

   50   50  translate
   30  rotate

   50   50  moveto
  100   50  lineto
stroke

Figura 433.33. Esempio riferito a uno spostamento e a una rotazione degli assi.

spostamento di assi

Lo spostamento e la rotazione del piano sono informazioni che possono essere salvate e recuperate con le istruzioni gsave e grestore. Pertanto, prima di uno spostamento o di una rotazione, conviene salvare la situazione, per recuperarla quando questi cambiamenti non servono più.

gsave
   50   50  translate
   30  rotate

   50   50  moveto
  100   50  lineto
stroke
grestore

Oltre allo spostamento e alla rotazione del piano, si può modificare la scala, con l'istruzione scale. Gli argomenti dell'istruzione sono due valori, che esprimono il rapporto nei confronti dell'asse X e nei confronti dell'asse Y. Dopo la modifica della scala, le coordinate 0 , 0 rimangono centrate sulla stessa posizione iniziale. L'esempio seguente serve a fare in modo che la scala dell'asse Y risulti schiacciata alla metà del valore precedente, mentre l'asse X non viene modificato:

1 0.5 scale

Anche le alterazioni della scala possono essere recuperate da un'istruzione grestore.

433.5   Ripetizione

Un gruppo di istruzioni, racchiuso tra parentesi graffe, può essere ripetuto più volte con l'istruzione repeat:

n {istruzioni} repeat

Evidentemente, perché ciò abbia un senso, è necessario che le istruzioni da ripetere creino ogni volta un cambiamento, come una rotazione o uno spostamento di assi. Per esempio,

36 {10 rotate 10 10 moveto 30 30 lineto} repeat
stroke

Disegna una stellina attorno alle coordinate 0 , 0, con un diametro di 80 punti. In questo caso, la rotazione riporta alla fine gli assi nella posizione di partenza, ma in generale conviene salvare e ripristinare la situazione:

gsave
36 {10 rotate 10 10 moveto 30 30 lineto} repeat
stroke
grestore

Figura 433.38. Esempio di un disegno ottenuto con la rotazione.

rotazione

433.6   Testo

Per poter scrivere sulla superficie del foglio, è necessario selezionare il tipo di carattere e la dimensione prima di tutto. Questo si ottiene con alcune istruzioni, che in pratica conviene usare assieme:

/carattere findfont dimensione scalefont setfont

Per esempio, per usare il carattere Helvetica alto 12 punti, si usa l'istruzione seguente:

/Helvetica findfont 12 scalefont setfont

La scrittura vera e propria avviene con l'istruzione show, con la quale si colloca il testo a partire dalle coordinate correnti, per cui si fa precedere normalmente da un'istruzione moveto:

(testo) show

Come si vede dal modello sintattico, il testo deve essere scritto tra parentesi tonde e collocato prima della parola chiave show.

Dovendo usare le parentesi tonde per delimitare il testo da visualizzare, deve esserci un modo per poter togliere a queste il valore sintattico normale, quando c'è la necessità di rappresentarle nel testo. In pratica si usano le sequenze \( e \) per rappresentarle; inoltre, dal momento che la barra obliqua inversa ha un significato speciale, per rappresentare questa si usa la sequenza \\. La tabella 433.40 riepiloga le sequenze speciali più importanti per il testo delimitato tra parentesi tonde.

Tabella 433.40. Alcune sequenze speciali per la scrittura di testo delimitato da parentesi tonde, con l'istruzione show.

Sequenza Descrizione
\\
Barra obliqua inversa.
\(
Parentesi tonda aperta.
\)
Parentesi tonda chiusa.
\nnn
Simbolo corrispondente al numero, in ottale, secondo la codifica attuale.

Se si seleziona un carattere non disponibile, viene utilizzato il Courier. La tabella 433.41 elenca i nomi standard dei tipi di carattere fondamentali che si possono utilizzare con il linguaggio PostScript.

Tabella 433.41. Nomi dei tipi di carattere comuni che possono essere utilizzati con il linguaggio PostScript.

Nome Descrizione
Times
Times-Roman
Times normale.
Times-Italic
Times corsivo.
Times-Bold
Times neretto.
Times-BoldItalic
Times neretto inclinato.
Helvetica
Helvetica normale.
Helvetica-Oblique
Helvetica inclinato.
Helvetica-Bold
Helvetica neretto.
Helvetica-BoldOblique
Helvetica neretto inclinato.
Courier
Courier normale.
Courier-Oblique
Courier inclinato.
Courier-Bold
Courier neretto.
Courier-BoldOblique
Courier neretto inclinato.
Symbol
Symbol.

Un'istruzione simile a show, si occupa di visualizzare il testo, controllandone lo spostamento in corrispondenza di un simbolo particolare:

x y n (testo) widthshow

L'istruzione widthshow serve a fissare uno spostamento orizzontale (x) e uno spostamento verticale (y), subito dopo il simbolo corrispondente al numero n. In pratica, se alla fine di ogni spazio si vuole aggiungere uno spazio orizzontale di due punti, si usa la forma seguente:

2 0 32 (testo) widthshow

Questa è anche la situazione tipica, in cui si vuole allargare lo spazio tra le parole, per adattare la riga scritta alla larghezza disponibile. Naturalmente, lo spazio normale può anche essere ridotto, se lo si desidera, utilizzando valori orizzontali negativi, come nell'esempio seguente:

-1 0 32 (testo) widthshow

Se si attribuisce un valore anche al secondo argomento numerico, si ottiene uno spostamento verticale, come nell'esempio seguente, in cui ogni parola viene alzata di due punti rispetto alla precedente:

0 2 32 (testo) widthshow

433.7   Salvataggio e recupero delle impostazioni della pagina nel complesso

Quando si scrive un documento composto da diverse pagine, diventa utile la possibilità di recuperare le impostazioni precedenti, prima di passare alla pagina successiva. È già stata presentata la coppia di istruzioni gsave e grestore, specifica per le impostazioni grafiche. Per tutto, si può usare invece la coppia save e restore. Di solito si inizia una pagina con save e si conclude con restore, in modo da garantire il recupero di tutto, senza dimenticare qualcosa.

%!PS-Adobe-2.0
%%Creator: nome_del_redattore_del_file
%%DocumentPaperSizes: formato
%%EndComments
[%%BeginProlog
  prologo
%%EndProlog]
%%Page: numero_mostrato pagina_reale
save
istruzioni_ps
showpage
restore
[%%Page: numero_mostrato pagina_reale
save
istruzioni_ps
showpage
restore]...
%%Trailer
%%EOF

Le istruzioni save e restore dovrebbero essere sempre annidate correttamente, nel senso che ogni istruzione restore va a recuperare l'ultima istruzione save che non sia già stata presa in considerazione da un altro restore. Se viene eseguito un restore che non risulta abbinato a un'istruzione save, si genera un errore irreversibile.

Per ovviare all'inconveniente di dover seguire attentamente l'uso delle istruzioni save e restore, si può attribuire un «nome» a un'istruzione save, richiamando lo stesso nome nel momento del restore:

/nome save def
...
...
...
nome restore

La cosa non è molto intuitiva, ma funziona così: il nome che viene dichiarato nel momento dell'uso dell'istruzione save, viene posto davanti all'istruzione restore. Se nello spazio tra queste due istruzioni appaiono altre istruzioni save, queste sono tutte annullate. Segue un esempio:

/Mia_Configurazione_Predefinita save def
...
...
...
Mia_Configurazione_Predefinita restore

Tabella 433.46. Tabella riassuntiva delle istruzioni più semplici del linguaggio PostScript.

Istruzione Descrizione
x y moveto
Cambia le coordinate correnti senza disegnare.
x y rmoveto
Cambia le coordinate correnti in modo relativo.
x y lineto
Traccia una linea fino alle coordinate assolute indicate.
x y rlineto
Traccia una linea fino alle coordinate relative indicate.
x y m n o arc
Arco con centro in x,y, raggio m, da n a o gradi, in senso antiorario.
x y m n o arcn
Arco con centro in x,y, raggio m, da n a o gradi, in senso orario.
x y x y x y curveto
Curva indicando le coordinate di arrivo delle tangenti e infine della curva.
x y translate
Fa sì che x , y corrispondano alle nuove coordinate 0 , 0.
n rotate
Ruota di n il fondo, con centro sulle coordinate 0 , 0.
n {istruzioni} repeat
Ripete n volte le istruzioni tra parentesi graffe.
n setlinewidth
Spessore delle linee.
n setgray
Colorazione grigia: 0=nero; 1=bianco.
fill
Riempie i poligoni e le aree racchiuse entro le curve.
newpath
Inizia a disegnare un oggetto nuovo.
closepath
Unisce l'ultimo punto disegnato con il punto di partenza.
stroke
Fissa le linee tracciate.
gsave
Accumula le impostazioni grafiche.
grestore
Recupera le impostazioni.
save
Accumula tutte le impostazioni della pagina.
restore
Recupera le impostazioni della pagina.
/nome save def
Accumula tutte le impostazioni dichiarando un nome.
nome restore
Recupera le impostazioni riferite a quel nome.
/nome findfont dim \
  \scalefont setfont
Seleziona il carattere e la dimensione indicata.
(testo) show
Scrive il testo indicato usando il carattere già stabilito.
x y n (testo) widthshow
Scrive il testo indicato con uno spostamento x,y alla fine del simbolo n.
x 0 32 (testo) widthshow
Scrive il testo indicato con l'aggiunta di uno spazio di x tra le parole.

433.8   Riferimenti


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome linguaggio_postscript_introduzione.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home]

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory