Una Chiave per il Desktop Publishing

Corso di PostScript - Marco A. Calamari

Sesta Puntata


In questa puntata ci occuperemo dell'utilizzo più comune e più importante del PostScript; la stampa dei testi. Per far questo dovremo introdurre pochi nuovi operatori, e rispolverare l'uso di alcuni altri già noti. Tratteremo inoltre alcune problematiche elementari di impaginazione.


L'utilizzo più diffuso del PostScript è senz'altro per la stampa di testi; nelle precedenti puntate abbiamo appena avuto il tempo di stampare qualche stringa isolata, in quanto ci siamo occupati prevalentemente dell'altro utilizzo principale del PostScript, cioè della grafica.

bene, direte voi, è giunto finalmente il momento di vedere all'opera i potenti operatori del PostScript, grazie ai quali è possibile impaginare, incolonnare, sillabare, e fare tutte quelle manipolazioni tipiche dell'elaborazione testi.

Se questo è il vostro pensiero, state per subire una delusione; infatti questi operatori non esistono; sarebbe come pretendere di avere, in Basic, gli operatori matematici che permettono di risolvere un sistema di equazioni differenziali o, in Cobol, quelli per compilare la dichiarazione dei redditi. Per fare queste cose è necessario apprendere l'uso di operatori molto più semplici, come le moltiplicazioni in Basic o i formati di stampa in Cobol, ed utilizzarli per scrivere programmi che realizzino queste operazioni più complesse.

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 utilizzate, ne utilizzeremo abitualmente solo una, ma forniremo almeno una volta la traduzione fra parentesi.

- Un font di carattere (in italiano tipo di carattere) è la raccolta ordinata di tutti i caratteri di uso normale (lettere maiuscole e minuscole, numeri, segni di interpunzione, caratteri speciali e lettere accentate), disegnati con certe caratteristiche comuni, che di solito comprende anche segni non presenti nella lingua italiana, ma che sono definiti in altri lingue, come tilde, dieresi, dittonghi, eccetera. Esso viene individuato da tre parametri fondamentali; il font, il corpo e lo stile. Nel campo dell'informatica grafica si distinguono due tipi principali di font: screen font (font di schermo) e outlined font.

- Gli screen font sono font descritti per mezzo della bitmap di ciascun carattere; hanno il vantaggio di poter essere rappresentati direttamente e velocemente su un video, e lo svantaggio di essere meno precisi e più ingombranti in termini di spazio in memoria e su disco.

- Gli outlined font sono font descritti geometricamente fornendo il perimetro (linee, archi e curve) che descrive il carattere, il quale viene poi riempito col colore prescelto (di solito, ma non sempre, nero pieno); hanno il vantaggio di essere estremamente precisi e poco ingombranti, ma lo svantaggio di non poter essere rappresentati direttamente su un device raster (come un video od una stampante laser), ma di richiedere prima un certo numero di operazioni di trasformazione. La descrizione geometrica è di solito molto complessa e dettagliata; un solo carattere può richiedere anche parecchie decine di segmenti ed archi di curva.

- Gli stroked font sono una variazione degli outlined font, in cui il carattere viene descritto sempre in termini di entità geometriche, fornendo, invece del perimetro, l'asse e la larghezza di ciascun segmento del carattere. Per fissare le idee si pensi che più un carattere è formato da segmenti di spessore costante e più è adatto ad essere rappresentato con questo metodo; il tipico font stroked è il Courier, mentre un esempio di font outlined è il Times (si noti che quasi tutti i font PostScript sono outlined).

- Si indica con font (o tipo) di carattere la raccolta di una serie completa di caratteri, aventi a comune certe caratteristiche stilistiche che li rendono simili, piacevoli a guardarsi e di facile lettura, ed indicati di solito con un nome convenzionale o di fantasia; esempi noti sono Times, Courier, Helvetica, ma ne esistono centinaia di meno noti, alcuni dei quali sono copie esatte di altri font più famosi, a cui viene cambiato il nome per problemi di copyright.

- Il corpo di un tipo di caratteri è un numero che indica l'altezza del font di caratteri espressa in punti; tipograficamente un punto corrisponde quasi esattamente ad 1/72 di pollice, ed in PostScript un punto è esattamente 1/72 di pollice.

- Lo stile infine consiste in variazioni dell'aspetto grafico di un certo font di caratteri, che ne conserva certe caratteristiche comuni e ne varia altre; alcuni stili sono grassetto (in inglese bold), corsivo (italic), sottolineato (underline), ombreggiato (shadow), e così via.

Deve essere chiaro che, nel caso di font outlined o stroked, il file contenente un certo font di caratteri precisa sia il tipo che lo stile, ma lascia indeterminato il corpo, che può essere variato ingrandendo o rimpicciolendo per similitudine la stessa descrizione geometrica; in PostScript per convenzione, le fonti di carattere sono descritte a corpo 1 o 1000, e devono quindi essere comunque scalate per poterle utilizzare.

Gli utenti di software per Macintosh, di MS Windows o di GEM, che utilizzano font di tipo screen, si trovano in una situazione opposta. In questi casi infatti non si usano caratteri descritti geometricamente ma bitmapped. Il file di un certo screen font è descritto direttamente in termini di pixel accesi o spenti, e specifica quindi il font, il corpo e lo stile; in molti casi però esistono algoritmi che permettono di ricavare, dalla descrizione di un certo carattere di font e corpo dati ed in stile normale, una approssimazione accettabile della stessa lettera in grassetto, in corsivo od in altri stili. In pratica quindi il file di uno screen font precisa tipo e corpo, ma lascia libero (nei casi in cui non occorrano qualità elevate) lo stile.

Un modo molto utilizzato per classificare le varie famiglie di font è la suddivisione in caratteri con grazie (Courier, Times, Bookman, ecc.) e caratteri senza grazie, o caratteri bastoni (Helvetica, Geneva, Monaco).

- Le grazie sono quelle piccole sporgenze che si trovano alle estremità dei caratteri, come per esempio alla base e sulle braccia di una T maiuscola scritta in Times; servono, oltre che per un evidente scopo estetico, per facilitare la lettura, guidando l'occhio nel passaggio da una lettera all'altra. I caratteri con grazie sono preferiti per la stampa di libri e lunghi testi, mentre i caratteri bastoni vengono spesso utilizzati nella stampa di cataloghi.

Un'altra suddivisione importante è quella fra caratteri proporzionali (proportional) e non proporzionali (monospaced).

- Un font si dice proporzionale (come Times, Bookman, Helvetica e Geneva) quando gli spazi che separano una lettera dall'altra sono tutti uguali; questo significa che i rettangoli (bounding box) che racchiudono esattamente ogni carattere sono di dimensioni diverse, od in parole povere che le singole lettere hanno larghezze diverse. I caratteri non proporzionali (come Courier e Monaco) invece hanno lettere tutte della stessa larghezza; questo significa che, data la diversa larghezza di lettere come la i rispetto ad altre come la m, gli spazi bianchi che separano le lettere di una parola saranno di dimensione diversa. I font proporzionali si utilizzano nella maggioranza dei casi, perché sono di lettura meno affaticante, mentre i non proporzionali si riservano a quelle situazioni dove è importante l'incolonnamento, come nel caso della stampa di tabelle o listati di programmi.

Un testo può essere disposto nella pagina in molti modi diversi, anche limitandosi ai casi più semplici di pagine in cui non sono presenti elementi grafici, come fotografie, disegni o marchi. Innanzitutto il testo può essere disposto su una colonna (è il caso di molti libri) o su più colonne (giornali, riviste, ecc.); la scelta è dettata principalmente da considerazioni di carattere estetico e stilistico che vanno ben oltre gli scopi di questo corso, e che sono l'oggetto di interi trattati dedicati ai metodi per l'ottenimento di una pagina composta in maniera equilibrata.

All'interno di una colonna il testo può essere:

Un'altra distinzione importante per l'aspetto finale del testo è se viene sillabato oppure no.

Un testo sillabato con un programma di impaginazione viene di solito memorizzato con il carattere ASCII 31 (Hex 1F) inserito nei punti dove è possibile spezzare una parola. Si noti tuttavia che, con la maggior parte dei word processor, se si sillaba un testo e poi se ne varia in qualche modo l'impaginazione è necessario ripetere l'operazione di sillabazione. Infatti i word processor (ad esempio Microsoft Word 3.0) di solito non inseriscono il carattere di sillabazione fra tutte le sillabe del testo, ma soltanto in quei punti dove, data una certa impaginazione, è necessario spezzare una parola. Diverso è il caso dei programmi di sillabazione dedicati (Hypens!, TurboSplit, ecc.) o dei programmi di impaginazione con sillabazione automatica (es. Quark XPress); questi infatti, non conoscendo come il testo è impaginato, inseriscono il carattere di sillabazione fra tutte le sillabe del testo, oppure sillabano al volo il testo ogni volta che esso o l'impaginazione vengono variati. Se quindi ci si trova nella situazione di dover comporre un testo realizzato con un word processor utilizzando un programma di Desktop Publishing non dotato di sillabazione automatica in italiano, conviene trattarlo con un programma di sillabazione dedicato, in modo da evitare di dover risillabare e verificare il testo ad ogni modifica dell'impaginazione.

Gli operatori di trattamento testi

Nella terza parte di questo corso abbiamo definito i principali operatori di trattamento testi, cioè findfont, scalefont, setfont e show. Ricordiamo brevemente che findfont pone sullo stack degli operandi una copia del dizionario contenente il font (nello stile) richiesto, scalefont scala il font al corpo richiesto, setfont rende il font sullo stack quello corrente per le successive operazioni di stampa, ed infine show stampa la stringa fornita come argomento usando il font corrente ed a partire dal punto corrente. Se, memori delle passate esperienze con gli operatori grafici, avete pensato che gli operatori dedicati al testo non fossero solo questi quattro avete indovinato in pieno! Prima di passare a fare qualche esempio, dobbiamo quindi introdurre alcuni nuovi operatori.

Operatori di trattamento delle stringhe

Operatori di conversione

Operatori di trattamento dei font

Operatori di stampa

- stampa il carattere;

- pone il carattere stampato sullo stack;

- pone il carattere successivo sullo stack;

- esegue la procedura proc .

Quest'ultimo operatore è di particolare interesse; viene utilizzato in vari modi, il più comune dei quali è la stampa di un testo eseguendo ciò che viene chiamato kerning. Si chiama kerning l'operazione di modifica della spaziatura fra caratteri nel caso che un dato carattere sia seguito da un certo altro; facciamo un esempio (vedi Figura 1) e supponiamo che in un certo punto di un testo la lettera A sia seguita da una V. Con l'operatore show queste due lettere verrebbero stampate con una spaziatura standard, ma, poiché il lato destro della A ha la stessa inclinazione del lato sinistro della V, la spaziatura apparirebbe all'occhio più grande del normale.

Per fare in modo che questo non avvenga e che le lettere appaiano uniformemente spaziate, è necessario riconoscere quando nel testo sono presenti particolari coppie di caratteri, e diminuire la spaziatura di un valore opportuno, diverso per ciascuna di esse; questa operazione viene eseguita da una procedura scritta dall'utente, che viene fornita come procedura all'operatore kshow.

Qualche esempio

Un esempio elementare di impaginazione di un brevissimo testo è riportato nel programma del Listato 1, il cui output è mostrato in Figura 2. Si noti che questo programma non esegue nessun calcolo di impaginazione, cioè non sillaba le parole del testo, e non le distribuisce in righe, colonne e pagine; la realizzazione di queste funzioni più avanzate (ed anche più complesse) sarà oggetto di futuri esempi.

Il secondo esempio riguarda l'operatore kshow, utilizzato in maniera non standard, (cioè non per fare il kerning); esso viene infatti impiegato per stampare una parola con le lettere separate dal simbolo - (vedi Listato 2 e Figura 3).

Il terzo, e per questa volta ultimo, esempio (vedi Listato 3 e Figura 4) produce la stampa dell'elenco dei font posseduti da una stampante PostScript, sia inclusi nelle ROM che caricati temporaneamente nella memoria. Si noti, nel loop ottenuto con l'operatore forall, l'utilizzo dell'operatore pop per scartare il font vero e proprio, posto sullo stack insieme al suo nome (è quest'ultimo ovviamente che deve essere stampato).

To be continued .....

Per questa volta niente esercizi (siamo in attesa di vostre soluzioni per quelli delle precedenti puntate). Ci risentiremo la prossima volta per un approfondimento delle problematiche di stampa di testi, dedicato all'ottenimento di effetti speciali di stampa ed all'impaginazione di testi non formattati.


% Corso PostScript - parte VI - programma 1
% Esempio di stampa di un testo marginato
% a sinistra, centrato e giustificato
%
% 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 centraTesto
% Argomenti: stringa
% Variabili Globali: AsseTesto
% Variabili Locali: Stringa
% La procedura centra il testo rispetto al
% currentpoint; l'asse del testo deve
% essere memorizzato nella variabile
% AsseTesto .
/centraTesto {
/Stringa exch def
AsseTesto Stringa stringwidth pop sub 2 div 0
rmoveto Stringa show } def
%
% Procedura giustificaTesto
% Argomenti: stringa
% Variabili Globali: LarghezzaTesto
% Variabili Locali: Stringa
% Questa procedura stampa una stringa
% giustificandola ad una certa larghezza;
% il currentpoint deve essere il margine
% sinistro desiderato
/giustificaTesto {
/Stringa exch def
LarghezzaTesto Stringa stringwidth pop sub
Stringa length 1 sub div 0 Stringa ashow
} def
%
% Procedura aCapo
% Argomenti: -
% Variabili Globali: MargineSinistro , AltezzaTesto
% Questa procedura manda a capo una riga,
% allineadosi al margine sinistro desiderato
/aCapo{
MargineSinistro
currentpoint exch pop AltezzaTesto sub
moveto
} def
%
%
% Programma principale
%
% Incapsulamento e disegno della cornice
gsave
tracciaCornice
%
% Definizione del carattere da utilizzare e dell'origine
/Times-Bold findfont 0.5 inch scalefont setfont
0 inch 9 inch translate
%
% Definizione delle variabili globali
/MargineSinistro 2.0 inch def
/LarghezzaTesto 4.5 inch def
/AltezzaTesto 0.5 inch def
/AsseTesto MargineSinistro 2 mul
LarghezzaTesto
add 2 div def
%
% Stampa di testo marginato a sinistra
MargineSinistro 0 moveto
(Esempio di testo) show aCapo
(stampato) show aCapo
(marginato a sinistra) show aCapo
%
% Stampa di testo centrato
aCapo
aCapo
(Esempio di testo) centraTesto aCapo
(stampato) centraTesto aCapo
(centrato) centraTesto aCapo
%
% Stampa di testo giustificato
aCapo
aCapo
(Esempio di testo) giustificaTesto aCapo
(stampato) giustificaTesto aCapo
(giustificato) giustificaTesto aCapo
%
% Rimozione incapsulamento e stampa
grestore
showpage

% Corso PostScript - parte VI - programma 2
% Esempio stampa di un testo con i caratteri
% separati da un bullet.
%
% 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
gsave
%
tracciaCornice
/Times-Bold findfont
1 inch scalefont setfont
1.5 inch 5.5 inch moveto
{pop pop (\267) show} (KSHOW) kshow
%
% Rimozione incapsulamento e stampa
grestore
showpage

% Corso PostScript - parte VI - programma 3
% Stampa della lista dei font residenti o caricati
%
% 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
gsave
% Inizializzazioni font e origine
% Tracciamento della cornice
/Times-Roman findfont 0.25 inch scalefont setfont
tracciaCornice
1 inch 10.5 inch translate
/fontname 30 string def
%
% Loop per ogni elemento di FontDirectory
FontDirectory
{ 0 0 moveto pop fontname cvs
show
0 inch -0.25 inch translate }
forall
%
% Rimozione incapsulamento e stampa
grestore
showpage

Copyright © 1985: Marco A. Calamari