[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]


Capitolo 228.   Esempi di funzioni PostScript

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.

228.1   Unità di misura

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.

228.2   Funzioni diagnostiche

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

228.3   Gestione di stringhe

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

Figura 228.1. Esempio nell'uso delle funzioni sulle stringhe.

rotazione

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

228.4   Riferimenti

Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- 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]