Articoli
Il Postscript
Che cosa è il Postscript? Perché viene menzionato così spesso
nel mondo Unix/Linux?
La maggior parte degli utenti Linux pensa che il Postscript sia
solo un passaggio obbligato per poter stampare (assieme o senza Ghostscript)
e che se ci fosse un driver di stampa a livello di sistema operativo
come in MacOS o Windows sarebbe lo stesso (o meglio).
Cerchiamo allora di spiegare perché viene usato il Postscript
e che benefici comporta.
Il Postscript è un linguaggio di programmazione sviluppato per
descrivere pagine di testo e grafica in modo indipendente dalla
risoluzione e dal dispositivo di visualizzazione. Questo significa che
una pagina di testo e grafica può essere distribuita e quindi
visualizzata o stampata alla massima risoluzione consentita senza
perdita di qualità.
Uno sguardo più approfondito
Questo paragrafo tratta alcuni aspetti tecnici di Postscript: se non
siete curiosi o interessati potete tranquillamente saltarlo.
Il Postscript è un linguaggio di programmazione che viene interpretato (dalla stampante,
oppure da Ghostscript): potete quindi dare una occhiata ad un
qualsiasi file (programma) Postscript con il vostro editor preferito
oppure potete dare i comandi di esempio direttamente a ghostscript
lanciandolo in modo interattivo da un xterm
(usare in questo modo ghostscript facilita la programmazione perché
nel prompt dell'interprete viene visualizzato il numero di elementi sullo stack).
Il meccanismo di interpretazione, infatti, è basato sul concetto di stack: a
mano a mano che un token viene letto l'interprete decide se farne un
push sullo stack (nel caso di una variabile il valore di questa viene
messo sullo stack) oppure se interpretarlo come un operatore ed eseguire
perciò la funzione associata.
Un concetto importante in Postscript è il dizionario, cioè una struttura
dati che associa un nome ad un determinato valore (sequenza di
comandi, numero oppure testo).
In pratica, dato il simbolo tok, se è interpretabile come un numero,
il numero viene messo sullo stack, se è il nome di una variabile il
valore di questa viene messo sullo stack, se è lo mnemonico di un
operatore, questo viene eseguito. Il nome di una variabile preceduto
da slash (/tok) viene messo sullo stack tale e quale, cosl come
i comandi racchiusi tra parentesi graffe. Esempio:
/square {dup mul} def
In questo esempio il simbolo square viene messo sullo stack seguito
dalla sequenza di comandi {dup mul}. A questo punto il token
def viene riconosciuto come un operatore che inserisce nel dizionario
la procedura square con la definizione {dup mul}.
La nuova procedura square può essere usata in questo modo:
5 square
La sequenza di operazioni eseguite è questa:
- 5 viene messo sullo stack
- square viene cercato nel dizionario e sostituito dalla sua
definizione
- dup viene riconosciuto come un operatore che duplica il primo
elemento dello stack
- mul viene riconosciuto come l'operatore di moltiplicazione che
prende due valori dallo stack, li moltiplica e mette il risultato
di nuovo sullo stack
Per definire una variabile invece che una nuova funzione si immette sullo
stack un numero:
/PI 3.1415 def
oppure del testo (che in postscript viene racchiuso tra parentesi tonde):
/mystring (Articolo per il PlutoJ!) def
Il linguaggio fornisce anche operatori per ruotare e scalare l'immagine.
Grazie a questa flessibilità
sono stati creati dei postprocessori, ovvero dei filtri che ricevono in input
un programma postscript e lo modificano in modo da cambiare orientamento,
posizione e dimensione delle pagine.
Esistono due sistemi di coordinate in postscript: lo spazio dell'utente e lo spazio
del dispositivo. L'interprete usa una matrice di conversione tra i due sistemi di
coordinate che può essere modificata utilizzando gli operatori scale,
rotate e translate.
Le operazioni di disegno si eseguono definendo un percorso (path) e
chiamando l'operatore stroke (che disegna una linea lungo il percorso) oppure
l'operatore fill che riempie la zona racchiusa dal percorso con il
colore selezionato. C'è anche una altro operatore che può essere applicato
ad un path: l'operatore clip che limita l'output all'area descritta dal path.
Un aspetto interessante è che può essere usato come path anche
l'outline di un stringa di testo (con l'operatore charpath).
Ultima nota: l'interprete postscript mantiene anche uno stack di dizionari,
e cerca di risolvere i simboli a partire dall'ultimo dizionario messo sullo
stack: in questo modo è facile ridefinire il significato degli
operatori standard (ad esempio l'operatore showpage che emette la
pagina sul dispositivo grafico).
Ecco infine un esempio di codice che potete inserire direttamente
al prompt di ghostscript o salvare in un file (in quest'ultimo caso
la prima linea del file deve iniziare con %! ).
% ---cut cut---
/Times-Roman findfont 64 scalefont setfont
/mystring (Pluto Journal) def
newpath
100 100 moveto
mystring show
200 200 moveto
2 2 scale
90 rotate
mystring show
showpage
% ---cut cut---
E ora passiamo al sodo ...
Alcuni esempi di quanto sia utile postscript: quelli che hanno letto
anche la precedente sezione sapranno perché tutto questo è
possibile.
- Descrizione indipendente dalla risoluzione
Provate a vedere con ghostview il file tiger.ps che viene incluso
con tutte le distribuzioni di ghostscript e ingrandite le ciglia dell'occhio
della tigre: vedrete che, aumentando lo zoom (che è praticamente la
stessa cosa che aumentare la risoluzione), i dettagli migliorano, sono più
nitidi.
Provate ora a fare la stessa cosa con una immagine bitmap, (un qualunque .gif
oppure la stessa immagine della tigre trasformata in bitmap con il comando
gs -sDEVICE=ppmraw -dNOPAUSE -SOutputFile=/tmp/t.ppm tiger.ps) e scoprite la
differenza.
- Ridimensionare ruotare e traslare
Vi è mai venuta la voglia di stampare la documentazione di Linux
ma vi siete scoraggiati pensando che richiede centinaia di
pagine? Se avete le versioni postscript potete postprocessarle e
riarrangiare le pagine in modo che ne vengano stampate due per pagine
(o anche di più se avete una buona stampante e buona vista:-)).
Naturalmente i programmi che fanno questo sporco lavoro sono gi` stati scritti
(per esempio il pacchetto psutils della distribuzione Debian).
- Distribuzione e qualità
Un file postscript può essere distribuito (nessun problema di little o big-endian,
dimensione di int e long etc:-)) e visualizzato al meglio delle
possibilità del dispositivo finale: sia che si abbia una stampante a 9 aghi
che una laser a 600 dpi la qualità della stampa dipende dalla stampante,
non dal formato del file.
L'avvocato del diavolo
Naturalmente non è tutto oro quello che luccica: un file postscript non è
facilmente editabile in modo visuale (tuttavia esistono dei programmi che
trasformano postscript in un altro formato vettoriale o che consentono di editare
direttamente il postscript con qualche limitazione come Tailor e Adobe Illustrator); le stampanti postscript
costano di più (ma Ghostscript consente di stampare anche su stampanti non-PS);
al postscript standard mancano istruzioni per la fusione di più immagini con
vari livelli di opacità e ci sono altri limiti ancora legati alla natura di linguaggio
di programmazione (ci sono anche gli operatori per cancellare e scrivere file, per cui
è bene usare l'opzione -dSAFER di Ghostscript, per esempio).
Riferimenti
Ci sono diversi siti sul WWW che trattano aspetti introduttivi della programmazione
in postscript, è sufficiente fare una ricerca con parole chiave come postscript,
guide, document, first etc.
Il newsgroup dedicato a postscript è: comp.lang.postscript.
Paolo Molaro