%  arrsym.mf
%  Anders G S Svensson

%  This file was tangled from arrsym.fw.
%  $Revision: 1.9 $
%  $Date: 1995/04/01 02:31:13 $

compute_spread(.45x_height#,.55y_height#);
numeric thin_spread#; thin_spread#:=4/5spread#;
define_pixels(thin_spread);

def rightallo(expr code) =
   beginchar(code, 18u#, v_center(spread#+rule_thickness#));
      pickup rule.nib;
      lft x1=hround u - eps; x2=x1; x7=x8=w-x1;
      y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
      draw z1--z7; draw z2--z8;
      pickup crisp.nib; rt x0=hround(w-u)+eps; y0=y2;
      pos3(rule_thickness,0);
      y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0-6u-eps;
      pos5(rule_thickness,angle(z4-z0)); z5l=z0;
      z9=.381966[.5[z3,z4],z0];
      erase filldraw z0..{z3-z9}z3--(w,y3)--z0&cycle;
      filldraw z5l..{z3-z9}z3r---{z9-z3}z3l..z5r--cycle;
   endchar;
enddef;

def rightpara(expr code) =
   beginchar(code, 18u#, v_center(spread#+rule_thickness#));
      pickup rule.nib;
      lft x1=hround u - eps; x2=x1; x7=x8=w-x1;
      y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
      draw z1--z7; draw z2--z8;
      pickup crisp.nib; rt x0=hround(w-u)+eps; y0=y1;
      pos4(rule_thickness,0);
      y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0-6u-eps;
      pos5(rule_thickness,angle(z3-z0)); z5l=z0;
      z9=.381966[.5[z3,z4],z0];
      erase filldraw z0..{z4-z9}z4--(w,y4)--z0&cycle;
      filldraw z5r..{z4-z9}z4l---{z9-z4}z4r..z5l--cycle;
   endchar;
enddef;

def leftpara(expr code) =
   beginchar(code, 18u#, v_center(spread#+rule_thickness#));
      pickup rule.nib;
      lft x7=hround u - eps; x8=x7; x1=x2=w-x7;
      y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
      draw z1--z7; draw z2--z8;
      pickup crisp.nib; lft x0=hround u - eps; y0=y2;
      pos3(rule_thickness,0);
      y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0+6u+eps;
      pos5(rule_thickness,angle(z4-z0)); z5l=z0;
      z9=.381966[.5[z3,z4],z0];
      erase filldraw z0..{z3-z9}z3--(0,y3)--z0&cycle;
      filldraw z5r..{z3-z9}z3r---{z9-z3}z3l..z5l--cycle;
   endchar;
enddef;

def leftallo(expr code) =
   beginchar(code, 18u#, v_center(spread#+rule_thickness#));
      pickup rule.nib;
      lft x7=hround u - eps; x8=x7; x1=x2=w-x7;
      y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
      draw z1--z7; draw z2--z8;
      pickup crisp.nib; lft x0=hround u - eps; y0=y1;
      pos4(rule_thickness,0);
      y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0+6u+eps;
      pos5(rule_thickness,angle(z3-z0)); z5l=z0;
      z9=.381966[.5[z3,z4],z0];
      erase filldraw z0..{z4-z9}z4--(0,y4)--z0&cycle;
      filldraw z5l..{z4-z9}z4l---{z9-z4}z4r..z5r--cycle;
   endchar;
enddef;

def downallo(expr code) =
   beginchar(code, 11u#, asc_height#, asc_depth#);
      pickup rule.nib;
      top y1=top y2=h+eps; bot y7=-d; y8=y7;
      x1=x7; x2=x8; x1-x2=spread; .5[x1,x2]=crisp.lft hround(crisp.rt .5w);
      draw z1--z7; draw z2--z8;
      pickup crisp.nib;
      bot y0=-d-eps; x0=x2;
      pos4(rule_thickness,90);
      x2-x3=x4-x1=3u+eps; y3=y4=y0+.48asc_height-eps;
      pos6(rule_thickness,angle(z3-z0)); z6l=z0;
      z9=.381966[.5[z3,z4],z0];
      erase filldraw z0..{z4-z9}z4--(x4,-d-eps)--z0&cycle;
      filldraw z6l..{z4-z9}z4l---{z9-z4}z4r..z6r--cycle;
   endchar;
enddef;

def downpara(expr code) =
   beginchar(code, 11u#, asc_height#, asc_depth#);
      pickup rule.nib;
      top y1=top y2=h+eps; bot y7=-d; y8=y7;
      x1=x7; x2=x8; x1-x2=spread; .5[x1,x2]=crisp.lft hround(crisp.rt .5w);
      draw z1--z7; draw z2--z8;
      pickup crisp.nib;
      bot y0=-d-eps; x0=x1;
      pos3(rule_thickness,90);
      x2-x3=x4-x1=3u+eps; y3=y4=y0+.48asc_height-eps;
      pos5(rule_thickness,angle(z4-z0)); z5l=z0;
      z9=.381966[.5[z3,z4],z0];
      erase filldraw z0..{z3-z9}z3--(x3,-d-eps)--z0&cycle;
      filldraw z5r..{z3-z9}z3r---{z9-z3}z3l..z5l--cycle;
   endchar;
enddef;

def uppara(expr code) =
   beginchar(code, 11u#, asc_height#, asc_depth#);
      pickup rule.nib;
      bot y1=bot y2=-d-eps; top y7=h; y8=y7;
      x1=x7; x2=x8; x1-x2=spread; .5[x1,x2]=crisp.lft hround(crisp.rt .5w);
      draw z1--z7; draw z2--z8;
      pickup crisp.nib;
      top y0=h+eps; x0=x2;
      pos4(rule_thickness,90);
      x2-x3=x4-x1=3u+eps; y3=y4=y0-.48asc_height-eps;
      pos6(rule_thickness,angle(z3-z0)); z6l=z0;
      z9=.381966[.5[z3,z4],z0];
      erase filldraw z0..{z4-z9}z4--(x4,h+eps)--z0&cycle;
      filldraw z6r..{z4-z9}z4l---{z9-z4}z4r..z6l--cycle;
   endchar;
enddef;

def upallo(expr code) =
   beginchar(code, 11u#, asc_height#, asc_depth#);
      pickup rule.nib;
      bot y1=bot y2=-d-eps; top y7=h; y8=y7;
      x1=x7; x2=x8; x1-x2=spread; .5[x1,x2]=crisp.lft hround(crisp.rt .5w);
      draw z1--z7; draw z2--z8;
      pickup crisp.nib;
      top y0=h+eps; x0=x1;
      pos3(rule_thickness,90);
      x2-x3=x4-x1=3u+eps; y3=y4=y0-.48asc_height-eps;
      pos5(rule_thickness,angle(z4-z0)); z5l=z0;
      z9=.381966[.5[z3,z4],z0];
      erase filldraw z0..{z3-z9}z3--(x3,h+eps)--z0&cycle;
      filldraw z5l..{z3-z9}z3r---{z9-z3}z3l..z5r--cycle;
   endchar;
enddef;

def righttriple(expr code) =
   beginchar(code, 18u#, v_center(2spread#+rule_thickness#));
      pickup rule.nib;
      lft x1=hround u - eps; x3=x5=x1; x2=x4=x6=w-x1;
      y1=y2; y3=y4=math_axis; y5=y6; y1-y3=y3-y5=thin_spread;
      draw z1--z2; draw z3--z4; draw z5--z6;
      pickup crisp.nib; rt x0=hround(w-u)+eps; y0=y4;
      pos7(rule_thickness,0); pos8(rule_thickness,0);
      y7-y2=y6-y8=.24asc_height+eps; x7=x8=x0-6u-eps;
      pos9(rule_thickness,angle(z8-z0)); z9l=z0;
      pos10(rule_thickness,angle(z7-z0)); z10l=z0;
      z11=.381966[.5[z7,z8],z0];
      erase filldraw z0..{z7-z11}z7--(w,y7)--(w,y8)--
         z8{z11-z8}..z0&cycle;
      filldraw z9l..{z7-z11}z7r---z7l{z11-z7}..z9r--cycle;
      filldraw z10r..{z8-z11}z8l---z8r{z11-z8}..z10l--cycle;
   endchar;
enddef;

def lefttriple(expr code) =
   beginchar(code, 18u#, v_center(2spread#+rule_thickness#));
      pickup rule.nib;
      lft x1=hround u - eps; x3=x5=x1; x2=x4=x6=w-x1;
      y1=y2; y3=y4=math_axis; y5=y6; y1-y3=y3-y5=thin_spread;
      draw z1--z2; draw z3--z4; draw z5--z6;
      pickup crisp.nib; lft x0=hround u-eps; y0=y4;
      pos7(rule_thickness,0); pos8(rule_thickness,0);
      y7-y2=y6-y8=.24asc_height+eps; x7=x8=x0+6u+eps;
      pos9(rule_thickness,angle(z8-z0)); z9l=z0;
      pos10(rule_thickness,angle(z7-z0)); z10l=z0;
      z11=.381966[.5[z7,z8],z0];
      erase filldraw z0..{z7-z11}z7--(0,y7)--(0,y8)--
         z8{z11-z8}..z0&cycle;
      filldraw z9r..{z7-z11}z7r---z7l{z11-z7}..z9l--cycle;
      filldraw z10l..{z8-z11}z8l---z8r{z11-z8}..z10r--cycle;
   endchar;
enddef;

def equiv(expr code) =
   beginchar(code, 14u#, v_center(2spread#+rule_thickness#));
      pickup rule.nib;
      lft x1=hround u - eps; x3=x5=x1; x2=x4=x6=w-x1;
      y1=y2; y3=y4=math_axis; y5=y6; y1-y3=y3-y5=thin_spread;
      draw z1--z2;
      draw z3--z4;
      draw z5--z6;
   endchar;
enddef;

def dashbar(expr code) =
   beginarithchar(code);
      pickup rule.nib;
      lft x1=hround u-eps;
      x2=.3w; x3=.7w;
      x4=w-x1;
      y1=y2=y3=y4=math_axis;
      draw z1--z2;
      draw z3--z4;
   endchar;
enddef;

def rightarrow(expr code, width) =
   beginchar(code, width*u#, v_center(spread#+rule_thickness#));
      adjust_fit(0,0); pickup crisp.nib;
      pos1(rule_thickness,90); pos2(rule_thickness,90);
      pos3(bar,0); pos4(bar,0);
      y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
      y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0-3u-eps;
      pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
      z9=.381966[.5[z3,z4],z0];
      numeric t; path p; p=z4l{z9-z4}..z6r;
      t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
      filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
       --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
       --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
   endchar;
enddef;

def leftarrow(expr code, width) =
   beginchar(code, width*u#, v_center(spread#+rule_thickness#));
      adjust_fit(0,0); pickup crisp.nib;
      pos1(rule_thickness,90); pos2(rule_thickness,90);
      pos3(bar,0); pos4(bar,0);
      y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
      y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
      pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
      z9=.381966[.5[z3,z4],z0];
      numeric t; path p; p=z4r{z9-z4}..z6r;
      t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
      filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
       --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
       --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
   endchar;
enddef;

def leftrightarrow(expr code) =
   beginchar(code, 18u#, v_center(spread#+rule_thickness#));
      adjust_fit(0,0); pickup crisp.nib;
      pos1(rule_thickness,90); pos2(rule_thickness,90);
      pos3(bar,0); pos4(bar,0);
      y0=y1=y2=math_axis; lft x0=hround u;
      x1=.5w;
      y3-y0=y0-y4=.24asc_height+eps;
      x3=x4=x0+3u+eps;
      pos5(bar,angle(z4-z0)); z5l=z0;
      pos6(bar,angle(z3-z0)); z6l=z0;
      z9=.381966[.5[z3,z4],z0];
      numeric t; path p; p=z4r{z9-z4}..z6r;
      t=xpart(p intersectiontimes((0,y2l)--(w,y2l)));
      x2=xpart point t of p;
      filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
       --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
       --z3l{z9-z3}..z0 & cycle;  % left arrowhead and stem
      pos11(rule_thickness,90); pos12(rule_thickness,90);
      pos13(bar,0); pos14(bar,0);
      y10=y11=y12=math_axis;
      rt x10=hround(w-u);
      x11=.5w;
      y13-y10=y10-y14=.24asc_height+eps;
      x13=x14=x10-3u-eps;
      pos15(bar,angle(z14-z10)); z15l=z10;
      pos16(bar,angle(z13-z10)); z16l=z10;
      z19=.381966[.5[z13,z14],z10];
      numeric t; path p; p=z14l{z19-z14}..z16r;
      t=xpart(p intersectiontimes((0,y12l)--(w,y12l)));
      x12=xpart point t of p;
      filldraw z10..{z14-z19}z14r--subpath (0,t) of\\(z14l{z19-z14}..z16r)
       --z12l---z11l..z11r---z12r--subpath (t,0) of\\(z13l{z19-z13}..z15r)
       --z13r{z19-z13}..z10 & cycle;  % right arrowhead and stem
   endchar;
enddef;

def rightmonotail(expr code) =
   beginchar(code,10u#,v_center(spread#+rule_thickness#));
      adjust_fit(0,0); pickup crisp.nib;
      pos1(rule_thickness,90); pos2(rule_thickness,90);
      pos3(bar,0); pos4(bar,0);
      x3=x4=.5rule_thickness+hround u;
      y0=y1=y2=math_axis;
      y3-y0=y0-y4=.24asc_height+eps;
      x0=x3+3u+eps;
      rt x1=hround(w-u);
      pos5(bar,angle(z4-z0)); z5l=z0;
      pos6(bar,angle(z3-z0)); z6l=z0;
      z9=.381966[.5[z3,z4],z0];
      numeric t; path p; p=z4l{z9-z4}..z6r;
      t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
      filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
       --z2l---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
       --z3r{z9-z3}..z0 & cycle;
      filldraw z1l..z1r---z2r..z2l---z1l & cycle;
   endchar;
enddef;

def leftmonotail(expr code) =
   beginchar(code,10u#,v_center(spread#+rule_thickness#));
      adjust_fit(0,0); pickup crisp.nib;
      pos1(rule_thickness,90); pos2(rule_thickness,90);
      pos3(bar,0); pos4(bar,0);
      x3=x4=hround(w-u)-.5rule_thickness;
      y0=y1=y2=math_axis;
      y3-y0=y0-y4=.24asc_height+eps;
      x0=x3-3u-eps;
      lft x1=hround u;
      pos5(bar,angle(z4-z0)); z5l=z0;
      pos6(bar,angle(z3-z0)); z6l=z0;
      z9=.381966[.5[z3,z4],z0];
      numeric t; path p; p=z4r{z9-z4}..z6r;
      t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
      filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
       --z2l---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
       --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
      filldraw z1l..z1r---z2r..z2l---z1l & cycle;
   endchar;
enddef;

def squiggle(expr code) =
   beginarithchar(code);
      pickup rule.nib;
      x2=.12w; x3=.3w;
      x4=.7w; x5=.88w;
      y2=y5=math_axis;
      y3-y2=y2-y4=.5spread;
      draw z2{right}..z3{right}..z4{right}..z5{right};
   endchar;
enddef;

def leftharpoonup(expr code) =
   beginchar(code, 18u#, v_center(spread#+rule_thickness#));
      adjust_fit(0,0); pickup crisp.nib;
      pos1(rule_thickness,90); pos2(rule_thickness,90);
      pos3(bar,0); pos4(bar,0);
      y0=y1=y2=math_axis;
      x1+.5rule_thickness=hround(w-u);
      lft x0=hround u;
      y3-y0=y0-y4=.24asc_height+eps;
      x3=x4=x0+3u+eps;
      pos5(bar,angle(z4-z0)); z5l=z0;
      pos6(bar,angle(z3-z0)); z6l=z0;
      numeric t; path p; p=z4r..{2(x0-x4),y0-y4}z6r;
      t=xpart(p intersectiontimes((0,y2l)--(w,y2l)));
      x2=xpart point t of p;
      filldraw z0--(x0,y2l)---z1l..z1r---z2r
       ..subpath (t,0) of\\(z3r..{2(x0-x3),y0-y3}z5r)
       --z3l..{2(x0-x3),y0-y3}cycle;  % arrowhead and stem
   endchar;
enddef;

def leftharpoondown(expr code) =
   beginchar(code, 18u#, v_center(spread#+rule_thickness#));
      adjust_fit(0,0); pickup crisp.nib;
      pos1(rule_thickness,90); pos2(rule_thickness,90);
      pos3(bar,0); pos4(bar,0);
      y0=y1=y2=math_axis;
      x1+.5rule_thickness=hround(w-u);
      lft x0=hround u;
      y3-y0=y0-y4=.24asc_height+eps;
      x3=x4=x0+3u+eps;
      pos5(bar,angle(z4-z0)); z5l=z0;
      pos6(bar,angle(z3-z0)); z6l=z0;
      numeric t; path p; p=z4r..{2(x0-x4),y0-y4}z6r;
      t=xpart(p intersectiontimes((0,y2l)--(w,y2l)));
      x2=xpart point t of p;
      filldraw z0{2(x4-x0),y4-y0}..z4l
       --subpath (0,t) of\\(z4r..{2(x0-x4),y0-y4}z6r)
       ..z2l---z1l..z1r---(x0,y2r)--cycle;  % arrowhead and stem
   endchar;
enddef;

def rightharpoonup(expr code) =
   beginchar(code, 18u#, v_center(spread#+rule_thickness#));
      adjust_fit(0,0); pickup crisp.nib;
      pos1(rule_thickness,90); pos2(rule_thickness,90);
      pos3(bar,0); pos4(bar,0);
      y0=y1=y2=math_axis;
      x1-.5rule_thickness=hround u;
      rt x0=hround(w-u);
      y3-y0=y0-y4=.24asc_height+eps;
      x3=x4=x0-3u-eps;
      pos5(bar,angle(z4-z0)); z5l=z0;
      pos6(bar,angle(z3-z0)); z6l=z0;
      numeric t; path p; p=z4l..{2(x0-x4),y0-y4}z6r;
      t=xpart(p intersectiontimes((0,y2l)--(w,y2l)));
      x2=xpart point t of p;
      filldraw z0--(x0,y2l)---z1l..z1r---z2r
       ..subpath (t,0) of\\(z3l..{2(x0-x3),y0-y3}z5r)
       --z3r..{2(x0-x3),y0-y3}cycle;  % arrowhead and stem
   endchar;
enddef;

def rightharpoondown(expr code) =
   beginchar(code, 18u#, v_center(spread#+rule_thickness#));
      adjust_fit(0,0); pickup crisp.nib;
      pos1(rule_thickness,90); pos2(rule_thickness,90);
      pos3(bar,0); pos4(bar,0);
      y0=y1=y2=math_axis;
      x1-.5rule_thickness=hround u;
      rt x0=hround(w-u);
      y3-y0=y0-y4=.24asc_height+eps;
      x3=x4=x0-3u-eps;
      pos5(bar,angle(z4-z0)); z5l=z0;
      pos6(bar,angle(z3-z0)); z6l=z0;
      numeric t; path p; p=z4l..{2(x0-x4),y0-y4}z6r;
      t=xpart(p intersectiontimes((0,y2l)--(w,y2l)));
      x2=xpart point t of p;
      filldraw z0{2(x4-x0),y4-y0}..z4r
       --subpath (0,t) of\\(z4l..{2(x0-x4),y0-y4}z6r)
       ..z2l---z1l..z1r---(x0,y2r)--cycle;  % arrowhead and stem
   endchar;
enddef;

def vector(expr code) =
   beginchar(code, 9u#, asc_height#+.5rule_thickness#,0);
      italcorr .7[x_height#,asc_height#]*slant;
      adjust_fit(0,0); pickup rule.nib;
      lft x1=hround .5u; x2=w-x1; y1=y2=good.x .7[x_height,asc_height];
      draw z1--z2;  % bar
      rt x3=hround(x2-u);
      y3=y2+.3(asc_height-x_height);
      draw z3{x2-x3,2(y2-y3)}...{2(x2-x3),y2-y3}z2;  % upper point
   endchar;
enddef;

def ofcirc(expr code) =
   beginchar(code, 7u#, v_center(7u#));
      adjust_fit(0,0); pickup rule.nib; autorounded;
      lft x6=hround u; x2=w-x6;
      z0=.5[z2,z6];
      y8-y0=x2-x0;
      y2=math_axis;
      circle_points; draw_circle;  % circle
   endchar;
enddef;

def dotp(expr code) =
   beginchar(code, 5u#, v_center(7u#));
      adjust_fit(0,0); pickup fine.nib;
      numeric dot_diam#; dot_diam#=2dot_size#;
      define_whole_blacker_pixels(dot_diam);
      pos1(dot_diam,0); pos2(dot_diam,90);
      lft x1l=hround(.5w-.5dot_diam);
      y1+.5dot_diam=vround(math_axis+.5dot_diam);
      z1=z2; dot(1,2);  % dot
   endchar;
enddef;

def cupp(expr code) =
   beginchar(code, 10u#, v_center(7u#));
      adjust_fit(0,0); pickup rule.nib; autorounded;
      lft x1=hround u; y1=vround(math_axis+.15x_height);
      x3=w-x1; y3=y1;
      penpos2(rule_thickness,90); x2=.5w;
      y2=good.y(math_axis-.15x_height);
      numeric theta; theta=angle((z2-z1)yscaled 3);
      penpos1(rule_thickness,90+theta);
      penpos3(rule_thickness,90-theta);
      draw z1{dir theta}...z2...{dir-theta}z3;
   endchar;
enddef;

def capp(expr code) =
   beginchar(code, 10u#, v_center(7u#));
      adjust_fit(0,0); pickup rule.nib; autorounded;
      lft x1=hround u; y1=vround(math_axis-.15x_height);
      x3=w-x1; y3=y1;
      penpos2(rule_thickness,90); x2=.5w;
      y2=good.y(.15x_height+math_axis);
      numeric theta; theta=angle((z2-z1)yscaled 3);
      penpos1(rule_thickness,90+theta);
      penpos3(rule_thickness,90-theta);
      draw z1{dir theta}...z2...{dir-theta}z3;
   endchar;
enddef;

