summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/fonts/source/public/mathabx/mathbase.mf
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/fonts/source/public/mathabx/mathbase.mf')
-rw-r--r--Master/texmf-dist/fonts/source/public/mathabx/mathbase.mf664
1 files changed, 664 insertions, 0 deletions
diff --git a/Master/texmf-dist/fonts/source/public/mathabx/mathbase.mf b/Master/texmf-dist/fonts/source/public/mathabx/mathbase.mf
new file mode 100644
index 00000000000..03619996ddc
--- /dev/null
+++ b/Master/texmf-dist/fonts/source/public/mathabx/mathbase.mf
@@ -0,0 +1,664 @@
+% mathematical symbols by Anthony Phan.
+% file: mathbase.mf (base file)
+% last modification: May 16, 2005.
+
+mathbase := 1; % when |mathbase| is known, this file has been input
+
+newinternal slant, currentbreadth, math_spread, superness, stress;
+slant := 0; superness := 1/sqrt 2; stress := 0.5;
+
+string main_name_string, tmp_string,
+extra_beginchar_save, extra_endchar_save;
+
+picture tmp_picture;
+path tmp_path, tmpp_path;
+
+boolean true_size, tmp_boolean, dagesh;
+true_size := false;% see mathhbrw.mf
+
+pair both; both = (1, 1);
+
+def autorounded = interim autorounding := 2 enddef;
+
+def localtransform = save currenttransform;
+ transform currenttransform; currenttransform
+enddef;
+
+numeric currentlocation_;
+
+vardef currentlocation =
+ currentlocation_ := currentlocation_+1;
+ currentlocation_-1
+enddef;
+
+def main_name_with(suffix $) =
+ scantokens(main_name_string & str$)
+enddef;
+
+def math_setup =
+ autorounding := 0; smoothing := 0;
+ appr# := u#+letter_fit#; Appr# := 1.5u#+letter_fit#;
+ numeric paren_depth#, asc_depth#, body_depth#;
+ 0.5[body_height#, -paren_depth#] = math_axis#;
+ 0.5[asc_height#, -asc_depth#] = math_axis#;
+ body_depth# := desc_depth#+body_height#-asc_height#;
+ %
+ define_pixels(u, dh, dish, stem_corr, vair_corr);
+ define_whole_blacker_pixels(hair, stem, curve,
+ cap_hair, cap_stem, cap_curve, dtsz, ast_curve, ast_stem);
+ define_whole_vertical_blacker_pixels(vair, slab);% cap_bar...
+ define_whole_vertical_pixels(body_height, asc_height,
+ cap_height, fig_height, x_height, desc_depth,
+ asc_depth, body_depth, paren_depth);
+ define_whole_pixels(letter_fit, appr, Appr,
+ crisp, tiny, fine, ast_size);
+ define_corrected_pixels(o);
+ define_horizontal_corrected_pixels(ho);
+ lowres_fix(stem, curve) 1.2;
+ lowres_fix(cap_stem, cap_curve) 1.2;
+ lowres_fix(hair, cap_hair) 1.2;
+ oo := vround(0.5o#*hppp*o_correction)+eps;
+ dw := (curve#-stem#)*hppp; bold := curve#*hppp+blacker;
+ vair' := vround(vair+vair_corr);
+ %
+ % usual pens.
+ %
+ clear_pen_memory;
+ if fine = 0: fine := 1; fi
+ null := 0;
+ forsuffixes $ = null, crisp, tiny, fine:
+ $.breadth := $;
+ pickup if $ = 0: nullpen else: pencircle scaled $ fi;
+ $ := $-eps; $.nib := savepen; breadth_[$.nib] := $;
+ endfor
+ $ := 0;
+ forever:
+ exitif unknown rth[$].#;
+ rth[$] := ceiling(rth[$].#*hppp);
+ pickup pencircle scaled rth[$];
+ rule.nib[$] := savepen;
+ $ := $+1;
+ endfor
+ %
+ % spreads
+ %
+ for $ = 0 upto 10:
+ if known spread[$].#:
+ spread[$] := 2ceiling(0.5spread[$].#*hppp);
+ fi
+ endfor
+ %
+ % current transform (slant is not taken into account)
+ %
+ currenttransform = identity
+ yscaled aspect_ratio scaled granularity;
+ %
+ % proofing
+ %
+ standard_proofing;
+ use_rule1;
+enddef;
+
+% The following environment enables people to draw a picture
+% almost like drawing a character. The resulting picture is
+% stored in $_picture and then it can be used in at any
+% place later.
+
+def beginpicture(suffix $)(expr w_sharp, h_sharp, d_sharp) =
+ begingroup
+ save picturename;
+ w := hround(w_sharp*hppp); h := vround(h_sharp*hppp);
+ d := vround(d_sharp*hppp); clearxy; clearit; clearpen;
+ string picturename; picturename = str $ &"_picture";
+ enddef;
+
+ def endpicture =
+ expandafter picture scantokens picturename;
+ scantokens picturename = currentpicture;
+ endgroup
+enddef;
+
+vardef use_rule@# =
+ rth := rth@#; rth# := rth@#.#;
+ rule.nib := rule.nib@#;
+ math_axis := vround(math_axis#*hppp-0.5rth)+0.5rth;
+enddef;
+
+def numeric_pickup_ primary q =
+ currentpen := pen_[q];
+ pen_lft := pen_lft_[q]; pen_rt := pen_rt_[q];
+ pen_top := pen_top_[q]; pen_bot := pen_bot_[q];
+ currentpen_path := pen_path_[q];
+ if known breadth_[q]: currentbreadth := breadth_[q]; fi
+enddef;
+
+%def compute_spread(expr normal_spread, big_spread) =
+% spread# := math_spread[normal_spread, big_spread];
+% spread := 2ceiling((spread#)*hppp/2)
+%enddef;
+
+def v_center(expr h_sharp) =
+ .5h_sharp+math_axis#, .5h_sharp-math_axis#
+enddef;
+
+def ensure_centering_of(expr stem) =
+ if hround 0.5(w-hround stem)+0.5hround stem<> 0.5w:
+ change_width; fi
+enddef;
+
+vardef v_adjust(suffix $, $$)(expr middle, height) =
+ top y$-middle = middle-bot y$$ = vround 0.5(height-rth)+0.5rth
+enddef;
+
+def arithmetic_bounds =
+ 12u#+2appr#, math_axis#+6u#, 6u#-math_axis#
+enddef;
+
+def padded expr del_sharp =
+ charht := charht+del_sharp; chardp := chardp+del_sharp
+enddef;
+
+%vardef pos@#(expr b, d) =
+% if known b: if b <= currentbreadth: errmessage "bad pos"; fi fi
+% save d_; pair d_; d_ = dir d;
+% z@#r-z@#l+penoffset d_ of currentpen+penoffset -d_ of currentpen = b*d_;
+% x@# = .5(x@#l+x@#r); y@# = .5(y@#l+y@#r) enddef;
+
+vardef pos@#(expr b, d) =
+ if known b: if b <= currentbreadth: errmessage "bad pos"; fi fi
+ (x@#r-x@#l, y@#r-y@#l) = (b-currentbreadth, 0) rotated d;
+ x@# = .5(x@#l+x@#r); y@# = .5(y@#l+y@#r) enddef;
+
+vardef stroke text t =
+ forsuffixes e = l, r: path_.e := t;endfor
+ if cycle path_.l:
+ errmessage "Beware: `stroke' doesn't work with cycles";
+ fi
+ path_.l -- reverse path_.r -- cycle
+enddef;
+
+% DIAGONALS
+
+def diag_width(expr $, $$) =
+ $/abs sind angle $$
+enddef;
+
+%vardef diag_height(expr $, $$) =
+% $/abs cosd angle $$
+%enddef;
+
+% $ <---> $$$; $$ <---> $$$$. sign = +1 for \, -1 for /.
+
+vardef adjust_slanted_bar(suffix $, $$, $$$, $$$$)(expr thickness, sign) =
+ save a, b;
+ if abs(y$$-y$) = thickness:
+ (a1, a2) = (z$$-z$);
+ if a1 = 0: b = 0;% b should then be infinite.
+ else: b = if sign<0: - fi (a1++a2)*((a1++a2)/2a1);
+ fi
+ else:
+ a = angle(z$$-z$);
+ b = (cosd(a)/sind(a) if sign<0: - else: + fi
+ (((y$$-y$)/(thickness)/sind(a))+-+1))
+ /(((y$$-y$)/(thickness))**2-1)*(y$$-y$);
+ fi
+ z$$$ = (x$-b, y$); z$$$$ = (x$$+b, y$$)
+enddef;
+
+% supplementary points for diagonal strokes
+% as in cm's \#. (see MetaFontbook, p. 200--201)
+% Well, ...
+
+vardef diag_stroke.@#(suffix $, $$, s)(text y_list) =
+ z$.@#--for y_ = y_list:
+ (good.x(((x$.s-x$$.s)/(y$.s-y$$.s))*(y_-y$$r)+x$$.s), y_)
+ +z$.@#-z$.s
+ --endfor z$$.@#
+enddef;
+
+% CIRCLES, ELLIPSES AND RELATED THINGS
+
+primarydef w up_to_right z =
+ w{0, ypart(z-w)}
+ ...(superness[xpart z, xpart w],
+ superness[ypart w, ypart z]){z-w}
+ ...{xpart(z-w), 0}z
+enddef;
+
+let up_to_left = up_to_right;
+let down_to_right = up_to_right;
+let down_to_left = up_to_right;
+
+primarydef w right_to_up z =
+ w{xpart(z-w), 0}
+ ...(superness[xpart w, xpart z],
+ superness[ypart z, ypart w]){z-w}
+ ...{0, ypart(z-w)}z
+enddef;
+
+let right_to_down = right_to_up;
+let left_to_up = right_to_up;
+let left_to_down = right_to_up;
+
+def ellipse_set(suffix $, @, @@, $$) =
+ alpha_ := slope*(x@-x$); beta_ := y$$-y$-slope*(x$$-x$);
+ gamma_ := alpha_/beta_;
+ y@-y$ = .5(beta_-alpha_*gamma_);
+ x@@-x$ = -2gamma_*(x@-x$)/(1+gamma_*gamma_);
+ y@@-y$$ = slope*(x@@-x$$)
+enddef;
+
+def hellipse_set(suffix $, @, @@, $$) =
+ alpha_ := (y@-y$)/slope; beta_ := x$$-x$-(y$$-y$)/slope;
+ gamma_ := alpha_/beta_;
+ x@-x$ = .5(beta_-alpha_*gamma_);
+ y@@-y$ = -2gamma_*(y@-y$)/(1+gamma_*gamma_);
+ x@@-x$$ = (y@@-y$$)/slope
+enddef;
+
+vardef adjust_elliptic_arc(suffix $, $$, $$$) =
+ save a, b;
+ if known (y$$$-y$): a = (1+-+((y$$$-y$)/(y$$-y$)));
+ x$$-x$ = (x$$$-x$)/(1+a); b = (1+-+((x$$$-x$$)/(x$$-x$)));
+ else: b = (1+-+((x$$$-x$$)/(x$$-x$)));
+ y$$$-y$ = (y$$-y$)*b; a = (1+-+((y$$$-y$)/(y$$-y$)));
+ fi
+ y$$$' = y$$; x$$$' = (((1-b)/a)*(b/a))[x$$$, x$$];
+enddef;
+
+def flatcup(expr zi, zii, ziii) =
+ zi..controls (xpart zi, flatness[ypart zi, ypart zii])
+ and (xpart zi, ypart zii)
+ ..zii..controls (xpart ziii, ypart zii)
+ and (xpart ziii, flatness[ypart ziii, ypart zii])..ziii
+enddef;
+
+% DOTS
+
+boolean full_dot; full_dot := true;
+
+def dot(suffix $, $$) =
+ autorounded;
+ if full_dot: filldraw else: draw fi
+ dot_path($, $$); full_dot := true;
+enddef;
+
+def dot_path(suffix $, $$) =
+ (x$, 0.5[y$, y$$]) down_to_right (0.5[x$, x$$], y$) right_to_up
+ (x$$, 0.5[y$, y$$]) up_to_left (0.5[x$, x$$], y$$) left_to_down
+ (x$, 0.5[y$, y$$])...cycle
+enddef;
+
+vardef adjust_dot@#(expr center, diameter, h_fit, v_fit) =
+ if v_fit: save y_min, y_max;
+ bot y_min = vround(ypart center-0.5diameter)-eps;
+ top y_max = vround(ypart center+0.5diameter)+eps;
+ y@#'-ypart center = ypart center-y@#
+ = max(y_max-ypart center, ypart center-y_min);
+ else:
+ bot y@# = vround(ypart center-0.5diameter)-eps;
+ top y@#'-bot y@# = vround diameter+2eps; fi
+ if h_fit: save x_min, x_max;
+ lft x_min = hround(xpart center-0.5diameter)-eps;
+ rt x_max = hround(xpart center+0.5diameter)+eps;
+ x@#'-xpart center = xpart center-x@#
+ = max(x_max-xpart center, xpart center-x_min);
+ else:
+ lft x@# = vround(xpart center-0.5diameter)-eps;
+ rt x@#'-lft x@# = hround(diameter)+2eps; fi
+ labels(@#, @#');
+enddef;
+
+% VERY DESIGN DEPENDENT MACROS
+
+% DAGGERS AND ASTERISKS
+
+vardef dagger_stroke@#(expr height, curve, stem, u_) =
+ save alpha, a, b, c, R;
+ alpha = angle u_-90; R = 0.5(curve-currentbreadth);
+ a = stress*(height-curve+0.5currentbreadth)+R;
+ b = 0.5(stem-currentbreadth);
+ c = (a*R-b*sqrt(a**2+b**2-R**2))/(a**2+b**2);
+ z@#c-z@# = (height-0.5currentbreadth)*u_;
+ z@#c-z@#b = R*u_; z@#d-z@#b = -a*u_; z@#a = (c*(R/a))[z@#b, z@#d];
+ penpos@#(2b, alpha); penpos@#d(2b, alpha);
+ penpos@#a(2R*(1+-+c), alpha); penpos@#b(2R, alpha);
+ penlabels(@#a, @#b, @#c, @#d, @#);
+ z@#r{u_}...z@#a.r{z@#a.r-z@#d.r}...z@#b.r{u_}...
+ (superness[z@#b, z@#b.r]+superness[z@#b, z@#c]-z@#b){z@#c-z@#b.r}
+ ...z@#c{z@#b.l-z@#b.r}...
+ (superness[z@#b, z@#b.l]+superness[z@#b, z@#c]-z@#b){z@#b.l-z@#c}
+ ...z@#b.l{-u_}...z@#a.l{z@#d.l-z@#a.l}...{-u_}z@#l
+enddef;
+
+% ARROWS
+
+numeric arrow_height, arrow_width, arrow_breadth, arrow_stress,
+arrow_tense[], arrow_time, double_arrow_height, double_arrow_width,
+double_arrow_tense, double_arrow_flatness;
+
+boolean arrow_head_fitting;
+arrow_head_fitting := false;
+
+vardef arrow_head@#(expr p, side) =
+ save a, t; numeric a[];
+ a1 = angle direction infinity of p; pos@#a(rth, a1-90);
+ z@#a = point infinity of p
+ if arrow_head_fitting: -0.5currentbreadth*dir a1 fi;
+ t := xpart(p intersectiontimes (halfcircle rotated(a1+90)
+ scaled (2arrow_stress*arrow_height-currentbreadth)
+ shifted z@#a));
+ a2 := angle direction t of p; arrow_time := t;
+ z@# = point t of p; pos@#(rth, a2-90);
+ z@#-z@#c = (1-arrow_stress)*arrow_height*dir a2;
+ z@#c.r-z@#c = z@#c-z@#c.l = 0.5(arrow_width-currentbreadth)*dir(a2-90);
+ z@#b.r-z@#c.r = z@#b.l-z@#c.l = max(arrow_breadth-currentbreadth, 0)*dir a2;
+ z@#b = p intersectionpoint (z@#b.r..z@#b.l);
+ t := xpart(p intersectiontimes (halfcircle rotated(a1+90)
+ scaled (2arrow_tense2[1, arrow_stress]*arrow_height-currentbreadth)
+ shifted z@#a));
+ a3 = angle direction t of p; z@#' = point t of p; pos@#'(rth, a3-90);
+ z@#a' = if arrow_tense1<1:
+ p intersectionpoint (halfcircle rotated(a1+90)
+ scaled(arrow_tense1[length(z@#b-z@#a), 0]*2) shifted z@#a);
+ else: z@#a; fi
+ filldraw
+ if side = right: z@#a.l{-dir a1}...{-dir a2}z@#l
+ else: z@#a...{z@#b.l-z@#a'}z@#b.l--z@#c.l{z@#'l-z@#c.l}...z@#l
+ fi --
+ if side = left: z@#r{dir a2}...z@#a.r{dir a1}
+ else: z@#r...{z@#c.r-z@#'r}z@#c.r--z@#b.r{z@#a'-z@#b.r}...z@#a
+ fi -- cycle;
+ labels(@#a'); penlabels(@#', @#a, @#b, @#c);
+ arrow_head_fitting := false;
+enddef;
+
+vardef double_arrow_head@#(expr head, vect) =
+ save a, b, u_, v_; pair u_, v_;
+ u_ = unitvector vect; v_ = u_ rotated 90;
+ z@# = z@#' = head;
+ z@#-z@#m = double_arrow_height*u_;
+ pos@#'(rth, angle u_-90);
+ pos@#m(rth, angle u_-90);
+ z@#-z@#b.r = z@#m-z@#m.b = 0.5rth*double_arrow_flatness*v_;
+ a = angle(-double_arrow_height, 0.5double_arrow_width);
+ b = (cosd(a)/sind(a)+
+ ((0.5double_arrow_width/rth/sind(a))+-+1))
+ /((0.5double_arrow_width/rth)**2-1)
+ *0.5double_arrow_width;
+ z@#c.l = double_arrow_tense[z@#m.b, z@#b.r-b*u_];
+ z@#m-z@#a.l = 0.5double_arrow_width*v_;
+ b := rth/abs sind(angle(z@#a.l-z@#c.l)-angle(-u_));
+ z@#a.r-z@#a.l = z@#c.r-z@#c.l = b*u_;
+ z@#ab = 0.5[z@#a.r, z@#c.r];
+ penpos@#b(rth, angle(z@#b.r-z@#ab)-90);
+ %
+ save p, t; path p[]; numeric t[];
+ z@#a = 0.5[z@#a.r, z@#a.l];
+ p1 = z@#a{z@#ab-z@#a.r}...{z@#b.r-z@#ab}z@#b;
+ p3 = z@#a.r{z@#ab-z@#a.r}...{z@#b.r-z@#ab}z@#b.r;
+ p5 = if (z@#b.l-z@#) dotprod v_<0:
+ z@#'l+(u_ dotprod (z@#b.l-z@#))*u_-- fi
+ z@#b.l{z@#ab-z@#b.r}...{z@#a.r-z@#ab}z@#a.l;
+ p2 = reverse p1 reflectedabout (z@#, z@#m);
+ p4 = reverse p3 reflectedabout (z@#, z@#m);
+ p6 = reverse p5 reflectedabout (z@#, z@#m);
+ t5 = xpart(p5 intersectiontimes (z@#+eps*v_ .. z@#m+eps*v_));
+ t6 = xpart(p6 intersectiontimes (z@#-eps*v_ .. z@#m-eps*v_));
+ fill p3--z@#+eps*v_--subpath (t5, length p5) of p5--cycle;
+ fill z@#-eps*v_--p4--subpath (0, t6) of p6--cycle;
+ forsuffixes $ = l, , r:
+ z@#r$ = p1 intersectionpoint
+ ((z@#'$..z@#m$) shifted (-0.5spread1*v_));
+ z@#l$ = p2 intersectionpoint
+ ((z@#'$..z@#m$) shifted (0.5spread1*v_));
+ endfor
+ penlabels(@#, @#', @#a, @#b, @#c, @#r, @#l, @#m); labels(@#ab, @#m.b);
+enddef;
+
+% ARM, BEAK and SERIFS (personal taste)
+
+% vardef arm@#(expr beak, beak_jut, breadth, darkness, orientation, x_limit) =
+% save a; a = 90;
+% if orientation = up: y@#a = min(y@#l, y@#r); y@#d = max(y@#l, y@#r);
+% y@#b-y@#d = vround beak; a := -a;
+% else: y@#a = max(y@#l, y@#r); y@#d = min(y@#l, y@#r);
+% y@#b-y@#d = -vround beak; fi
+% if x_limit>x@#: rt x@#b = hround x_limit; x@#b-x@#a = hround beak_jut;
+% else: lft x@#b = hround x_limit; x@#b-x@#a = -hround beak_jut; a := -a; fi
+% z@#c-z@#b = max(0, breadth-currentbreadth)
+% *unitvector(z@#a-z@#b)rotated a;
+% z@#d-z@#c = whatever*(z@#a-z@#b);
+% filldraw z@#c{z@#d-z@#c}...
+% if y@#l = y@#.d: darkness[z@#d, 0.5[z@#c, z@#l]]{z@#l-z@#c}
+% ...z@#l{z@#l-z@#d}--z@#r
+% else: darkness[z@#d, 0.5[z@#c, z@#r]]{z@#r-z@#c}
+% ...z@#r{z@#r-z@#d}--z@#l fi
+% --z@#a--z@#b--cycle;
+% labels(@#a, @#b, @#c, @#d);
+% enddef;
+
+vardef arm@#(expr beak, beak_jut, hair, darkness, direction, limit) =
+ y@#d = y@#r; y@#a = y@#b = y@#r if ypart direction > 0: + else: - fi vround beak;
+ y@#c = y@#l;
+ rt x@#b = hround limit; lft x@#a = hround(limit-hair);
+ x@#b-x@#c = hround beak_jut; z@#d-z@#a = whatever*(z@#c-z@#b);
+ filldraw z@#r{z@#d-z@#r}...darkness[z@#d, 0.5[z@#r, z@#a]]...
+ z@#a{z@#a-z@#d}--z@#b--z@#c--z@#l--cycle;
+ labels(@#a, @#b, @#c, @#d);
+enddef;
+
+vardef serif(suffix $, $$)
+ (expr bracket, left_jut, left_slab, dished_left, left_dish,
+ right_jut, right_slab, dished_right, right_dish) =
+ save a, b; b = cosd angle(z$$-z$);
+ a = max(0.5left_jut, 0.5right_jut, bracket);
+ if y$<y$$: top y$b = bot y$+vround left_slab;
+ top y$g = bot y$+vround right_slab;
+ y$a-y$b = y$h-y$g = bracket;
+ top y$c-bot y$d = left_slab+left_dish;
+ top y$f-bot y$e = right_slab+right_dish;
+ else: bot y$b = top y$-vround left_slab;
+ bot y$g = top y$-vround right_slab;
+ y$a-y$b = y$h-y$g = -bracket;
+ bot y$c-top y$d = -left_slab-left_dish;
+ bot y$f-top y$e = -right_slab-right_dish;
+ fi
+ if dished_left: y$c = y$b; else: y$d = y$; fi
+ if dished_right: y$f = y$g; else: y$e = y$; fi
+ if x$l<x$r: z$a = whatever[z$l, z$$l];
+ z$h = whatever[z$r, z$$r];
+ x$c = x$d = x$l-hround(left_jut-b*abs(y$b-y$));
+ x$e = x$f = x$r+hround(right_jut+b*abs(y$g-y$));
+ x$l-x$b = min(left_jut, a);
+ x$g-x$r = min(right_jut, a);
+ else: z$a = whatever[z$r, z$$r];
+ z$h = whatever[z$l, z$$l];
+ x$c = x$d = x$r-hround(left_jut-b*abs(y$b-y$));
+ x$e = x$f = x$l+hround(right_jut+b*abs(y$g-y$));
+ x$r-x$b = min(left_jut, a);
+ x$g-x$l = min(right_jut, a);
+ fi
+ filldraw z$a{z$-z$$}...z$b{left}...z$c--z$d...z${right}
+ ...z$e--z$f...z$g{left}...{z$$-z$}z$h--cycle;
+ labels($a, $b, $c, $d, $e, $f, $g, $h);
+enddef;
+
+% SIM: drawn once, used many times
+
+def make_sim_picture =
+ if unknown sim_picture:
+ beginpicture(sim, 12u#+2appr#, v_center(spread1#+rth#));
+ pickup tiny.nib;
+ save a, b;
+ a = angle(1, 1.25(h+d)/u);
+ b = angle(1, -(h+d)/4.5u);
+ pos1(hair, a+90); pos9(hair, a+90); pos5(stem, b+90);
+ bot y7l = -d-eps; top y3r = h+eps;
+ y1l = good.y 0.225[y7l, y3r]; y3r-y9r = y1l-y7l;
+ top y3r-bot y3l = top y7r-bot y7l = vround 0.5[hair, stem];
+ lft x1r = Appr-eps; rt x9l = w-Appr+eps;
+ z5 = 0.5[z1, z9];
+ forsuffixes $ = r, l: y2$ = y3$ = y4$; y6$ = y7$ = y8$;
+ z2$-z1$ = whatever*dir a; z8$-z9$ = whatever*dir a;
+ z4$-z5$ = whatever*dir b; z6$-z5$ = whatever*dir b;
+ x3$ = 0.6525[x2$, x4$]; x7$ = 0.6525[x8$, x6$];
+ endfor
+ filldraw stroke z1e..controls 0.66[z1e, z2e] and 0.66[z3e, z2e]
+ ..z3e..controls 0.4[z3e, z4e] and 1[z5e, z4e]% 1 for inflexion point
+ ..z5e..controls 1[z5e, z6e] and 0.4[z7e, z6e]
+ ..z7e..controls 0.66[z7e, z8e] and 0.66[z9e, z8e]..z9e;
+ %penlabels(1, 2, 3, 4, 5, 6, 7, 8, 9);
+ endpicture;
+ fi
+enddef;
+
+% TRIANGLES
+
+% makes an equilateral triangle optionally fully centered.
+
+numeric triangle_foot;
+
+vardef set_triangle@#(expr orientation, a, rth, centered, fit_bounds) =
+ if orientation = left:
+ rt x1@#r = rt x3@#r = if centered:
+ hround(0.5w+0.5a/sqrt3);
+ else: hround triangle_foot; fi
+ x1@#r-x2@#r = hround(0.5a*sqrt(3)-currentbreadth)+eps;
+ y2@#r = good.y 0.5[-d, h];
+ y3@#r-y2@#r = y2@#r-y1@#r = vround(0.5(a-currentbreadth))+eps;
+ elseif orientation = right:
+ lft x1@#r = lft x3@#r = if centered:
+ hround(0.5w-0.5a/sqrt3);
+ else: hround triangle_foot; fi
+ x2@#r-x1@#r = hround(0.5a*sqrt(3)-currentbreadth)+eps;
+ y2@#r = good.y 0.5[-d, h];
+ y2@#r-y3@#r = y1@#r-y2@#r = vround(0.5(a-currentbreadth))+eps;
+ elseif orientation = down:
+ top y1@#r = top y3@#r = if centered:
+ vround(math_axis+0.5a/sqrt3);
+ else: vround triangle_foot; fi
+ y1@#r-y2@#r = hround(0.5a*sqrt(3)-currentbreadth)+eps;
+ x2@#r = good.x 0.5w;
+ x1@#r-x2@#r = x2@#r-x3@#r
+ = hround 0.5min(a-currentbreadth, w-2appr-currentbreadth+2ho)+eps;
+ else:
+ bot y1@#r = bot y3@#r = if centered:
+ vround(math_axis-0.5a/sqrt3);
+ else: vround triangle_foot; fi
+ y2@#r-y1@#r = hround(0.5a*sqrt(3)-currentbreadth)+eps;
+ x2@#r = good.x 0.5w;
+ x3@#r-x2@#r = x2@#r-x1@#r
+ = hround 0.5min(a-currentbreadth, w-2appr-currentbreadth+2ho)+eps;
+ fi
+ z1@#l-z1@#r = (rth-currentbreadth)/sind(60)
+ *(unitvector(z3@#r-z1@#r)+unitvector(z2@#r-z1@#r));
+ z2@#l-z2@#r = (rth-currentbreadth)/sind(60)
+ *(unitvector(z3@#r-z2@#r)+unitvector(z1@#r-z2@#r));
+ z3@#l-z3@#r = (rth-currentbreadth)/sind(60)
+ *(unitvector(z1@#r-z3@#r)+unitvector(z2@#r-z3@#r));
+ penlabels(1@#, 2@#, 3@#);
+enddef;
+
+% It's buggy
+vardef draw_star@#(expr center, n_edges, radius, tense, angle_init, void) =
+ save a, b, theta; theta = 360/n_edges;
+ x@# = good.x xpart center; y@# = good.y ypart center;
+ % external points
+ a = radius-0.5currentbreadth;
+ b = (1-tense)*a*cosd theta/cosd(theta/2);
+ for $ = 1 upto n_edges:
+ z@#[2$-1]l = z@#+round(a*dir(($-1)*theta+angle_init));
+ z@#[2$]l = z@#+round(b*dir(($-0.5)*theta+angle_init));
+ labels(@#[2$-1]l, @#[2$]l);
+ endfor
+ if void:
+ % internal points
+ a := (rth-currentbreadth)/
+ abs sind(angle(z@#[1]l-z@#[2]l)-angle(z@#[1]l-z@#));
+ b := (rth-currentbreadth)/
+ abs sind(angle(z@#[2]l-z@#[1]l)-angle(z@#[2]l-z@#));
+ for $ = 1 upto n_edges:
+ z@#[2$-1]l-z@#[2$-1]r = a*dir(($-1)*theta+angle_init);
+ z@#[2$]l-z@#[2$]r = b*dir(($-0.5)*theta+angle_init);
+ labels(@#[2$-1]r, @#[2$]r);
+ endfor
+ filldraw stroke for $ = 1 upto 2n_edges: z@#[$]e--endfor z@#[1]e;
+ else:
+ filldraw for $ = 1 upto 2n_edges: z@#[$]l--endfor cycle;
+ fi
+enddef;
+
+% ADMINISTRATION
+
+% PROOFING
+
+def horizontal_rules_list =
+ -body_depth, -desc_depth, x_height, cap_height, asc_height, body_height
+enddef;
+
+def makebox(text rule) =
+ for y = -d.o_, 0, h.o_:
+ rule((-xoffset, y), (w-xoffset, y)); endfor
+ for y = horizontal_rules_list:
+ rule((appr-xoffset, y), (w-appr-xoffset, y));
+ endfor
+ for x = -xoffset, appr-xoffset, w-appr-xoffset, w-xoffset:
+ rule((x, -d.o_), (x, h.o_)); endfor
+ for x = appr+u-xoffset step u until w-appr-1.5-xoffset:
+ rule((x, -d.o_), (x, h.o_)); endfor
+ if charic<>0:
+ rule((w-xoffset+charic*hppp, h.o_),
+ (w-xoffset+charic*hppp, .5[h, -d].o_)); fi
+enddef;
+
+def accents_proofing =
+ for $ = 0 upto 19:
+ makelabel("", (0.5w-xoffset, 0.5x_height)
+ +(4u*cosd($*360/20), 0.5x_height*sind($*360/20)));
+ endfor
+enddef;
+
+def diacritics_proofing =
+ if proofing>0: extra_endchar := extra_endchar&"accents_proofing;"; fi
+enddef;
+
+def standard_proofing =
+ if proofing>0: extra_endchar := "additions_to_proof;"; fi
+enddef;
+
+def additions_to_proof =
+ makelabel.lft("baseline", (-xoffset, 0));
+ if h>math_axis: makelabel.lft("math axis", (-xoffset, math_axis)); fi
+enddef;
+
+% `iff' CONSTRUCTION
+
+let semi_ = ;; let colon_ = :; let endchar_ = endchar;
+def iff expr b = if b:let next_ = use_it else:let next_ = lose_it fi; next_ enddef;
+def use_it = let : = restore_colon; enddef;
+def restore_colon = let : = colon_; enddef;
+def lose_it = let endchar = fi;
+let ; = fix_ semi_ if false enddef;
+def fix_ = let ; = semi_; let endchar = endchar_;
+enddef;
+def always_iff = let : = endgroup; killboolean enddef;
+def killboolean text t = use_it enddef;
+
+% Not the fastest solution
+def beginchar(expr c, w_sharp, h_sharp, d_sharp) =
+ iff known c:
+ begingroup
+ charcode := byte c;
+ charwd := w_sharp;
+ charht := h_sharp;
+ chardp := d_sharp;
+ w := hround(charwd*hppp);
+ h := vround(charht*hppp);
+ d := vround(chardp*hppp);
+ charic := 0; clearxy; clearit;
+ clearpen;
+ scantokens extra_beginchar;
+ enddef;
+
+ endinput;