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¤t&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;

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