[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]
In questo capitolo si raccolgono alcuni esempi di funzioni PostScript che possono essere utili a vario titolo. Trattandosi di un linguaggio specifico per la stampa, non vengono proposti esempi di programmazione standard.
L'unità di misura utilizzata è sempre il punto tipografico, che in questo ambito corrisponde a 1/72-esimo di pollice, ovvero a 0,352 777 7 mm (per converso, un millimetro è pari a 2,834 646 punti). Volendo usare unità di misura più comuni, si possono realizzare alcune funzioni molto semplici che si limitano a moltiplicare il valore per una costante, in modo da ottenere come risultato l'equivalente in punti:
/cm { 28.346456 mul } def % <n> cm % converte centimetri in punti /mm { 2.8346456 mul } def % <n> mm % converte millimetri in punti /pt { 1 mul } def % <n> pt % non converte alcunché /in { 72 mul } def % <n> in % converte pollici in punti
In questo modo, al posto di inserire un valore puro e semplice, basta aggiungere subito dopo la sigla dell'unità di misura, che in realtà è una funzione. Per esempio:
3 cm 18 cm moveto
Evidentemente, la funzione pt è inutile, ma può servire per mantenere coerenza con il resto, nel momento in cui si utilizzi sistematicamente questo meccanismo per indicare le coordinate o le distanze.
Pur non trattandosi di un linguaggio di programmazione normale, quando si cerca di realizzare qualcosa di particolare, può essere comoda la possibilità di mostrare un valore da qualche parte, per verificare il contenuto di una data informazione.
/diag_display_number % <n> <x> <y> diag_display_number { gsave /Helvetica findfont 10 scalefont setfont moveto 100 string cvs show grestore } def
La funzione appena mostrata, serve per ottenere la conversione di un numero in stringa, che poi viene visualizzato nelle coordinate previste. Andrebbe usata nel modo seguente, dove x,y sono le coordinate a partire dalle quali mostrare il valore:
n x y diag_display_number
Dal momento che questa funzione preleva il valore dallo stack, potrebbe essere conveniente la duplicazione di tale valore prima di utilizzarlo:
n dup x y diag_display_number
Volendo completare il problema con una funzione equivalente per la visualizzazione delle stringhe, basta la variante seguente:
/diag_display_string % <stringa> <x> <y> diag_display_string { gsave /Helvetica findfont 10 scalefont setfont moveto show grestore } def
Quando si disegnano delle figure o dei grafici, può essere comodo disporre di qualche funzione che faciliti la collocazione di didascalie o di annotazioni di qualunque tipo. Qui viene proposto un sistema molto semplice, con cui è possibile piazzare delle stringhe allineate correttamente a sinistra, a destra o al centro, date le coordinate di riferimento. Si parte con la definizione di alcune «variabili», che servono per fissare i punti di riferimento delle stringhe:
/set_line_t { /line_t exch def } def /set_line_l { /line_l exch def } def /set_line_r { /line_r exch def } def /set_line_c { /line_c exch def } def /set_line_h { /line_h exch def } def
La funzione line_t verrà usata per conoscere la posizione verticale (Y) della stringa da collocare; la funzione line_l servirà per fornire la posizione iniziale (X) di una stringa da allineare a sinistra; line_r fornirà la posizione finale (X) di una stringa da allineare a destra; line_c fornirà la posizione centrale (X) di una stringa da centrare; infine, line_h servirà per conoscere la distanza tra le righe.
Per usare le funzioni che verranno presentate, dovranno essere impostati inizialmente i valori per le variabili appena descritte. Per esempio, sapendo che si vuole scrivere un testo allineato a sinistra a partire dalla coordinata 100,50, con una distanza tra le righe di 14 punti, basterà impostare i valori nel modo seguente:
50 set_line_t 100 set_line_l 14 set_line_h
Dal momento che non si devono centrare le righe e nemmeno allineare a destra, le altre variabili non servono, altrimenti occorrerebbe impostare line_c o line_r, al posto di line_l.
/show_line_left % <stringa> show_line_left { % Si posiziona all'inizio della riga. line_l line_t moveto % Mostra la riga. show % Sottrae alla posizione Y l'altezza della riga. line_t line_h sub set_line_t } def
Si osservi la funzione show_line_left: si usano i valori restituiti dalle funzioni line_l e line_t per impostare le coordinate iniziali, quindi si visualizza la stringa. Subito dopo si provvede a ridurre il valore della variabile corrispondente alla funzione line_t del valore restituito da line_h (la distanza tra le righe), in modo da poter continuare con la visualizzazione di altre stringhe, con lo stesso allineamento sinistro, subito sotto quella appena inserita.
/show_line_right % <stringa> show_line_right { % Calcola la lunghezza della riga. dup % fa una copia della stringa stringwidth % restituisce le coordinate finali X e Y pop % elimina la coordinata Y % Sottrae dalla posizione destra la lunghezza della riga, % cambiando poi il segno. line_r sub neg % Si posiziona correttamente. line_t moveto % Mostra la riga e va all'inizio di una riga nuova. show % Sottrae alla posizione Y l'altezza della riga. line_t line_h sub set_line_t } def
La funzione show_line_right è molto simile, con la differenza che occorre fare qualche calcolo per individuare la posizione orizzontale di inizio, sapendo la posizione finale ottenuta dalla funzione line_r. Per questo, viene fatta una copia della stringa, che quindi viene misurata con la funzione setlinewidth. Da questa misurazione si espelle l'informazione verticale, che risulta inutile, sottraendo poi a questa il valore restituito da line_r. Quello che si ottiene è la distanza dalla posizione destra finale, con segno invertito, pertanto si inverte nuovamente con la funzione neg. Disponendo della coordinata X, si aggiunge la coordinata Y, data da line_t, spostando la posizione corrente, per poi mostrare la stringa e infine preparare nuovamente la posizione verticale per una nuova riga.
/show_line_center { % Calcola la lunghezza della riga. dup % fa una copia della stringa stringwidth % restituisce le coordinate finali X e Y pop % elimina la coordinata Y 2 div % divide la lunghezza a metà % Sottrae dal centro la metà della riga, cambiando poi il segno. line_c sub neg % Si posiziona correttamente. line_t moveto % Mostra la riga e va all'inizio di una riga nuova. show % Sottrae alla posizione Y l'altezza della riga. line_t line_h sub set_line_t } def
La funzione show_line_center centra la stringa in riferimento alla posizione line_c. I calcoli sono simili a quelli per l'allineamento a destra, con la differenza che la distanza dal centro è pari alla metà della lunghezza della stringa. Il resto è equivalente.
L'esempio seguente mostra come scrivere qualcosa con queste funzioni; la figura 228.1 mostra il risultato che si ottiene osservando il riquadro che va da 0,0 a 150,100:
/Times-Roman findfont 10 scalefont setfont 90 set_line_t 10 set_line_l 140 set_line_r 75 set_line_c 14 set_line_h (Stringa a sinistra) show_line_left (Stringa centrata) show_line_center (Stringa a destra) show_line_right (Ciao) show_line_center () show_line_center (:-\)) show_line_center showpage
|
Naturalmente, si possono predisporre anche delle abbreviazioni a queste funzioni:
/L { show_line_left } def /R { show_line_right } def /C { show_line_center } def
In questo modo, l'indicazione delle stringhe può essere ridotto alla forma seguente:
(Stringa a sinistra) L (Stringa centrata) C (Stringa a destra) R (Ciao) C () C (:-\)) C
Cappella Archive
David Byram-Wigfield, Practical PostScript
David Byram-Wigfield, The TinyDict Typesetter
David Byram-Wigfield, Tinydict
David Byram-Wigfield, Making an electronic book
First Guide to PostScript
<http://www.cs.indiana.edu/docproject/programming/postscript/postscript.html>
daniele @ swlibero.org
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome esempi_di_funzioni_postscript.html
[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico]