summaryrefslogtreecommitdiff
path: root/fonts/mathabx/source/mathastr.mf
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/mathabx/source/mathastr.mf
Initial commit
Diffstat (limited to 'fonts/mathabx/source/mathastr.mf')
-rw-r--r--fonts/mathabx/source/mathastr.mf946
1 files changed, 946 insertions, 0 deletions
diff --git a/fonts/mathabx/source/mathastr.mf b/fonts/mathabx/source/mathastr.mf
new file mode 100644
index 0000000000..f037c718c9
--- /dev/null
+++ b/fonts/mathabx/source/mathastr.mf
@@ -0,0 +1,946 @@
+% mathematical symbols by Anthony Phan.
+% file: mathastr.mf (mathematical astronomical symbols)
+% last modification: May 16, 2005.
+% Only known charcodes will be generated.
+
+% stem_corr had been added (darkness).
+% also vair_corr and slab.
+
+%astro := 1;
+
+% from cmbase.mf
+
+% super_arc.r(suffix $, $$) and super_arc.l(suffix $, $$)
+% have the same effect as a right_to_down
+
+vardef pulled_super_arc.r(suffix $, $$)(expr superpull) =
+ pair center, corner;
+ if y$ = y$r: center = (x$$r, y$r); corner = (x$r, y$$r);
+ else: center = (x$r, y$$r); corner = (x$$r, y$r); fi
+ z$r{corner-z$r}...superness[center, corner]{z$$r-z$r}
+ ...{z$$r-corner}z$$r
+enddef;
+
+vardef pulled_super_arc.l(suffix $, $$)(expr superpull) =
+ pair center, corner, outer_point;
+ if y$ = y$r: center = (x$$l, y$l); corner = (x$l, y$$l);
+ outer_point = superness[(x$$r, y$r), (x$r, y$$r)];
+ else: center = (x$l, y$$l); corner = (x$$l, y$l);
+ outer_point = superness[(x$r, y$$r), (x$$r, y$r)]; fi
+ z$l{corner-z$l}
+ ...superpull[superness[center, corner], outer_point]{z$$l-z$l}
+ ...{z$$l-corner}z$$l
+enddef;
+
+vardef pulled_arc@#(suffix $, $$) =
+ pulled_super_arc@#($, $$)(superpull)
+enddef;
+
+% let's go
+
+use_rule4;
+
+boolean serifs;
+if astro > 0.75: serifs := true; else: serifs := false; fi
+
+astro.hair := hround astro[rth, hair];
+astro.vair := vround astro[rth, vair];
+astro.stem := hround astro[rth, stem];
+astro.light_stem := astro[rth, 0.9[vair, 0.85stem]];
+astro.curve := hround astro[rth, curve];
+astro.vair' := vround astro[rth, vair'];
+astro.cap_hair := vround astro[rth, cap_hair];
+astro.cap_stem := hround astro[rth, cap_stem];
+astro.cap_curve := hround astro[rth, cap_curve];
+astro.rth := astro[rth, rth];
+astro.beak := astro[0, 0.38cap_height-astro.cap_hair];
+astro.slab := vround astro[rth, slab];
+
+superpull := astro*1/6;
+arrow_breadth := astro[0, vair];
+arrow_stress := astro[1, 0.7];
+arrow_tense1 := astro[1, 0.75];
+arrow_tense2 := astro[1, 0.875];
+
+% absolutely okay
+beginchar(astro_sun, 13u#+2appr#, cap_height#, 0);
+ "Sun";
+ italcorr 0; % italcorr 0.6cap_height#*slant-.5u#;
+ autorounded;
+ pickup null.nib;
+% circle
+ penpos1(astro.vair', 90);
+ penpos2(hround astro[rth, cap_curve-stem_corr], 180);
+ penpos3(vround astro[rth, vair+1.5vair_corr], -90);
+ penpos4(hround astro[rth, cap_curve-stem_corr], 0);
+ y1r = h+o; y3r = -o; y2 = y4 = 0.5h;
+ x2r = appr; x4r = w-appr; x1 = x3 = 0.5[x2, x4];
+ y2l := y4l := astro[y2, 0.52h];
+ penstroke pulled_arc.e(1, 2) & pulled_arc.e(2, 3)
+ & pulled_arc.e(3, 4) & pulled_arc.e(4, 1) & cycle;
+% dot
+ adjust_dot5((x1, y2), astro[2.7rth, 1.3dtsz], true, true);
+ dot(5, 5');
+ penlabels(1, 2, 3, 4);
+endchar;
+
+% okay
+beginchar(astro_left_moon, 10u#+2appr#, cap_height#, 0);
+ "Left moon (Moon)";
+ italcorr 0; % italcorr cap_height#*slant-.5u#;
+ save tmp_path, a, t; path tmp_path[];
+%
+% Two solutions may be considered for
+% this construction. The first (and the
+% one which is done here) is to put the
+% two centers of circles at a predeterminated
+% distance $a$ from each others (namely $a = 4u$)
+% and do the construction hoping that edges
+% will fit the right bound.
+% The second one consists in calculating that
+% distance $a$ to make sure that edges will lie
+% on the right bound (the calculations are shown
+% commentated). The problem with this method
+% is that there is no control of the clear part's
+% width of the drawing. Moreover, when the inner
+% radius become too small there is no more solution
+% to that problem (see below).
+%
+%% The actual width of the drawing must be 10u.
+%% The problem is to calculate the distance
+%% between the two centers to make it work.
+%% Alas when the two radius are too far from
+%% each over, this problem has no solution.
+%%
+%% 6.5u = radius of great circle.
+%% 3.5u = 10u-6.5u = (inner width)-radius.
+%% 6.5u-rth = radius of small circle.
+%%
+% b = (3.5u)**2+(rth**2)-2*6.5u*rth;
+% if b> = 0: a = hround(3.5u+sqrt b);
+% else: a = hround(3.5u); fi
+ a = hround(4u-rth+astro.rth);
+ penpos2(vround astro.rth, 90);
+ penpos3(hround astro.rth, 180);
+ penpos4(vround astro.rth, -90);
+ penpos1(hround astro.rth, 0);
+ x3r = appr; x1r-x3r = 13u; y2r = h+o; y4r = -o;
+ y1 = y3 = 0.5[y2, y4]; x2 = x4 = 0.5[x1, x3];
+ tmp_path1 = z1r up_to_left z2r left_to_down z3r
+ down_to_right z4r right_to_up z1r..cycle;
+ tmp_path2 = z1l up_to_left z2l left_to_down z3l
+ down_to_right z4l right_to_up z1l..cycle;
+ tmp_path3 = tmp_path1 shifted (a, 0);
+ tmp_path4 = tmp_path2 shifted (a, 0);
+%
+% The presence of epsilons makes almost certain
+% that paths won't have double points causing
+% trouble with filling commands.
+%
+ (t1-eps, t4-eps) = (subpath (0, 4) of tmp_path1)
+ intersectiontimes (subpath (0, 4) of tmp_path4);
+ (t2-4+eps, t3-4+eps) = (subpath (4, 8) of tmp_path1)
+ intersectiontimes (subpath (4, 8) of tmp_path4);
+ (t5-eps, t8-eps) = (subpath (0, 4) of tmp_path2)
+ intersectiontimes (subpath (0, 4) of tmp_path3);
+ (t6-4+eps, t7-4+eps) = (subpath (4, 8) of tmp_path2)
+ intersectiontimes (subpath (4, 8) of tmp_path3);
+ fill subpath (t1, t2) of tmp_path1
+ ..reverse subpath(t4, t3) of tmp_path4..cycle;
+ unfill subpath (t5, t6) of tmp_path2
+ ..reverse subpath(t8, t7) of tmp_path3..cycle;
+ penlabels(1, 2, 3, 4);
+endchar;
+
+beginchar(astro_right_moon, 10u#+2appr#, cap_height#, 0);
+ "Right moon";
+ italcorr 0; % italcorr cap_height#*slant-.5u#;
+ save tmp_path, a, t; path tmp_path[];
+ a = -hround(4u-rth+astro.rth);
+ penpos2(vround astro.rth, 90);
+ penpos3(hround astro.rth, 0);
+ penpos4(vround astro.rth, -90);
+ penpos1(hround astro.rth, 180);
+ x3 = w-appr-0.5rth; x1r-x3r = -13u; y2r = h+o; y4r = -o;
+ y1 = y3 = 0.5[y2, y4]; x2 = x4 = 0.5[x1, x3];
+ tmp_path1 = z1r up_to_left z2r left_to_down z3r
+ down_to_right z4r right_to_up z1r..cycle;
+ tmp_path2 = z1l up_to_left z2l left_to_down z3l
+ down_to_right z4l right_to_up z1l..cycle;
+ tmp_path3 = tmp_path1 shifted (a, 0);
+ tmp_path4 = tmp_path2 shifted (a, 0);
+ (t1-eps, t4-eps) = (subpath (0, 4) of tmp_path1)
+ intersectiontimes (subpath (0, 4) of tmp_path4);
+ (t2-4+eps, t3-4+eps) = (subpath (4, 8) of tmp_path1)
+ intersectiontimes (subpath (4, 8) of tmp_path4);
+ (t5-eps, t8-eps) = (subpath (0, 4) of tmp_path2)
+ intersectiontimes (subpath (0, 4) of tmp_path3);
+ (t6-4+eps, t7-4+eps) = (subpath (4, 8) of tmp_path2)
+ intersectiontimes (subpath (4, 8) of tmp_path3);
+ fill subpath (t1, t2) of tmp_path1
+ ..reverse subpath(t4, t3) of tmp_path4..cycle;
+ unfill subpath (t5, t6) of tmp_path2
+ ..reverse subpath(t8, t7) of tmp_path3..cycle;
+ penlabels(1, 2, 3, 4);
+endchar;
+
+beginchar(astro_full_moon, 13u#+2appr#, cap_height#, 0);
+ "Full moon";
+ italcorr 0; % italcorr 0.6cap_height#*slant-.5u#;
+ autorounded;
+% circle
+ penpos1(vround astro.rth, 90);
+ penpos2(hround astro.rth, 180);
+ penpos3(vround astro.rth, -90);
+ penpos4(hround astro.rth, 0);
+ y1r = h+o; y3r = -o; y2 = y4 = 0.5h;
+ x2r = appr; x4r = w-appr; x1 = x3 = 0.5[x2, x4];
+ y2l := y4l := astro[y2, y2];
+ penstroke z1e left_to_down z2e down_to_right
+ z3e right_to_up z4e up_to_left z1e;
+ penlabels(1, 2, 3, 4);
+endchar;
+
+beginchar(astro_new_moon, 13u#+2appr#, cap_height#, 0);
+ "New moon";
+ italcorr 0; % italcorr cap_height#*slant-.5u#;
+ autorounded;
+ x4 = w-appr; x2 = appr; y1 = h+o; y3 = -o;
+ y2 = y4 = 0.5h; x1 = x3 = 0.5[x2, x4];
+ fill z1 left_to_down z2 down_to_right z3
+ right_to_up z4 up_to_left z1..cycle;
+ labels(1, 2, 3, 4);
+endchar;
+
+% okay
+beginchar(astro_mercury, 9u#+2appr#, cap_height#, 0);
+ "Mercury";
+ italcorr 0; % italcorr cap_height#*slant-.5u#;
+ save a; a = astro.light_stem;
+ ensure_centering_of(a);
+% circle
+ penpos1(astro.vair, 90);
+ penpos2(astro.curve, 180);
+ penpos3(astro.vair, -90);
+ penpos4(astro.curve, 0);
+ y1r = cap_height+oo;
+ y3r = vround astro[0.30cap_height, cap_height-x_height]-oo;
+ y2 = y4 = 0.5[y1, y3];
+ x2r = appr; x4r = w-appr; x1 = x3 = 0.5[x2, x4];
+ y2l := y4l := astro[y2, 0.52[y3, y1]];
+ penstroke pulled_arc.e(1, 2) & pulled_arc.e(2, 3)
+ & pulled_arc.e(3, 4) & pulled_arc.e(4, 1) & cycle;
+% queue
+ tmp_path := pulled_arc.r(1, 2) & pulled_arc.r(2, 3)
+ & pulled_arc.r(3, 4) & pulled_arc.r(4, 1) & cycle;
+ pickup crisp.nib;
+ bot y5 = -o; bot y6l = bot y7l = vround(0.5[-d, y3r]-0.5a);% a little higher
+ pos5(hround a, 0); pos6(vround a, 90); pos7(vround a, 90);
+ x5 = x3; x5l-x6 = x7-x5r = hround 0.5(x1-x2l);
+ save t;
+ forsuffixes $ = , r, l:
+ t$ = xpart(tmp_path intersectiontimes (z5$..(x5$, y2)));
+ endfor
+ filldraw subpath (t.r, t.l) of tmp_path--z5l--z5r--cycle;
+ filldraw stroke z6e..z7e;
+% horns
+ tmp_path := reverse tmp_path;
+ save p; path p.r, p.l;
+ a := astro[rth, stem];
+ pos8(a, 90); pos9(hround 0.5[a, astro.vair], 180);
+ pos10(astro.vair, -90); pos11(hround 0.5[a, astro.vair], 0);
+ lft x9r = appr; x8 = x10 = x1; rt x11r = w-appr;
+ y9 = y11 = 0.5[y8, y10] = y1;
+ top y8 = vround max(1.22cap_height, y1r+a);
+ p.r = z8r left_to_down z9r down_to_right
+ z10r right_to_up z11r up_to_left z8r;
+ p.l = z8l right_to_down z11l down_to_left
+ z10l left_to_up z9l up_to_right z8l;
+ t1 = xpart(p.r intersectiontimes (z8..(x9r, y8)));
+ (t2, t3-4) = p.r intersectiontimes subpath (4, 8) of tmp_path;
+ (t5, t4-4) = p.l intersectiontimes subpath (4, 8) of tmp_path;
+ t6-6 = xpart(subpath (6, 8) of p.l intersectiontimes
+ ((point t1 of p.r)..(x1, y2)));
+ t7 = xpart(p.r intersectiontimes (z8..(x11r, y8)));
+ (t8, t9) = p.r intersectiontimes subpath (0, 4) of tmp_path;
+ (t11, t10) = p.l intersectiontimes subpath (0, 4) of tmp_path;
+ t12 = xpart(subpath (0, 2) of p.l intersectiontimes
+ ((point t7 of p.r)..(x1, y2)));
+ interim turningcheck := 0;% I hate turning numbers
+ filldraw subpath (t1, t2) of p.r
+ --subpath (t3, t4) of tmp_path
+ --subpath (t5, t6) of p.l -- cycle;
+ filldraw subpath (t12, t11) of p.l
+ --subpath (t10, t9) of tmp_path
+ --subpath (t8, t7) of p.r -- cycle;
+ penlabels(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
+endchar;
+
+% okay
+beginchar(astro_venus, 9u#+2appr#, cap_height#, 0);
+ "Venus";
+ italcorr 0; % italcorr cap_height#*slant-.5u#;
+ save a, t; a = astro.light_stem;
+ ensure_centering_of(a);
+% circle
+ penpos1(astro.vair, 90);
+ penpos2(astro.curve, 180);
+ penpos3(astro.vair', -90);
+ penpos4(astro.curve, 0);
+ y1r = cap_height+oo;
+ y3r = vround astro[0.30cap_height, cap_height-x_height]-oo;
+ y2 = y4 = 0.5[y1, y3];
+ x2r = appr; x4r = w-appr; x1 = x3 = 0.5[x2, x4];
+ y2l := y4l := astro[y2, 0.52[y3, y1]];
+ penstroke pulled_arc.e(1, 2) & pulled_arc.e(2, 3)
+ & pulled_arc.e(3, 4) & pulled_arc.e(4, 1)& cycle;
+% queue
+ tmp_path := pulled_arc.r(1, 2) & pulled_arc.r(2, 3)
+ & pulled_arc.r(3, 4) & pulled_arc.r(4, 1) & cycle;
+ pickup crisp.nib;
+ bot y5 = -o; bot y6l = bot y7l = vround(0.5[-d, y3r]-0.5a);% a little higher
+ pos5(hround a, 0); pos6(vround a, 90); pos7(vround a, 90);
+ x5 = x3; x5l-x6 = x7-x5r = hround 0.5(x1-x2l);
+ forsuffixes $ = , r, l:
+ t$ = xpart(tmp_path intersectiontimes (z5$..(x5$, y2)));
+ endfor
+ filldraw subpath (t.r, t.l) of tmp_path--z5l--z5r--cycle;
+ filldraw stroke z6e..z7e;
+ penlabels(1, 2, 3, 4, 5, 6, 7);
+endchar;
+
+% absolutely okay
+beginchar(astro_earth, 13u#+2appr#, cap_height#, 0);
+ "Earth";
+ italcorr 0; % italcorr 0.6cap_height#*slant-.5u#;
+ save a; a = astro.light_stem;
+ ensure_centering_of(a);
+ pickup null.nib;
+ autorounded;
+% circle
+ penpos1(astro.vair', 90);
+ penpos2(hround astro[rth, cap_curve-2stem_corr], 180);
+ penpos3(vround astro[rth, vair+1.5vair_corr], -90);
+ penpos4(hround astro[rth, cap_curve-2stem_corr], 0);
+ y1r = h+o; y3r = -o; y2 = y4 = 0.5h;
+ x2r = appr; x4r = w-appr; x1 = x3 = 0.5[x2, x4];
+ y2l := y4l := astro[y2, 0.52h];
+ penstroke pulled_arc.e(1, 2) & pulled_arc.e(2, 3)
+ & pulled_arc.e(3, 4) & pulled_arc.e(4, 1) & cycle;
+% cross
+ tmp_path := z1 left_to_down z2 down_to_right
+ z3 right_to_up z4 up_to_right z1;
+ penpos5(hround a, 0); penpos6(vround a, 90);
+ x5 = x6 = 0.5w;
+ y5 = y6 = vround(y2-0.5vround a)+0.5vround a;
+ forsuffixes $ = , r, l:
+ z7$ = tmp_path intersectionpoint (z5$..(x5$, y1r));
+ z8$ = tmp_path intersectionpoint (z5$..(x5$, y3r));
+ z9$ = tmp_path intersectionpoint (z6$..(x2r, y6$));
+ z10$ = tmp_path intersectionpoint (z6$..(x4r, y6$));
+ endfor
+ fill z7r..z7..z7l--z8l..z8..z8r--cycle;
+ fill z9r..z9..z9l--z10l..z10..z10r--cycle;
+ penlabels(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+endchar;
+
+% almost okay (see arrows dimensions)
+beginchar(astro_mars, 9u#+2appr#, body_height#, 0);
+ "Mars";
+ italcorr 0; % italcorr body_height#*slant-.5u#;
+ save a; a = astro.light_stem;
+ % ensure_centering_of(a);% just for homogeneity
+ % circle
+ penpos1(astro.vair, 90);
+ penpos2(astro.curve, 180);
+ penpos3(astro.vair', -90);
+ penpos4(astro.curve, 0);
+ y1r = vround astro[0.70cap_height, x_height]+oo;
+ y3r = -oo;
+ y2 = y4 = 0.5[y1, y3];
+ x2r = appr; x4r = w-appr; x1 = x3 = 0.5[x2, x4];
+ y2l := y4l := astro[y2, 0.52[y3, y1]];
+ penstroke pulled_arc.e(1, 2) & pulled_arc.e(2, 3)
+ & pulled_arc.e(3, 4) & pulled_arc.e(4, 1) & cycle;
+ % arrow
+ tmp_path := pulled_arc.r(1, 2) & pulled_arc.r(2, 3)
+ & pulled_arc.r(3, 4) & pulled_arc.r(4, 1) & cycle;
+ z6 = (x1, y2); top y7 = body_height+o; rt x7 = w-appr;
+ arrow_height := vround astro[0.2cap_height, 0.3cap_height];
+ arrow_width := max(4.9rth, rth+3u);
+ save rth; rth = a;
+ arrow_head5(z6..z7, both);
+ z6r-z6 = z5r-z5; z6-z6l = z5-z5l;
+ save t;
+ forsuffixes $ = r, l:
+ t$ = xpart(tmp_path intersectiontimes (z6$..z5$));
+ endfor
+ filldraw if t.l>t.r: subpath (t.r, t.l) of tmp_path
+ else: subpath (t.r, 8) of tmp_path & subpath (0, t.l) of tmp_path fi
+ --z5l--z5r--cycle;
+ penlabels(1, 2, 3, 4, 6, 7);
+endchar;
+
+% humm
+beginchar(astro_jupiter, 10u#+2appr#, asc_height#, desc_depth#);
+ "Jupiter";
+ italcorr 0; % italcorr body_height#*slant-.5u#;
+ pickup crisp.nib;
+ %
+ top y1r = h; bot y2l = -d;
+ rt x1r = w-appr-.5u;
+ lft x2l = appr+3u;
+ adjust_slanted_bar(1r, 2l, 1l, 2r)(astro[rth, cap_stem]-crisp, -1);
+ z1r-z1 = z1-z1l; z2r-z2 = z2-z2l;
+ filldraw stroke z1e..z2e;
+ %
+ top y3r-bot y3l = top y4r-bot y4l = astro.cap_hair;
+ z3r-z3l = whatever*(z1-z2);
+ bot y3l = bot y4l = bot y5l = vround 0.0h;
+ lft x5l = appr-0.5u;
+ adjust_slanted_bar(1l, 5l, 0, 5)(0.5(astro.cap_hair-crisp), -1);
+ z5r-z5 = z5-z5l;
+ top y8 = h-0.5rth; lft x8 = appr;
+ z0' = 0.72[z5, z1l]; z6 = 0.25[z5, z1l];
+ pos6(astro.cap_hair, angle(z1l-z5)-90);
+ pos8(astro.cap_curve, angle(z8-z0')-90);
+ x4l = x5; z4r-z4l = whatever*(z6-z5); z3 = 0.5[z3l, z3r];
+ filldraw stroke z5e---z6e{z0'-z6}...{z8-z0'}z8e;
+ %
+ if serifs:
+ save beak_jut, bracket, cap_jut;
+ cap_jut = hround astro[0, 1.8u];
+ bracket = 0.5cap_jut;
+ serif(1, 2, bracket, cap_jut, astro.slab, true, dish,
+ cap_jut, astro.slab, true, dish);
+ serif(2, 1, bracket, cap_jut, astro.slab, true, dish,
+ cap_jut, astro.slab, true, dish);
+ z3l = whatever[z1r, z2r];
+ beak_jut = (astro.beak+astro.slab)*(x1-x2)/(y1-y2);
+ arm3(astro.beak, beak_jut, astro.slab, beak_darkness, up, w-appr+0.75u);
+ else: x3l = 0.8[x2, x1];
+ fi
+ filldraw stroke z3e..z4e;
+ labels(0, 0'); penlabels(1, 2, 3, 4, 5, 6, 7, 8);
+endchar;
+
+% humm
+beginchar(astro_saturn, 9.5u#+2appr#, body_height#, 0);
+ "Saturn";
+ italcorr 0; % italcorr body_height#*slant-.5u#;
+ % curve
+ pickup crisp.nib;
+ pos1(astro.cap_hair, 180); pos2(astro.cap_hair, 90);
+ pos3(hround 0.43[astro.cap_hair, astro.cap_stem], 0);
+ pos5(hround 0.44[astro.cap_hair, astro.cap_stem], 0);
+ pos6(astro.cap_hair, 90);
+ pos7(hround 0.44[astro.cap_hair, astro.cap_stem], 180);
+ pos10(astro.cap_stem, 0);
+ lft x10l = appr+hround 1.5u;
+ x10r = x1l;
+ rt x3r = rt x7l = w-appr;
+ x2 = (astro[0.5,0.57])[x1l, x3l];
+ rt x5r+eps = hround astro[x2, x10r+0.5[astro.cap_hair, astro.cap_stem]];
+ x6 = 0.5[x5, x7];
+ %
+ % Construction with tangent circles
+ %
+ save d, k, R; k = (x7-x5)/(x3-x1);
+ k' = (1+k-2sqrt k)/((1-k)**2);
+ bot y6l = -o;
+ top y2r = vround 0.8h+o;
+ R = k'*(y2-y6);
+ y3 = y2-R; bot y1 = bot y10 = vround y3;
+ y5 = y7 = y6+k*R;
+ z4 = (1/(1+k))[(x2, y1), (x6, y5)]; d = R/(x2-x1);
+ pos4(astro.cap_stem, angle((y1-y5)/d, (x6-x2)*d)-90);
+ % stem
+ save rth; rth = astro.cap_stem;
+ arrow_height := vround astro[h-cap_height, 0.2cap_height]+o;
+ arrow_width := rth+hround 2(2.25u)+0.5;
+ arrow_head9(z10..(x10, h+o-pen_top), left);
+ filldraw stroke z9e..z10e;
+ %
+ x7 := x7r+1;
+ tmp_path := z6l right_to_up z7l;
+ t := xpart(tmp_path intersectiontimes (z7..(x7, y6l)));
+ autorounded;
+ filldraw subpath (0, t) of tmp_path
+ --z7--z7r down_to_left z6r--cycle;
+ filldraw stroke z1e up_to_right z2e right_to_down
+ z3e...z4e{((y5-y1)/d, (x2-x6)*d)}
+ ...z5e down_to_right z6e;
+ penlabels(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+endchar;
+
+% almost okay (see arrows dimensions)
+beginchar(astro_uranus, 9u#+2appr#, body_height#, 0);
+ "Uranus";
+ italcorr 0; % italcorr body_height#*slant-.5u#;
+ save a;
+ a = astro.light_stem;
+ ensure_centering_of(a);% just for homogeneity
+% circle
+ penpos1(astro.vair, 90);
+ penpos2(hround astro[rth, curve-stem_corr], 180);
+ penpos3(astro.vair', -90);
+ penpos4(hround astro[rth, curve-stem_corr], 0);
+ y1r = vround astro[0.70cap_height, x_height]+oo;
+ y3r = -oo;
+ y2 = y4 = 0.5[y1, y3];
+ x2r = appr; x4r = w-appr; x1 = x3 = 0.5[x2, x4];
+ y2l := y4l := astro[y2, 0.52[y3, y1]];
+ penstroke pulled_arc.e(1, 2) & pulled_arc.e(2, 3)
+ & pulled_arc.e(3, 4) & pulled_arc.e(4, 1) & cycle;
+% dot
+ adjust_dot5((x1, y2), astro[1.6rth, dtsz], true, true);
+ dot(5, 5');
+% arrow
+ tmp_path := pulled_arc.r(1, 2) & pulled_arc.r(2, 3)
+ & pulled_arc.r(3, 4) & pulled_arc.r(4, 1) & cycle;
+ arrow_height := vround astro[0.2cap_height, 0.3cap_height]+eps;
+ arrow_width := max(4.9rth, rth+3u);
+ save rth; rth = hround a;
+ arrow_head6(z1..(x1, body_height+o-pen_top), both);
+ save t;
+ forsuffixes $ = , r, l:
+ t$ = xpart(tmp_path intersectiontimes (z6$..(x6$, y2)));
+ endfor
+ pickup crisp.nib;
+ filldraw subpath (t.r, 8) of tmp_path
+ & subpath (0, t.l) of tmp_path --z6l--z6r--cycle;
+ penlabels(1, 2, 3, 4, 6, 7);
+endchar;
+
+% almost okay (see arrows dimensions)
+beginchar(astro_neptune, 10.5u#+2Appr#, cap_height#, 0);
+ "Neptune";
+ italcorr 0; % italcorr cap_height#*slant-.5u#;
+ save a;
+ a = hround astro[rth, cap_stem-2stem_corr];
+ ensure_centering_of(a);
+% stems
+ x1-0.5a = hround astro[Appr, appr];
+ x3 = x7 = 0.5w;
+ x1 = x2; x4-x3 = x3-x1;
+ pickup crisp.nib;
+% arrows
+ save rth; rth = a;
+ arrow_height := vround astro[0.125cap_height, 0.25cap_height]+eps;
+ arrow_width := min(3a, x3-x1-0.5u, 2.5u+a);
+ arrow_head0((x1, 0)..(x1, h+o-pen_top), both);
+ arrow_head5((x4, 0)..(x4, h+o-pen_top), both);
+ arrow_head6((x3, 0)..(x3, h+o-pen_top), both);
+% cup and queue
+ pos1(a, 180); pos2(a, 180); pos3(astro.vair, -90); pos4(a, 0); pos7(a, 0);
+ pos8(vround astro.light_stem, 90); pos9(vround astro.light_stem, 90);
+ bot y3r = vround 0.2cap_height;
+ y1 = y0; y2 = y4 = 0.5[y1, y3]; bot y7 = -o;
+ top y8r = top y9r = vround 0.2cap_height-1;
+ x7l-x8 = x9-x7r = hround 0.5(x3-x1-a);
+ filldraw stroke z1e..z2e down_to_right z3e right_to_up z4e..z5e;
+ filldraw stroke z6e..z7e; filldraw stroke z8e..z9e;
+ penlabels(1, 2, 3, 4, 7, 8, 9);
+endchar;
+
+% The serifs are not cm compatible
+beginchar(astro_pluto, 7.75u#+Appr#+appr#, cap_height#, 0);
+ "Pluto";
+ italcorr 0; % italcorr 0.75cap_height#*slant-.5u#;
+ pickup crisp.nib;
+ %
+ % stem
+ %
+ pos1(astro.cap_stem, 0);
+ pos2(astro.cap_stem, 0);
+ top y1 = h; bot y2 = 0; lft x1l = lft x2l = Appr;
+ filldraw stroke z1e..z2e;
+ %
+ % curve
+ %
+ penpos3(astro.cap_hair, 90);
+ penpos4(astro.cap_hair, 90);
+ penpos5(astro.cap_curve, 0);
+ penpos6(astro.vair, -90);
+ penpos7(astro.vair, -90);
+ y3r = y4r = h; y5 = 0.5[y4, y6];
+ y6r = y7r = vround astro[0.275h, 0.5h-astro.vair];
+ x3 = x7 = x1; x5r = w-appr; x4 = x6 = 0.4[x3, x5];
+ penstroke z3e..pulled_arc.e(4, 5) & pulled_arc.e(5, 6)..z7e;
+ %
+ % arm or beak, and serifs
+ %
+ pos9(astro.slab, 90); pos10(astro.slab, 90); y9l = y10l = y2; x9 = x2r;
+ if serifs: x10 = 0.5w;
+ save beak_jut, bracket, cap_jut;
+ beak_jut = hround astro[0, 0.75u];
+ cap_jut = hround astro[0, 1.8u];
+ bracket = 0.5cap_jut;
+ arm10(astro.beak, beak_jut, astro.slab, beak_darkness, up, w-appr);
+ serif(1, 2, bracket, cap_jut, astro.slab, true,
+ 0, 0.5cap_jut, astro.slab, true, 0);
+ serif(2, 1, bracket, cap_jut, astro.slab, true,
+ 0, 0.5cap_jut, astro.slab, true, 0);
+ else: rt x10 = w-appr; fi
+ filldraw stroke z9e..z10e;
+ penlabels(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
+endchar;
+
+% okay
+beginchar(astro_varearth, 9u#+2appr#, cap_height#, 0);
+ "Variant Earth";
+ italcorr 0; % italcorr x_height#*slant-.5u#;
+ save a;
+ a = astro.light_stem;
+ ensure_centering_of(a);
+ % circle
+ penpos1(astro.vair, 90);
+ penpos2(astro.curve, 180);
+ penpos3(astro.vair', -90);
+ penpos4(astro.curve, 0);
+ y1r = vround astro[0.70cap_height, x_height]+oo;
+ y3r = -oo;
+ y2 = y4 = 0.5[y1, y3];
+ x2r = appr; x4r = w-appr; x1 = x3 = 0.5[x2, x4];
+ y2l := y4l := astro[y2, 0.52[y3, y1]];
+ penstroke pulled_arc.e(1, 2) & pulled_arc.e(2, 3)
+ & pulled_arc.e(3, 4) & pulled_arc.e(4, 1) & cycle;
+ % head
+ tmp_path := pulled_arc.r(1, 2) & pulled_arc.r(2, 3)
+ & pulled_arc.r(3, 4) & pulled_arc.r(4, 1) & cycle;
+ pickup crisp.nib;
+ top y5 = h+o; top y6r = top y7r = vround(0.5[h, y1r]+0.5o+0.5a);
+ pos5(hround a, 0); pos6(vround a, 90); pos7(vround a, 90);
+ x5 = x1; x5l-x6 = x7-x5r = hround 0.5(x1-x2l);
+ save t;
+ forsuffixes $ = , r, l:
+ t$ = xpart(tmp_path intersectiontimes (z5$..(x5$, y2)));
+ endfor
+ filldraw subpath (t.r, 8) of tmp_path
+ & subpath (0, t.l) of tmp_path --z5l--z5r--cycle;
+ filldraw stroke z6e..z7e;
+ penlabels(1, 2, 3, 4, 5, 6, 7);
+endchar;
+
+beginchar(astro_aries, 13u#+2appr#, cap_height#, 0);
+ "Aries";
+ italcorr 0; % italcorr 0.7x_height#*slant-.5u#;
+ save a, b;
+ a = 10; b = hround astro[1.2rth,astro.cap_stem];
+ ensure_centering_of(b);
+ x1 = x2 = x3 = 0.5w; y3 = 0.5h;
+ if serifs:
+ save bracket, cap_jut;
+ pickup crisp.nib;
+ cap_jut = hround astro[0, 1.8u];
+ bracket = 0.5cap_jut;
+ bot y2=0;
+ pos2(b, 0); pos3(b, 0);
+ serif(2, 3, bracket, cap_jut, astro.slab, true, dish,
+ cap_jut, astro.slab, true, dish);
+ filldraw stroke z2e..z3e;
+ else:
+ pickup tiny.nib;
+ bot y1 = -d-o; y2-y1 = o;
+ pos1(max(0.75b, tiny+eps), 0);
+ pos2(b, 0); pos3(b, 0);
+ filldraw stroke z1e--z2e--z3e;
+ penlabels(1);
+ fi
+ pickup tiny.nib;
+ pos3a(astro.light_stem, 0); pos4a(vround astro.light_stem, 90);
+ pos5a(astro.curve, 180); pos6a(astro.cap_hair, 270-a);
+ pos3b(astro.light_stem, 180); pos4b(vround astro.light_stem, 90);
+ pos5b(astro.curve, 0); pos6b(astro.cap_hair, -90+a);
+ y3 = y3a = y3b;
+ top y4a.r = top y4b.r = h+o;
+ y5a = y5b = 0.6[y6a, y4a];
+ bot y6a.r = bot y6b.r = vround 0.5h;
+ lft x3a.l = 0.5(w-b); rt x3b.l = 0.5(w+b);
+ x4a = 0.6[x3a, x5a]; x4b = 0.6[x3b, x5b];
+ lft x5a.r = appr; rt x5b.r = w-appr;
+ x6a.r = good.x 0.5[x5a.r, x3a.l];
+ x3a.l-x6a.r = x6b.r-x3b.l;
+ filldraw stroke z3a.e up_to_left z4a.e
+ & pulled_arc.e(4a, 5a)...z6a.e{dir -a};
+ filldraw stroke z3b.e up_to_right z4b.e
+ & pulled_arc.e(4b, 5b)...z6b.e{dir(180+a)};
+ penlabels(1, 2, 3, 3a, 4a, 5a, 6a, 3b, 4b, 5b, 6b);
+endchar;
+
+% okay
+beginchar(astro_taurus, 9u#+2appr#, cap_height#, 0);
+ "Taurus";
+ italcorr 0; % italcorr x_height#*slant-.5u#;
+% circle
+ penpos1(astro.vair, 90);
+ penpos2(astro.curve, 180);
+ penpos3(astro.vair', -90);
+ penpos4(astro.curve, 0);
+ y1r = vround astro[0.70cap_height, x_height]+oo;
+ y3r = -oo;
+ y2 = y4 = 0.5[y1, y3];
+ x2r = appr; x4r = w-appr; x1 = x3 = 0.5[x2, x4];
+ y2l := y4l := astro[y2, 0.52[y3, y1]];
+ penstroke pulled_arc.e(1, 2) & pulled_arc.e(2, 3)
+ & pulled_arc.e(3, 4) & pulled_arc.e(4, 1) & cycle;
+% head
+ pickup crisp.nib;
+ pos5(astro.hair, 180);
+ pos6(vround astro.light_stem, -90);
+ pos7(astro.hair, 0);
+ top y5 = top y7 = h+o; bot y6r = y1l;
+ lft x5r = appr; rt x7r = w-appr; x6 = x1;
+ filldraw stroke z5e down_to_right z6e right_to_up z7e;
+ penlabels(1, 2, 3, 4, 5, 6, 7);
+endchar;
+
+beginchar(astro_gemini, 11u#+2appr#, cap_height#, 0);
+ "Gemini";
+ italcorr 0; % italcorr asc_height#*slant-.5u#;
+ pickup crisp.nib;
+ save c, bracket;
+ bracket = 0.5hround astro[0, 1.8u];
+ c = hround 0.25(w-2appr-2astro.stem);
+ % stems
+ pos1(astro.stem, 0); pos2(astro.stem, 0);
+ pos3(astro.stem, 0); pos4(astro.stem, 0);
+ top y1 = top y3 = h; bot y2 = bot y4 = 0;
+ lft x1l = lft x2l = appr+c; rt x3r = rt x4r = w-appr-c;
+ filldraw stroke z1e..z2e;
+ filldraw stroke z3e..z4e;
+ % serifs
+ if serifs:
+ serif(1, 2, bracket, c, astro.slab, true, dish, 0.0c, astro.slab, true, 0);
+ serif(2, 1, bracket, c, astro.slab, true, dish, 0.0c, astro.slab, true, 0);
+ serif(3, 4, bracket, 0.0c, astro.slab, true, 0, c, astro.slab, true, dish);
+ serif(4, 3, bracket, 0.0c, astro.slab, true, 0, c, astro.slab, true, dish);
+ filldraw z1e--z1f--z3c--z3d--cycle;
+ filldraw z2e--z2f--z4c--z4d--cycle;
+ else:
+ pos5(astro.slab, 90); pos6(astro.slab, 90);
+ pos7(astro.slab, 90); pos8(astro.slab, 90);
+ lft x5r = lft x7l = appr; rt x6r = rt x8l = w-appr;
+ y5r = y6r = y1; y7l = y8l = y2;
+ filldraw stroke z5e..z6e;
+ filldraw stroke z7e..z8e;
+ penlabels(5, 6, 7, 8);
+ fi
+ penlabels(1, 2, 3, 4);
+endchar;
+
+beginchar(astro_cancer, 13u#+2appr#, cap_height#, 0);
+ "Cancer";
+ italcorr 0; % italcorr 0.7x_height#*slant-.5u#;
+ labels(1, 2, 3, 4);
+endchar;
+
+beginchar(astro_leo, 13u#+2appr#, cap_height#, 0);
+ "Leo";
+ italcorr 0; % italcorr 0.7x_height#*slant-.5u#;
+ pickup crisp.nib;
+ pos1(astro.cap_hair,0);
+ pos2(astro.vair,90);
+ pos3(astro.cap_hair,180);
+ pos4(astro.vair,-90);
+ pos5(astro.cap_hair,180);
+ pos6(astro.cap_curve,180);
+ pos7(astro.vair,90);
+ pos8(astro.cap_curve,0);
+ pos9(astro.cap_hair,0);
+ pos10(astro.vair,90);
+ pos11(astro.cap_hair,180);
+ bot y4r=bot y10.l=-o; top y7r=h+o;top y2r=vround 0.3h+o;
+ y1=y3=y5=y9=0.5[y2, y4]; y6=y8=0.6[y1,y7]; y11=good.y y9;
+ lft x3r=appr; rt x11l=w-appr;
+ lft x6r=w-rt x8r=appr+hround(2.5u-0.5astro.cap_curve);
+ rt x1r-lft x3r=rt x11l-lft x9l=hround 5u;
+ x5=x1; x2=x4=0.5[x1,x3]; x10=0.5[x9,x11];
+ x7=0.5[x6, x8];
+ filldraw stroke z1e up_to_left z2e left_to_down z3e down_to_right z4e
+ right_to_up z1e;
+ filldraw stroke z5e{up}...pulled_arc.e(6,7)&pulled_arc.e(7,8)...z9e
+ down_to_right z10e right_to_up z11e;
+ penlabels(1,2,3,4,5,6,7,8,9,10,11);
+endchar;
+
+beginchar(astro_virgo, 13u#+2appr#, cap_height#, 0);
+ "Virgo";
+ italcorr 0; % italcorr 0.7x_height#*slant-.5u#;
+ labels(1, 2, 3, 4);
+endchar;
+
+beginchar(astro_libra, 13u#+2appr#, cap_height#, 0);
+ "Libra";
+ italcorr 0; % italcorr 0.7x_height#*slant-.5u#;
+ pickup crisp.nib;
+ save a, b;
+ % horizontal stems
+ top y1r-bot y1l = astro.slab;
+ y1=0.5[y1r, y1l]; x1 = x1l= x1r;
+ forsuffixes $ = 2, 3, 4, 5, 6:
+ y$r-y$l = y1r-y1l; y$ = 0.5[y$r, y$l]; x$ = x$l = x$r;
+ endfor
+ bot y1l = 0; y1 = y2;
+ y3-y1= vround astro[0.375x_height, 0.2x_height]; y3 = y4 = y5 = y6;
+ rt x4= hround(0.5w-astro[1.5u, 1u]); x5 = w-x4; lft x1= appr; rt x2=w-appr;
+ % ellipses $(x-x_0)^2/a^2+(y-y_0)^2/b^2=1$
+ pos8(astro.curve, 180); pos9(astro.vair, 90); pos10(astro.curve, 0);
+ top y9r=h+o; lft x8r=w-rt x10r=appr+hround(2u-0.5astro.curve);
+ x0 = x9 = 0.5w; y7l = y7r = y11l = y11r = y4r; x7l = x4r; x11l = x5r;
+ % inner ellipse
+ a = x10l-x0;
+ b*(1+-+((x11l-x0)/a)) = (-b+y9l-y7l);
+ y0 = y8 = y10 = y9l-b;
+ z7'l=unitvector((y7l-y0)/b/b, -(x7l-x0)/a/a);
+ z11'l=unitvector((y11l-y0)/b/b, -(x11l-x0)/a/a);
+ % outer ellipse
+ a := x10r-x0;
+ b := y9r-y0;
+ x0-x7r = x11r-x0 = a*(1+-+((y11r-y0)/b));
+ z7'r=unitvector((y7r-y0)/b/b, -(x7r-x0)/a/a);
+ z11'r=unitvector((y11r-y0)/b/b, -(x11r-x0)/a/a);
+ % draw things
+ if serifs: x3=x7r; x6=x11r;
+ arm3(astro.beak, -astro[0, 0.75u], -astro.slab,
+ beak_darkness, up, appr-0.75u);
+ arm6(astro.beak, astro[0, 0.75u], astro.slab,
+ beak_darkness, up, w-appr+0.75u);
+ else: x3=x1; x6=x2;
+ fi
+ filldraw stroke z1e..z2e;
+ filldraw stroke z3e..z4e;
+ filldraw stroke z5e..z6e;
+ filldraw stroke z7e{z7'e}...pulled_arc.e(8, 9)
+ & pulled_arc.e(9, 10)...z11e{z11'e};
+ penlabels(0, 1, 2, 3, 4,5,6,7,8,9,10,11);
+endchar;
+
+%iff false:
+beginchar(astro_scorpio,15u#+2appr#,cap_height#,0.5desc_depth#);
+ "Scorpio";
+% italcorr .5[bar_height#,x_height#]*slant-serif_fit#+.5stem#-2u#;
+% adjust_fit(serif_fit#+stem_shift#,serif_fit#-stem_shift#);
+% numeric shaved_stem; shaved_stem=hround(mfudged.stem-2stem_corr);
+ pickup crisp.nib;
+ pos1(astro.cap_stem,0); pos2(astro.cap_stem,0);
+ pos3(astro.cap_stem,0); pos4(astro.cap_stem,0);
+ pos5(astro.cap_stem,0); pos6(astro.cap_stem,0);
+ pos6'(astro.cap_stem,180); pos7(astro.vair,-90);
+ lft x1l=appr+hround(1.5u-.5astro.cap_stem);
+ x5-x3=x3-x1=hround 5u; x1=x2; x3=x4; x5=x6;
+ bot y2=0; y2=y4; y6=0.25x_height; y1=y3=y5=0.7h;
+ for $ = 3, 5:
+ pos[$]a(astro.cap_hair, 180); top y[$]b.r-bot y[$]b.l=astro.vair;
+ rt x[$]a.l=x[$-2]r; y[$]a=astro[0.7h,0.55h]; top y[$]b.r=h+o;
+ x[$]b.r=astro[0.5[x[$]a, x[$]], 0.5[rt x[$]a.l, rt x[$]r]];
+ z[$]b.l= whatever[z[$]a.l, z[$]b.r];
+ x[$]b = x[$]b.r; y[$]b=0.5[y[$]b.l, y[$]b.r];
+ filldraw stroke z[$]a.e{up}...z[$]b.e{right}
+ & pulled_arc.e([$]b, [$])..z[$+1]e;
+ endfor
+ lft x1a=appr-hround u; top y1a.r=h+o; pos1a(astro.vair,90);
+ filldraw stroke pulled_arc.e(1a, 1)..z2e;
+ z6=z6'; bot y7r=-d; x7=0.5[x6,w];
+ save rth; rth = astro.hair;
+ arrow_height := vround astro[0.125cap_height, 0.25cap_height]+eps;
+ arrow_width := 3.5u;
+ arrow_head8(z7{right}...(w,0.25x_height){up}, both);
+ filldraw stroke pulled_arc.e(6',7)...{z8a-z8}z8e;
+ if serifs:
+ save beak_jut, bracket, cap_jut;
+ cap_jut = hround astro[0, 1.8u];
+ bracket = 0.5cap_jut;
+ serif(2, 1, bracket, cap_jut, astro.slab, true, dish,
+ cap_jut-0.5u, astro.slab, true, dish);
+ serif(4, 3, bracket, cap_jut-0.5u, astro.slab, true, dish,
+ cap_jut-0.5u, astro.slab, true, dish);
+ fi
+ penlabels(1,1a,2,3,3a,3b,4,5,5a,5b,6,7);
+endchar;
+
+beginchar(astro_sagittarius, 13u#+2appr#, cap_height#, 0);
+ "Sagittarius";
+ italcorr 0; % italcorr 0.7x_height#*slant-.5u#;
+ save a, rth; a= angle(w-2appr,h+2o); rth=astro.light_stem;
+ pickup crisp.nib; lft x1l=appr; bot y1r=-o;
+ pos1(astro.light_stem, a-90);
+ arrow_height := vround astro[0.2cap_height, 0.3cap_height]+eps;
+ arrow_width := max(4.9rth, rth+3u);
+ arrow_head2((appr,-o)..(w-appr, h+o), both);
+ pos3(astro.light_stem,a); pos4(astro.light_stem,a);
+ z3-z2c.l=whatever*(z2-z1); z0=1/3[z1,z2]; z3-z0=whatever*dir(a+90);
+ z3-z0=z0-z4;
+% autorounded;
+ filldraw stroke z1e..z2e;
+ filldraw stroke z3e..z4e;
+ penlabels(1, 2, 3, 4);
+endchar;
+
+beginchar(astro_capricorn, 13u#+2appr#, cap_height#, 0);
+ "Capricorn";
+ italcorr 0; % italcorr 0.7x_height#*slant-.5u#;
+ labels(1, 2, 3, 4);
+endchar;
+
+beginchar(astro_aquarius, 13u#+2appr#, cap_height#, 0);
+ "Aquarius";
+ italcorr 0; % italcorr 0.7x_height#*slant-.5u#;
+ labels(1, 2, 3, 4);
+endchar;
+
+beginchar(astro_pisces, 13u#+2appr#, cap_height#, 0);
+ "Pisces";
+ italcorr 0; % italcorr 0.7x_height#*slant-.5u#;
+ pickup crisp.nib;
+ pos1(astro.vair, 90); pos2(astro.curve,0); pos3(astro.vair, -90);
+ pos4(astro.vair, 90); pos5(astro.curve,180); pos6(astro.vair, -90);
+ pos7(vround astro.light_stem,90); pos8(vround astro.light_stem,90);
+ top y1r=top y4r=h+o; bot y3r=bot y6r=-o;
+ top y7r=top y8r=vround(0.5h+0.5astro.light_stem); y2=y5=y7;
+ lft x3=lft x1=appr; rt x4=rt x6=w-appr;
+ lft x2l=w-rt x5l=appr+hround(4u-.5astro.curve);
+ lft x7=w-rt x8=appr+hround u;
+ filldraw stroke pulled_arc.e(1,2)&pulled_arc.e(2,3);
+ filldraw stroke pulled_arc.e(4,5)&pulled_arc.e(5,6);
+ filldraw stroke z7e..z8e;
+ penlabels(1, 2, 3, 4,5,6,7,8);
+endchar;
+
+% The next symbol is intended to figure ``cemetery''
+% in the theory of Markov processes.
+% Usualy, this concept is represented by a partial derivative
+% symbol or a Greek lowercase delta. It seems that
+% no specific symbol has been designed before.
+
+use_rule1;
+beginchar(cemetery, 10u#+2appr#, cap_height#, 0);
+ "Cemetery symbol";
+ pickup rule.nib;
+ ensure_centering_of(rth);
+ x1 = x2 = 0.5w;
+ lft x5 = appr; rt x8 = w-appr; bot y5 = bot y8 = 0;
+ y1 = h; x3 = w-x4 = appr+hround 1.5u;
+ y2 = good.y 0.2[y5, y1]; y3 = y4 = good.y 2/3[top y2, y1];
+ z6 = 0.5[z5, z2]; z7 = 0.5[z8, z2];
+ tmp_path := z5{right}...z6{0.5(x2-x6), y2-y6}...z2{right}
+ ...z7{0.5(x7-x2), y7-y2}...z8{right};
+ draw tmp_path;
+ penpos1(rth, 0); penpos2(rth, 0);
+ penpos3(rth, 90); penpos4(rth, 90);
+ penstroke z1e..z2e; penstroke z3e..z4e;
+ save a, b, c, number_of_slashes; a = max(h, w);
+ pickup crisp.nib;
+ x5' = good.x appr; x8' = good.x w-appr; y5 = y5'; y8 = y8';
+ pos5(rth, 90); pos5'(rth, 90); pos8(rth, 90); pos8'(rth, 90);
+ filldraw stroke z5e..z5'e; filldraw stroke z8e..z8'e;
+ pickup fine.nib;
+ number_of_slashes = 6; c = hround((x8-x5)/(number_of_slashes+1));
+ number_of_slashes := round((x8-x5)/max(c, 1))-1;
+ for i = 1 upto number_of_slashes:
+ bot y[i+8]l = 0; x[i+8]l = x5+i*c;
+ z[i+8]r = tmp_path intersectionpoint (z[i+8]l..z[i+8]l+(a, a));
+ draw z[i+8]l..z[i+8]r; penlabels([i+8]);
+ endfor;
+ penlabels(1, 2, 3, 4, 5, 8, 5', 8'); labels(6, 7);
+endchar;