Una Chiave per il DesktopPublishing

Corso di PostScript- Marco A. Calamari

Settima Puntata


Nella quinta parte di questo corso abbiamo descritto ilmeccanismo con cui una applicazione normalmente effettua lastampa di un documento su una stampante PostScript; riassumendo,viene inviato alla stampante un file ASCII diviso in due partiprincipali, prologo (costante) e script (variabilee contenente la descrizione del documento). Nella sesta parteabbiamo poi esaminato i principali comandi PostScript con cui èpossibile formattare il testo su una pagina.

È arrivato ora il momento di mettere tutto insieme; quindi,con molta fiducia in noi stessi, proveremo a scrivere unaelementare applicazione di impaginazione, che effettui laformattazione e la stampa di un file di testo, suddividendolo inrighe e pagine, e stampando queste ultime con intestazione e numerazionea piè di pagina.

Si tratta, in altre parole, di scrivere un programma, in unqualunque linguaggio, che legga il testo da formattare da un fileASCII, e produca un file di uscita contenente un programmaPostScript; quest'ultimo, downloadato ad una stampantePostScript, produrrà la stampa richiesta.

Il programma di impaginazione

Scrivere un programma che a sua volta scrive altri programmipuò sembrare un compito estremamente complesso, ma la potenzadel linguaggio PostScript, unita alla relativa semplicità del problematipografico da risolvere, ci permetteranno di cavarcela con unnumero di linee di codice abbastanza ridotto. Per consentirel'utilizzo di un qualunque computer, abbiamo scelto di scriverloin Basic, visto che è di gran lunga il linguaggio più diffuso,esistendo in forma interpretata o compilata su tutti i sistemi.Si è inoltre cercato di utilizzare solo le istruzioni principalidel Basic, evitando le estensioni di un particolare dialetto dellinguaggio, in modo da rendere il più possibile indolore l'eventualetrasporto nel vostro particolare ambiente di sviluppo PostScript.

Il programma è stato comunque provato con i principali tipidi compilatori ed interpreti degli ambienti Macintosh e Pc;l'elenco è riportato nei commenti iniziali del listato. Nel casosi presentasse la necessità di adattarsi a qualche dialettostretto del Basic, ad esempio l'arcinoto Applesoft Basic deisistemi Apple //, la linearità del programma semplificheràmolto il lavoro di conversione da effettuare.

Nel battere il programma, riportato nel Listato 1, siponga particolare attenzione all'uso delle maiuscole e delleminuscole; infatti, nel caso delle stringhe che vengono stampatedalle istruzioni PRINT per produrre i comandi PostScript, icaratteri maiuscoli e minuscoli non sono, come ben sappiamo,equivalenti. Per provare il programma potete battere il testoriportato nel Listato 2, che deve essere formato da solicaratteri ASCII (niente lettere accentate o caratteri strani - il programmanon è in grado di trattarli, e vedremo in futuro perché) ed hai ritorni carrello solo a fine paragrafo, e non a fine riga. Iltesto di prova è formato da due soli paragrafi; il primo diquattro parole, ed il secondo che comprende tutto il resto deltesto. Potrete comunque utilizzare qualunque altro file giàpronto, purché soddisfi ai due requisiti sopraelencati. Ilprogramma PostScript che verrà generato, riportato nel Listato3, produrrà una volta downloadato il risultato mostrato in Figura1.

Il funzionamento del programma Basic è molto semplice; unavolta lanciato esso richiede il nome del file da convertire (seutilizzate un Pc, il nome del file non deve avere estensione), eproduce poi un file con il nome ottenuto aggiungendo l'estensione.pos a quello di partenza. Considerando che questo esempio nonpretende di essere una applicazione reale ma solo un buon esempiodi programmazione, esso è stato semplificato in diversi punti;ad esempio il codice PostScript ha alcune limitazioni rimuovibilia prezzo di un aumento di complessità, alcuni parametri sono incorporatinel sorgente ed i controlli di errore sono ridotti al minimo.

I parametri di stampa del programma possono essere variatimodificando le variabili Basic che si trovano all'inizio dellistato, e che sono:

Il file PostScript ottenuto risponde ai requisiti minimi diconformità Adobe 2.0, ed è formato da una serie di commenti (header),un prologo (fino alla scritta %%EndProlog), lo scriptche contiene il testo, ed infine un trailer ridotto alminimo indispensabile (le ultime due righe del file).

Il prologo, che è costante, contiene solo due oggetti; ladefinizione del separatore delle parole (uno spazio bianco) equella della procedura spezzaInLinee, che è il cuore ditutto il programma. Questa procedura usa tre argomenti, chedevono esserle forniti, e che sono

  1. una serie di stringhe di lunghezza massima inferiore ai 255 caratteri, che contengono il paragrafo da stampare;
  2. un numero, che è la lunghezza della linea espressa in punti;
  3. una procedura di stampa linea, che si prende cura di stampare le righe formate da spezzaInLinee.

Lo script è formato da tre parti:

  1. una procedura di inizializzazione della stampa, contenuta nelle sei linee successive a %%EndProlog;
  2. una serie di gruppi dei tre argomenti sopraelencati;
  3. una procedura di chiusura stampa, contenuta nelle quattro linee che precedono %%Trailer.

Si noti che le procedure di stampa linea, di inizializzazionestampa e di chiusura stampa non sono costanti, ma dipendono daivalori dei parametri, come i margini ed i tipi di font, chevengono forniti al programma Basic.

Le due procedure di inizializzazione e di fine stampa sonoelementari; quella di stampa linea consiste in una istruzione if,che, a seconda della coordinata Y della linea da trattare(fornita dalla procedura spezzaInLinee) stampa solo quest'ultima, oppure stampa anche l'intestazione, il piè di pagina ed incrementail contatore delle pagine.

La procedura spezzaInLinee assegna a tre variabili itre argomenti passati, inizializza altre cinque variabili locali,entra nel ciclo principale (operatore loop, interrottoalla fine da exit), ed infine esegue alcune istruzioni dichiusura.

Come esercizio lasciamo, a coloro che vorranno cimentarsi, lostudio del funzionamento del loop principale di spezzaInLinee;i nomi delle variabili coinvolte sono autoesplicativi, ed èstata già fornita la definizione di tutti gli operatoriPostScript utilizzati.

Per cambiare: programmiamo l'hardware

Allo scopo di variare i contenuti di questa puntata, cioccuperemo adesso di un paio di esempi di argomento completamentediverso; il primo riguarda la possibilità di modificarepermanentemente via software il comportamento della stampantelaser che stiamo utilizzando.

Nella maggior parte delle stampanti PostScript, come in moltealtre periferiche intelligenti che l'industria dei computer hasfornato ultimamente, è incorporata una piccola area di memorianon volatile EEROM (cioè che non si cancella quando mancal'alimentazione), utilizzata per conservare in permanenza alcuneregolazioni della stampante. Per poter cambiare questi parametriè necessario eseguire quattro operazioni:

  1. fornire uno di tali parametri, detto password (che deve essere noto - è un numero intero), per poter essere autorizzati a modificare la memoria non volatile. Quando la stampante viene venduta la password è 0, e con ogni probabilità nessuno l'avrà modificata; se così non fosse avrete bisogno di chiedere alla persona responsabile della modifica il nuovo valore della password;
  2. uscire temporaneamente dalla normale condizione di funzionamento della stampante, detta loop di server (vedremo nella prossima puntata di cosa si tratta);
  3. porre sullo stack un particolare dizionario predefinito statusdict, che contiene tutti gli operatori che permettono di variare i parametri di sistema immagazzinati nella memoria non volatile;
  4. utilizzare l'adatto operatore per variare il parametro desiderato.

Il nostro scopo è quello di sopprimere la stampa della paginadi prova che la stampante esegue ogni volta che viene accesa oresettata; per far questo dovremo cambiare il valore delparametro dostartpage da true a false conl'utilizzo dell'operatore setdostartpage. Il programma cherealizza queste operazioni è riportato nel Listato 4; isuoi commenti riportano anche la modifica necessaria perripristinare eventualmente la stampa della pagina di prova.

Un effetto speciale

Il programma riportato nel Listato 5 produce ilrisultato mostrato in Figura 2, cioè la stampa di un testocon effetto di sfumatura. Il programma esegue il solitoincapsulamento, il tracciamento della cornice, definisce il fontcorrente e la variabile che contiene la parola da tracciare,sposta l'origine degli assi ed entra nel loop principale.Quest'ultimo, realizzato per mezzo dell'operatore for,stampa per diciannove volte la stringa scritta,utilizzando il contatore del loop come tono di grigio corrente (variada bianco a nero), e traslando successivamente l'origine di unapiccola quantità in alto a sinistra. All'uscita del loop lascritta viene stampata un'ultima volta in bianco.

To be continued .....

Come esercizio vi proponiamo di riscrivere il Programma 3, inmodo che il numero e lo spostamento delle stampe successive siafunzione del corpo prescelto, ottimizzando il tempo di esecuzionee mantenendo le proporzioni della scia, fornendo inoltrelunghezza rispetto al corpo e direzione di quest'ultima comeparametri.

Nella prossima puntata ci occuperemo di nuovo dei parametriche sono immagazzinati nella memoria non volatile, e dellediverse modalità di funzionamento della stampante. Ritorneremoanche ad occuparci di grafica, trattando della stampa di bitmaped introducendo l'utilizzo degli oggetti di tipo file.


1000 REM Corso PostScript - parte VII - programma 1
1010 REM APFCP: ASCII -> PostScript File Conversion Program
1020 REM
1030 REM Programma BASIC per la stampa di files di testo
1040 REM su stampante PostScript Laserwriter
1050 REM Convertire il file ASCII (nome senza estensione)
1060 REM con questo programma.
1070 REM Verrà generato un file PostScript avente lo stesso
1080 REM nome ed estensione ".pos", che dovrà poi essere
1090 REM scaricato su una stampante PostScript.
1100 REM Il programma è scritto con un subset del BASIC, al fine di
1110 REM garantirne una facile trasportabilità
1120 REM È stato comunque provato con:
1130 REM - Macintosh + interprete MS BASIC 3.0
1140 REM - Macintosh + compilatore MS BASIC 1.0
1150 REM - Macintosh + compilatore MS QUICKBASIC 1.0
1160 REM - PC + interprete MS GW-BASIC 3.2
1170 REM In questo programma i caratteri maiuscoli e minuscoli
1180 REM sono significativi; batteteli esattamente come sono.
1190 REM Attenzione anche al numero di spazi bianchi indicati dai commenti.
1200 REM
1210 REM ====== INIZIALIZZAZIONI
1220 R$ = CHR$ (13)
1230 TYPE$ = "Times-Roman": REM font per il testo
1240 SIZE = 12: REM altezza carattere per il testo
1250 HEIGHT = 11: REM altezza pagina
1260 WIDTHH = 8.5: REM larghezza pagina
1270 LEFT = 1: REM margine sinistro
1280 RIGHT = 1: REM margine destro
1290 UP = 1: REM margine superiore
1300 BOT = 1: REM margine inferiore
1310 SPACE = SIZE * 1: REM spaziatura (in questo caso singola)
1320 LL = 72 * (WIDTHH - LEFT - RIGHT): REM larghezza linea in punti
1330 HEADER$ = "*** File convertito con Apfcp e stampato su LaserWriter ***"
1340 REM scritta per intestazione
1350 HTYPE$ = "Times-Bold": REM font per intestazione
1360 HSIZE = 14: REM altezza carattere per l'intestazione
1370 REM
1380 REM ====== APERTURA DEI FILE
1390 INPUT "Nome del file di testo da stampare ";N$
1400 OPEN N$+".pos" FOR OUTPUT AS #2: CLOSE #2: KILL N$+".pos"
1410 OPEN N$ FOR INPUT AS #1
1420 OPEN N$+".pos" FOR OUTPUT AS #2
1430 REM
1440 REM ====== SCRITTURA PROLOGO
1450 ON ERROR GOTO 1640
1460 GOSUB 1800: GOSUB 2220
1470 A$ = "("
1480 GOSUB 1550
1490 IF RIGHT$ (A$,3) = " )" THEN 1510
1500 REM UNO SPAZIO PRIMA DELLA PARENTESI CHIUSA
1510 GOSUB 2310
1520 A$ = C$
1530 GOTO 1480
1540 REM
1550 REM ====== SUBROUTINE LETTURA E PREPARAZIONE STRINGHE POSTSCRIPT
1560 C$=INPUT$(1,#1)
1570 IF C$ = R$ AND A$ = "(" THEN A$ = A$ + " )":C$ = "(": RETURN
1580 REM UNO SPAZIO PRIMA DELLA PARENTESI CHIUSA
1590 IF C$ = R$ THEN A$ = A$ + " )":C$ = "(": RETURN
1600 REM DUE SPAZI PRIMA DELLA PARENTESI CHIUSA
1610 A$ = A$ + C$: IF LEN (A$) = 251 THEN C$ = "": RETURN
1620 GOTO 1560
1630 REM
1640 REM ====== SUBROUTINE DI TRATTAMENTO ERRORI
1650 IF ERR = 62 THEN GOTO 1710
1660 CLOSE #1
1670 CLOSE #2
1680 PRINT "Errore tipo ";ERR;" alla linea numero "; ERL
1690 END
1700 REM
1710 REM ====== TERMINE DELLA STAMPA
1720 A$ = A$ + " )": REM UNO SPAZIO PRIMA DELLA PARENTESI CHIUSA
1730 GOSUB 2310
1740 GOSUB 2370
1750 CLOSE #1
1760 CLOSE #2
1770 PRINT "Fine della conversione: il file PostScript si chiama ";N$+".pos"
1780 END
1790 REM
1800 REM ====== SUBROUTINE DI SCRITTURA DEL PROLOGO POSTSCRIPT
1810 PRINT#2, "%!PS-Adobe-2.0"
1820 PRINT#2, "%%Title: File",N$," (Postscript Downloading)"
1830 PRINT#2, "%%Creator: APFCP: ASCII -> PostScript File Conversion Program"
1840 PRINT#2, "%%For: Corso Postscript BIT"
1841 PRINT#2, "%%CreationDate: (4-10-1989) (15:56)"
1842 PRINT#2, "%%BoundingBox: 28 30 566 811"
1850 PRINT#2, "%%EndComments"
1860 PRINT#2, "/Separatore ( ) def": REM C'È UN SOLO SPAZIO FRA LE PARENTESI
1870 PRINT#2, "/spezzaInLinee"
1880 PRINT#2, "{/proceduraDiStampa exch def"
1890 PRINT#2, "/LunghezzaDellaLinea exch def"
1900 PRINT#2, "/StringaDiTesto exch def"
1910 PRINT#2, "/LunghezzaDelSeparatore Separatore stringwidth pop def"
1930 PRINT#2, "/LunghezzaCorrente 0 def"
1940 PRINT#2, "/UltimoSeparatore 0 def
1950 PRINT#2, "/CarattereDiPartenza 0 def"
1960 PRINT#2, "/TestoRimanente StringaDiTesto def"
1970 PRINT#2, "{TestoRimanente Separatore search"
1980 PRINT#2, "{/ProssimaParola exch def pop"
1990 PRINT#2, "/TestoRimanente exch def"
2000 PRINT#2, "/LunghezzaDellaParola ProssimaParola stringwidth pop def"
2010 PRINT#2, "LunghezzaCorrente LunghezzaDellaParola add LunghezzaDellaLinea lt
2020 PRINT#2, "{/LunghezzaCorrente LunghezzaCorrente LunghezzaDellaParola add"
2030 PRINT#2, "LunghezzaDelSeparatore add def}"
2040 PRINT#2, "{StringaDiTesto CarattereDiPartenza"
2050 PRINT#2, "UltimoSeparatore CarattereDiPartenza sub"
2060 PRINT#2, "getinterval proceduraDiStampa"
2070 PRINT#2, "/CarattereDiPartenza UltimoSeparatore def"
2080 PRINT#2, "/LunghezzaCorrente LunghezzaDellaParola LunghezzaDelSeparatore add def"
2090 PRINT#2, "}ifelse"
2100 PRINT#2, "/UltimoSeparatore UltimoSeparatore"
2110 PRINT#2, "ProssimaParola length add 1 add def"
2120 PRINT#2, "}"
2130 PRINT#2, "{pop exit}"
2140 PRINT#2, "ifelse"
2150 PRINT#2, "}loop"
2160 PRINT#2, "/UltimoCarattere StringaDiTesto length def"
2170 PRINT#2, "StringaDiTesto CarattereDiPartenza UltimoCarattere"
2180 PRINT#2, "CarattereDiPartenza sub getinterval proceduraDiStampa"
2190 PRINT#2, "}def"
2195 PRINT#2, "%%EndProlog"
2200 RETURN
2210 REM
2220 REM ====== SUBROUTINE POSTSCRIPT INIZIO STAMPA
2230 PRINT#2, "/";HTYPE$;" findfont ";HSIZE;" scalefont setfont"
2240 PRINT#2, LEFT * 72;" ";HEIGHT * 72 - 18;" moveto
2250 PRINT#2, "(";HEADER$;") show"
2260 PRINT#2, "/";TYPE$;" findfont ";SIZE;" scalefont setfont"
2270 PRINT#2, "/YLinea ";(HEIGHT * 72) - (72 * UP + SIZE);" def"
2280 PRINT#2, "/NumeroPagina 1 def"
2290 RETURN
2300 REM
2310 REM ====== SUBROUTINE DI STAMPA STRINGA
2320 PRINT#2, A$
2330 IF RIGHT$ (A$,1) = ")" THEN GOSUB 2430
2340 RETURN
2350 REM
2360 REM ====== SUBROUTINE POSTSCRIPT FINE STAMPA
2370 PRINT#2, "480 36 moveto"
2380 PRINT#2, "(Pagina ) show": REM UNO SPAZIO PRIMA DELLA PARENTESI CHIUSA
2390 PRINT#2, "NumeroPagina ( ) cvs show": REM DUE SPAZI FRA LE PARENTESI
2395 PRINT#2, "showpage"
2400 PRINT#2, "%%Trailer"
2405 PRINT#2, "%%EOF"
2410 RETURN
2420 REM
2430 REM ====== SUBROUTINE POSTSCRIPT DI ELABORAZIONE PARAGRAFO
2440 PRINT#2, LL
2450 PRINT#2, "{YLinea ";BOT * 72 + SPACE;" le"
2460 PRINT#2, "{";LEFT * 72;" YLinea moveto show"
2470 PRINT#2, "/YLinea YLinea ";SPACE;" sub def"
2480 PRINT#2, "480 36 moveto"
2490 PRINT#2, "(Pagina ) show": REM UNO SPAZIO PRIMA DELLA PARENTESI CHIUSA
2500 PRINT#2, "NumeroPagina ( ) cvs show": REM DUE SPAZI FRA LE PARENTESI
2510 PRINT#2, "showpage"
2520 PRINT#2, "/";HTYPE$;" findfont ";HSIZE;" scalefont setfont"
2530 PRINT#2, LEFT * 72;" ";HEIGHT * 72 - 18;" moveto
2540 PRINT#2, "(";HEADER$;") show"
2550 PRINT#2, "/";TYPE$;" findfont ";SIZE;" scalefont setfont"
2560 PRINT#2, "/NumeroPagina NumeroPagina 1 add def"
2570 PRINT#2, "/YLinea ";(HEIGHT * 72) - (72 * UP + SIZE);" def}"
2580 PRINT#2, "{";LEFT * 72;" YLinea moveto show"
2590 PRINT#2, "/YLinea YLinea ";SPACE;" sub def} ifelse}"
2600 PRINT#2, "spezzaInLinee"
2610 RETURN

Definiamo qualche termine tipografico
Probabilmente molti dei concetti che adesso definiremo sono noti alla maggior parte dei voi, dato che l'uso dei word-processor è ormai così diffuso, ma riteniamo vantaggioso per tutti partire da una base comune di terminologia, che ci sarà utile anche per precisare alcuni concetti di cui ci siamo già occupati. Gli esperti di composizione tipografica ci scuseranno se semplificheremo od approssimeremo alcuni concetti, al fine di non appesantire troppo l'esposizione. In parecchie situazioni definiremo un termine utilizzando la lingua italiana oppure quella inglese, a seconda della consuetudine prevalente; nel caso esse siano ambedue comunemente impiegate, ne utilizzeremo abitualmente solo una, ma forniremo almeno una volta la traduzione fra parentesi.

%!PS-Adobe-2.0
%%Title: File CP7-Listato2 (Postscript Downloading)
%%Creator: APFCP: ASCII -> PostScript File Conversion Program
%%For: Corso Postscript BIT
%%CreationDate: (4-10-1989) (15:56)
%%BoundingBox: 28 30 566 811
%%EndComments
/Separatore ( ) def
/spezzaInLinee
{/proceduraDiStampa exch def
/LunghezzaDellaLinea exch def
/StringaDiTesto exch def
/LunghezzaDelSeparatore Separatore stringwidth pop def
/LunghezzaCorrente 0 def
/UltimoSeparatore 0 def
/CarattereDiPartenza 0 def
/TestoRimanente StringaDiTesto def
{TestoRimanente Separatore search
{/ProssimaParola exch def pop
/TestoRimanente exch def
/LunghezzaDellaParola ProssimaParola stringwidth pop def
LunghezzaCorrente LunghezzaDellaParola add LunghezzaDellaLinea lt
{/LunghezzaCorrente LunghezzaCorrente LunghezzaDellaParola add
LunghezzaDelSeparatore add def}
{StringaDiTesto CarattereDiPartenza
UltimoSeparatore CarattereDiPartenza sub
getinterval proceduraDiStampa
/CarattereDiPartenza UltimoSeparatore def
/LunghezzaCorrente LunghezzaDellaParola LunghezzaDelSeparatore add def
}ifelse
/UltimoSeparatore UltimoSeparatore
ProssimaParola length add 1 add def
}
{pop exit}
ifelse
}loop
/UltimoCarattere StringaDiTesto length def
StringaDiTesto CarattereDiPartenza UltimoCarattere
CarattereDiPartenza sub getinterval proceduraDiStampa
}def
%%EndProlog
/Times-Bold findfont 14 scalefont setfont
72 774 moveto
(*** File convertito con Apfcp e stampato su LaserWriter ***) show
/Times-Roman findfont 12 scalefont setfont
/YLinea 708 def
/NumeroPagina 1 def
(Definiamo qualche termine tipografico )
468
{YLinea 84 le
{ 72 YLinea moveto show
/YLinea YLinea 12 sub def
480 36 moveto
(Pagina ) show
NumeroPagina ( ) cvs show
showpage
/Times-Bold findfont 14 scalefont setfont
72 774 moveto
(*** File convertito con Apfcp e stampato su LaserWriter ***) show
/Times-Roman findfont 12 scalefont setfont
/NumeroPagina NumeroPagina 1 add def
/YLinea 708 def}
{ 72 YLinea moveto show
/YLinea YLinea 12 sub def} ifelse}
spezzaInLinee
(Probabilmente molti dei concetti che adesso definiremo sono noti alla maggior parte dei voi, dato che l'uso dei word-processor è ormai così diffuso, ma riteniamo vantaggioso per tutti partire da una base comune di terminologia, che ci sarà utile a
nche per precisare alcuni concetti di cui ci siamo già occupati. Gli esperti di composizione tipografica ci scuseranno se semplificheremo od approssimeremo alcuni concetti, al fine di non appesantire troppo l'esposizione. In parecchie situazioni defi
niremo un termine utilizzando la lingua italiana oppure quella inglese, a seconda della consuetudine prevalente; nel caso esse siano ambedue comunemente impiegate, ne utilizzeremo abitualmente solo una, ma forniremo almeno una volta la traduzione fra
parentesi. )
468
{YLinea 84 le
{ 72 YLinea moveto show
/YLinea YLinea 12 sub def
480 36 moveto
(Pagina ) show
NumeroPagina ( ) cvs show
showpage
/Times-Bold findfont 14 scalefont setfont
72 774 moveto
(*** File convertito con Apfcp e stampato su LaserWriter ***) show
/Times-Roman findfont 12 scalefont setfont
/NumeroPagina NumeroPagina 1 add def
/YLinea 708 def}
{ 72 YLinea moveto show
/YLinea YLinea 12 sub def} ifelse}
spezzaInLinee
( )
468
{YLinea 84 le
{ 72 YLinea moveto show
/YLinea YLinea 12 sub def
480 36 moveto
(Pagina ) show
NumeroPagina ( ) cvs show
showpage
/Times-Bold findfont 14 scalefont setfont
72 774 moveto
(*** File convertito con Apfcp e stampato su LaserWriter ***) show
/Times-Roman findfont 12 scalefont setfont
/NumeroPagina NumeroPagina 1 add def
/YLinea 708 def}
{ 72 YLinea moveto show
/YLinea YLinea 12 sub def} ifelse}
spezzaInLinee
480 36 moveto
(Pagina ) show
NumeroPagina ( ) cvs show
showpage
%%Trailer
%%EOF

%!PS-Adobe-2.0
%%Title: Soppressione della pagina di prova
%%Creator: Corso PostScript - parte VII - programma 2
%%For: Corso PostScript BIT
%%EndComments
%%EndProlog
%
% Programma principale
% (non trattandosi di un programma di stampa
% non è necessario l'incapsulamento)
%
% Uscita dal loop di server
% (se la password è stata cambiata dal
% valore di default di zero, modificare
% opportunamente il programma nella
% riga seguente)
serverdict begin 0 exitserver
%
% Fuori dal loop di server può ora
% essere modificato statusdict; per
% ripristinare la stampa della pagina
% di prova modificare false in true.
statusdict begin false setdostartpage end
%
%%Trailer
%%EOF

%!PS-Adobe-2.0
%%Title: Esempio di stampa di una parola con effetto di sfumatura
%%Creator: Corso PostScript - parte VII - programma 3
%%For: Corso PostScript BIT
%%EndComments
%%EndProlog
%
% Procedura inch
% Argomenti: XInches / XPoints
% Converte misure da pollici
% a punti tipografici.
/inch { 72 mul } def
%
% Procedura tracciaCornice
% Argomenti: - / -
% Traccia una cornice su pagina
% A4 a mezzo pollice dal margine.
/tracciaCornice {
gsave newpath
0.5 inch 0.5 inch moveto
7.3 inch 0 inch rlineto
0 inch 10.5 inch rlineto
-7.3 inch 0 inch rlineto
closepath
.05 inch setlinewidth
0 setgray stroke
grestore
} def
%
%
%
% Programma principale
%
% Incapsulamento e disegno della cornice
gsave
tracciaCornice
%
% Definizione del carattere da utilizzare,
% della parola da tracciare e dell'origine.
/Times-Italic findfont 2 inch scalefont setfont
/scritta (Fading) def
1.5 inch 5.5 inch translate
%
% Loop for per il tracciamento della scia
0.95 -0.05 0.0
{setgray 0 0 moveto scritta show -1.5 0.7 translate}
for
%
% Tracciamento della parola in bianco
1 setgray 0 0 moveto -1.5 0.7
translate scritta show
%
% Rimozione incapsulamento e stampa pagina
grestore
showpage
%
%%Trailer
%%EOF

Copyright © 1985: Marco A. Calamari