% mathematical symbols by Anthony Phan.
% file: mathmbcb.mf (symbols medium or big in circles or boxes)
% last modification: May 16, 2005.
% Only known charcodes will be generated.

def horizontal_rules_list=
  0.5[-d,h]-math_axis,0.5[-d,h]-math_axis+x_height,
  0.25[-d,h],0.5[-d,h],0.75[-d,h] enddef;

extra_beginchar_save:=extra_beginchar;
numeric display_over_text;

% Beware: one can not execute conditionnal commands
% thru the following construction. For instance,
% on_size(use_rule1,use_rule2,use_rule3) would
% lead to the use of rule3.

def on_size(expr $,$$,$$$)=
  if substring (0,1) of main_name_string="m": $
  elseif substring (0,1) of main_name_string="b": $$
  else: $$$ fi% "B" case or else
enddef;

if substring (0,1) of main_name_string="m":
  let tmp_bounds=arithmetic_bounds;
  def tmp_radius=6.75u enddef;
  use_rule1;
elseif substring (0,1) of main_name_string="b":
  def tmp_bounds=10/6dh#+2appr#,0,10/6dh# enddef;
  % def tmp_bounds=18u#+2appr#,0,10/6dh# enddef;
  def tmp_radius=0.5(h+d) enddef;
  use_rule2;
else:% "B" case or else
  def tmp_bounds= 1.20*10/6dh#+2appr#,
    0,1.20*10/6dh# enddef;
  %  def tmp_bounds= 25.2u#+2appr#,0,14/6dh# enddef;
  def tmp_radius=0.5(h+d) enddef;
  use_rule3;
fi

numeric tmp_dtsz;
a:=on_size(max(0.82u,1.25u-rth1),1.33u,1.20*1.33u);
tmp_dtsz=on_size(dtsz,1.2dtsz,1.20*1.2dtsz);
tmp_string:=on_size("Medium ","Textstyle ","Displaystyle ")
& substring (1,infinity) of main_name_string;
extra_beginchar:=extra_beginchar & on_size("","","padded bigop_padding#;");

% I know what anyone will think while reading this file:
% ``this guy had totally messed up with boundaries''.
% Believe me, I had not.

% The next programs put a circle or a box exactly around the point
% z0. So that z0 must be adjusted with respect to the pen 
% with which the circle will be drawn.

if substring (1,infinity) of main_name_string="circle":
  vardef tmp_program=
    autorounded; pickup rule.nib;
    x0=good.x 0.5w; y0=good.y 0.5[-d,h];
    for i=1 upto 8:
      z[i]=z0+round(tmp_radius-0.5rth)*right rotated(45*(i-1));
    endfor; labels(0,1,2,3,4,5,6,7,8);
    tmp_path:=z1{up}...z2{z3-z1}
    ...z3{left}...z4{z5-z3}...z5{down}...z6{z7-z5}
    ...z7{right}...z8{z1-z7}...cycle; draw tmp_path;
  enddef;
  def dot_spread=4*tmp_radius/(3*3.14159) enddef;
 % average point of some half disc
  def prepare_triangle(expr orientation)=
    save b,c; pickup tiny.nib;
    b=min(on_size(7u,12u,1.20*12u),
      2*sqrt(3)*(tmp_radius-rth-a));
    c=on_size(rth0,rth1,rth2);
    tmp_boolean:=true
  enddef;
else:
  vardef tmp_program=
    pickup rule.nib;
    x0=good.x 0.5w; y0=good.y 0.5[-d,h];
    pickup tiny.nib;
    for i=1 step 2 until 7:
      z[i]=z0+round(tmp_radius-0.5rth)*right rotated(45*(i-1));
    endfor;
    pos1(rth,0); pos5(rth,180);
    pos3(rth,90); pos7(rth,-90);
    forsuffixes $=,r,l:
      x1$=x2$=x8$; x5$=x4$=x6$;
      y2$=y3$=y4$; y6$=y7$=y8$;
    endfor
    penlabels(0,1,2,3,4,5,6,7,8);
    filldraw stroke z8e--z6e--z4e--z2e--z8e;
    tmp_path:=z1--z2--z3--z4--z5--z6--z7--z8--cycle;
    pickup rule.nib;
  enddef;
  def dot_spread=0.5(y3-y0) enddef;
  def prepare_triangle(expr orientation)=
    save b,c; pickup tiny.nib;
    b=min(on_size(7u,12u,1.20*12u),
      2*sqrt(3)*(tmp_radius-rth-a));
    c=on_size(rth0,rth1,rth2);
    tmp_boolean:=false;
    save triangle_foot;
    triangle_foot=
    if (orientation=up)or(orientation=down): y0 else: x0 fi
    if (orientation=up)or(orientation=right): - else: + fi
    0.5[1/3,1/2]*0.5b*sqrt 3
  enddef;
fi

%
% Let's go
%

beginchar(main_name_with(_plus),tmp_bounds);
  tmp_string & " plus";
  tmp_program;
  pickup tiny.nib;
  top y9=vround(y3-0.5rth-a); y3-y9=y10-y7; y11=y12=y0;
  rt x12=hround(x1-0.5rth-a); x1-x12=x11-x5; x9=x10=x0;
  pos9(rth,0); pos10(rth,0); pos11(rth,90); pos12(rth,90);
  filldraw stroke z9e..z10e; filldraw stroke z11e..z12e;
  penlabels(9,10,11,12);
endchar;

beginchar(main_name_with(_minus),tmp_bounds);
  tmp_string & " minus";
  tmp_program;
  pickup tiny.nib;
  rt x9=hround(x1-0.5rth-a);
  x10-x5=x1-x9; y9=y10=y0; pos9(rth,90); pos10(rth,90);
  filldraw stroke z10e..z9e; penlabels(9,10,11,12);
endchar;

beginchar(main_name_with(_times),tmp_bounds);
  tmp_string & " times";
  tmp_program;
  pickup tiny.nib;
  rt x0'=hround(x1-0.5rth-a); y0=y0';
  z9-z0=z0-z10=(z0'-z0) rotated 45; z11-z0=z0-z12=(z0'-z0) rotated -45;
  pos9(rth+2eps,-45); pos10(rth+2eps,-45);
  pos11(rth+2eps,45); pos12(rth+2eps,45);
  filldraw stroke z9e..z10e; filldraw stroke z12e..z11e;
  penlabels(9,10,11,12);
endchar;

beginchar(main_name_with(_division),tmp_bounds);
  tmp_string & " division";
  tmp_program;
  pickup tiny.nib;
  rt x9=hround(x1-0.5rth-a); x10-x5=x1-x9;
  y9=y10=y0; pos9(rth,90); pos10(rth,90);
  filldraw stroke z10e..z9e; penlabels(9,10);
  pickup null.nib;
  adjust_dot11((x0,y0+dot_spread),tmp_dtsz,true,false); dot(11,11');
  adjust_dot12((x0,y0-dot_spread),tmp_dtsz,true,false); dot(12,12');
endchar;

beginchar(main_name_with(_dot),tmp_bounds);
  tmp_string & " dot";
  tmp_program;
  pickup null.nib;
  adjust_dot9(z0,1.3tmp_dtsz,true,true); dot(9,9');
endchar;

beginchar(main_name_with(_circle),tmp_bounds);
  tmp_string & " circle";
  tmp_program;
  numeric b;
  b=min(max(on_size(7u,7u,1.20*7u),tmp_dtsz),tmp_radius-rth-a);
  pickup rule.nib0; adjust_dot9((x0,y0),b,true,true);
  full_dot:=false; dot(9,9');
endchar;

% the asterisk is the same in textstyle and displaystyle

beginchar(main_name_with(_asterisk),tmp_bounds);
  tmp_string & " asterisk";
  tmp_program;
  autorounded;
  interim stress:=0.5;
  pickup null.nib;
  numeric b,c,dag_stem,dag_curve;
  dag_curve=on_size(ast_curve,round 1.1cap_curve,round 1.1cap_curve);
  dag_stem=on_size(ast_stem,hair,hair);
  b=on_size(1.8ast_stem,2.6hair,2.6hair);
  c=on_size(1.4dag_stem,0.625b,0.625b);
  spread:=min(on_size(ast_size,12u,12u),2(tmp_radius-rth-a));
  for $=9 upto 14: z[$]=b*dir(($-9)*60+30)+z0;
    z[$]'=c*dir(($-9)*60+60)+z0; endfor
  filldraw for $=9 upto 14: dagger_stroke[$](round(0.5spread-b)+eps,
      dag_curve,dag_stem,dir(($-9)*60+30))...z[$]'...endfor cycle;
endchar;

% the asterisk is the same in textstyle and displaystyle

beginchar(main_name_with(_co_asterisk),tmp_bounds);
  tmp_string & " co-asterisk";
  tmp_program;
  autorounded;
  interim stress:=0.5;
  pickup null.nib;
  numeric b,c,dag_stem,dag_curve;
  dag_curve=on_size(ast_curve,round 1.1cap_curve,round 1.1cap_curve);
  dag_stem=on_size(ast_stem,hair,hair);
  b=1.8dag_stem; c=1.4dag_stem;
  spread:=min(on_size(ast_size,12u,12u),2(tmp_radius-rth-a));
  for $=9 upto 14: z[$]=b*dir(($-9)*60)+z0;
    z[$]'=c*dir(($-9)*60+30)+z0; endfor
  filldraw for $=9 upto 14: dagger_stroke[$](round(0.5spread-b)+eps,
      dag_curve,dag_stem,dir(($-9)*60))...z[$]'...endfor cycle;
endchar;

beginchar(main_name_with(_left),tmp_bounds);
  tmp_string & " left";
  tmp_program;
  draw z3..z7; draw z0..z5;
endchar;

beginchar(main_name_with(_right),tmp_bounds);
  tmp_string & " right";
  tmp_program;
  draw z3..z7; draw z0..z1;
endchar;

beginchar(main_name_with(_top),tmp_bounds);
  tmp_string & " top";
  tmp_program;
  draw z1..z5; draw z0..z7;
endchar;

beginchar(main_name_with(_bot),tmp_bounds);
  tmp_string & " bot";
  tmp_program;
  draw z1..z5; draw z0..z3;
endchar;

beginchar(main_name_with(_slash),tmp_bounds);
  tmp_string & " slash";
  tmp_program;
  draw z2..z6;
endchar;

beginchar(main_name_with(_backslash),tmp_bounds);
  tmp_string & " backslash";
  tmp_program;
  draw z4..z8;
endchar;

beginchar(main_name_with(_sign),tmp_bounds);
  tmp_string & " sign";
  tmp_program;
endchar;

beginchar(main_name_with(_triangle_up),tmp_bounds);
  tmp_string & " triangle up";
  tmp_program;
  begingroup save math_axis; math_axis=y0;
    prepare_triangle(up);
    set_triangle'(up,b,c,tmp_boolean,false);
    filldraw stroke z1'e--z2'e--z3'e--z1'e;
  endgroup;
endchar;

% UNSUPPORTED

beginchar(main_name_with(_truc),tmp_bounds);
  tmp_string & " truc";
  tmp_program;
  x9=x0; y9=good.y
  if substring (1,infinity) of main_name_string="circle":
    0.632466 else: 2/3 fi [top y7,bot y3];
  z10=tmp_path intersectionpoint (z9..(x5,y9));
  z11=tmp_path intersectionpoint (z9..(x1,y9));
  draw z7..z9; draw z10..z11; labels(9,10,11);
endchar;

% numerics are such that all the three parts
% have almost the same area. (look at the circle's case)

beginchar(main_name_with(_curt),tmp_bounds);
  tmp_string & " curt";
  tmp_program;
  x9=x0; y9=good.y
  if substring (1,infinity) of main_name_string="circle":
    0.632466 else: 2/3 fi [bot y3,top y7];
  z10=tmp_path intersectionpoint (z9..(x5,y9));
  z11=tmp_path intersectionpoint (z9..(x1,y9));
  draw z3..z9; draw z10..z11; labels(9,10,11);
endchar;

% hummm, too big
beginchar(main_name_with(_full_circle),tmp_bounds);
  tmp_string & " full circle";
  tmp_program;
  numeric b;
  b=min(max(on_size(7u-rth0,7u-rth0,1.20*7u-rth0),
      tmp_dtsz),tmp_radius-rth-a);
  pickup rule.nib0; adjust_dot9((x0,y0),b,true,true);
  dot(9,9');
endchar;

% the star is the same in textstyle and displaystyle

beginchar(main_name_with(_five_star),tmp_bounds);
  tmp_string & " five star";
  tmp_program;
  pickup tiny.nib;
  save b,tense;
  b=on_size(3.5u+o,6u+o,6u+o);
  tense=on_size(0.2,0.1,0.1); 
  draw_star.a(z0,5,b,tense,90,false);
  labels(a);
endchar;

% the star is the same in textstyle and displaystyle

beginchar(main_name_with(_six_star),tmp_bounds);
  tmp_string & " six star";
  tmp_program;
  pickup tiny.nib;
  save b,tense;
  b=on_size(3.5u,6u+o,6u+o);
  tense=on_size(0.4,0.3,0.3); 
  draw_star.a(z0,6,b,tense,90,false);
  labels(a);
endchar;

beginchar(main_name_with(_triangle_down),tmp_bounds);
  tmp_string & " triangle down";
  tmp_program;
  begingroup save math_axis; math_axis=y0;
    prepare_triangle(down);
    set_triangle'(down,b,c,tmp_boolean,false);
    filldraw stroke z1'e--z2'e--z3'e--z1'e;
  endgroup;
endchar;

beginchar(main_name_with(_triangle_left),tmp_bounds);
  tmp_string & " triangle left";
  tmp_program;
  begingroup save math_axis; math_axis=y0;
    prepare_triangle(left);
    set_triangle'(left,b,c,tmp_boolean,false);
    filldraw stroke z1'e--z2'e--z3'e--z1'e;
  endgroup;
endchar;

beginchar(main_name_with(_triangle_right),tmp_bounds);
  tmp_string & " triangle right";
  tmp_program;
  begingroup save math_axis; math_axis=y0;
    prepare_triangle(right);
    set_triangle'(right,b,c,tmp_boolean,false);
    filldraw stroke z1'e--z2'e--z3'e--z1'e;
  endgroup;
endchar;

beginchar(main_name_with(_top_dot_minus),tmp_bounds);
  tmp_string & " top dot minus";
  tmp_program; pickup tiny.nib;
  rt x9=hround(x1-0.5rth-a); x10-x5=x1-x9;
  y9=y10=y0; pos9(rth,90); pos10(rth,90);
  filldraw stroke z10e..z9e; penlabels(9,10);
  pickup null.nib;
  adjust_dot11((x0,y0+dot_spread),tmp_dtsz,true,false); dot(11,11');
endchar;

beginchar(main_name_with(_bot_dot_minus),tmp_bounds);
  tmp_string & " bot dot minus";
  tmp_program;
  pickup tiny.nib;
  rt x9=hround(x1-0.5rth-a); x10-x5=x1-x9;
  y9=y10=y0; pos9(rth,90); pos10(rth,90);
  filldraw stroke z10e..z9e; penlabels(9,10);
  pickup null.nib;
  adjust_dot11((x0,y0-dot_spread),tmp_dtsz,true,false); dot(11,11');
endchar;

beginchar(main_name_with(_horiz),tmp_bounds);
  tmp_string & " horizontal";
  tmp_program;
  draw z1..z5;
endchar;

beginchar(main_name_with(_vert),tmp_bounds);
  tmp_string & " vertical";
  tmp_program;
  draw z3..z7;
endchar;

beginchar(main_name_with(_cross),tmp_bounds);
  tmp_string & " cross";
  tmp_program;
  draw z1..z5; draw z3..z7;
endchar;

beginchar(main_name_with(_across),tmp_bounds);
  tmp_string & " across";
  tmp_program;
  draw z2..z6; draw z4..z8;
endchar;

beginchar(main_name_with(_wedge),tmp_bounds);
  tmp_string & " wedge";
  tmp_program;
  draw z8--z3--z6;
endchar;

beginchar(main_name_with(_vee),tmp_bounds);
  tmp_string & " vee";
  tmp_program;
  draw z2--z7--z4;
endchar;

beginchar(main_name_with(_black_left),tmp_bounds);
  tmp_string & " black left";
  tmp_program;
  fill subpath (2,6) of tmp_path--cycle;
endchar;

beginchar(main_name_with(_black_right),tmp_bounds);
  tmp_string & " black right";
  tmp_program;
  fill subpath (6,8) of tmp_path
  & subpath (0,2) of tmp_path--cycle;
endchar;

beginchar(main_name_with(_black_top),tmp_bounds);
  tmp_string & " black top";
  tmp_program;
  fill subpath (0,4) of tmp_path--cycle;
endchar;

beginchar(main_name_with(_black_bot),tmp_bounds);
  tmp_string & " black bot";
  tmp_program;
  fill subpath (4,8) of tmp_path--cycle;
endchar;

beginchar(main_name_with(_black_northwest),tmp_bounds);
  tmp_string & " black north-west";
  tmp_program;
  fill subpath (1,5) of tmp_path--cycle;
endchar;

beginchar(main_name_with(_black_northeast),tmp_bounds);
  tmp_string & " black north-east";
  tmp_program;
  fill subpath (7,8) of tmp_path
  --subpath (0,3) of tmp_path--cycle;
endchar;

beginchar(main_name_with(_black_southwest),tmp_bounds);
  tmp_string & " black south-west";
  tmp_program;
  fill subpath (3,7) of tmp_path--cycle;
endchar;

beginchar(main_name_with(_black_southeast),tmp_bounds);
  tmp_string & " black south-east";
  tmp_program;
  fill subpath (5,8) of tmp_path
  --subpath (0,1) of tmp_path--cycle;
endchar;

% There is no normalization for the next symbol as it seems...

beginchar(main_name_with(_ying_yang),tmp_bounds);
  tmp_string & " Ying-Yang";
  tmp_program;
  autorounded;
  y9=bot y3; y10=0.5[y9,y0]; y11=0.5[y0,y12]; y12=top y7;
  x0=x9=x12; x10=ceiling(x0+y0-y11); x10-x0=x0-x11;
  pickup null.nib;
  fill subpath (6,8) of tmp_path
  -- subpath (0,2) of tmp_path
  --z9 right_to_down z10 down_to_left
  z0 left_to_down z11 down_to_right z12
  --cycle;
  adjust_dot13((x0,y10),tmp_dtsz,true,true);
  adjust_dot14((x0,y11),tmp_dtsz,true,true);
  dot(13,13'); unfill dot_path(14,14');
  labels(9,10,11,12,14,14');
endchar;

beginchar(main_name_with(_peace_and_love),tmp_bounds);
  tmp_string & " peace and love";
  tmp_program;
  z9=tmp_path intersectionpoint (z0..(z0+2(tmp_radius)*dir 210));
  z10=tmp_path intersectionpoint (z0..(z0+2(tmp_radius)*dir 330));
  draw z3..z7; draw z0..z9; draw z0..z10;
  labels(9,10);
endchar;

% numerics are such that all the three parts
% have almost the same area. (look at the circle's case)

extra_beginchar:=extra_beginchar_save;