MetaPost / Macro avec paramètres optionnels

Macro avec paramètres optionnels

L'exemple ci-dessous montre une façon d'adjoindre des paramètres optionnels à une macro. Les explications sont dans le source.

exemple.mp [ source brut ]

 %@Auteur: Philippe Ivaldi
 %@Date: 24 mars 2006
 
 tertiarydef a << b = a, b enddef;
 def even (expr a) = not odd(a) enddef;
 
 %%Marquage d'un point avec des options
 vardef marque(expr p)(text t) =
 %% Trace une marque translatée du pair p avec les options t
 %% Options t:
 %%	"type"<<"{+|x|-|o|.||}" (type de marque)
 %%	angle<<Num (rotation de la marque)
 %%	echelle<<Num (coeff multiplicateur de la marque)
 %%	couleur<<color (couleur de la marque)
 %%	epaisseur<<Num (epaissuer du trait)
   save typemarque,i,current,chain,type,angle,echelle,couleur,epaisseur,$;
   string typemarque,$;
   color couleur;
   numeric i,angle,echelle,epaisseur; i:=0;
   path $;
   string current;
   typemarque:="+";
   echelle:=1;
   angle:=0;
   couleur:=black;
   epaisseur:=0;
   for chain=t:
     if even(i):
       current:= chain ;
     else:
       if current = "type":
 	typemarque := chain;
       elseif current = "angle":
 	angle := chain;
       elseif current = "echelle":
 	echelle := chain;
       elseif current = "couleur":
 	couleur := chain;
       elseif current = "epaisseur":
 	epaisseur := chain;
       else:
 	errmessage("marque: option inconnue ->"&ditto&current&ditto);
       fi;
     fi;
     i := i + 1;
   endfor;
   if odd(i):
     errmessage("marque: nombre d'argument impair ->"&decimal(i));
   fi;
   if ((typemarque="+") or (typemarque="x")):
     $:=(0,0)--echelle*cm*(-1/20,0)--(0,0)--echelle*cm*(1/20,0)--(0,0)--
 	echelle*cm*(0,1/20)--(0,0)--echelle*cm*(0,-1/20)--cycle;
     if typemarque="x" : angle:=angle+45;fi;
   elseif ((typemarque="-") or (typemarque="|")) :
     $:=echelle*cm*(-1/20,0)--echelle*cm*(1/20,0);
     if typemarque="|" : angle:=angle+90;fi;
   elseif typemarque="o" :
     $:=fullcircle scaled (echelle*cm/20);
   elseif typemarque="." :
     $:=(0,0);
   else :
     errmessage("marque : type iconnu ->"&ditto&typemarque&ditto);
   fi;
   draw ($ rotated angle shifted p) 
     withcolor couleur 
     withpen pencircle scaled epaisseur;
 enddef;
 
 
Conversion au format PDF de exemple.1
 beginfig(1);
   marque((1cm,1cm))("echelle"<<4);
   marque((0,0))("type"<<"+","angle"<<45,"echelle"<<4,"couleur"<<blue,"epaisseur"<<2bp);
   draw (-1cm,-1cm)--(2cm,2cm);
 endfig;
 end
 

 

Validation CSS Validation XHTMLJean-Michel Sarlat — Dernière modification : 25 mars 2006 (0.07s - 3778025 - jeudi 20 novembre 2008) vers le haut