%@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;

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
