% mathematical symbols by Anthony Phan. % file: mathbdel.mf (big delimiters) % last modification: April 29, 2002. % 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; % Since I thinck that adjust_fit's strategy is too % complex, I just cut actual width in three parts: % ``visible'' width, ``internal'' adjustment and % finally ``external'' adjustment. Letter_fit# is % added automatically (there is no use of appr#'s). vardef set_width(expr inner_sharp,internal_sharp,external_sharp)= internal_adjustment:=hround((internal_sharp+letter_fit#)*hppp); external_adjustment:=hround((external_sharp+letter_fit#)*hppp); inner_sharp+internal_sharp+external_sharp+2letter_fit# enddef; % PARENTHESIS (look at cm) def tmp_program(expr orientation,hair,stem,do_top,do_bot)= pickup fine.nib; pos1(hround hair,0); pos2(hround stem,0); pos3(hround hair,0); if orientation=left: rt x1r=rt x3r=hround(w-internal_adjustment-0.25u+0.5hair); lft x2l=external_adjustment+hround 0.25u; else: lft x1l=lft x3l=hround(internal_adjustment+0.25u-0.5hair); rt x2r=w-external_adjustment-hround 0.25u; fi if do_top and do_bot: top y1=h; bot y3=-d; y2=0.5[y1,y3]; filldraw stroke z1e{3(x2e-x1e),y2-y1}...z2e{down} ...{3(x3e-x2e),y3-y2}z3e; elseif do_top: top y1=h; y2=-d-eps; filldraw stroke z1e{3(x2e-x1e),y2-y1}...z2e{down}; elseif do_bot: y2=h+eps; bot y3=-d; filldraw stroke z2e{down}...{3(x3e-x2e),y3-y2}z3e; else: pos2'(hround stem,0); x2'=x2; y2=h+eps; y2'=-d-eps; filldraw stroke z2e..z2'e; fi penlabels(1,2,3,2'); enddef; beginchar(paren_left, 5u#+2appr#,body_height#,paren_depth#); "Left parenthesis"; % italcorr body_height#*slant-0.5u#; pickup fine.nib; pos1(vair,0); pos2(0.75[hair,stem],0); pos3(vair,0); rt x1r=rt x3r=w-appr; lft x2l=hround(x1-4u); top y1=h; y2=0.5[y1,y3]=math_axis; filldraw stroke z1e{3(x2e-x1e),y2-y1}...z2e{down} ...{3(x3e-x2e),y3-y2}z3e; penlabels(1,2,3); endchar; beginchar(paren_left_big,%7u#, set_width(5u#,(1-0.25)*u#,(1+1.5)*u#),rth.frac#,2dh#-rth.frac#); "big left parenthesis"; % adjust_fit(1.5u#,-.25u#); tmp_program(left,hair,stem,true,true); endchar; beginchar(paren_left_Big,%9u#, set_width(7u#,(1-0.25)*u#,(1+2)*u#),rth.frac#,3dh#-rth.frac#); "Big left parenthesis"; % adjust_fit(2u#,-.25u#); tmp_program(left,rth1,.5[stem,bold],true,true); endchar; beginchar(paren_left_bigg,%11u#, set_width(9u#,(1-0.25)*u#,(1+2.5)*u#),rth.frac#,4dh#-rth.frac#); "bigg left parenthesis"; % adjust_fit(2.5u#,-.25u#); tmp_program(left,rth1+.2dw,bold,true,true); endchar; beginchar(paren_left_Bigg,%11.5u#, set_width(9.5u#,(1-0.25)*u#,(1+3)*u#),rth.frac#,5dh#-rth.frac#); "Bigg left parenthesis"; % adjust_fit(3u#,-.25u#); tmp_program(left,rth1+.4dw,bold+dw,true,true); endchar; beginchar(paren_left_top,%12u#, set_width(10u#,(1-0.25)*u#,(1+4)*u#),rth.frac#,3dh#-rth.frac#); "left perenthesis' extension top"; % adjust_fit(4u#,-.25u#); pickup fine.nib; tmp_program(left,rth1+.6dw,bold+2dw,true,false); endchar; beginchar(paren_left_bot,%12u#, set_width(10u#,(1-0.25)*u#,(1+4)*u#),rth.frac#,3dh#-rth.frac#); "left parenthesis' extension bot"; % adjust_fit(4u#,-.25u#); pickup fine.nib; tmp_program(left,rth1+.6dw,bold+2dw,false,true); endchar; beginchar(paren_left_mid,%12u#, set_width(10u#,(1-0.25)*u#,(1+4)*u#),0,dh#); "left parenthesis' extension mid"; % adjust_fit(4u#,-.25u#); pickup fine.nib; tmp_program(left,rth1+.6dw,bold+2dw,false,false); endchar; beginchar(paren_right, 5u#+2appr#,body_height#,paren_depth#); "Right parenthesis"; % italcorr math_axis#*slant-0.5u#; pickup fine.nib; pos1(vair,0); pos2(0.75[hair,stem],0); pos3(vair,0); lft x1l=lft x3l=appr; rt x2r=hround(x1+4u); top y1=h; y2=0.5[y1,y3]=math_axis; filldraw stroke z1e{3(x2e-x1e),y2-y1}...z2e{down} ...{3(x3e-x2e),y3-y2}z3e; penlabels(1,2,3); endchar; beginchar(paren_right_big,%7u#, set_width(5u#,(1-0.25)*u#,(1+1.5)*u#),rth.frac#,2dh#-rth.frac#); "big right parenthesis"; % adjust_fit(-.25u#,1.5u#); tmp_program(right,hair,stem,true,true); endchar; beginchar(paren_right_Big,%9u#, set_width(7u#,(1-0.25)*u#,(1+2)*u#),rth.frac#,3dh#-rth.frac#); "Big right parenthesis"; % adjust_fit(-.25u#,2u#); tmp_program(right,rth1,.5[stem,bold],true,true); endchar; beginchar(paren_right_bigg,%11u#, set_width(9u#,(1-0.25)*u#,(1+2.5)*u#),rth.frac#,4dh#-rth.frac#); "bigg right parenthesis"; % adjust_fit(-.25u#,2.5u#); tmp_program(right,rth1+.2dw,bold,true,true); endchar; beginchar(paren_right_Bigg,%11.5u#, set_width(9.5u#,(1-0.25)*u#,(1+3)*u#),rth.frac#,5dh#-rth.frac#); "Bigg right parenthesis"; % adjust_fit(-.25u#,3u#); tmp_program(right,rth1+.4dw,bold+dw,true,true); endchar; beginchar(paren_right_top,%12u#, set_width(10u#,(1-0.25)*u#,(1.4)*u#),rth.frac#,3dh#-rth.frac#); "right parenthesis' extension top"; % adjust_fit(-.25u#,4u#); pickup fine.nib; tmp_program(right,rth1+.6dw,bold+2dw,true,false); endchar; beginchar(paren_right_bot,%12u#, set_width(10u#,(1-0.25)*u#,(1+4)*u#),rth.frac#,3dh#-rth.frac#); "right parenthesis' extension top"; % adjust_fit(-.25u#,4u#); pickup fine.nib; tmp_program(right,rth1+.6dw,bold+2dw,false,true); endchar; beginchar(paren_right_mid,%12u#, set_width(10u#,(1-0.25)*u#,(1.4)*u#),0,dh#); "big right parenthesis' extension mid"; % adjust_fit(-.25u#,4u#); pickup fine.nib; tmp_program(right,rth1+.6dw,bold+2dw,false,false); endchar; % BRACKETS def tmp_program(expr orientation,stem,rth,do_top,do_bot,not_ext)= pickup tiny.nib; pos1(hround stem,0); pos2(hround stem,0); pos3(vround rth,90); pos4(vround rth,90); pos5(vround rth,90); pos6(vround rth,90); if do_top or not_ext: top y1=h; else: y1=h+eps; fi if do_bot or not_ext: bot y2=-d; else: y2=-d-eps; fi y1=y3r=y4r; y2=y5l=y6l; if orientation=left: lft x1l=lft x2l=min(external_adjustment,hround 0.5(w-stem)); rt x3r=rt x5l=w-internal_adjustment; x4r=x1r; x6l=x2r; else: rt x1r=rt x2r=max(w-external_adjustment,hround 0.5(w+stem)); lft x4r=lft x6l=internal_adjustment; x3r=x1l; x5l=x2l; fi filldraw stroke z1e--z2e; if do_top: filldraw stroke z3e--z4e; fi if do_bot: filldraw stroke z5e--z6e; fi penlabels(1,2,3,4,5,6); enddef; % HALF BRACKETS (true heights or depths are to be discussed) % okay beginchar(bracket_upper_left, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Upper left bracket"; a:=d; d:=-vround 0.75[-d,h]; tmp_program(left,0[0.95stem,0.95cap_stem], rth0,true,false,true); d:=a; endchar; % okay beginchar(bracket_lower_left, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Lower left bracket"; a:=h; h:=vround 0.25[-d,h]; tmp_program(left,0[0.95stem,0.95cap_stem], rth0,false,true,true); h:=a; endchar; % okay beginchar(bracket_upper_right, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Upper right bracket"; a:=d; d:=-vround 0.75[-d,h]; tmp_program(right,0[0.95stem,0.95cap_stem], rth0,true,false,true); d:=a; endchar; % okay beginchar(bracket_lower_right, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Lower right bracket"; a:=h; h:=vround 0.25[-d,h]; tmp_program(right,0[0.95stem,0.95cap_stem], rth0,false,true,true); h:=a; endchar; % okay beginchar(bracket_upper_lower_left, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Upper lower left bracket"; a:=d; d:=-vround 0.75[-d,h]; tmp_program(left,0[0.95stem,0.95cap_stem], rth0,true,false,true); d:=a; clearxy; a:=h; h:=vround 0.25[-d,h]; tmp_program(left,0[0.95stem,0.95cap_stem], rth0,false,true,true); h:=a; endchar; % okay beginchar(bracket_upper_lower_right, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Upper lower right bracket"; a:=d; d:=-vround 0.75[-d,h]; tmp_program(right,0[0.95stem,0.95cap_stem], rth0,true,false,true); d:=a; clearxy; a:=h; h:=vround 0.25[-d,h]; tmp_program(right,0[0.95stem,0.95cap_stem], rth0,false,true,true); h:=a; endchar; % okay beginchar(bracket_left, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Left bracket"; tmp_program(left,0[0.95stem,0.95cap_stem], rth0,true,true,true); endchar; beginchar(bracket_left_big, set_width(4.5u#,0.4u#,2.5u#),rth.frac#,2dh#-rth.frac#); "big left bracket"; tmp_program(left,0.125[0.95stem,0.95cap_stem], 0.125[rth0,rth1],true,true,true); endchar; beginchar(bracket_left_Big, set_width(5u#,0.6u#,3u#),rth.frac#,3dh#-rth.frac#); "Big left bracket"; tmp_program(left,0.25[0.95stem,0.95cap_stem], 0.25[rth0,rth1],true,true,true); endchar; beginchar(bracket_left_bigg, set_width(5.5u#,0.8u#,3.5u#),rth.frac#,4dh#-rth.frac#); "bigg left bracket"; tmp_program(left,0.5[0.95stem,0.95cap_stem], 0.5[rth0,rth1],true,true,true); endchar; beginchar(bracket_left_Bigg, set_width(6u#,1.00u#,4u#),rth.frac#,5dh#-rth.frac#); "Bigg left bracket"; tmp_program(left,0.75[0.95stem,0.95cap_stem], 0.75[rth0,rth1],true,true,true); endchar; beginchar(bracket_left_top, set_width(7u#,1.5u#,5u#),rth.frac#,3dh#-rth.frac#); "left bracket's extension top"; tmp_program(left,0.95cap_stem,rth1,true,false,false); endchar; beginchar(bracket_left_bot, set_width(7u#,1.5u#,5u#),rth.frac#,3dh#-rth.frac#); "left bracket's extension bottom"; tmp_program(left,0.95cap_stem,rth1,false,true,false); endchar; beginchar(bracket_left_mid, set_width(7u#,1.5u#,5u#),0,dh#); "left bracket's extension module"; tmp_program(left,0.95cap_stem,rth1,false,false,false); endchar; % okay beginchar(bracket_right, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Right bracket"; tmp_program(right,0[0.95stem,0.95cap_stem], rth0,true,true,true); endchar; beginchar(bracket_right_big, set_width(4.5u#,0.4u#,2.5u#),rth.frac#,2dh#-rth.frac#); "big right bracket"; tmp_program(right,0.125[0.95stem,0.95cap_stem], 0.125[rth0,rth1],true,true,true); endchar; beginchar(bracket_right_Big, set_width(5u#,0.6u#,3u#),rth.frac#,3dh#-rth.frac#); "Big right bracket"; tmp_program(right,0.25[0.95stem,0.95cap_stem], 0.25[rth0,rth1],true,true,true); endchar; beginchar(bracket_right_bigg, set_width(5.5u#,0.80u#,3.5u#),rth.frac#,4dh#-rth.frac#); "bigg right bracket"; tmp_program(right,0.5[0.95stem,0.95cap_stem], 0.5[rth0,rth1],true,true,true); endchar; beginchar(bracket_right_Bigg, set_width(6u#,1.00u#,4u#),rth.frac#,5dh#-rth.frac#); "Bigg right bracket"; tmp_program(right,0.75[0.95stem,0.95cap_stem], 0.75[rth0,rth1],true,true,true); endchar; beginchar(bracket_right_top, set_width(7u#,1.5u#,5u#),rth.frac#,3dh#-rth.frac#); "right bracket's extension top"; tmp_program(right,0.95cap_stem,rth1,true,false,false); endchar; beginchar(bracket_right_bot, set_width(7u#,1.5u#,5u#),rth.frac#,3dh#-rth.frac#); "right bracket's extension bottom"; tmp_program(right,0.95cap_stem,rth1,false,true,false); endchar; beginchar(bracket_right_mid, set_width(7u#,1.5u#,5u#),0,dh#); "right bracket's extension module"; tmp_program(right,0.95cap_stem,rth1,false,false,false); endchar; % okay beginchar(ceiling_left, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Left ceiling"; tmp_program(left,0[0.95stem,0.95cap_stem], rth0,true,false,true); endchar; beginchar(ceiling_left_big, set_width(4.5u#,0.4u#,2.5u#),rth.frac#,2dh#-rth.frac#); "big left ceiling"; tmp_program(left,0.125[0.95stem,0.95cap_stem], 0.125[rth0,rth1],true,false,true); endchar; beginchar(ceiling_left_Big, set_width(5u#,0.6u#,3u#),rth.frac#,3dh#-rth.frac#); "Big left ceiling"; tmp_program(left,0.25[0.95stem,0.95cap_stem], 0.25[rth0,rth1],true,false,true); endchar; beginchar(ceiling_left_bigg, set_width(5.5u#,0.8u#,3.5u#),rth.frac#,4dh#-rth.frac#); "bigg left ceiling"; tmp_program(left,0.5[0.95stem,0.95cap_stem], 0.5[rth0,rth1],true,false,true); endchar; beginchar(ceiling_left_Bigg, set_width(6u#,1.00u#,4u#),rth.frac#,5dh#-rth.frac#); "Bigg left ceiling"; tmp_program(left,0.75[0.95stem,0.95cap_stem], 0.75[rth0,rth1],true,false,true); endchar; % okay beginchar(ceiling_right, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Right ceiling"; tmp_program(right,0[0.95stem,0.95cap_stem],rth0,true,false,true); endchar; beginchar(ceiling_right_big, set_width(4.5u#,0.4u#,2.5u#),rth.frac#,2dh#-rth.frac#); "big right ceiling"; tmp_program(right,0.125[0.95stem,0.95cap_stem], 0.125[rth0,rth1],true,false,true); endchar; beginchar(ceiling_right_Big, set_width(5u#,0.6u#,3u#),rth.frac#,3dh#-rth.frac#); "Big right ceiling"; tmp_program(right,0.25[0.95stem,0.95cap_stem], 0.25[rth0,rth1],true,false,true); endchar; beginchar(ceiling_right_bigg, set_width(5.5u#,0.80u#,3.5u#),rth.frac#,4dh#-rth.frac#); "bigg right ceiling"; tmp_program(right,0.5[0.95stem,0.95cap_stem], 0.5[rth0,rth1],true,false,true); endchar; beginchar(ceiling_right_Bigg, set_width(6u#,1.00u#,4u#),rth.frac#,5dh#-rth.frac#); "Bigg right ceiling"; tmp_program(right,0.75[0.95stem,0.95cap_stem], 0.75[rth0,rth1],true,false,true); endchar; % okay beginchar(floor_left, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Left floor"; tmp_program(left,0[0.95stem,0.95cap_stem], rth0,false,true,true); endchar; beginchar(floor_left_big, set_width(4.5u#,0.4u#,2.5u#),rth.frac#,2dh#-rth.frac#); "big left floor"; tmp_program(left,0.125[0.95stem,0.95cap_stem], 0.125[rth0,rth1],false,true,true); endchar; beginchar(floor_left_Big, set_width(5u#,0.6u#,3u#),rth.frac#,3dh#-rth.frac#); "Big left floor"; tmp_program(left,0.25[0.95stem,0.95cap_stem], 0.25[rth0,rth1],false,true,true); endchar; beginchar(floor_left_bigg, set_width(5.5u#,0.8u#,3.5u#),rth.frac#,4dh#-rth.frac#); "bigg left floor"; tmp_program(left,0.5[0.95stem,0.95cap_stem], 0.5[rth0,rth1],false,true,true); endchar; beginchar(floor_left_Bigg, set_width(6u#,1.00u#,4u#),rth.frac#,5dh#-rth.frac#); "Bigg left floor"; tmp_program(left,0.75[0.95stem,0.95cap_stem], 0.75[rth0,rth1],false,true,true); endchar; % okay beginchar(floor_right, set_width(4u#,0.2u#,2u#),body_height#,paren_depth#); "Right floor"; tmp_program(right,0[0.95stem,0.95cap_stem], rth0,false,true,true); endchar; beginchar(floor_right_big, set_width(4.5u#,0.4u#,2.5u#),rth.frac#,2dh#-rth.frac#); "big right floor"; tmp_program(right,0.125[0.95stem,0.95cap_stem], 0.125[rth0,rth1],false,true,true); endchar; beginchar(floor_right_Big, set_width(5u#,0.6u#,3u#),rth.frac#,3dh#-rth.frac#); "Big right floor"; tmp_program(right,0.25[0.95stem,0.95cap_stem], 0.25[rth0,rth1],false,true,true); endchar; beginchar(floor_right_bigg, set_width(5.5u#,0.80u#,3.5u#),rth.frac#,4dh#-rth.frac#); "bigg right floor"; tmp_program(right,0.5[0.95stem,0.95cap_stem], 0.5[rth0,rth1],false,true,true); endchar; beginchar(floor_right_Bigg, set_width(6u#,1.00u#,4u#),rth.frac#,5dh#-rth.frac#); "Bigg right floor"; tmp_program(right,0.75[0.95stem,0.95cap_stem], 0.75[rth0,rth1],false,true,true); endchar; % BRACES def tmp_program(expr orientation,stem,hair,factor,superness)= pickup fine.nib; if orientation=left: rt x5l=w-internal_adjustment; lft x1=external_adjustment; else: lft x5l=internal_adjustment; rt x1=w-external_adjustment; fi x3=0.5[x1,x5l]; y1+0.5hair=vround(0.5[-d,h]+0.5hair); pos1(hround hair,90); top y5r=h+eps; y3=0.5[y1l,y5r]; y2=y2l=y1l; y1r=y2r; x2=factor[x3,x5l]; a:=0.5[angle(z3-z2),90]; pos5(hair,a); pos3(stem,angle(z3-z2) if orientation=left: + else: - fi 90); forsuffixes $=r,l: z2$-z3$=whatever*(z2-z3); z4$-z3$=whatever*(z2-z3); z4$-z5$=whatever*dir(a+90); forsuffixes @=1,2,3,4,5: x@'.$=x@.$; y@'.$-y1=y1-y@.$; endfor endfor autorounded; filldraw stroke z1e{x5e-x1e,0}... (z2e+(1-superness)*(z1e-z2e)+(1-superness)*(z3e-z2e)){z3e-z1e} ...z3e{z3e-z2e}... (z4e+(1-superness)*(z3e-z4e)+(1-superness)*(z5e-z4e)){z5e-z3e} ...z5e{z5e-z4e}; filldraw stroke z1'e{x5'e-x1'e,0}... (z2'e+(1-superness)*(z1'e-z2'e)+(1-superness)*(z3'e-z2'e)){z3'e-z1'e} ...z3'e{z3'e-z2'e}... (z4'e+(1-superness)*(z3'e-z4'e)+(1-superness)*(z5'e-z4'e)){z5'e-z3'e} ...z5'e{z5'e-z4'e}; % filldraw stroke z1e{x5e-x1e,0}.. % controls 0.5[z1e,z2e] and z2e ..z3e.. % controls z4e and 0.5[z5e,z4e] ..z5e; % filldraw stroke z1'e{x5'e-x1'e,0}.. % controls 0.5[z1'e,z2'e] and z2'e ..z3'e.. % controls z4'e and 0.5[z5'e,z4'e] ..z5'e; penlabels(1,2,3,4,5,1',2',3',4',5'); enddef; beginchar(brace_left, set_width(5u#,1.5u#,1.5u#),body_height#,paren_depth#); "left brace"; tmp_program(left,0[stem,cap_stem], 0[hair,rth1],0.5,superness); endchar; beginchar(brace_left_big, set_width(6u#,1.75*u#,1.75*u#),rth.frac#,2dh#-rth.frac#); "big left brace"; tmp_program(left,0.125[stem,cap_stem], 0.125[hair,rth1],0.5,superness); endchar; beginchar(brace_left_Big, set_width(7u#,2*u#,2*u#),rth.frac#,3dh#-rth.frac#); "Big left brace"; tmp_program(left,0.25[stem,cap_stem], 0.25[hair,rth1],0.5,superness); endchar; beginchar(brace_left_bigg, set_width(8u#,2.25*u#,2.25*u#),rth.frac#,4dh#-rth.frac#); "bigg left brace"; tmp_program(left,0.5[stem,cap_stem], 0.5[hair,rth1],0.5,superness); endchar; beginchar(brace_left_Bigg, set_width(9u#,2.5*u#,2.5*u#),rth.frac#,5dh#-rth.frac#); "Bigg left brace"; tmp_program(left,0.75[stem,cap_stem], 0.75[hair,rth1],0.5,superness); endchar; beginchar(brace_left_top, set_width(10u#,3*u#,3*u#),0,1.5dh#); "left brace's extension top"; a:=cap_stem; pickup fine.nib; top y1l=h; top y1l-y2=0.5(h+d); y3=-d-eps; rt x1=w-internal_adjustment; x2=x3=hround(0.5[external_adjustment,w-internal_adjustment]-0.5a)+0.5a; pos1(rth1,-90); pos2(a,0); pos3(a,0); filldraw stroke z1e left_to_down z2e..z3e; penlabels(1,2,3); endchar; beginchar(brace_left_bot, set_width(10u#,3*u#,3*u#),0,1.5dh#); "left brace's extension bot"; a:=cap_stem; pickup fine.nib; y1=h+eps; y2-bot y3l=0.5(h+d); bot y3l=-d; rt x3=w-internal_adjustment; x1=x2=hround(0.5[external_adjustment,w-internal_adjustment]-0.5a)+0.5a; pos1(a,0); pos2(a,0); pos3(rth1,90); filldraw stroke z1e..z2e down_to_right z3e; penlabels(1,2,3); endchar; beginchar(brace_left_mid, set_width(10u#,3*u#,3*u#),0,3dh#); "left brace's extension mid"; a:=cap_stem; pickup fine.nib; y1=h+eps; y3+0.5rth1=vround(0.5[-d,h]+0.5rth1); y2-bot y3r=top y3l-y4=0.25(h+d); y5=-d-eps; x1=x2=x4=x5=hround(0.5[external_adjustment,w-internal_adjustment]-0.5a)+0.5a; lft x3=external_adjustment; pos1(a,0); pos2(a,0); pos3(rth1,-90); pos4(a,180); pos5(a,180); filldraw stroke z1e..z2e down_to_left z3e; filldraw stroke z3e right_to_down z4e..z5e; penlabels(1,2,3,4,5); endchar; beginchar(brace_left_mod, set_width(10u#,3*u#,3*u#),0,0.5dh#); "left brace's extension module"; a:=cap_stem; pickup fine.nib; y1=h+eps; y2=-d-eps; x1=x2=hround(0.5[external_adjustment,w-internal_adjustment]-0.5a)+0.5a; pos1(a,0); pos2(a,0); filldraw stroke z1e..z2e; penlabels(1,2); endchar; beginchar(brace_right, set_width(5u#,1.5u#,1.5u#),body_height#,paren_depth#); "Right brace"; internal_adjustment:=appr+hround 0.5u; external_adjustment:=appr+hround 0.5u; tmp_program(right,0[stem,cap_stem], 0[hair,rth1],0.5,superness); endchar; beginchar(brace_right_big, set_width(6u#,1.75*u#,1.75*u#),rth.frac#,2dh#-rth.frac#); "big right brace"; tmp_program(right,0.125[stem,cap_stem], 0.125[hair,rth1],0.5,superness); endchar; beginchar(brace_right_Big, set_width(7u#,2*u#,2*u#),rth.frac#,3dh#-rth.frac#); "Big right brace"; tmp_program(right,0.25[stem,cap_stem], 0.25[hair,rth1],0.5,superness); endchar; beginchar(brace_right_bigg, set_width(8u#,2.25*u#,2.25*u#),rth.frac#,4dh#-rth.frac#); "bigg right brace"; tmp_program(right,0.5[stem,cap_stem], 0.5[hair,rth1],0.5,superness); endchar; beginchar(brace_right_Bigg, set_width(9u#,2.5*u#,2.5*u#),rth.frac#,5dh#-rth.frac#); "Bigg right brace"; tmp_program(right,0.75[stem,cap_stem], 0.75[hair,rth1],0.5,superness); endchar; beginchar(brace_right_top, set_width(10u#,3*u#,3*u#),0,1.5dh#); "right brace's extension top"; a:=cap_stem; pickup fine.nib; top y1r=h; top y1r-y2=0.5(h+d); y3=-d-eps; lft x1=internal_adjustment; x2=x3=hround(0.5[internal_adjustment,w-external_adjustment]-0.5a)+0.5a; pos1(rth1,90); pos2(a,0); pos3(a,0); filldraw stroke z1e right_to_down z2e..z3e; penlabels(1,2,3); endchar; beginchar(brace_right_bot, set_width(10u#,3*u#,3*u#),0,1.5dh#); "right brace's extension bot"; a:=cap_stem; pickup fine.nib; y1=h+eps; y2-bot y3r=0.5(h+d); bot y3r=-d; lft x3=internal_adjustment; x1=x2=hround(0.5[internal_adjustment,w-external_adjustment]-0.5a)+0.5a; pos1(a,0); pos2(a,0); pos3(rth1,-90); filldraw stroke z1e..z2e down_to_left z3e; penlabels(1,2,3); endchar; beginchar(brace_right_mid, set_width(10u#,3*u#,3*u#),0,3dh#); "right brace's extension mid"; a:=cap_stem; pickup fine.nib; y1=h+eps; y3+0.5rth1=vround(0.5[-d,h]+0.5rth1); y2-bot y3l=top y3r-y4=0.25(h+d); y5=-d-eps; x1=x2=x4=x5=hround(0.5[internal_adjustment,w-external_adjustment]-0.5a)+0.5a; rt x3=w-external_adjustment; pos1(a,0); pos2(a,0); pos3(rth1,90); pos4(a,180); pos5(a,180); filldraw stroke z1e..z2e down_to_right z3e; filldraw stroke z3e right_to_down z4e..z5e; penlabels(1,2,3,4,5); endchar; beginchar(brace_right_mod, set_width(10u#,3*u#,3*u#),0,0.5dh#); "right brace's extension module"; a:=cap_stem; pickup fine.nib; y1=h+eps; y2=-d-eps; x1=x2=hround(0.5[internal_adjustment,w-external_adjustment]-0.5a)+0.5a; pos1(a,0); pos2(a,0); filldraw stroke z1e..z2e; penlabels(1,2); endchar; % ANGLES def tmp_program(expr orientation,rth)= pickup tiny.nib; top y1r=h+eps; y2l=good.y 0.5[-d,h]; y1r-y2l=y2l-y3r; if orientation=left: rt x1r=rt x3r=w-internal_adjustment+eps; lft x2l=external_adjustment-eps; adjust_slanted_bar(1r,2l,1l,2a)(max(rth-tiny,1),-1); adjust_slanted_bar(3r,2l,3l,2b)(max(rth-tiny,1),1); else: lft x1r=lft x3r=internal_adjustment-eps; rt x2l=w-external_adjustment+eps; adjust_slanted_bar(1r,2l,1l,2a)(max(rth-tiny,1),1); adjust_slanted_bar(3r,2l,3l,2b)(max(rth-tiny,1),-1); fi z2r=whatever[z1r,z2a]; z2r=whatever[z3r,z2b]; filldraw stroke z1e--z2e--z3e; penlabels(1,2,3); labels(2a,2b); enddef; % almost okay beginchar(angle_left, set_width(6.5u#,0.5u#,0.5u#),body_height#,paren_depth#); "Left angle"; tmp_program(left,rth0); endchar; beginchar(angle_left_big, set_width(8u#,0.75u#,0.75u#),rth.frac#,2dh#-rth.frac#); "big left angle"; tmp_program(left,0.125[rth0,rth2]); endchar; beginchar(angle_left_Big, set_width(10u#,1.0u#,1.0u#),rth.frac#,3dh#-rth.frac#); "Big left angle"; tmp_program(left,0.25[rth0,rth2]); endchar; beginchar(angle_left_bigg, set_width(12u#,1.25u#,1.25u#),rth.frac#,4dh#-rth.frac#); "bigg left angle"; tmp_program(left,0.5[rth0,rth2]); endchar; beginchar(angle_left_Bigg, set_width(14u#,1.5u#,1.5u#),rth.frac#,5dh#-rth.frac#); "Bigg left angle"; tmp_program(left,0.75[rth0,rth2]); endchar; % almost okay beginchar(angle_right, set_width(6.5u#,0.5u#,0.5u#),body_height#,paren_depth#); "Right angle"; tmp_program(right,rth0); endchar; beginchar(angle_right_big, set_width(8u#,0.75u#,0.75u#),rth.frac#,2dh#-rth.frac#); "big right angle"; tmp_program(right,0.125[rth0,rth2]); endchar; beginchar(angle_right_Big, set_width(10u#,1.0u#,1.0u#),rth.frac#,3dh#-rth.frac#); "Big right angle"; tmp_program(right,0.25[rth0,rth2]); endchar; beginchar(angle_right_bigg, set_width(12u#,1.25u#,1.25u#),rth.frac#,4dh#-rth.frac#); "bigg right angle"; tmp_program(right,0.5[rth0,rth2]); endchar; beginchar(angle_right_Bigg, set_width(14u#,1.5u#,1.5u#),rth.frac#,5dh#-rth.frac#); "Bigg right angle"; tmp_program(right,0.75[rth0,rth2]); endchar; % SLASHES vardef tmp_program(expr orientation,thickness,slash_slant)= pickup tiny.nib; top y1=h; y1=y1l=y1r; bot y2=-d; y2=y2l=y2r; 0.5[x1,x2]=0.5w; x1-x2=if orientation=left: - fi slash_slant*(y1-y2); x1r-x1l=x2r-x2l=diag_width(thickness-tiny,z1-z2); 0.5[x1l,x1r]=x1; 0.5[x2l,x2r]=x2; filldraw stroke z1e..z2e; penlabels(1,2); enddef; beginchar(backslash, set_width((body_height#+paren_depth#)*0.375 +(0[rth0#,rth2#]-tiny#)*(1++0.375)+tiny#, 0.2u#,0.2u#), body_height#,paren_depth#); "backslash"; tmp_program(left,0[rth0,rth2],0.375); endchar; beginchar(backslash_thick, set_width((body_height#+paren_depth#)*0.375 +(0.95stem#-tiny#)*(1++0.375)+tiny#, 0.2u#,0.2u#), body_height#,paren_depth#); "Thick backslash"; tmp_program(left,0.95stem,0.375); endchar; beginchar(backslash_big, set_width(2dh#*0.375 +(0.125[rth0#,rth2#]-tiny#)*(1++0.375)+tiny#, 0.4u#,0.4u#), rth.frac#,2dh#-rth.frac#); "big backslash"; tmp_program(left,0.125[rth0,rth2],0.375); endchar; beginchar(backslash_Big, set_width(3dh#*0.375 +(0.25[rth0#,rth2#]-tiny#)*(1++0.375)+tiny#, 0.7u#,0.7u#), rth.frac#,3dh#-rth.frac#); "Big backslash"; tmp_program(left,0.25[rth0,rth2],0.375); endchar; beginchar(backslash_bigg, set_width(4dh#*0.375 +(0.5[rth0#,rth2#]-tiny#)*(1++0.375)+tiny#, 1.0u#,1.0u#), rth.frac#,4dh#-rth.frac#); "bigg backslash"; tmp_program(left,0.5[rth0,rth2],0.375); endchar; beginchar(backslash_Bigg, set_width(5dh#*0.375 +(0.75[rth0#,rth2#]-tiny#)*(1++0.375)+tiny#, 1.2u#,1.2u#), rth.frac#,5dh#-rth.frac#); "Bigg backslash"; tmp_program(left,0.75[rth0,rth2],0.375); endchar; beginchar(slash, set_width((body_height#+paren_depth#)*0.375 +(0[rth0#,rth2#]-tiny#)*(1++0.375)+tiny#, 0.2u#,0.2u#), body_height#,paren_depth#); "slash"; tmp_program(right,0[rth0,rth2],0.375); endchar; beginchar(slash_thick, set_width((body_height#+paren_depth#)*0.375 +(0.95stem#-tiny#)*(1++0.375)+tiny#, 0.2u#,0.2u#), body_height#,paren_depth#); "Thick slash"; tmp_program(right,0.95stem,0.375); endchar; beginchar(slash_big, set_width(2dh#*0.375 +(0.125[rth0#,rth2#]-tiny#)*(1++0.375)+tiny#, 0.4u#,0.4u#), rth.frac#,2dh#-rth.frac#); "big slash"; tmp_program(right,0.125[rth0,rth2],0.375); endchar; beginchar(slash_Big, set_width(3dh#*0.375 +(0.25[rth0#,rth2#]-tiny#)*(1++0.375)+tiny#, 0.7u#,0.7u#), rth.frac#,3dh#-rth.frac#); "Big slash"; tmp_program(right,0.25[rth0,rth2],0.375); endchar; beginchar(slash_bigg, set_width(4dh#*0.375 +(0.5[rth0#,rth2#]-tiny#)*(1++0.375)+tiny#, 1.0u#,1.0u#), rth.frac#,4dh#-rth.frac#); "bigg slash"; tmp_program(right,0.5[rth0,rth2],0.375); endchar; beginchar(slash_Bigg, set_width(5dh#*0.375 +(0.75[rth0#,rth2#]-tiny#)*(1++0.375)+tiny#, 1.2u#,1.2u#), rth.frac#,5dh#-rth.frac#); "Bigg slash"; tmp_program(right,0.75[rth0,rth2],0.375); endchar; % % blackboard bold brackets % def tmp_program(expr orientation,rth,thick, do_top,do_bot,not_ext)= save a,b; a=hround(rth*(1++slant)); b=hround(thick*(1++slant)); y5r=y6r=h if do_top or not_ext: else: +eps fi; y7r=y8r=-d if do_bot or not_ext: else: -eps fi; if orientation=left: forsuffixes @#=1,2,3,4: x@#r-x@#=x@#-x@#l=-0.5a; endfor x1r=x2r=x5r=x7r=min(external_adjustment, hround 0.5(w-a-b)); x1-x3=x2-x4=-b; x6r=x8r=w-internal_adjustment; else: forsuffixes @#=1,2,3,4: x@#r-x@#=x@#-x@#l=0.5a; endfor x1r=x2r=x5r=x7r=max(w-external_adjustment, hround 0.5(w+a+b)); x1-x3=x2-x4=b; x6r=x8r=internal_adjustment; fi forsuffixes @=1,1r,1l,3,3r,3l: z@=whatever[z5r,z6r]; endfor forsuffixes @=2,2r,2l,4,4r,4l: z@=whatever[z7r,z8r]; endfor penpos5(rth,90); penpos6(rth,90); penpos7(rth,-90); penpos8(rth,-90); penstroke z1e..z2e; penstroke z3e..z4e; if do_top: penstroke z5e..z6e; fi if do_bot: penstroke z7e..z8e; fi penlabels(1,2,3,4,5,6,7,8); enddef; beginchar(bbbracket_left, set_width(5u#,0.5u#,2u#),body_height#,paren_depth#); "Left bbbracket"; tmp_program(left,rth0,2.2u,true,true,true); endchar; beginchar(bbbracket_left_big, set_width(5.5u#,0.75u#,2.5u#),rth.frac#,2dh#-rth.frac#); "big left bbbracket"; tmp_program(left,0.125[rth0,rth1],0.125[2.2u,3.0u],true,true,true); endchar; beginchar(bbbracket_left_Big, set_width(6.0u#,1.0u#,3u#),rth.frac#,3dh#-rth.frac#); "Big left bbbracket"; tmp_program(left,0.25[rth0,rth1],0.25[2.2u,3.0u],true,true,true); endchar; beginchar(bbbracket_left_bigg, set_width(6.5u#,1.25u#,3.5u#),rth.frac#,4dh#-rth.frac#); "bigg left bbbracket"; tmp_program(left,0.5[rth0,rth1],0.5[2.2u,3.0u],true,true,true); endchar; beginchar(bbbracket_left_Bigg, set_width(7.0u#,1.5u#,4u#),rth.frac#,5dh#-rth.frac#); "Bigg left bbbracket"; tmp_program(left,0.75[rth0,rth1],0.75[2.2u,3.0u],true,true,true); endchar; beginchar(bbbracket_left_top, set_width(8u#,2u#,5u#),rth.frac#,3dh#-rth.frac#); "Left bbbracket's extension top"; tmp_program(left,rth1,3.0u,true,false,false); endchar; beginchar(bbbracket_left_bot, set_width(8u#,2u#,5u#),rth.frac#,3dh#-rth.frac#); "Left bbbracket's extension bottom"; tmp_program(left,rth1,3.0u,false,true,false); endchar; beginchar(bbbracket_left_mid, set_width(8u#,2u#,5u#),0,dh#); "Left bbbracket's extension module"; tmp_program(left,rth1,3.0u,false,false,false); endchar; beginchar(bbbracket_right, set_width(5u#,0.5u#,2u#),body_height#,paren_depth#); "Right bbbracket"; tmp_program(right,rth0,2.2u,true,true,true); endchar; beginchar(bbbracket_right_big, set_width(5.5u#,0.75u#,2.5u#),rth.frac#,2dh#-rth.frac#); "big right bbbracket"; tmp_program(right,0.125[rth0,rth1],0.125[2.2u,3.0u],true,true,true); endchar; beginchar(bbbracket_right_Big, set_width(6.0u#,1.0u#,3u#),rth.frac#,3dh#-rth.frac#); "Big right bbbracket"; tmp_program(right,0.25[rth0,rth1],0.25[2.2u,3.0u],true,true,true); endchar; beginchar(bbbracket_right_bigg, set_width(6.5u#,1.25u#,3.5u#),rth.frac#,4dh#-rth.frac#); "bigg right bbbracket"; tmp_program(right,0.5[rth0,rth1],0.5[2.2u,3.0u],true,true,true); endchar; beginchar(bbbracket_right_Bigg, set_width(7.0u#,1.5u#,4u#),rth.frac#,5dh#-rth.frac#); "Bigg right bbbracket"; tmp_program(right,0.75[rth0,rth1],0.75[2.2u,3.0u],true,true,true); endchar; beginchar(bbbracket_right_top, set_width(8u#,2.0u#,5u#),rth.frac#,3dh#-rth.frac#); "Right bbbracket's extension top"; tmp_program(right,rth1,3.0u,true,false,false); endchar; beginchar(bbbracket_right_bot, set_width(8u#,2.0u#,5u#),rth.frac#,3dh#-rth.frac#); "Right bbbracket's extension bottom"; tmp_program(right,rth1,3.0u,false,true,false); endchar; beginchar(bbbracket_right_mid, set_width(8u#,2.0u#,5u#),0,dh#); "Right bbbracket's extension module"; tmp_program(right,rth1,3.0u,false,false,false); endchar; % % A poursuivre % beginchar(vert_sign,3u#+2appr#,body_height#,paren_depth#); "Vertical line"; ensure_centering_of(rth1); pickup tiny.nib; pos1(rth1,0); pos2(rth1,0); x1=x2=0.5w; top y1=h; bot y2=-d; filldraw stroke z1e..z2e; penlabels(1,2); endchar; beginchar(vert_mod,3u#+2appr#,0,dh#); "Vertical line's module"; ensure_centering_of(rth1); pickup tiny.nib; pos1(rth1,0); pos2(rth1,0); x1=x2=0.5w; y1=h+eps; y2=-d-eps; filldraw stroke z1e..z2e; penlabels(1,2); endchar; beginchar(vert_thick,3u#+2appr#,body_height#,paren_depth#); "Thick vertical line"; ensure_centering_of(0.95stem); pickup tiny.nib; pos1(hround 0.95stem,0); pos2(hround 0.95stem,0); x1=x2=0.5w; top y1=h; bot y2=-d; filldraw stroke z1e..z2e; penlabels(1,2); endchar; beginchar(vert_thick_mod,3u#+2appr#,0,dh#); "Thick vertical line's module"; ensure_centering_of(0.95stem); pickup tiny.nib; pos1(hround 0.95stem,0); pos2(hround 0.95stem,0); x1=x2=0.5w; y1=h+eps; y2=-d-eps; filldraw stroke z1e..z2e; penlabels(1,2); endchar; beginchar(vvert_sign,5.5u#+2appr#,body_height#,paren_depth#); "Double vertical line"; numeric a; a=max(2.5u-rth0,2rth0);% blank space between bars pickup tiny.nib; pos1(rth0,0); pos2(rth0,0); pos3(rth0,0); pos4(rth0,0); rt x1r=rt x2r=hround 0.5(w-a); w-rt x3r=lft x1l; x3=x4; top y1=top y3=h; bot y2=bot y4=-d; filldraw stroke z1e..z2e; filldraw stroke z3e..z4e; penlabels(1,2,3,4); endchar; beginchar(vvert_mod,5.5u#+2appr#,0,dh#); "Double vertical line's module"; numeric a; a=max(2.5u-rth0,2rth0);% blank space between bars pickup tiny.nib; pos1(rth0,0); pos2(rth0,0); pos3(rth0,0); pos4(rth0,0); rt x1r=rt x2r=hround 0.5(w-a); w-rt x3r=lft x1l; x3=x4; y1=y3=h+eps; y2=y4=-d-eps; filldraw stroke z1e..z2e; filldraw stroke z3e..z4e; penlabels(1,2,3,4); endchar; beginchar(vvvert_sign,9u#+2appr#,body_height#,paren_depth#); "Triple vertical line"; ensure_centering_of(rth0); numeric a; a=max(2.75u-rth0,2rth0);% blank space between bars pickup tiny.nib; pos1(rth0,0); pos2(rth0,0); pos3(rth0,0); pos4(rth0,0); pos5(rth0,0); pos6(rth0,0); x3=x4=0.5w; x1=x2; x5=x6; lft x5l-rt x3r=lft x3l-rt x1r=hround a; top y1=top y3=top y5=h; bot y2=bot y4=bot y6=-d; filldraw stroke z1e..z2e; filldraw stroke z3e..z4e; filldraw stroke z5e..z6e; penlabels(1,2,3,4,5,6); endchar; beginchar(vvvert_mod,9u#+2appr#,0,dh#); "Triple vertical line's module"; ensure_centering_of(rth0); numeric a; a=max(2.75u-rth0,2rth0);% blank space between bars pickup tiny.nib; pos1(rth0,0); pos2(rth0,0); pos3(rth0,0); pos4(rth0,0); pos5(rth0,0); pos6(rth0,0); x3=x4=0.5w; x1=x2; x5=x6; lft x5l-rt x3r=lft x3l-rt x1r=hround a; y1=y3=y5=h+eps; y2=y4=y6=-d-eps; filldraw stroke z1e..z2e; filldraw stroke z3e..z4e; filldraw stroke z5e..z6e; penlabels(1,2,3,4,5,6); endchar; beginchar(left_filet,4stem#+2appr#,0,dh#); "extensible left filet"; pickup fine.nib; y1r=y1l=0; y5r=y5l=-d; forsuffixes $=r,l: y2$=0.25[y1r,y5r]; y3$=0.5[y1r,y5r]; y4$=0.75[y1r,y5r]; endfor x1l=x5l=x4r=good.x 0.5w; x1l-lft x3l=rt x2r-x4r=2stem; x2l=x4l=0.5[x1l,x3l]; x1r=x3r=x5r=0.5[x2r,x4r]; filldraw z1l{down}...z2l{(z3l-z1l)xscaled 2}...z3l{down} ...z4l{(z5l-z3l)xscaled 2}...z5l{down}-- z5r{(z4r-z5r)xscaled 2}...z4r{up}... z3r{(z2r-z3r)xscaled 2}...z2r{up}... z1r{(z1r-z2r)xscaled 2}--cycle; penlabels(1,2,3,4,5); endchar; beginchar(right_filet,4stem#+2appr#,0,dh#); "extensible right filet"; pickup fine.nib; y1r=y1l=0; y5r=y5l=-d; forsuffixes $=r,l: y2$=0.25[y1r,y5r]; y3$=0.5[y1r,y5r]; y4$=0.75[y1r,y5r]; endfor x1r=x5r=x2l=good.x 0.5w; x2l-lft x4l=rt x3r-x1r=2stem; x1l=x3l=x5l=0.5[x2l,x4l]; x2r=x4r=0.5[x1r,x3r]; filldraw z1r{down}...z2r{(z3r-z1r)xscaled 2}...z3r{down} ...z4r{(z5r-z3r)xscaled 2}...z5r{down}-- z5l{(z4l-z5l)xscaled 2}...z4l{up}... z3l{(z2l-z3l)xscaled 2}...z2l{up}... z1l{(z1l-z2l)xscaled 2}--cycle; penlabels(1,2,3,4,5); endchar; % HORIZONTAL BRACES (almost okay, check xdvi problems) beginchar(overbrace_left,0.75dh#+appr#,cap_stem#,dh#); "overbrace's left piece"; pickup fine.nib; pos1(rth1,180); pos2(cap_stem,90); bot y2l=vround (0.5[-d,h]-0.5cap_stem); bot y1r=vround(y2-min(5u,0.4dh+0.5cap_stem)); lft x1r=appr; x2=w+eps; filldraw stroke z1e up_to_right z2e; penlabels(1,2); endchar; beginchar(overbrace_mid,1.5dh#,cap_stem#,dh#); "overbrace's middle piece"; pickup fine.nib; pos1(cap_stem,-90); pos2(rth1,0); pos3(cap_stem,90); bot y1r=bot y3l=vround (0.5[-d,h]-0.5cap_stem); top y2=vround(y3+min(5u,0.4dh+0.5cap_stem)); x2=hround 0.5(w-rth1); x1=-eps; x3=w+eps; filldraw stroke z1e right_to_down z2e; filldraw stroke z3e left_to_down z2e; penlabels(1,2,3); endchar; beginchar(overbrace_right,0.75dh#+appr#,cap_stem#,dh#); "overbrace's right piece"; pickup fine.nib; pos1(rth1,0); pos2(cap_stem,90); bot y2l=vround (0.5[-d,h]-0.5cap_stem); bot y1r=vround(y2-min(5u,0.4dh+0.5cap_stem)); rt x1r=w-appr; x2=-eps; filldraw stroke z1e up_to_left z2e; penlabels(1,2); endchar; % 4u# ??? beginchar(overbrace_mod,0.5dh#,cap_stem#,dh#); "overbrace's module piece"; pickup fine.nib; pos1(cap_stem,90); pos2(cap_stem,90); bot y1l=bot y2l=vround (0.5[-d,h]-0.5cap_stem); x1=-eps; x2=w+eps; filldraw stroke z1e..z2e; penlabels(1,2); endchar; beginchar(underbrace_left,0.75dh#+appr#,cap_stem#,dh#); "underbrace's left piece"; pickup fine.nib; pos1(rth1,0); pos2(cap_stem,90); bot y2l=vround (0.5[-d,h]-0.5cap_stem); top y1l=vround(y2+min(5u,0.4dh+0.5cap_stem)); lft x1l=appr; x2=w+eps; filldraw stroke z1e down_to_right z2e; penlabels(1,2); endchar; beginchar(underbrace_mid,1.5dh#,cap_stem#,dh#); "underbrace's middle piece"; pickup fine.nib; pos1(cap_stem,90); pos2(rth1,0); pos3(cap_stem,-90); bot y1l=bot y3r=vround (0.5[-d,h]-0.5cap_stem); bot y2=vround(y3-min(5u,0.4dh+0.5cap_stem)); x2=hround 0.5(w-rth1); x1=-eps; x3=w+eps; filldraw stroke z1e right_to_down z2e; filldraw stroke z3e left_to_down z2e; penlabels(1,2,3); endchar; beginchar(underbrace_right,0.75dh#+appr#,cap_stem#,dh#); "underbrace's right piece"; pickup fine.nib; pos1(rth1,180); pos2(cap_stem,90); bot y2l=vround (0.5[-d,h]-0.5cap_stem); top y1l=vround(y2+min(5u,0.4dh+0.5cap_stem)); rt x1l=w-appr; x2=-eps; filldraw stroke z1e down_to_left z2e; penlabels(1,2); endchar; % 4u# ??? beginchar(underbrace_mod,0.5dh#,cap_stem#,dh#); "underbrace's module piece"; pickup fine.nib; pos1(cap_stem,90); pos2(cap_stem,90); bot y1l=bot y2l=vround (0.5[-d,h]-0.5cap_stem); x1=-eps; x2=w+eps; filldraw stroke z1e..z2e; penlabels(1,2); endchar; % RADICALS rth:=ceiling(rth.frac#*hppp); vardef tmp_program= % imperative coordinates save a,b,c,f,sl; a=2.75; b=1.25;% slope factors pickup crisp.nib; x1'=w; lft x5l=appr; top y1r=h; y1'=h-0.5rth; bot y2r=bot y3r=-d-eps; top y4l=vround 0.5[-d,h]+o; y5l=good.y 0.75[y2r,y4l]; % numerical calculus c=a*(y4l-y5l)+b*(y4l-y2r)+y1'-y2r; vardef f(expr sl)= sl*c-(1++(b*sl))*(curve-crisp)+0.5(rth-crisp)*(1+(1++sl))