summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/fonts/source/public/mathabx/mathbdel.mf
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/fonts/source/public/mathabx/mathbdel.mf')
-rw-r--r--Master/texmf-dist/fonts/source/public/mathabx/mathbdel.mf1456
1 files changed, 1456 insertions, 0 deletions
diff --git a/Master/texmf-dist/fonts/source/public/mathabx/mathbdel.mf b/Master/texmf-dist/fonts/source/public/mathabx/mathbdel.mf
new file mode 100644
index 00000000000..0a178a37f26
--- /dev/null
+++ b/Master/texmf-dist/fonts/source/public/mathabx/mathbdel.mf
@@ -0,0 +1,1456 @@
+% 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))<x1'-x5l
+ enddef;
+ sl = solve f(0, (x1'-x5l)/(y1'-y5l));
+% setting other key points
+ x4l = good.x(x5l+a*sl*(y4l-y5l));
+ x2r = good.x(x1'-sl*(y1'-y2r)+0.5(rth-crisp)*(1++sl));
+ penpos1((rth-crisp)*(1++sl), 0);
+ pos5(min(hair, rth), angle(z4l-z5l)-90);
+ rt x2r-lft x3r = rth; z1r-z2r = whatever*(sl, 1);
+ adjust_slanted_bar(3r, 4l, 3, 4)(curve-crisp, -1);
+ z1l-z2l = whatever*(z1r-z2r); z2l = whatever[z3, z4l];
+ z4r-z5r = whatever*(z4l-z5l); z4r = whatever[z3r, z4];
+ z3l = 0.5[z2l, z4l];% it's not an interesting point
+ filldraw stroke z1e--z2e--z3e--z4e--z5e;
+ penlabels(1, 2, 3, 4, 5); labels(1');
+enddef;
+
+beginchar(radical_sign,
+ 15u#+letter_fit#, rth.frac#, body_height#+paren_depth#-rth.frac#);
+ "radical sign";
+ tmp_program;
+endchar;
+
+beginchar(radical_big,
+ 18u#+letter_fit#, rth.frac#, 2dh#-rth.frac#);
+ "big radical sign";
+ tmp_program;
+endchar;
+
+beginchar(radical_Big,
+ 18u#+letter_fit#, rth.frac#, 3dh#-rth.frac#);
+ "Big radical sign";
+ tmp_program;
+endchar;
+
+beginchar(radical_bigg,
+ 18u#+letter_fit#, rth.frac#, 4dh#-rth.frac#);
+ "bigg radical sign";
+ tmp_program;
+endchar;
+
+beginchar(radical_Bigg,
+ 18u#+letter_fit#, rth.frac#, 5dh#-rth.frac#);
+ "Bigg radical sign";
+ tmp_program;
+endchar;
+
+beginchar(radical_bot, 19u#+letter_fit#, 0, 3dh#);
+ "Extensible radical sign---bottom";
+ % imperative coordinates
+ save a, b, c, f, sl; a = 1; b = 1;% slope factors
+ pickup crisp.nib;
+ rt x1r = rt x2r = hround(w-6u+0.5rth); lft x5l = appr;
+ top y1r = h+1+eps; bot y2r = bot y3r = -d-eps;
+ top y4l = vround 0.9[-d, h]+o; y5l = good.y 0.75[y2r, y4l];
+% numerical calculus
+ c = a*(y4l-y5l)+b*(y4l-y2r);
+ vardef f(expr sl) =
+ sl*c-(1++(b*sl))*(curve-crisp)+0.5(rth-crisp)<x1r-x5l
+ enddef;
+ sl = solve f(0, (x1r-x5l)/(y1r-y5l));
+% setting other key points
+ x4l = good.x(x5l+a*sl*(y4l-y5l)); x3r = x1l;
+ pos1(rth, 0); pos5(min(hair, rth), angle(z4l-z5l)-90);
+ adjust_slanted_bar(3r, 4l, 3, 4)(curve-crisp, -1);
+ z1l-z2l = whatever*(z1r-z2r); z2l = whatever[z3, z4l];
+ z4r-z5r = whatever*(z4l-z5l); z4r = whatever[z3r, z4];
+ z3l = 0.5[z2l, z4l];% it's not an interesting point
+ filldraw stroke z1e--z2e--z3e--z4e--z5e;
+ penlabels(1, 2, 3, 4, 5);
+endchar;
+
+beginchar(radical_mod, 19u#+letter_fit#, 0, dh#);
+ "Extensible radical sign---module";
+ pickup crisp.nib; rt x1r = rt x2r = hround(w-6u+0.5rth);
+ y1 = h+1+eps; y2 = -d-1-eps; pos1(rth, 0); pos2(rth, 0);
+ filldraw stroke z1e..z2e; penlabels(1, 2);
+endchar;
+
+beginchar(radical_top, 19u#+letter_fit#, rth.frac#, dh#-rth.frac#);
+ "Extensible radical sign---top";
+ pickup crisp.nib; rt x3r = rt x2r = hround(w-6u+0.5rth);
+ x1 = good.x(w+0.5); bot y1r = bot y2r = 0; y3 = -d-1-eps;
+ x2l = x3l; y1l = y2l; pos1(rth, -90); pos3(rth, 0);
+ filldraw stroke z1e--z2e--z3e; penlabels(1, 2, 3);
+endchar;
+
+beginchar(group_left,
+ set_width(4u#, 0.2u#, 2u#), body_height#, paren_depth#);
+ "Left group";
+ a := hround 0[0.95stem, 0.95cap_stem];
+ pickup fine.nib;
+ top y1l = h; bot y4l = -d;
+ y2 = 0.75[y4r, y1r]; y3 = 0.25[y4r, y1r];
+ rt x1 = rt x4 = w-internal_adjustment;
+ lft x2l = lft x3l = external_adjustment;
+ pos1(rth0, -90); pos2(a, 0); pos3(a, 0); pos4(rth0, 90);
+ filldraw stroke z1e left_to_down
+ z2e..z3e down_to_right z4e;
+ penlabels(1, 2, 3, 4);
+endchar;
+
+beginchar(group_left_big,
+ set_width(4.5u#, 0.4u#, 2.5u#), rth.frac#, 2dh#-rth.frac#);
+ "big left group";
+ a := hround 0.125[0.95stem, 0.95cap_stem];
+ pickup fine.nib;
+ top y1l = h; bot y4l = -d;
+ y2 = 0.75[y4r, y1r]; y3 = 0.25[y4r, y1r];
+ rt x1 = rt x4 = w-internal_adjustment;
+ lft x2l = lft x3l = external_adjustment;
+ pos1(rth0, -90); pos2(a, 0); pos3(a, 0); pos4(rth0, 90);
+ filldraw stroke z1e left_to_down
+ z2e..z3e down_to_right z4e;
+ penlabels(1, 2, 3, 4);
+endchar;
+
+beginchar(group_right,
+ set_width(4u#, 0.2u#, 2u#), body_height#, paren_depth#);
+ "Right group";
+ a := hround 0[0.95stem, 0.95cap_stem];
+ pickup fine.nib;
+ top y1r = h; bot y4r = -d;
+ y2 = 0.75[y4l, y1l]; y3 = 0.25[y4l, y1l];
+ lft x1 = lft x4 = internal_adjustment;
+ rt x2r = rt x3r = w-external_adjustment;
+ pos1(rth0, 90); pos2(a, 0); pos3(a, 0); pos4(rth0, -90);
+ filldraw stroke z1e right_to_down
+ z2e..z3e down_to_left z4e;
+ penlabels(1, 2, 3, 4);
+endchar;
+
+beginchar(group_right_big,
+ set_width(4.5u#, 0.4u#, 2.5u#), rth.frac#, 2dh#-rth.frac#);
+ "big right group";
+ a := hround 0.125[0.95stem, 0.95cap_stem];
+ pickup fine.nib;
+ top y1r = h; bot y4r = -d;
+ y2 = 0.75[y4l, y1l]; y3 = 0.25[y4l, y1l];
+ lft x1 = lft x4 = internal_adjustment;
+ rt x2r = rt x3r = w-external_adjustment;
+ pos1(rth0, 90); pos2(a, 0); pos3(a, 0); pos4(rth0, -90);
+ filldraw stroke z1e right_to_down
+ z2e..z3e down_to_left z4e;
+ penlabels(1, 2, 3, 4);
+endchar;