From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- fonts/mathabx/source/mathastr.mf | 946 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 946 insertions(+) create mode 100644 fonts/mathabx/source/mathastr.mf (limited to 'fonts/mathabx/source/mathastr.mf') 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; -- cgit v1.2.3