Robitex's Blog

Ideas in the web

Introduzione a METAPOST


METAPOST

Il linguaggio METAPOST possiede alcune caratteristiche peculiari come la possibilità di risolvere sistemi di equazioni lineari, ma la cosa che mi ha convinto a provare il babbo di Asymptote è stata la decisione degli sviluppatori di luatex di includerlo come libreria nativa con il nome di MPlib.

La sintassi di METAPOST sviluppato originariamente da John D. Hobby, è piuttosto asciutta, del resto deriva dal METAFONT l’originale programma di creazione di font tipografici dello stesso Donald Knuth, creatore di TeX, a differenza del quale produce un output Postscript (quindi il nome), digeribile anche da pdflatex (i disegni possono essere inseriti nel documento direttamente senza conversioni).

Naturalmente una qualsiasi distribuzione LaTeX (che sia TeX Live, MiKTeX o MacTeX), installarerà sul vostro sistema (che sia Linux, Windows o MacOS), la più recente versione di METAPOST.

Primo codice

La funzione primitiva per disegnare è chiamata (ovviamente) draw ed accetta come argomenti percorsi ed anche intere figure chiamate picture. Per esempio per disegnare un rettangolo 36×28 mm si scrive:

draw origin -- (36mm,0) -- (36mm,28mm) -- (0,28mm) -- cycle;

od anche (aggiungendo un po’ di colore):

u = 1mm;
draw origin -- (36u,0) -- (36u,28u) -- (0,28u) -- cycle
  withcolor .625red;

I punti del tipo pair vengono instanziati descrivendone le coordinate tra parentesi tonde ed equiparando l’idea di punto a vettore con il primo estremo nell’origine, così da poter effettuare trasformazioni geometriche come traslazioni (chiave shifted) oppure rotazioni (chiave rotated) od ancora operazioni di scala (chiavi scaled, xscaled, yscaled, zscaled).

Definiamo il rettangolo come percorso e disegnamolo due volte, la prima con riempimento grigio e la seconda solo con il contorno ma traslato del vettore (2mm,2mm), vediamo l’esempio (completando l’esempio con le istruzioni iniziali e finali indispensabili per la corretta compilazione):

% prima prova con METAPOST
beginfig(1);
u = 1.0mm;
path p;
p = origin -- (36u,0) -- (36u,28u) -- (0,28u) -- cycle;

fill p shifted (2u,2u) withcolor .75white;
draw p withcolor .625red;

endfig;
end

ed ecco il risultato:

First test of the METAPOST language

First test of the METAPOST language

Il parametro 1 passato alla funzione beginfig() non è altro che il numero che viene assegnato come estensione al file del disegno. Vengono infatti creati tanti file di output quanti ambienti beginfig()…endfig vi sono nel sorgente e quel numero serve appunto a numerarli.

Il codice va inserito in un file di testo con estensione .mp e poi compilato per ottenere i file dei disegni (il piccolo grande editor SciTE può essere di (grande) aiuto, come pure un visualizzatore Postscript).

Come vedete ci sono i punti e virgola finali che consentono di impaginare il sorgente come si desidera, i commenti che iniziano con il simbolo di percento, ed una sinteticità espressiva generale che in qualche modo esalta la potenza grafica di METAPOST (non lasciatevi ingannare dalla sua modestia…).

Esiste anche la possibilità di instanziare il vettore unitario con direzione specificata per mezzo della funzione dir() che accetta il valore dell’angolo con verso antiorario dall’asse x (così il punto dir(0) è del tutto equivalente al punto (1,0) ).

Per individuare un punto su un segmento è possibile utilizzare l’espressione factor[p1,p2], se factor = 0.50 verrà restituito il punto di mezzo.

Ecco l’ultimo esempio:

% seconda prova con METAPOST
beginfig(1);
% disegnamo un triangolo equilatero
u = 5 mm;

pair A; A=origin;
pair B; B=(7u,0);
pair C; C=(dir(60) scaled 7u);

pair m; m = 0.5[B,C];
pair g; g = 2/3[A,m];

path p; p = A--B--C--cycle;

% regolazione dello spessore della penna
pickup pencircle scaled 4pt;

draw p
     withcolor .625red;
fill p  scaled .8 shifted .2 g
     withcolor .565blue;

endfig;
end
More difficult METAPOST example

More difficult METAPOST example

Bene, ora ne sappiamo abbastanza per procedere, ma mi raccomando, la comprensione dei concetti qui esposti è molto superiore se eseguirete anche degli esercizi con METAPOST, pertanto fateli!!! Ne ricaverete ottime basi e grande soddisfazione.

Happy METAPOST!

7 risposte a “Introduzione a METAPOST

  1. a.ledda 06/11/2009 alle 20:15

    Grazie per il tutorial, Roberto.

    Proprio ieri — non scherzo — mi sono avvicinato per la prima volta ad Asymptote, più per curiosità che per necessità. Oggi ho provato METAPOST, seguendo i tuoi esempi. Ecco un risultato: http://i814.photobucket.com/albums/zz66/lateximages/metapost/mpost.png

    Non è uguale al tuo e, ovviamente, non so perché. Per ora non mi metto il problema, perché non ho tempo di approfondire la faccenda. Ho visto che anche per METAPOST c’è una buona documentazione: ottimo.

    Ciao,
    Antonio

  2. robitex 07/11/2009 alle 01:29

    Ciao Antonio,
    METAPOST merita di essere utilizzato e forse sarà uno dei protagonisti delle future piattaforme di typesetting asincrone basate su luatex.
    Comunque il tuo triangolo mi sembra che sia perfetto no?

    A presto.

  3. a.ledda 07/11/2009 alle 11:32

    Mannaggia: mi sono accorto solo ora, che i link alle immagini sono stati “inquinati” dalle parentesi tonde.😦

  4. a.ledda 07/11/2009 alle 16:29

    \documentclass{article}
    \usepackage{graphicx}
    \DeclareGraphicsRule{*}{mps}{*}{}
    \begin{document}
    \includegraphics{triangolo.1}
    \end{document}

    Perfetto: http://i814.photobucket.com/albums/zz66/lateximages/metapost/metapost6400.png

    Grazie del suggerimento!

    Ciao,
    Antonio

  5. Pingback:Il triangolo di Sierpiński con METAPOST « Robitex’s Blog

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: