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
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.
a questo punto lo stack dei dizionari, che inizialmenteconteneva
ha assunto la configurazione
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)
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
ora lo stack dei dizionari, ha assunto la configurazione
e, con i soliti comandi, possiamo esaminarne il contenuto;vediamo per esempio chi è il vero ed originale inventore delfont Helvetica
Guarda guarda, non c'è quindi solo l'Adobe Systems nel mondodei font!
Potete ora chiudere il dizionario FontInfo con questo comando
lo stack dei dizionari ritorna quindi
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
poteva essere scritta (in ottale)
oppure (in esadecimale)
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
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.
Copyright © 1985: Marco A. Calamari