Una Chiave per il DesktopPublishing

Corso di PostScript- Marco A. Calamari

Decima Puntata


Anche questa puntata sarà quasi completamente dedicataallo studio dei font; valendoci dei dettagli sulla strutturainterna di essi, che sono stati esposti il mese scorso, opereremo modifichee personalizzazioni molto più complesse di una modifica diinclinazione, fino ad arrivare alla generazione di un fontpartendo da zero.


Un membro del nostro gruppo di aficionados delPostScript mi ha detto, dopo aver letto la bozza della nonapuntata

Interessante, ma mentre mi è chiara l'utilità deglioperatori grafici e di trattamento testo, non riesco acomprendere a cosa diavolo potrà servirmi conoscere la strutturadi un font PostScript ed i meccanismi della Font Machinery, vistoche userò il PostScript come uno strumento per la grafica, e nonmi metterò certamente a disegnare font.

Questa obiezione è validissima, e così spenderemo due paroleper cercare di spiegare come, a nostro parere, la conoscenzadelle basi di questo particolare argomento può aiutare anchecoloro che non lo utilizzeranno mai direttamente.

- Fenomeno 1: vi è mai capitato di trasferire inqualche modo un documento di testo tra ambienti e programmidiversi, ad esempio da un editor di linea su un Pc a MS Word 3.0su un Macintosh, e di aver osservato misteriose apparizioni,sparizioni o sostituzioni di caratteri speciali o accentati, eche magari avvenivano solo in stampa e non su video?

- Fenomeno 2: vi è mai capitato, in ambienteMacintosh, di cercare faticosamente con l'accessorio di scrivaniaTastiera un carattere speciale, di inserirlo nell'importantissimoe curatissimo testo che stavate scrivendo, e di vederlosuccessivamente scomparire, o essere sostituito da un altrocarattere che non c'entra nulla, od anche da un rettangolo vuoto?

Fenomeno 3: vi siete mai chiesti come diavolo èpossibile, usando ad esempio un Macintosh, inserire letterestraniere (la n minuscola con la tilde della lingua spagnola,oppure la a minuscola con l'accento circonflesso del francese) inun testo, visto che l'accessorio di scrivania Tastiera non le visualizzamai?

Ebbene (tono enfatico da pubblicità cinematografica anni '60)signore e signori , tutto questo ed altro ancora vi saràmostrato nel nostro film!

Come accedere alle informazioni dei font

Nella puntata precedente avevamo consigliato i possessori diLaserTalk di utilizzare questo programma per esaminare lastruttura ed i contenuti dei font residenti sulla LaserWriter; sipossono ovviamente eseguire le stesse operazioni (con un pocopiù di fatica) utilizzando la modalità interactive ed inormali operatori PostScript che già conosciamo.

Nel seguito le righe che iniziano con PS> contengono icomandi battuti da tastiera, mentre quelle senza sono le rispostedell'interprete PostScript. Supponiamo di essere collegati con lastampante, di aver attivato la modalità interattiva,caratterizzata dal prompt PS>, e di voler esaminare le informazionicontenute nel font Helvetica; la procedura potrebbe iniziare con

PS> clear
PS> /Helvetica findfont
PS> pstack
-- dictionary --

queste linee ci informano che, dopo aver cancellato eventualicontenuti precedenti dello stack, abbiamo caricato il dizionarioche contiene il font Helvetica, ed un oggetto di questo tipo è effettivamentepresente sullo stack.

Un normale programma PostScript invocherebbe probabilmente aquesto punto gli operatori scalefont e setfont perutilizzare il font; poiché noi invece vogliamo esaminarne icontenuti, trasferiremo il dizionario del font Helvetica, che sitrova attualmente sullo stack degli operandi, sullo stack deidizionari, in modo da rendere disponibili gli elementi che visono contenuti.

PS> begin

a questo punto lo stack dei dizionari, che inizialmenteconteneva

userdict
systemdict

ha assunto la configurazione

Helvetica
userdict
systemdict

tutti i contenuti del dizionario del font Helvetica sonoquindi disponibili per essere utilizzati, ma non modificati(ricordiamo che i dizionari che sono stati dichiarati come fontsono protetti in scrittura, cioè sono oggetti con l'attributo readonlyattivato).

Verifichiamo innanzitutto di aver ottenuto il font correttostampandone il relativo elemento FontName (vedi la descrizionedella struttura di un font pubblicata nella nona parte)

PS> FontName
PS> ==
/Helvetica

Noterete che questa volta abbiamo utilizzato l'operatorePostScript == invece di pstack; ricordiamo che, mentrepstack stampa la rappresentazione degli oggetti che si trovanosullo stack degli operandi senza alterarlo in alcun modo,l'operatore == stampa la rappresentazione dell'oggetto che sitrova in cima allo stack, rimuovendolo però contemporaneamenteda esso.

Come abbiamo già detto, un dizionario può contenere comeelementi altri dizionari; è il caso del dizionario checostituisce un font, che al suo interno ne contiene altri. Ilfont Helvetica dell'Adobe, essendo scritto secondo gli standarddi questa ditta, contiene il noto dizionario FontInfo al suo interno.Per esaminare i contenuti di quest'ultimo possiamo scrivere

PS> FontInfo
PS> pstack
-- dictionary --
PS> begin

ora lo stack dei dizionari, ha assunto la configurazione

FontInfo
Helvetica
userdict
systemdict

e, con i soliti comandi, possiamo esaminarne il contenuto;vediamo per esempio chi è il vero ed originale inventore delfont Helvetica

PS> Notice
PS> ==
(Helvetica is a registered trademark of Allied Corporation.)

Guarda guarda, non c'è quindi solo l'Adobe Systems nel mondodei font!

Potete ora chiudere il dizionario FontInfo con questo comando

PS> end

lo stack dei dizionari ritorna quindi

Helvetica
userdict
systemdict

e, per esercizio, continuare ad esaminare gli altri elementiche costituiscono il dizionario principale del font Helvetica,dei quali abbiamo riportato l'elenco nella scorsa puntata.

Il Font Encoding

Dal punto di vista dell'utente dei font, il più importantemeccanismo interno della Font Machinery, e probabilmente l'unicooltre alla FontMatrix su cui eventualmente verranno eseguitedelle modifiche, è il vettore Encoding. Per capirne ilfunzionamento e l'utilità facciamo un passo indietro, e chiediamociche cosa avviene realmente durante l'esecuzione del seguentesemplicissimo frammento di programma PostScript

(abcdef) show

L'operatore show stampa la stringa che trova in cimaallo stack, imprimendo sulla pagina uno per volta i caratteri chela formano, ed avanzando il punto corrente ogni volta di unaopportuna quantità. Ricordiamo però che attribuire a certicodici binari (cioè ai byte che formano ogni programma PostScript,ed in particolare a quelli che formano la stringa in questione)la corrispondenza con certi caratteri è solo una questione diconvenzioni. La grande maggioranza dei computer e del software esistential modo usano una codifica standard, detta ASCII (che, tanto perla cronaca, significa American Standard Coding for InformationInterchange - codifica americana standard per l'interscambio diinformazioni), che pone in corrispondenza rigida e biunivoca icodici binari da 0 a 127 (decimale) con i caratteri stampabili edi controllo più comuni.

La stringa di cui ci stiamo occupando, è infattirappresentata dai codici binari che hanno i seguenti valoridecimali

97 98 99 100 101 102

oppure i seguenti valori esadecimali (base 16)

61 62 63 64 65 66

od infine anche i seguenti valori ottali (base 8)

141 142 143 144 145 146

In base alla nostra conoscenza del PostScript (per eventualiripassi, vedere la terza puntata, ed il programma 2, sestapuntata), la suddetta stringa

(abcdef)

poteva essere scritta (in ottale)

(\141\142\143\144\145\146)

oppure (in esadecimale)

<616263646566>

La corrispondenza fra i byte di un file di testo ed icaratteri che vediamo stampati inviandolo ad una qualunquestampante non PostScript è quindi frutto di questa antica edutilissima convenzione.

L'interprete PostScript ovviamente si adegua allo standardASCII, ma utilizzando un meccanismo molto più complesso, dettoFont Encoding, che nella maggior parte dei casi produceesattamente lo stesso risultato; rinviamo a dopo la spiegazionedei vantaggi di questa maggiore complicazione, e vediamo subitocome questo meccanismo funziona.

L'operatore show, per stampare il primo carattere dellastringa, preleva il valore del primo byte (possiamo pensare chesia in base 10 senza perdere di generalità), che è 97, e perdecidere quale carattere stampare, va a consultare il valore delnovantasettesimo elemento del vettore Encoding del font corrente.Come abbiamo già detto il vettore Encoding è formato da oggettidi tipo nome (al massimo 256), che descrivono di che carattere sitratta; la Figura 2 mostra una stampa dell'Encoding vectorstandard, contenuto nel font Times-Bold. I nomi contenutinell'Encoding vector sono, come abbiamo visto, la descrizione ininglese del nome del carattere, compattata in un'unica parola; adesempio

A = A
.
.
Z = Z
a = a
.
.
z = z
0 = zero
.
.
9 = nine
. = period
: = colon
; = semicolon
( = parenleft
) = parenright
? = question
` = grave
´ = acute
è = egrave
é = eacute
È = Egrave
É = Eacute
.
.
... e così via. questi nomi fanno parte dello standard PostScript e non possono essere modificati; essi prevedono tuttavia qualunque lettera, anche stranissima, possa essere scritta in tutte le lingue che usino l'alfabeto latino.

Nel nostro caso, il nome a così recuperato viene usato perricercare, nel dizionario CharStrings del font corrente, laprocedura ivi associata a quel nome, che infine viene usata perstampare il carattere a minuscola.

Dove sono i vantaggi di questo, apparentementecomplicatissimo, modo di procedere? Cominciamo innanzitutto adire che non tutti i caratteri che sono definiti in un fontPostScript sono normalmente inseriti nel relativo Encodingvector; un esempio è la lettera E maiuscola, accentata grave edacuta. Di essa esistono le procedure in CharStrings, maqueste non possono essere normalmente utilizzate con l'operatore show,perché non corrispondono a nessun codice binario. Vedremo frapoco come questi caratteri possono essere comunque utilizzati.

Una parentesi per i Font Bitmapped

Gli screen font del Macintosh, normalmente usati da tutte leapplicazioni di word processing funzionanti su questa macchina,ed in genere quelli usati dagli ambienti grafici a finestre tipo Windowsdella Microsoft e Gem della Digital Research, utilizzano unacodifica ASCII diretta, che pone in corrispondenza i codicibinari da 0 a 127 con le bitmap dei singoli caratteri, edutilizzano i restanti codici da 128 a 255 per includere altricaratteri speciali o semigrafici, che variano da ambiente adambiente ed anche da font a font. Una visualizzazione di questacodifica la possono avere gli utenti Macintosh, aprendo conResEdit una delle risorse di tipo FONT contenute nel file Systemdella Cartella Sistema; facendo scorrere i caratteri del fontpotranno sapere come sono associati ai relativi codici binari(vedi Figura 1). In particolare potranno notare come acerti codici binari, come quelli da 0 a 31, sia associato ilcarattere OpenBox o rettangolo vuoto; i codici sono mostrati inbasso a sinistra nella figura.

Fenomeni, Tasti Morti ed altre storie

Adesso che ci siamo impadroniti dei più importanti dettaglidel funzionamento e della struttura interna di un font,cominciamo a capire il perché di quei fenomeni di cui abbiamoaccennato all'inizio.

Il Fenomeno 1, come è facile comprendere adesso, èdovuto alla diversa codifica dei caratteri speciali (ad esempiole vocali accentate italiane) in due ambienti diversi come quellidi Word su Macintosh e dell'editor Edit dell'MS-Dos; quandoimportiamo direttamente in Word per Macintosh un file di testoproveniente da un Pc MS-Dos con tastiera italiana, Word non hamodo di sapere quale codifica li ha originati, e questo provocala sparizione o la sostituzione di caratteri, particolarmente levocali accentate. Un modo di risolvere il problema (limitatoperò a questo fenomeno, e solo per chi lavora su Macintosh) puòessere utilizzare l'Apple File Exchange, che, pur essendo unadelle applicazioni peggio scritte e meno intuitive dell'ambienteMac-OS, permette, una volta compresone il funzionamento, dioperare perfette conversioni di file in pochi secondi, riscattandocosì ampiamente il tempo che l'assenza di un decente Help inlinea e la macchinosità dell'uso hanno costretto a spendere.

Il Fenomeno 2, che interessa i soli utenti Macintosh,è causato dal fatto che non tutti gli screen font per Macintoshhanno lo stesso set di caratteri; normalmente gli screen font chesono anche presenti nella LaserWriter, come il Times, hanno piùcaratteri speciali, mentre quelli che non lo sono, come il NewYork, ne hanno meno. Se, usando il Times, si inserisce ilcarattere È (Egrave) e poi si trasforma tutto il testo in NewYork, si noterà che il carattere viene sostituito da unrettangolo vuoto, perché il carattere corrispondente non esistenello screen font New York.

Il Fenomeno 3 infine, è già stato compreso da chiconosce il modo di inserire caratteri accentati strani con latastiera del Macintosh; il metodo, detto Dead Key, consiste nelbattere prima il segno speciale che si desidera attaccare allalettera mentre si tiene premuto il tasto Option, nel rilasciare i duetasti, e nel battere infine normalmente la lettera, maiuscola ominuscola, desiderata. Per battere Egrave si deve quindi battereOption+ì` seguito da Shift+ìE. I caratteri speciali si possono individuareaprendo il prezioso accessorio di scrivania Tastiera, premendo iltasto Option, ed osservando sullo schermo dove appare ilcarattere desiderato.

Vale la pena di spendere due parole per spiegare come mai leapplicazioni tipo Word riescono talvolta a stampare i caratterinon presenti nell'Encoding, una volta che essi siano statiinseriti nel testo col metodo che abbiamo appena visto; questeapplicazioni definiscono infatti procedure speciali nel loroprologo per trattare tali caratteri. Quando una applicazionepossiede queste possibilità ed il meccanismo funziona, sipossono avere due situazioni particolari.

- Primo caso: il font che viene stampato non èpresente in FontDirectory (cioè non è residente e non è statodownloadato a mano o automaticamente) ed il carattere speciale èvisibile sullo schermo ed è stato stampato correttamente. Inquesto caso l'opzione Font Substitution nel Page Setup era disabilitata;ciò significa che lo screen font è stato downloadatoautomaticamente e usato come font dalla LaserWriter, e che inesso il carattere speciale era previsto.

- Secondo caso: il font che viene stampato non èpresente in FontDirectory (cioè non è residente e non è statodownloadato a mano o automaticamente) ed il carattere specialenon è visibile sullo schermo (si vede come un rettangolo) ma èstato stampato correttamente. In questo caso l'opzione FontSubstitution nel Page Setup era abilitata; ciò significa che loscreen font è stato sostituito automaticamente con uno dei fontresidenti sulla LaserWriter, e che in quest'ultimo il carattere specialeera previsto (succede col carattere New York, che sullaLaserWriter viene stampato con il Times).

Qualche nuovo operatore

Negli esempi di questa puntata è compreso qualche nuovooperatore; vediamoli.

Modifichiamo l'Encoding vector

L'uso dell'encoding vector può essere sembrato l'inutilecomplicazione di un meccanismo semplice. Certamente esso è piùcomplesso della normale codifica ASCII o ASCII-Like, ma presentadelle possibilità notevoli, che sono in linea con la filosofiache sta alla base del linguaggio PostScript; fornire unostrumento potente che consenta, all'utilizzatore avveduto chelavori nel modo giusto, di fare tutto ciò che gli necessitanella maniera più rapida possibile. Supponiamo di dover stampareun lungo testo, scritto in una lingua che possieda lettereaccentate con diversi tipi di accento (rappresentati da codiciASCII noti, e probabilmente superiori a 127). Consultandol'appendice A del PostScript Language Reference Manual (ilriferimento 1 della bibliografia sul PostScript fornita nellaterza parte del corso) constatiamo che questi caratteri(supponiamo che siano la A maiuscola con tutti i possibiliaccenti e segni) non si trovano nell'Encoding vector standard, masono comunque contenuti nel font che pensiamo di usare (è semprevero per tutte le lettere accentate in tutti i modi possibili).

A questo punto abbiamo due possibilità:

- Rinunciare a stampare questi caratteri, e sostituirli concoppie di caratteri simili (ad esempio una A maiuscola più unapostrofo al posto di Agrave); questa può essere una spiacevolenecessità, se non si lavora in PostScript, ma tipograficamenteparlando è una eresia.

- Generare un nuovo font con Encoding vector modificato, inmodo tale da stampare automaticamente i caratteri desiderati.

Il Programma 1, riportato nel Listato 1, risolveil problema posto. Il cuore del programma è la creazione delfont modificato, che inizia dal relativo commento e termina conl'operatore definefont. Il programma crea il nuovodizionario per il font e vi copia tutti i contenuti di quellorelativo al font di base, eccettuati FID, che verrà creatodirettamente da definefont, e Encoding, che viene copiatoma sostituendovi gli elementi dei nuovi caratteri accentati. Lasequenza di istruzioni interessata è formata da un repeat,che esegue la procedura principale per ciascuna coppia dielementi codice/nomecarattere; la procedura stessa contiene due ifelse,che trattano i casi particolari di copia relativi a FID eEncoding. L'output del programma è mostrato in Figura 3,e consiste nella stampa di una A maiuscola accentata in tutti imodi possibili.

Il Programma 2, riportato nel Listato 2, stampal'intero vettore di Encoding di un font, in questo casol'arcinoto Times-Bold, con a fianco il relativo carattere; il suofunzionamento è elementare e non ci soffermiamo ulteriormente suesso, se non per dire che, sperimentando nomi di font diversi, potretenotare differenze nei relativi Encoding, e che ovviamente icaratteri compresi nel font ma non presenti nell'Encoding nonvengono stampati. L'output del programma è mostrato in Figura4.

Il Programma 3, riportato nel Listato 3, ed ilcui output è mostrato in Figura 5, genera un semplicefont geometrico (del tipo di Symbol) partendo assolutamente dazero. Si noti che il FontType è 3, che contraddistingue un fontcreato dall'utente.

La struttura dei font tipo 3 è leggermente diversa da quellache conosciamo, in quanto il loro funzionamento prevede cheincludano una procedura, chiamata BuildChar, che deve occuparsidi tracciare il carattere, del quale viene fornito il codicesullo stack; la procedura deve quindi sapere dove trovare lealtre procedure che definiscono i caratteri (in questo caso neldizionario CharacterDefs) e queste ultime devono provvedere ancheai necessari fill e stroke)

... to be continued

Per motivi di spazio rimandiamo alla prossima volta ladescrizione del funzionamento del Programma 4 della ottavapuntata. La prossima volta torneremo ad occuparci di grafica, ed introdurremol'uso dei retini. I più volenterosi potranno, come esercizio,modificare la parte PostScript del Programma 1 della settimapuntata, valendosi delle informazioni oggi apprese, al fine dimetterlo in grado di stampare i caratteri accentati italianiaventi la codifica MS-Dos.


%!PS-Adobe-2.0
%%Title: Esempio di generazione di font con encoding modificato
%%Creator: Corso PostScript - parte X - programma 1
%%For: Corso PostScript BIT
%%CreationDate: (4-10-1989) (15:56)
%%BoundingBox: 28 30 566 811
%%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 tracciatura della cornice
gsave
tracciaCornice
%
% Inizializzazioni
/Corpo 96 def
/NuovoEncoding [
8#330 /Aacute
8#331 /Acircumflex
8#332 /Adieresis
8#333 /Agrave
8#334 /Aring
8#335 /Atilde
] def
%
% Preparazione del font ricodificato
% Creazione ed apertura di un dizionario che
% conterrà le procedure e gli altri dizionari.
/DizionarioDiReencoding 12 dict def
DizionarioDiReencoding begin
/DizionarioDelFontBase /Times-Bold findfont def
/DizionarioDelFontNuovo DizionarioDelFontBase maxlength dict def
DizionarioDelFontBase {
exch dup /FID ne
{dup /Encoding eq
{exch dup length array copy
DizionarioDelFontNuovo 3 1 roll put}
{exch DizionarioDelFontNuovo 3 1 roll put}
ifelse
} {pop pop}
ifelse
} forall
DizionarioDelFontNuovo /FontName /Times-Bold-Reencoded put
NuovoEncoding aload
length 2 idiv
{DizionarioDelFontNuovo /Encoding get 3 1 roll put}
repeat
/Times-Bold-Reencoded DizionarioDelFontNuovo definefont pop
end
%
% Si rende corrente il nuovo font
/Times-Bold-Reencoded findfont Corpo scalefont setfont
%
% Tracciatura delle lettere accentate
3.75 inch 1.5 inch moveto (\330) show
3.75 inch 3.0 inch moveto (\331) show
3.75 inch 4.5 inch moveto (\332) show
3.75 inch 6.0 inch moveto (\333) show
3.75 inch 7.5 inch moveto (\334) show
3.75 inch 9.0 inch moveto (\335) show
%
% Rimozione incapsulamento e stampa
grestore
showpage
%
%%Trailer
%%EOF

%!PS-Adobe-2.0
%%Title: Stampa dell'Encoding Vector di un font
%%Creator: Corso PostScript - parte X - programma 2
%%For: Corso PostScript BIT
%%CreationDate: (4-10-1989) (15:56)
%%BoundingBox: 28 30 566 811
%%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
%
% Procedura nuovaLinea
% Argomenti: - / -
% Variabili Globali: MargineDestro
% Va a linea nuova.
/nuovaLinea
{currentpoint Interlinea sub exch pop MargineDestro
exch moveto} def
%
% Procedura codice
% Argomenti: codice/ -
% Stampa il codice.
/codice
{CodiceCarattere cvs show} def
%
% Procedura carattere
% Argomenti: codice/ -
% Stampa il carattere.
/carattere
{Carattere 0 3 -1 roll put Carattere show} def
%
% Procedura stampaLinea
% Argomenti: codice/ -
% Stampa una linea della tabella.
/stampaLinea
{dup codice
( ) show % 4 spazi fra le parentesi
carattere
nuovaLinea} def
%
% Programma principale
%
% Incapsulamento e tracciatura della cornice
gsave
tracciaCornice
%
% Inizializzazioni
/Interlinea 11 def
/Corpo 12 def
/Times-Bold findfont Corpo scalefont setfont
/Carattere 1 string def
/CodiceCarattere 3 string def
/MargineAlto 10.5 inch def
/MargineDestro 1.5 inch def
/SpazioFraColonne 1.5 inch def
%
% Stampa tabella
MargineDestro MargineAlto moveto
0 1 63 {stampaLinea} for
/MargineDestro MargineDestro SpazioFraColonne add def
MargineDestro MargineAlto moveto
64 1 127 {stampaLinea} for
/MargineDestro MargineDestro SpazioFraColonne add def
MargineDestro MargineAlto moveto
128 1 191 {stampaLinea} for
/MargineDestro MargineDestro SpazioFraColonne add def
MargineDestro MargineAlto moveto
192 1 255 {stampaLinea} for
%
% Rimozione incapsulamento e stampa
grestore
showpage
%
%%Trailer
%%EOF

%!PS-Adobe-2.0
%%Title: Creazione di un font geometrico
%%Creator: Corso PostScript - parte X - programma 3
%%For: Corso PostScript BIT
%%CreationDate: (4-10-1989) (15:56)
%%BoundingBox: 28 30 566 811
%%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
%
% Definizione del Font
%
% Creazione del Dizionario
10 dict dup begin
%
% Definizione degli elementi
/FontType 3 def
%
/FontMatrix [0.001 0 0 0.001 0 0 ] def
%
/FontBBox [0 0 700 700] def
%
/Encoding 256 array def
0 1 255 {Encoding exch /.notdef put} for
Encoding
dup (t) 0 get /triangolo put
dup (c) 0 get /cerchio put
dup (q) 0 get /quadrato put
(r) 0 get /rettangolo put
%
/Metrics 5 dict def
Metrics begin
/.notdef 0 def
/triangolo 600 def
/cerchio 600 def
/quadrato 600 def
/rettangolo 600 def
end
%
/BBox 5 dict def
BBox begin
/.notdef [0 0 0 0] def
/triangolo [ 50 50 550 550] def
/cerchio [ 50 50 550 550]def
/quadrato [ 50 50 550 550] def
/rettangolo [ 50 50 550 550] def
end
%
/CharacterDefs 5 dict def
CharacterDefs begin
% Definizione del carattere vuoto
/.notdef {} def
% Definizione del carattere triangolo
/triangolo {
100 100 moveto
300 500 lineto
500 100 lineto
closepath fill
} def
% Definizione del carattere cerchio
/cerchio {
300 300 200 0 360 arc closepath fill
} def
% Definizione del carattere quadrato
/quadrato {
100 100 moveto
100 500 lineto
500 500 lineto
500 100 lineto
closepath fill
} def
% Definizione del carattere rettangolo
% Si noti che questo carattere è stroked
/rettangolo {
30 setlinewidth
200 100 moveto
200 500 lineto
400 500 lineto
400 100 lineto
closepath stroke
} def
end
%
/BuildChar
{ 0 begin
/Carattere exch def
/DizionarioDelFont exch def
/NomeCarattere DizionarioDelFont /Encoding get Carattere get def
DizionarioDelFont begin
Metrics NomeCarattere get 0
BBox NomeCarattere get aload pop
setcachedevice
CharacterDefs NomeCarattere get exec
end
end
} def
%
/BuildChar load 0 3 dict put
%
/UniqueID 1 def
end
%
% Creazione del font
/MioFont exch definefont pop
%
% Programma principale
%
% Incapsulamento e tracciatura della cornice
gsave
tracciaCornice
%
% Inizializzazioni
/MioFont findfont 3 inch scalefont setfont
%
% Spostamento dell'origine
0.75 inch 5 inch moveto
%
% Stampa di tutti i caratteri del font.
% (la lettera corrisponde all'iniziale
% del nome della figura geometrica).
(tcqr) show
%
% Rimozione incapsulamento e stampa
grestore
showpage
%
%%Trailer
%%EOF

Copyright © 1985: Marco A. Calamari