summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Delim.mf
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Delim.mf')
-rw-r--r--Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Delim.mf882
1 files changed, 882 insertions, 0 deletions
diff --git a/Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Delim.mf b/Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Delim.mf
new file mode 100644
index 00000000000..cee9984a552
--- /dev/null
+++ b/Master/texmf-dist/fonts/source/public/mnsymbol/Sym-Delim.mf
@@ -0,0 +1,882 @@
+% brackets
+
+def draw_bracket(expr sign, thick, draw_top, draw_mid, draw_bot, draw_double) =
+ penpos0(thick, 90 - sign * 90);
+ penpos1(thick, 90 - sign * 90);
+ penpos2(3/2thick, 90);
+ penpos3(1/2thick, 90);
+ penpos4(3/2thick, 90);
+ penpos5(1/2thick, 90);
+ penpos6(1/2thick, 0);
+ penpos7(1/2thick, 0);
+
+ x3 - x2 = x5 - x4 = sign * (w - 2side_bearing); % - 2u + thick);
+
+ 1/2[x2,x3] = w/2 + sign * 1/2u;
+
+ if draw_top:
+ y1 = h;
+ else:
+ y1 = h + 1/3rule_thickness;
+ fi;
+
+ if draw_bot:
+ y0 = -d;
+ else:
+ y0 = -d - 1/3rule_thickness;
+ fi;
+
+ x1 = x0;
+
+ z6 = 1/3[z2l,z3l] + sign * thick * dir 0;
+ z7 = 1/3[z4r,z5r] + sign * thick * dir 0;
+
+ y2l = y3l;
+ y4r = y5r;
+ z2l = z0l;
+ z4r = z1l;
+
+ if draw_mid:
+ fill stroke z0e -- z1e;
+ else:
+ if draw_bot: fill stroke z0e -- 1/4[z0e,z1e]; fi;
+ if draw_top: fill stroke 3/4[z0e,z1e] -- z1e; fi;
+ fi;
+ if draw_top: fill stroke z4e .. {sign * dir 0}z5e; fi;
+ if draw_bot: fill stroke z2e .. {sign * dir 0}z3e; fi;
+ if draw_double: fill stroke z6e -- z7e; fi;
+enddef;
+
+lsquare_char = current_char + 1;
+rsquare_char = current_char + 6;
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 6)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "square bracket";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (scale/2), true, true, true, false);
+ endchar;
+ endfor;
+endfor;
+
+lfloor_char = current_char + 1;
+rfloor_char = current_char + 6;
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 6)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "floor";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (scale/2), false, true, true, false);
+ endchar;
+ endfor;
+endfor;
+
+lceil_char = current_char + 1;
+rceil_char = current_char + 6;
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 6)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "ceiling";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (scale/2), true, true, false, false);
+ endchar;
+ endfor;
+endfor;
+
+ulcorner_char = current_char + 1;
+urcorner_char = current_char + 6;
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 6)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "upper corner";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (scale/2), true, false, false, false);
+ endchar;
+ endfor;
+endfor;
+
+charlist urcorner_char: urcorner_char + 1: urcorner_char + 2: urcorner_char + 3: urcorner_char + 4;
+charlist ulcorner_char: ulcorner_char + 1: ulcorner_char + 2: ulcorner_char + 3: ulcorner_char + 4;
+
+llcorner_char = current_char + 1;
+lrcorner_char = current_char + 6;
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 6)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "lower corner";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (scale/2), false, false, true, false);
+ endchar;
+ endfor;
+endfor;
+
+charlist lrcorner_char: lrcorner_char + 1: lrcorner_char + 2: lrcorner_char + 3: lrcorner_char + 4;
+charlist llcorner_char: llcorner_char + 1: llcorner_char + 2: llcorner_char + 3: llcorner_char + 4;
+
+ullcorner_char = current_char + 1;
+ulrcorner_char = current_char + 6;
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 6)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "upper/lower corner";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (scale/2), true, false, true, false);
+ endchar;
+ endfor;
+endfor;
+
+charlist ulrcorner_char: ulrcorner_char + 1: ulrcorner_char + 2: ulrcorner_char + 3: ulrcorner_char + 4;
+charlist ullcorner_char: ullcorner_char + 1: ullcorner_char + 2: ullcorner_char + 3: ullcorner_char + 4;
+
+for sign = 1, -1:
+ beginsymbol((6 + 6)/2 * u# + 2side_bearing#, vcentre(delim_height#)); "square bracket -- top";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (6/2), true, true, false, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol((6 + 6)/2 * u# + 2side_bearing#, vcentre(delim_height#)); "square bracket -- bot";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (6/2), false, true, true, false);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol((6 + 6)/2 * u# + 2side_bearing#, vcentre(delim_height#)); "square bracket -- module";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (6/2), false, true, false, false);
+ endchar;
+endfor;
+
+extensible current_char: current_char - 4, 0, current_char - 2, current_char; %right square bracket
+extensible current_char - 1: current_char - 5, 0, current_char - 3, current_char - 1; %left square bracket
+extensible current_char - 2: 0, 0, current_char - 2, current_char; %right floor
+extensible current_char - 3: 0, 0, current_char - 3, current_char - 1; %left floor
+extensible current_char - 4: current_char - 4, 0, 0, current_char; %right ceiling
+extensible current_char - 5: current_char - 5, 0, 0, current_char - 1; %left ceiling
+
+charlist rsquare_char: rsquare_char + 1: rsquare_char + 2: rsquare_char + 3: rsquare_char + 4: current_char;
+charlist lsquare_char: lsquare_char + 1: lsquare_char + 2: lsquare_char + 3: lsquare_char + 4: current_char - 1;
+charlist rfloor_char: rfloor_char + 1: rfloor_char + 2: rfloor_char + 3: rfloor_char + 4: current_char - 2;
+charlist lfloor_char: lfloor_char + 1: lfloor_char + 2: lfloor_char + 3: lfloor_char + 4: current_char - 3;
+charlist rceil_char: rceil_char + 1: rceil_char + 2: rceil_char + 3: rceil_char + 4: current_char - 4;
+charlist lceil_char: lceil_char + 1: lceil_char + 2: lceil_char + 3: lceil_char + 4: current_char - 5;
+
+% semantic brackets
+
+lsem_char = current_char + 1;
+rsem_char = current_char + 6;
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 8)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "semantic bracket";
+ draw_bracket(sign, rule_thickness * sqrt (scale/2), true, true, true, true);
+ endchar;
+ endfor;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol((6 + 8)/2 * u# + 2side_bearing#, vcentre(delim_height#)); "semantic bracket -- top";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (6/2), true, true, false, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol((6 + 8)/2 * u# + 2side_bearing#, vcentre(delim_height#)); "semantic bracket -- bot";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (6/2), false, true, true, true);
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol((6 + 8)/2 * u# + 2side_bearing#, vcentre(delim_height#)); "semantic bracket -- module";
+ draw_bracket(sign, 5/4rule_thickness * sqrt (6/2), false, true, false, true);
+ endchar;
+endfor;
+
+extensible current_char: current_char - 4, 0, current_char - 2, current_char; %right semanic bracket
+extensible current_char - 1: current_char - 5, 0, current_char - 3, current_char - 1; %left semanic bracket
+extensible current_char - 2: 0, 0, current_char - 2, current_char; %right semanic floor
+extensible current_char - 3: 0, 0, current_char - 3, current_char - 1; %left semanic floor
+extensible current_char - 4: current_char - 4, 0, 0, current_char; %right semanic ceiling
+extensible current_char - 5: current_char - 5, 0, 0, current_char - 1; %left semanic ceiling
+
+charlist rsem_char: rsem_char + 1: rsem_char + 2: rsem_char + 3: rsem_char + 4: current_char;
+charlist lsem_char: lsem_char + 1: lsem_char + 2: lsem_char + 3: lsem_char + 4: current_char - 1;
+
+beginsymbol(6/2 * u# + 2side_bearing#, vcentre(1/2delim_height#)); "vertical bar -- module";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ pickup pencircle scaled 1/12thick;
+
+ penpos2 (thick, 0);
+ penpos3 (thick, 0);
+
+ x2 = x3 = w/2;
+
+ top y2 = h + 1/3rule_thickness;
+ bot y3 = -d - 1/3rule_thickness;
+
+ filldraw stroke z2e -- z3e;
+endchar;
+
+extensible current_char: 0, 0, 0, current_char; % vertical bar
+
+for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol(scale/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "vertical bar";
+ thick := 5/8rule_thickness * sqrt scale;
+
+ pickup pencircle scaled 1/12thick;
+
+ penpos2 (thick, 0);
+ penpos3 (thick, 0);
+
+ x2 = x3 = w/2;
+
+ top y2 = h;
+ bot y3 = -d;
+
+ filldraw stroke z2e -- z3e;
+ endchar;
+endfor;
+
+charlist current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char:
+ current_char - 5;
+
+beginsymbol((5.1 + 8)/2 * u# + 2side_bearing#, vcentre(1/2delim_height#));
+ "double vertical bar -- module";
+
+ thick := 3/8rule_thickness * sqrt 5.1;
+
+ pickup pencircle scaled 1/12thick;
+
+ penpos0 (thick, 0);
+ penpos1 (thick, 0);
+ penpos2 (thick, 0);
+ penpos3 (thick, 0);
+
+ x0 = x1;
+ x2 = x3;
+ 1/2[x0,x2] = w/2;
+ x2 - x0 = 4thick;
+
+ top y0 = top y2 = h + 1/3rule_thickness;
+ bot y1 = bot y3 = -d - 1/3rule_thickness;
+
+ filldraw stroke z0e -- z1e;
+ filldraw stroke z2e -- z3e;
+endchar;
+
+extensible current_char: 0, 0, 0, current_char; % double vertical line
+
+for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 8)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "double vertical bar";
+ thick := 4/8rule_thickness * sqrt scale;
+
+ pickup pencircle scaled 1/12thick;
+
+ penpos0 (thick, 0);
+ penpos1 (thick, 0);
+ penpos2 (thick, 0);
+ penpos3 (thick, 0);
+
+ x0 = x1;
+ x2 = x3;
+ 1/2[x0,x2] = w/2;
+ x2 - x0 = 4thick;
+
+ top y0 = top y2 = h;
+ bot y1 = bot y3 = -d;
+
+ filldraw stroke z0e -- z1e;
+ filldraw stroke z2e -- z3e;
+ endchar;
+endfor;
+
+charlist current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char:
+ current_char - 5;
+
+beginsymbol(5u# + 2side_bearing#, vcentre(delim_height#)); "wavy line";
+ thick := rule_thickness;
+
+ pickup pencircle scaled thick;
+
+ x0 = x1 = x2 = x3 = w/2;
+ 1/2[y0,y1] = h;
+ 1/2[y2,y3] = -d;
+ y2 - y1 = y1 - y0 = y3 - y2;
+
+ draw (subpath (0.5,2.5) of
+ (z0{dir (270-30)}
+ .. {dir (270+30)}z1{dir (270+30)}
+ .. {dir (270-30)}z2{dir (270-30)}
+ .. {dir (270+30)}z3));
+endchar;
+
+extensible current_char: 0, 0, 0, current_char;
+
+beginsymbol(8u# + 2side_bearing#, vcentre(delim_height#)); "double wavy line";
+ thick := rule_thickness;
+
+ pickup pencircle scaled thick;
+
+ x0a = x1a = x2a = x3a = 1/3w;
+ x0b = x1b = x2b = x3b = 2/3w;
+ 1/2[y0a,y1a] = 1/2[y0b,y1b] = h;
+ 1/2[y2a,y3a] = 1/2[y2b,y3b] = -d;
+
+ y2a - y1a = y1a - y0a = y3a - y2a;
+ y2b - y1b = y1b - y0b = y3b - y2b;
+
+ draw (subpath (0.5,2.5) of
+ (z0a{dir (270-30)}
+ .. {dir (270+30)}z1a{dir (270+30)}
+ .. {dir (270-30)}z2a{dir (270-30)}
+ .. {dir (270+30)}z3a));
+ draw (subpath (0.5,2.5) of
+ (z0b{dir (270-30)}
+ .. {dir (270+30)}z1b{dir (270+30)}
+ .. {dir (270-30)}z2b{dir (270-30)}
+ .. {dir (270+30)}z3b));
+endchar;
+
+extensible current_char: 0, 0, 0, current_char;
+
+def draw_angle(suffix $)(expr shift, sign, thick) =
+ pickup pencircle scaled (7/8thick);
+
+ x0$ = x1$ = x2$ + sign * (w - 2side_bearing - 2abs shift - thick);
+
+ x3$ = x2$ + sign * 3/8thick;
+
+ top y1$ = h;
+ bot y0$ = -d;
+ 1/2[y0$,y1$] = y2$ = y3$;
+ 1/2[x0$,x2$] = w/2;
+
+ draw (z0$ + shift * right) -- (z2$ + shift * right) -- (z1$ + shift * right) -- (z3$ + shift * right) -- cycle;
+enddef;
+
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 6)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "angle";
+ draw_angle(a, 0, sign, 7/8rule_thickness * sqrt scale);
+ endchar;
+ endfor;
+ charlist current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 6)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "angle bar";
+ draw_angle(a, 0, sign, 7/8rule_thickness * sqrt scale);
+
+ z3 = whatever[z0a,z2a];
+ z4 = whatever[z1a,z2a];
+
+ x3 = x4 = (1/(2*scale))[x0a,x2a];
+
+ pickup pencircle scaled (11/25rule_thickness * sqrt scale);
+
+ draw z3 -- z4;
+ endchar;
+ endfor;
+ charlist current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 6)/2 * u# + 5/2rule_thickness# * sqrt scale + 2side_bearing#,
+ vcentre(scale * delim_height#));
+ "double angle";
+ thick := 5/8rule_thickness * sqrt scale;
+ draw_angle(a, -2thick, sign, thick);
+ draw_angle(b, 2thick, sign, thick);
+ endchar;
+ endfor;
+ charlist current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+endfor;
+
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol(3scale * u# + side_bearing#, vcentre(scale * delim_height#)); "slash";
+ thick := 5/4rule_thickness * sqrt (scale/2);
+
+ pickup pencircle scaled thick;
+
+ x1 - x0 = sign * (w - side_bearing - thick);
+
+ top y1 = h;
+ bot y0 = -d;
+ 1/2[x0,x1] = w/2;
+
+ draw z0 -- z1;
+ endchar;
+ endfor;
+ charlist current_char - 4: current_char - 3: current_char - 2: current_char - 1: current_char;
+endfor;
+
+def draw_paren(expr sign, thick) =
+ penpos0(1/2thick, 90 - sign * 40);
+ penpos1(1/2thick, -90 + sign * 40);
+ penpos2(4/3thick, 90 - sign * 90);
+
+ x0 = x1 = x2 + sign * (w - 2side_bearing - thick);
+
+ top y1l = h;
+ bot y0l = -d;
+ 1/2[y0,y1] = y2;
+ 1/2[x0l,x2l] = w/2;
+
+ fill stroke z0e{3(x2e - x0e), y2e - y0e} .. z2e .. {3(x1e - x2e), y1e - y2e}z1e;
+
+ penlabels(0,1,2);
+enddef;
+
+lparen_char = current_char + 1;
+rparen_char = current_char + 6;
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol(2/3*(scale + 5.5) * u# + 2side_bearing#, vcentre(scale * delim_height#)); "parenthesis";
+ draw_paren(sign, 9/20rule_thickness * sqrt (4*scale));
+ endchar;
+ endfor;
+endfor;
+
+% extensible parenthesis
+
+for sign = 1, -1:
+ beginsymbol(2/3*(6 + 5.5) * u# + 2side_bearing#, vcentre(6/2 * delim_height#)); "parenthesis -- top";
+ thick := 9/20rule_thickness * sqrt 24;
+
+ penpos1(1/2thick, -90 + sign * 40);
+ penpos2(4/3thick, 90 - sign * 90);
+
+ x1 = x2 + sign * (w - 2side_bearing - thick);
+
+ top y1l = h + eps;
+ y2 = -d - 1/2rule_thickness;
+ 1/2[x1l,x2l] = w/2;
+
+ fill stroke z2e{up} .. {3(x1e - x2e), y1e - y2e}z1e;
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(2/3*(6 + 5.5) * u# + 2side_bearing#, vcentre(6/2 * delim_height#)); "parenthesis -- bot";
+ thick := 9/20rule_thickness * sqrt 24;
+
+ penpos0(1/2thick, 90 - sign * 40);
+ penpos2(4/3thick, 90 - sign * 90);
+
+ x0 = x2 + sign * (w - 2side_bearing - thick);
+
+ y2 = h + 1/2rule_thickness;
+ bot y0l = -d - eps;
+ 1/2[x0l,x2l] = w/2;
+
+ fill stroke z0e{3(x2e - x0e), y2e - y0e} .. {up}z2e;
+ endchar;
+endfor;
+
+for sign = 1, -1:
+ beginsymbol(2/3*(6 + 5.5) * u# + 2side_bearing#, vcentre(delim_height#)); "parenthesis -- module";
+ thick := 9/20rule_thickness * sqrt 24;
+
+ penpos1(1/2thick, 90 - sign * 40);
+ penpos2(4/3thick, 90 - sign * 90);
+ penpos3(4/3thick, 90 - sign * 90);
+
+ x2 = x3 = x1 - sign * (w - 2side_bearing - thick);
+
+ y2 = h + 1/2rule_thickness;
+ y3 = -d - 1/2rule_thickness;
+ 1/2[x1l,x2l] = w/2;
+
+ fill stroke z2e -- z3e;
+ endchar;
+endfor;
+
+extensible current_char: current_char - 4, 0, current_char - 2, current_char; %right parenthesis
+extensible current_char - 1: current_char - 5, 0, current_char - 3, current_char - 1; %left parenthesis
+
+charlist rparen_char: rparen_char + 1: rparen_char + 2: rparen_char + 3: rparen_char + 4: current_char;
+charlist lparen_char: lparen_char + 1: lparen_char + 2: lparen_char + 3: lparen_char + 4: current_char - 1;
+
+% curly braces
+
+def draw_brace_tip(suffix $,@)(expr alpha,thick) =
+ pickup pencircle scaled 1/12thick;
+
+ penpos$ (1/2thick, alpha);
+ penpos$'(1/2thick, alpha);
+ penpos@ (thick, alpha);
+ penpos@'(thick, alpha);
+
+ beta := angle (5(x$l-x@l), y$-y@) - alpha;
+
+ filldraw z$l{-dir (alpha + beta)} ... z@l --- z@'l -- z@'r
+ --- z@r ... {dir (alpha + beta)}z$'r -- z$r -- cycle;
+enddef;
+
+def draw_brace(expr center, size, width, alpha, thick, top_size, mid_size, bot_size) =
+
+ pickup pencircle scaled 1/12thick;
+
+ penpos1 (1/2thick, alpha);
+ penpos1'(1/2thick, alpha);
+ penpos4 (1/2thick, alpha);
+ penpos4'(1/2thick, alpha);
+ penpos7 (1/2thick, alpha);
+ penpos7'(1/2thick, alpha);
+ penpos2 (thick, alpha);
+ penpos2'(thick, alpha);
+ penpos3 (thick, alpha);
+ penpos3'(thick, alpha);
+ penpos5 (thick, alpha);
+ penpos5'(thick, alpha);
+ penpos6 (thick, alpha);
+ penpos6'(thick, alpha);
+
+ z1 - z7 = (size - 1/6thick) * dir (alpha + 90);
+
+ center - 1/2[z1l,z7l] = 1/2[z4r,z4'r] - center = width/2 * dir alpha;
+
+ z2 = center + whatever * dir (alpha + 90);
+ z3 = center + whatever * dir (alpha + 90);
+
+ z3' = center + (mid_size/2 + 1/2rule_thickness) * dir (alpha + 90);
+ z5' = center - (mid_size/2 + 1/2rule_thickness) * dir (alpha + 90);
+
+ z2' = center + (size/2 - top_size - 1/2rule_thickness) * dir (alpha + 90);
+ z6' = center - (size/2 - bot_size - 1/2rule_thickness) * dir (alpha + 90);
+
+ 1/2[z2,z6] = 1/2[z3,z5] = center;
+
+ z2 - z3 = z5 - z6 = 5/24(size - 1/3thick) * dir (alpha + 90);
+
+ z1 - z2 = z3 - z4;
+ z7 - z6 = z5 - z4';
+
+ z1 - z1' = z4 - z4' = z7' - z7 = 1/4thick * dir (alpha + 90);
+
+ beta := angle (5 (z1l-z2l) dotprod dir alpha, (z1l-z2l) dotprod dir (alpha+90));
+
+ if top_size > 0:
+ filldraw z1r{-dir (alpha + beta)} ... z2r --- z2'r -- z2'l
+ --- z2l ... {dir (alpha + beta)}z1'l -- z1l -- cycle;
+ penlabels(1,2,2');
+ elseif bot_size > 0:
+ filldraw
+ z6'r --- z6r ... {dir (alpha - beta)}z7r
+ -- z7l -- z7'l{-dir (alpha - beta)} ... z6l --- z6'l -- cycle;
+ penlabels(6',6,7);
+ elseif mid_size > 0:
+ filldraw z3'r --- z3r{dir (alpha-90)} ... {dir alpha}z4r
+ -- z4'r{-dir alpha} ... {dir (alpha-90)}z5r --- z5'r -- z5'l --- z5l{dir (alpha+90)}
+ ... {dir alpha}1/2[z4l, z4'l]{-dir alpha}
+ ... {dir (alpha+90)}z3l --- z3'l -- cycle;
+ penlabels(3',3,4,5,5');
+ else:
+ filldraw z1r{-dir (alpha + beta)} ... z2r --- z3r{dir (alpha-90)} ... {dir alpha}z4r
+ -- z4'r{-dir alpha} ... {dir (alpha-90)}z5r --- z6r ... {dir (alpha - beta)}z7r
+ -- z7l -- z7'l{-dir (alpha - beta)} ... z6l --- z5l{dir (alpha+90)}
+ ... {dir alpha}1/2[z4l, z4'l]{-dir alpha}
+ ... {dir (alpha+90)}z3l --- z2l ... {dir (alpha + beta)}z1'l -- z1l -- cycle;
+ penlabels(1,2,3,4,5,6,7);
+ fi;
+
+enddef;
+
+lcurly_char = current_char + 1;
+rcurly_char = current_char + 6;
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((scale + 10)/2 * u# + 2side_bearing#, vcentre(scale * delim_height#)); "curly brace";
+ thick := 5/4rule_thickness * sqrt sqrt (scale/2);
+
+ draw_brace((w/2, (h-d)/2), h+d, w - 2side_bearing, 90 + sign * 90, thick, 0, 0, 0)
+ endchar;
+ endfor;
+endfor;
+
+beginsymbol((6 + 10)/2 * u# + 2side_bearing#, vcentre(delim_height#)); "curly brace -- top";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ draw_brace((w/2, h - 3delim_height), 6delim_height, w - 2side_bearing, 180, thick, 0, 0, h+d);
+endchar;
+
+beginsymbol((6 + 10)/2 * u# + 2side_bearing#, vcentre(delim_height#)); "curly brace -- top";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ draw_brace((w/2, h - 3delim_height), 6delim_height, w - 2side_bearing, 0, thick, h+d, 0, 0);
+endchar;
+
+beginsymbol((6 + 10)/2 * u# + 2side_bearing#, vcentre(delim_height#)); "curly brace -- bot";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ draw_brace((w/2, 3delim_height - d), 6delim_height, w - 2side_bearing, 180, thick, h+d, 0, 0)
+endchar;
+
+beginsymbol((6 + 10)/2 * u# + 2side_bearing#, vcentre(delim_height#)); "curly brace -- bot";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ draw_brace((w/2, 3delim_height - d), 6delim_height, w - 2side_bearing, 0, thick, 0, 0, h+d)
+endchar;
+
+for sign = 1, -1:
+ beginsymbol((6 + 10)/2 * u# + 2side_bearing#, vcentre(2delim_height#)); "curly brace -- middle";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ draw_brace((w/2, (h-d)/2), 6delim_height, w - 2side_bearing, 90 + sign * 90, thick, 0, h+d, 0);
+ endchar;
+endfor;
+
+beginsymbol((6 + 10)/2 * u# + 2side_bearing#, vcentre(1/2delim_height#)); "curly brace -- module";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ pickup pencircle scaled 1/12thick;
+
+ penpos2 (thick, 0);
+ penpos3 (thick, 0);
+
+ x2 = x3 = w/2;
+
+ top y2 = h + 1/2rule_thickness;
+ bot y3 = -d - 1/2rule_thickness;
+
+ filldraw stroke z2e -- z3e;
+endchar;
+
+extensible current_char - 6: current_char - 6, 0, current_char - 4, current_char; %sharp left parenthesis
+extensible current_char - 5: current_char - 5, 0, current_char - 3, current_char; %sharp right parenthesis
+extensible current_char - 4: current_char - 5, 0, current_char - 4, current_char; %right moustache
+extensible current_char - 3: current_char - 6, 0, current_char - 3, current_char; %left moustache
+extensible current_char - 2: current_char - 6, current_char - 2, current_char - 4, current_char; %left curly brace
+extensible current_char - 1: current_char - 5, current_char - 1, current_char - 3, current_char; %right curly brace
+extensible current_char: 0, 0, 0, current_char; %vertical line
+
+charlist rcurly_char: rcurly_char + 1: rcurly_char + 2: rcurly_char + 3: rcurly_char + 4: current_char - 1;
+charlist lcurly_char: lcurly_char + 1: lcurly_char + 2: lcurly_char + 3: lcurly_char + 4: current_char - 2;
+
+for sign = 1, -1:
+ for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol(scale * delim_height#, vcentre((scale + 10)/2 * u# + 2side_bearing#));
+ "horizontal curly brace";
+
+ thick := 5/4rule_thickness * sqrt sqrt (scale/2);
+
+ draw_brace((w/2, (h-d)/2), w, (h+d) - 2side_bearing, sign * 90, thick, 0, 0, 0)
+ endchar;
+ endfor;
+endfor;
+
+beginsymbol(delim_height#, vcentre((6 + 10)/2 * u# + 2side_bearing#)); "curly brace -- left";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ draw_brace((3delim_height, (h-d)/2), 6delim_height, (h+d) - 2side_bearing, 90, thick, w, 0, 0);
+endchar;
+
+beginsymbol(delim_height#, vcentre((6 + 10)/2 * u# + 2side_bearing#)); "curly brace -- left";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ draw_brace((3delim_height, (h-d)/2), 6delim_height, (h+d) - 2side_bearing, -90, thick, 0, 0, w);
+endchar;
+
+beginsymbol(delim_height#, vcentre((6 + 10)/2 * u# + 2side_bearing#)); "curly brace -- right";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ draw_brace((w - 3delim_height, (h-d)/2), 6delim_height, (h+d) - 2side_bearing, 90, thick, 0, 0, w);
+endchar;
+
+beginsymbol(delim_height#, vcentre((6 + 10)/2 * u# + 2side_bearing#)); "curly brace -- right";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ draw_brace((w - 3delim_height, (h-d)/2), 6delim_height, (h+d) - 2side_bearing, -90, thick, w, 0, 0);
+endchar;
+
+for sign = 1, -1:
+ beginsymbol(2delim_height#, vcentre((6 + 10)/2 * u# + 2side_bearing#));
+ "curly brace -- horizontal middle";
+
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ draw_brace((w/2, (h-d)/2), 6delim_height, (h+d) - 2side_bearing, sign * 90, thick, 0, w, 0);
+ endchar;
+endfor;
+
+beginsymbol(u#, vcentre((6 + 10)/2 * u# + 2side_bearing#));
+ "curly brace -- horizontal module";
+ thick := 5/4rule_thickness * sqrt sqrt (6/2);
+
+ pickup pencircle scaled 1/12thick;
+
+ penpos1 (thick, 90);
+ penpos2 (thick, 90);
+
+ x1 = -u/2;
+ x2 = w + u/2;
+ y1 = y2 = (h-d)/2;
+
+ filldraw stroke z1e -- z2e;
+endchar;
+
+
+% roots
+
+def draw_root_top(expr scale, thick, vertical) =
+ pickup pencircle scaled thick;
+
+ top y0 = h;
+ x0 = w;
+
+ bot y1 = -d;
+
+ if vertical:
+ x1 = 6/9w;
+ draw z0 -- (x1, y0) -- z1;
+ else:
+ x1 = 4/9w;
+ draw z0 -- z1;
+ fi;
+enddef;
+
+def draw_root_bot(expr scale, thick, vertical) =
+ penpos2(3/2thick, 0);
+ penpos3(thick, 0);
+
+ x2l = 1/9w;
+ y2 = 1/2[y0, y1];
+ x3 = x1;
+ bot y3 = -d;
+
+ z4 = whatever[z0, z1] = z2r + whatever * (z2l - z3l);
+
+ penpos5(1/2thick, angle (z3l - z2l));
+ z5l = z2r + 5/2thick * dir (angle (z3l - z2l) - 90);
+
+ z6 = whatever[z2l, z3l] = z5r + whatever * dir (angle (z3l - z2l) - 90);
+
+ fill z5r -- z6 -- z3l -- z3 -- z4 -- z2r -- z5l -- cycle;
+enddef;
+
+root_char = current_char + 1;
+
+for scale = 2, 2.5, 3.3, 4.2, 5.1:
+ beginsymbol((2scale + 10) * u# + side_bearing#,
+ sqrt (scale/2) * rule_thickness#,
+ scale * delim_height# - sqrt (scale/2) * rule_thickness#);
+ "root";
+
+ draw_root_top(scale, sqrt (scale/2) * rule_thickness, false);
+ draw_root_bot(scale, sqrt (scale/2) * rule_thickness, false);
+ labels(0,1,2,3,4,5,6);
+
+ endchar;
+endfor;
+
+beginsymbol((12 + 10) * u# + side_bearing#,
+ sqrt (6/2) * rule_thickness#,
+ delim_height# - sqrt (6/2) * rule_thickness#);
+ "root -- top";
+
+ thick := vround (sqrt (6/2) * rule_thickness# * hppp);
+
+ draw_root_top(6, thick, true);
+endchar;
+
+beginsymbol((12 + 10) * u# + side_bearing#, 0, 3 * delim_height#);
+ "root -- bottom";
+
+ thick := vround (sqrt (6/2) * rule_thickness# * hppp);
+
+ pickup pencircle scaled thick;
+
+ x0 = x1 = 6/9w;
+ bot y0 = d;
+ bot y1 = -d;
+
+ draw 1/2[z0, z1] -- z1;
+
+ draw_root_bot(6, thick, true);
+endchar;
+
+beginsymbol((12 + 10) * u# + side_bearing#, vcentre(delim_height#));
+ "root -- module";
+
+ thick := vround (sqrt (6/2) * rule_thickness# * hppp);
+
+ pickup pencircle scaled thick;
+
+ x0 = x1 = 6/9w;
+ y0 = h;
+ y1 = -d;
+
+ draw z0 -- z1;
+endchar;
+
+extensible current_char - 2: current_char - 2, 0, current_char - 1, current_char;
+
+charlist root_char: root_char + 1: root_char + 2: root_char + 3: root_char + 4: current_char - 2;
+
+% reserve space for accents
+current_char := 212;
+
+for arrow_dir = 90, 270:
+ beginsymbol(8u# + 2side_bearing#, vcentre(delim_height#)); "arrow up/down";
+ pickup rule_pen;
+
+ pair foot, head;
+
+ if arrow_dir = 90:
+ head = (w/2, h);
+ foot = (w/2, -d);
+ else:
+ head = (w/2, -d);
+ foot = (w/2, h);
+ fi;
+
+ draw foot -- head;
+ draw arrowhead(head, arrow_dir, arrow_spread);
+ endchar;
+endfor;
+
+beginsymbol(8u# + 2side_bearing#, vcentre(delim_height#)); "arrow module";
+ pickup rule_pen;
+
+ z0 = (w/2, h + 1/2rule_thickness);
+ z1 = (w/2, -d - 1/2rule_thickness);
+
+ draw z0 -- z1;
+endchar;
+
+extensible current_char-2: current_char-2, 0, current_char, current_char;
+extensible current_char-1: current_char, 0, current_char-1, current_char;
+extensible current_char: current_char-2, 0, current_char-1, current_char;
+
+for arrow_dir = 90, 270:
+ beginsymbol(8u# + 2side_bearing#, vcentre(delim_height#)); "double arrow up/down";
+ pickup rule_pen;
+
+ pair foot, head;
+
+ if arrow_dir = 90:
+ head = (w/2, h);
+ foot = (w/2, -d);
+ else:
+ head = (w/2, -d);
+ foot = (w/2, h);
+ fi;
+
+ z1 - z0 = z3 - z2 = equal_spread * dir (arrow_dir + 90);
+
+ 1/2[z0,z1] = foot - 1/2rule_thickness * dir arrow_dir;
+ 1/2[z2,z3] = head;
+
+ draw z0 -- arrowhead_intersection(head, arrow_dir, 13/10arrow_spread, z0 -- z2);
+ draw z1 -- arrowhead_intersection(head, arrow_dir, 13/10arrow_spread, z1 -- z3);
+
+ draw arrowhead(head, arrow_dir, 13/10arrow_spread);
+ endchar;
+endfor;
+
+beginsymbol(8u# + 2side_bearing#, vcentre(delim_height#)); "double arrow module";
+ pickup rule_pen;
+
+ z1 - z0 = z3 - z2 = equal_spread * right;
+
+ 1/2[z0,z1] = (w/2, h + 1/2rule_thickness);
+ 1/2[z2,z3] = (w/2, -d - 1/2rule_thickness);
+
+ draw z0 -- z2;
+ draw z1 -- z3;
+endchar;
+
+extensible current_char-2: current_char-2, 0, current_char, current_char;
+extensible current_char-1: current_char, 0, current_char-1, current_char;
+extensible current_char: current_char-2, 0, current_char-1, current_char;
+