% mathematical symbols by Anthony Phan. % file: mathbdel.mf (big delimiters) % 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; % 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))