[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 444.   LaTeX: figure

Esistono diversi modi di realizzare dei disegni o di importare delle immagini esterne con LaTeX. Probabilmente, la tecnica più comune è quella di incorporare un'immagine o un disegno realizzato con strumenti interattivi esterni, ma è comunque importante conoscere più possibilità a disposizione, anche se non nel dettaglio.

444.1   Disegnare con LaTeX

LaTeX offre un ambiente particolare, picture, nel quale è possibile realizzare dei disegni utilizzando eventualmente dei comandi specifici. In generale, si tratta soprattutto di grafici, che contengono anche del testo collocato in modo preciso. L'esempio seguente serve per dare un punto di riferimento visivo alla descrizione che viene fatta successivamente a proposito di questo ambiente:

bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 

\setlength{\unitlength}{1cm}
\begin{picture}(3,2)(0,0)
\put(0,0){0,0}
\put(0,0){\line(1,0){3}}
\put(0,2){\line(1,0){3}}
\put(0,0){\line(0,1){2}}
\put(3,0){\line(0,1){2}}
\put(3,2){3,2}
\end{picture}

bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 

Ecco il risultato della composizione. Il testo prima e dopo la figura, serve a comprendere in che modo LaTeX la allinea e quanto viene spaziata verticalmente:

figura

L'ambiente picture viene dichiarato in modo insolito rispetto agli altri comandi di LaTeX:

\setlength{\unitlength}{dimensione}

...

\begin{picture}(ampiezza,altezza)(coordinata_iniziale_x,coordinata_iniziale_y)
    \put(coordinata_x,coordinata_y){oggetto}
    ...
    ...
\end{picture}

In pratica, da qualche parte del documento, prima dell'uso dell'ambiente picture, occorre assegnare un valore (non elastico) alla lunghezza \unitlength; questa lunghezza diventa poi l'unità di misura delle lunghezze e delle coordinate usate nell'ambito dell'ambiente picture. Naturalmente, il valore di \unitlength può essere cambiato successivamente, prima di altre figure.

Come si può vedere, l'ambiente picture utilizza degli argomenti tra parentesi tonde, che non si trovano altrimenti in LaTeX, ma la cosa più interessante è che la seconda parentesi tonda è facoltativa.(1)

La prima coppia di numeri tra parentesi tonde serve a delimitare un rettangolo ideale, all'interno del quale si intende collocare la figura. Nel caso dell'esempio, dal momento che \unitlength è di 1 cm, si tratta di un rettangolo largo 3 cm e alto 2 cm. La seconda coppia di numeri, opzionale, specifica le coordinate dell'angolo inferiore sinistro. Di solito si assegna a queste coordinate il valore zero, come si vede nell'esempio.

Gli «oggetti» grafici o testuali che vengono piazzati nella figura possono anche essere collocati al di fuori del rettangolo che la dovrebbe contenere, ma ovviamente, in tal modo viene meno il senso della definizione all'inizio dell'ambiente picture.

Tutto ciò che appare all'interno dell'ambiente picture viene inserito tramite il comando \put, dove, sempre tra parentesi quadre, si individuano le coordinate iniziali di un oggetto da collocare. Queste coordinata iniziali si intendono sempre relative alle coordinate iniziali del rettangolo in cui si colloca la figura.

L'esempio introduttivo, mostra un riquadro, disegnato sul bordo esterno del rettangolo che rappresenta l'area della figura. Inoltre, vengono collocate due etichette testuali, a partire dall'angolo inferiore sinistro di questo rettangolo e a partire dall'angolo superiore destro, per consentire di comprendere in che modo viene collocato il testo. In effetti, si può vedere che quanto scritto a partire dall'angolo superiore destro si trova in pratica al di fuori del rettangolo della figura.

All'interno del controllo di \put possono essere usati diversi comandi specifici, con i quali si realizzano facilmente linee, riquadri, ovali e cerchi. Viene mostrato un elenco parziale di questi.

Comando Descrizione
\circle*{diametro}
Disegna un cerchio con centro nelle coordinate iniziali, del diametro indicato, espresso in quantità di \unitlength. Se si usa l'asterisco, si ottiene un cerchio pieno (nero).
\dashbox{lunghezza_del_tratteggio}(ampiezza,altezza)\
  \[t|l|b|r|tl|bl|br|tr]{testo}
Disegna un rettangolo tratteggiato, con le coordinate iniziali corrispondenti all'angolo inferiore sinistro. L'ampiezza e l'altezza sono numeri che esprimono quantità di \unitlength. All'interno del rettangolo si può collocare del testo, contenuto nell'ultimo argomento, che di solito appare al centro, salvo il suo riposizionamento con l'uso di lettere particolari nell'argomento opzionale tra parentesi quadre.
\makebox(ampiezza,altezza)[t|l|b|r|tl|bl\
  \|br|tr]{testo}
Delimita un rettangolo, senza bordo, con le coordinate iniziali corrispondenti all'angolo inferiore sinistro. L'ampiezza e l'altezza sono numeri che esprimono quantità di \unitlength. All'interno del rettangolo si può collocare del testo, contenuto nell'ultimo argomento, che di solito appare al centro, salvo il suo riposizionamento con l'uso di lettere particolari nell'argomento opzionale tra parentesi quadre.
\frame{oggetto}
Disegna una cornice attorno all'oggetto, senza aggiungere altro spazio.
\line(scostamento_x,scostamento_y){lunghezza}
Disegna una linea a partire dalle coordinate iniziali, passante idealmente nelle coordinate descritte tra parentesi tonde, come valore che va a sommarsi alle coordinate iniziali. Questo punto passante può essere indicato solo con valori interi, da zero a sei, e serve in pratica a descrivere l'inclinazione della linea.
\vector(scostamento_x,scostamento_y){lunghezza}
Disegna una linea, come il comando \line, aggiungendo una freccia all'estremità finale.
\oval(ampiezza,altezza)[t|l|b|r|tl|bl|br|tr]
Disegna un ovale, oppure, se molto grande, un rettangolo smussato. Le lettere tra parentesi quadre, opzionali, consentono di mostrare solo una porzione dell'ovale.
\linethickness{lunghezza}
Consente di fissare lo spessore delle linee diritte generate da alcuni comandi. È importante osservare che la lunghezza della linea deve essere un valore positivo, espresso in modo indipendente da \unitlength.

Viene mostrato un esempio complessivo dei comandi descritti (escluso \linethickness):

\setlength{\unitlength}{1cm}
\begin{picture}(9,6)(0,0)
\put(0,0){\frame{\makebox(9,6){}}}
\put(1,1){\frame{tizio}}
\put(4,3){\dashbox{0.1}(1,0.5){caio}}
\put(4,3){\line(-3,-2){2.6}}
\put(4.5,3){\vector(0,-1){1}}
\put(4.5,1.5){\circle{1}}
\put(7,1.5){\oval(2,1)}
\put(5,1.5){\line(1,0){1}}
\end{picture}

figura

Come si intende, la realizzazione di disegni attraverso l'ambiente picture, può risultare impegnativo, quando il disegno diventa complesso. Tuttavia esiste la possibilità di usare XFig (capitolo 240), che è in grado di esportare i propri disegni in formato LaTeX, con le limitazioni grafiche necessarie. A titolo di esempio, si suppone di avere realizzato il file FIG disegno.fig, corrispondente a ciò che si può vedere sotto:

disegno realizzato con XFig

Per trasformare questo file in codice adatto a un sorgente LaTeX si può usare fig2dev nel modo seguente, allo scopo di generare il file disegno.tex:

fig2dev -L latex disegno.fig disegno.tex[Invio]

Il file che si ottiene è piuttosto complesso e probabilmente qualche comando non viene individuato correttamente da LaTeX. Per ovviare all'inconveniente, dovrebbe essere sufficiente eliminare i comandi che creano dei problemi. In generale dovrebbe trattarsi del comando \color:

cat disegno.tex | sed "s/[\]color\\[rgb\\][{][0-9,]*[}]//" \
  \> disegno_2.tex
[Invio]

Ecco cosa si ottiene alla fine, con la composizione LaTeX:

figura

444.2   Importazione di file EPS esterni

Un modo più semplice di inserire delle immagini nel testo realizzato con LaTeX è quello di incorporare delle immagini esterne attraverso il pacchetto epsfig, che si incorpora con il comando seguente, inserito preferibilmente nel preambolo:

\usepackage{epsfig}

Successivamente è possibile usare il comando \epsfig per fare riferimento a un file EPS (Encapsulated PostScript) da inserire nella composizione finale. Semplificando si può indicare come nel modello sintattico seguente:

\epsfig{file=file_eps,height=altezza,width=larghezza,angle=rotazione}

Il file rappresenta il percorso assoluto o relativo di un file EPS (oppure PostScript), ma senza estensione: il pacchetto epsfig si attende di trovarlo con l'estensione .ps. La larghezza e l'altezza vengono espresse nell'unità di misura desiderata; infine, l'angolo di rotazione permette di girare l'immagine; di solito si lascia il valore zero.

Non tutte le informazioni sono necessarie; per esempio, se si omettono le informazioni su altezza e larghezza, si fa riferimento alle dimensioni originali; nello stesso modo, se si mette solo la larghezza, si ottiene un'altezza proporzionale. In pratica, si individuano delle opzioni separate da virgole che possono essere omesse.

L'uso del pacchetto epsfig è compatibile con pdfLaTeX, che invece incorpora immagini in formato PNG. Questi file vengono cercati nello stesso percorso, ma con estensione .png.

In alternativa esiste anche un altro pacchetto adatto all'inserimento di immagini EPS. Si tratta di graphicx che si incorpora con il comando seguente inserito nel preambolo del sorgente LaTeX:

\usepackage{graphicx}

Successivamente si può usare il comando \includegraphics:

\includegraphics[width=larghezza,height=altezza,scale=scala,angle=rotazione]{file_eps}

A differenza di quanto visto con \epsfig, c'è anche la possibilità di definire una scala, attraverso un valore, dove l'unità rappresenta un rapporto pari al 100 %.

Con \includegraphics esiste anche un'altra differenza rispetto \epsfig, che è più importante: è necessario indicare anche l'estensione del file, che non è più determinata automaticamente. In questo modo, se si intende usare pdfLaTeX, è necessario fare riferimento a formati grafici differenti, cambiando di conseguenza l'estensione.

444.3   Estrazione di file EPS dal file PostScript finale

All'interno di un file PostScript, generato attraverso LaTeX e Dvips, le immagini inserite incorporando file EPS, come descritto nella sezione precedente, sono delimitate da due direttive molto precise:

%%BeginDocument: nome_file
codice_eps_della_figura
%%EndDocument

Sapendo questo, è possibile recuperare le immagini da un file PostScript di questo tipo attraverso un procedimento manuale, o automatico. Quello che segue è un piccolo programma Perl che legge dallo standard input il file PostScript e crea tutti i file che trova dichiarati come appena descritto (una copia di questo file dovrebbe essere disponibile anche qui: <allegati/a2/ps-latex-picture-save>):

#!/usr/bin/perl
#
my ($line)    = "";
my ($picture) = "";
my ($save)    = 0;
#
while ($line = <STDIN>)
  {
    if    ($line =~ m/^\%\%BeginDocument: (\S+)$/)
      {
        $save = 1;
        $picture = $1;
        open (PICTURE, "> $picture");
      }
    elsif ($line =~ m/^\%\%EndDocument$/)
      {
        close (PICTURE);
        $picture = "";
        $save = 0;
      }
    else
      {
        if ($save)
          {
            print PICTURE ("$line");
          }
      }
  }

Supponendo che questo programma sia stato salvato nel file ps-latex-picture-save e che sia stato reso eseguibile, si potrebbe usare come nell'esempio seguente:

ps-latex-picture-save < mio_file.ps[Invio]

Si osservi che questo procedimento può funzionare solo se il file PostScript di partenza è stato ottenuto direttamente da Dvips, tenendo conto che non ci devono essere state delle rielaborazioni successive, altrimenti si perdono i riferimenti descritti.

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) Qui non sono state usate della parentesi quadre sintattiche per non creare confusione.


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome latex_figure.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!