% masyms.mf 1.2.0 1994/10/11 -- misc. symbols for the Malvern font % Copyright 1991, 1992, 1993 P. Damian Cugley %%% @METAFONT-file { %%% filename = "masyms.mf", %%% version = "1.2.0", %%% date = "1994/10/11", %%% package = "Malvern 1.2", %%% author = "P. Damian Cugley", %%% email = "damian.cugley@comlab.ox.ac.uk", %%% address = "Oxford University Computing Laboratory, %%% Parks Road, Oxford OX1 3QD, UK", %%% codetable = "USASCII", %%% keywords = "Malvern, METAFONT, font, typefont, TeX", %%% supported = "Maybe", %%% abstract = "Miscellaneous character programs for the Malvern %%% font family.", %%% dependencies = "other program files", %%% } % See the Malvern Handbook (maman.tex) for more info about Malvern. % This software is available freely but without warranty. % See the file COPYING for details. %{{{ masyms.mf %{{{ Start a symbol char which is symmetrical about axis_ht def ma_sym(expr code, w_sh, h_sh) = ma_char(code, w_sh, axis_ht# + 1/2 * h_sh, max(0, -(axis_ht# - 1/2 * h_sh)))(1,1); if 1/2[l,r] <> good.x 1/2[l,r]: change_width; fi x.m = 1/2[x.l, x.r]; y.m = 1/2[y.t, y.b]; top y.t = axis_ht + (axis_ht - bot y.b) = h; lft x.l = w - rt x.r = l; enddef; %}}} if testing: endinput; fi %{{{ plus, minus iff known code.plus_sign: "plus sign"; ma_sym(code.plus_sign, 8u#, 8v#); draw (x.l, axis_ht) -- (x.r, axis_ht); draw (x.m, y.t) -- (x.m, y.b); set_ic axis_ht#; endchar; iff known code.minus_sign: "minus sign"; ma_sym(code.minus_sign, 8u#, 8v#); draw (x.l, axis_ht) -- (x.r, axis_ht); set_ic axis_ht#; endchar; %}}} %{{{ equals sign iff known code.equals: "equals sign"; ma_sym("=", 8u#, 4v#); draw_box_t; draw_box_b; set_ic axis_ht# + 2v#; endchar; %}}} %{{{ degree sign iff known code.degree: "degree sign"; ma_char(code.degree, 4u#, body_ht#, 0pt#)(1/2,1/2); draw_circle(l, h + oo, r, vround(h - 4v + oo)); set_ic h# - 1.5v#; endchar; %}}} %{{{ Various currency symbols iff known code.dollar: "dollar sign"; ma_char("$", 6u#, fig_ht#, 0pt#)(1,1); if 1/2w <> good.x 1/2w: change_width; fi x1bar = x2bar = x3bar = x4bar = 1/2[l, r]; top y1bar = h + o; bot y4bar = -d -o; y2bar = vround (1/2[-d, h] + 1/2x_ht); y3bar = vround (1/2[-d, h] - 1/2x_ht); draw_S(y2bar, y3bar)(0.5, 1/16, 1/12); draw z1bar -- z2bar; draw z3bar -- z4bar; set_ic 1/2[-chardp,charht] + 1/2x_ht#; % this is too much charic := max(0, charic - 1/2u#); % fudge labels(1bar, 2bar, 3bar, 4bar); endchar; iff known code.cent: "cent sign"; ma_sym(code.cent, 6u#, 11v#); x1bar = x2bar = x3bar = x4bar = 0.55[l,r] - eps; y1bar = y.t; y4bar = y.b; y2bar = axis_ht + 3.5v; y3bar = axis_ht - 3.5v; draw z1bar -- z2bar; draw z3bar -- z4bar; draw_C(l, y2bar, r, y3bar) 1/12; set_ic axis_ht# + 3.5v#; charic := max(0, charic - 1/4u#); % fudge labels(1bar, 2bar, 3bar, 4bar) endchar; iff known code.yen: "yen sign"; ma_char(code.yen, 8u#, fig_ht#, 0pt#)(1,1); draw_Y(0.55[-d, h]); pickup pencircle scaled yen.pn.th; top y5 = top y6 = vround y2; y7 = y8 = good.y (y5 - pn.ht - 1/2v); x6 - x5 = x8 - x7 = 1/2(r - l) + eps; 1/2[x5, x6] = 1/2[x7, x8] = x2; draw z5 -- z6; draw z7 -- z8; labels(5,6,7,8); set_ic_tr; endchar; def ear_pt(suffix $, @) = ((1/sqrt2)[x@,x$], (1/sqrt2)[y$,y@]) enddef; iff known code.currency: "ISO-646 currency sign"; ma_char(code.currency, 7u#, 11v#, 0pt#)(1,1); draw_circle(l, vround(1/2[-d,h] + 3.5v), r, vround(1/2[-d,h] - 3.5v)); x0ear1 = x3ear1 = x0; x1ear1 = x2ear1 = x2; top y0ear1 = top y1ear1 = h + o; y2ear1 = y3ear1 = 2[y0ear1, 1/2[-d,h]]; z0ear2 = ear_pt(0,1); z1ear2 = ear_pt(2,1); z2ear2 = ear_pt(2,3); z3ear2 = ear_pt(0,3); forsuffixes $ = 0,1,2,3: draw z$ear1 -- z$ear2; endfor set_ic_tr; labels(forsuffixes $=0,1,2,3: $ear1, $ear2, endfor, 99) endchar; iff known code.sterling: "pounds sterling sign"; ma_char(code.sterling, 8u#, asc_ht#, if italic: 1/2desc_dp# else: 0v# fi)(1,1); top y2 = h + o; bot y6 = bot y7 = -d; y5 = y6 + apex_adjust; lft x5 = lft x6 = l; rt x7 = r; rt x1 = 0.875[l,r]; x2 = 0.55[x3, x1]; x3 = x4 = good.x 0.25[l,r]; z2 = z3 + whatever*(hratio,1); y4 = 0.3[-d, h]; y1 = 0.25[y2, y3]; draw z1 .. z2{left} .. z3 --- z4 .. z5 -- z6 -- z7; y1bar = y2bar = good.y 0.48[-d, h]; x1bar = 0.4[x5, x4]; x2bar = 0.4[x2,x1]; draw z1bar -- z2bar; labels(1,2,3,4,5,6,7, 1bar, 2bar); set_ic_tr; charic := max(0, charic - u#); % fudge endchar; %}}} %{{{ (C) and (R) width# := 12u#; height# := 12v#; % for set_ic_O iff known code.copyright: "copyright sign"; ma_char(code.copyright, 12u#, 12v#, 0pt#)(1/2,1/2); draw_C(hround (1/2w - 3.6u), vround (1/2[-d,h] + 3.5v), hround (1/2w + 2.4u), vround (1/2[-d,h] - 3.5v)) 1/12; draw_circle.circle(l - ho, h + oo, r + ho, -d - oo); set_ic_O; endchar; iff known code.registered: "registered trademark sign"; ma_char(code.registered, 12u#, 12v#, 0v#)(1/2,1/2); draw_circle.circle(l - ho, h + oo, r + ho, -d - oo); z0 = 1/2[(l, h), (r, -d)]; lft x1stem = lft x2stem = lft x3stem = hround (x0 - 3u); rt x2bowl = x2tail = hround (x0 + 3u); top y1stem = top y1bowl = vround (y0 + 3.5v); bot y3stem = bot y2tail = vround (y0 - 3.5v); y3bowl = y2stem = y1tail = good.y (y0 - 1/2v); y2bowl = 1/2[y1bowl, y3bowl]; z1bowl = z2bowl + whatever*(-hratio, 1); z3bowl = z2bowl + whatever*(hratio, 1); z1tail = z2tail + whatever*(-hratio,1); draw z3stem -- z1stem --- z1bowl .. z2bowl .. z3bowl --- z2stem; draw z1tail -- z2tail; labels(1stem, 2stem, 3stem, 1bowl, 2bowl, 3bowl, 1tail, 2tail); set_ic_O; endchar; %}}} %{{{ hash mark iff known code.hash: "hash mark"; % or number sign etc. ma_char(code.hash, 8u#, fig_ht#, if italic: 1/2desc_dp# else: 0v# fi)(1,1); top y1a = top y2b = h + o; bot y2a = bot y1b = -d - o; lft x1d = l; rt x2c = r; x1a = w - x1b = good.x 0.35[l,r]; x2b = w - x2a = good.x 0.775[l,r]; y1c = y2c = good.y 0.3[h, -d]; y1d = y2d = h - y1c - d; z1c = z1d + whatever*(z1a - z2a); z2c = z2d + whatever*(z1a - z2a); forsuffixes $ = a,b,c,d: draw z1$ -- z2$; labels(1$, 2$); endfor set_ic 0.3[charht, -chardp]; endchar; %}}} %{{{ ampersand iff known code.ampersand: "ampersand"; ma_char(code.ampersand, 8u#, asc_ht#, 0v#)(2/3,1/2); top y2a = h + o; lft x2b = l; bot y3b = -d - o; bot rt z5a = (r, -d - o); x1a = x3a + 3u; y1a = y2a - 1/2v; x2a = 0.55[x3a, x1a]; x3a = good.x 1/6[l,r]; y3a = 1/2[x_ht, h]; z4a - (x2a, y3a) = (1/sqrt2)*(x3a - x2a, y3a - y2a); % z4a is tangent to circle through z2a and z3a draw z1a ... z2a{left} ... z3a{down} ... z4a --- z5a; z1b = whatever[z4a, z5a]; top y1b = x_ht; x3b = 0.45[l,r]; z3b = z2b + whatever*se; z4b = (9/10[l,r], 1/2[-d, h]); draw z1b ... z2b{down} ... z3b{right} ... z4b{up}; labels(1a, 2a, 3a, 4a, 5a, 1b, 2b, 3b, 4b); set_ic 1/2h#; endchar; %}}} %{{{ asterisk(s) for nlobes = 5,6,7,8,9: if known code.asterisk[nlobes]: decimal nlobes & "-lobed asterisk"; ma_char(code.asterisk[nlobes], 6u#, body_ht#, 0v#)(1/2,1/2); if 1/2w <> good.x 1/2w: change_width; fi z.m = (1/2w, good.y (h - 3v)); pickup pencircle scaled ast.pn.th; top z0 = (x.m, h + o); for i = 1 upto nlobes - 1: z[i] = z.m + (y0 - y.m) * dir(360*i/nlobes + 90) xscaled hratio; endfor for i = 0 upto nlobes - 1: penpos[i](pn.wd - ast.pn.th, 360*i/nlobes); draw z.m --- z[i]l ... z[i]r --- z.m; penlabels([i]); endfor set_ic h# - 2v#; endchar; fi endfor %}}} %{{{ slash and backslash iff known code.slash: "slash"; ma_char(code.slash, 7u#, brack_ht#, brack_dp#)(1/3,1/3); draw top rt (l, -d - o) -- bot lft (r, h + o); set_ic_tr; endchar; iff known code.fraction: "slash for fractions"; ma_char(code.fraction, 7u#, brack_ht#, brack_dp#)(-1,-1); draw top rt (l, -d - o) -- bot lft (r, h + o); set_ic_tr; endchar; iff known code.backslash: "backslash"; ma_char(code.backslash, 7u#, brack_ht#, brack_dp#)(1/3,1/3); draw top lft (r, -d - o) -- bot rt (l, h + o); set_ic chardp; endchar; %}}} %{{{ daggers vardef dagger_bar@#(expr midy) = pickup pencircle scaled dag.pn.th; y1@# = y2@# = vround (midy + 1/2dot_wd) - 1/2dot_wd; x1@# = w - x2@# = hround (l + 1/2dot_wd) + 1/2dag.pn.th; penpos1@#(dot_wd - dag.pn.th, 90); penpos2@#(dot_wd - dag.pn.th, -90); draw z1@#l --- z2@#l ... z2@#r --- z1@#r ... cycle; draw z1@# -- z2@#; penlabels(1@#,2@#); enddef; def ma_dagger(expr code) expr bot_bar_p = ma_char(code, 6u#, asc_ht#, 1/2desc_dp#)(1/2,1/2); if 1/2w <> good.x 1/2w: change_width; fi draw (1/2w, h - 1/2pn.ht + o) -- (1/2w, -d + 1/2pn.ht - o); if bot_bar_p: dagger_bar.top(1/4[h, -d]); dagger_bar.bot(1/4[-d, h]); set_ic 1/4[charht, chardp]; else: dagger_bar(0.3[h, -d]); set_ic 0.3[charht, chardp]; fi endchar enddef; if known code.dagger: "dagger"; ma_dagger(code.dagger) false; fi if known code.dbl.dagger: "double dagger"; ma_dagger(code.dbl.dagger) true; fi %}}} %{{{ at sign (@) iff known code.at_sign: "at sign"; ma_char(code.at_sign, 12u#, cap_ht#, 0v#)(1/2,1/2); lft z2 = (l - o, 1/2[-d, h]); rt z4 = (r + o, y2); top z3 = (1/2[l,r], h + o); bot y1 = -d - o; y10 = y6 = good.y 0.275[-d, h]; % bot of `a' part x1 = x8 = x10 = x3; rt x6 = 1/12[r, l]; y9 = y7 = 1/2[-d, h]; y8 = good.y 2[y10, y9]; x9 = w - x7 = good.x max(0.275[l, r], rt x2 + 1/4(r - l - 4pn.wd) + 1/2pn.wd); bot z0 = (good.x 0.85[l,r], good.y 1/24[-d, h]); draw z0 ... z1{left} ... z2{up} ... z3{right} ... z4{down} ... z6{left} ... z7{up} ... z8{left} ... z9{down} ... z10{right} ... z7{up}; labels(range 0 thru 10); set_ic 0.7h#; endchar; %}}} %{{{ Paragraph sign (\P) iff known code.paragraph: "paragraph sign"; ma_char(code.paragraph, 2.5pn.wd# + if italic: 5.5u# else: 5u# fi, cap_ht#, if italic: 1/2desc_dp# else: 0v# fi)(1/2,1); top rt z1c = (r, h); y1a = y1b = y2c = y1c; % points at top bot y2a = bot y2b = -d - o; % points at bot x1a = x2a = good.x (r - 1/2pn.wd - u); x1b = x2b = x2c = x4c = good.x (x1a - pn.wd - 1.5u); lft x3c = l; y3c = 1/2[y2c, y4c]; z3c = z2c + whatever*ne; if y4c < 1/2[-d,h]: y4c := (vround 1/2[-d,h]); y3c := 1/2[y2c, y4c]; fi draw z2a -- z1a -- z1b -- z2b; draw z1c -- z2c; if false: filldraw else: draw fi z2c{left} ... z3c{down} ... z4c{right} -- cycle; labels(1a, 1b, 2a, 2b, 1c, 2c, 3c, 4c); set_ic_tr; endchar; %}}} %{{{ Section sign (\S) iff known code.section: "section sign"; ma_char(code.section, 6u#, cap_ht#, if italic: 1/2desc_dp# else: 0v# fi)(1,1); z0 = 1/2[(l,h), (r,-d)]; % centre draw_circle.o(l, vround (y0 + 3v), r, vround (y0 - 3v)); rt x1a = w - lft x1b = hround 0.9[l,r]; lft x3a = l + ho; rt x3b = r - ho; top y2a = top y1a + 1/2v = h + o; bot y2b = bot y1b - 1/2v = -d - o; if italic: z4a = z1o; z4b = z3o; y3a = 1/2[y2a, y4a]; y3b = 1/2[y2b, y4b]; else: y3a = 2/3[y2a, y1o]; y3b = 2/3[y2b, y3o]; z4a = (1/sqrt2)[z0, (x2o, y1o)]; z4b = (1/sqrt2)[z0, (x0o, y3o)]; fi forsuffixes $ = a,b: x2$ = x0; draw z1$ ... z2${(x2$ - x1$, 0)} ... z3${(0, y3$ - y2$)} ... z4$; labels(1$, 2$, 3$, 4$); endfor; set_ic_tr; charic := max(0, charic - 1/2u#); %% fudge city endchar; %}}} %{{{ Trade mark sign iff known code.trademark: "trade mark sign"; ma_char(code.trademark, 3pn.wd# + sp# + 7u#, body_ht#, 0v#)(1/3,1/2); bot y4t = bot y1m = bot y5m = vround (h - 6u); top y1t = top y2t = top y3t = h; top y2m = top y4m = h + o; lft x1t = l; rt x4m = rt x5m = r; x2m = x1m = good.x 1/2[l,r]; rt x2t = hround (lft x2m - sp); if 1/2[x1t, x2t] <> good.x 1/2[x1t, x2t]: x2t := x2t + 1; fi x3t = x4t = 1/2[x1t, x2t]; z3m = z2m + whatever*se; z3m = z4m + whatever*ne; if y3m < y1m: y3m := y1m; fi draw z1t -- z2t; draw z3t -- z4t; draw z1m -- z2m -- z3m -- z4m -- z5m; labels(1t, 2t, 3t, 4t, 1m, 2m, 3m, 4m, 5m); set_ic_tr; endchar; %}}} %{{{ florin % I can't get anyone to tell me one way or the other whether % the florin sign is usually simply an italic `f' or is a special % symbol unto itself. % All the times I've seen it in print, it's simply been an italic `f'. % But since it is now a feature of the standard PostScript encoding % is is appearing more and more often in `real' fonts. % So, what the hey, here's another character % slot used up... iff known code.florin: "florin sign"; ma_char(code.florin, 3pn.wd# + 4u#, fig_ht#, desc_dp#)(1/2,1/2); if 1/2[l,r] <> good.x 1/2[l,r]: change_width; fi top y2 = h + oo; bot y5 = -d - oo; lft x6 = lft x7 = l; rt x0 = rt x1 = r; x3 = x4 = 1/2[l,r]; x2 = 1/2[x1,x3]; x5 = 1/2[x4,x6]; h - y1 = h - y3 = y4 - (-d) = y6 - (-d); z2 = z1 + whatever*se; h - bot y0 = top y7 - (-d) = max(h - bot y1, vround 1/16(h + d)); draw z0 --- z1 .. z2 .. z3 --- z4 .. z5 .. z6 --- z7; top y1bar = top y2bar = hround (golden_ratio[-d,h] + 1/2pn.ht); lft x1bar = good.x (lft x3 - 3/2u); rt x2bar = good.x (rt x3 + 2u); draw z1bar -- z2bar; labels(range 0 thru 7, 1bar, 2bar); set_ic_tr; endchar; %}}} %{{{ multiplication sign iff known code.multiply: "multiplication sign"; ma_char(code.multiply, 8u#/sqrt2, axis_ht# + 4v#/sqrt2, -min(0, axis_ht# - 4v#/sqrt2))(x_sp,x_sp); box_points; 1/2[z1,z2] = 1/2[z3,z4] = (1/2w, axis_ht); z2 = z1 + whatever*se; z3 = z4 + whatever*ne; top y1 = top y3 = h; draw z1 -- z2; draw z3 -- z4; labels(1,2,3,4); set_ic_tr; endchar; %}}} %{{{ per cent sign and similar ring_wd# := 5u#; ring_wd'# := 5.25u#; ring_ht# := 5v#; ring_ht'# := 5.25v#; define_whole_pixels(ring_wd, ring_wd'); define_whole_vertical_pixels(ring_ht, ring_ht'); lowres_fix(ring_wd, ring_wd') 1.2; lowres_fix(ring_ht, ring_ht') 1.2; iff known code.percent: "per cent sign"; ma_char(code.percent, 8u#, asc_ht#, if italic: 1/2desc_dp# else: 0v# fi)(1,1); draw_circle.top(l - ho, h + oo, l + ring_wd + ho, h - ring_ht - oo); draw_circle.bot(r - ring_wd' - ho, -d + ring_ht' + oo, r + ho, -d - oo); z4top = 1/2[z0top, z2top]; z4bot = 1/2[z0bot, z2bot]; 1/2[z1, z2] = 1/2[z4top, z4bot]; z1 - z2 = whatever*(y4bot - y4top, x4top - x4bot) if italic: yscaled 2 fi; % line is at rt angles to line joining circles lft x1 = l; draw z1 -- z2; labels(1,2); set_ic 1/2[charht, chardp] + if italic: 2 else: 1 fi * 4v#; endchar; iff known code.per_thousand_zero: "ring to stick on per-cent to make per-mille"; ma_char(code.per_thousand_zero, ring_wd#, if italic: ring_ht# - 1/2desc_dp# else: ring_ht# fi, if italic: 1/2desc_dp# else: 0v# fi)(0, 1); draw_circle(r - ring_wd' - ho, -d + ring_ht' + oo, r + ho, -d - oo); endchar; %{{{ c/o sign iff known code.care_of: "care of sign"; ma_char(code.care_of, 8u#, asc_ht#, if italic: 1/2desc_dp# else: 0v# fi)(1,1); draw_C.top(l - ho, h + oo, l + 7/8ring_wd + ho, h - ring_ht - oo) 1/20; draw_circle.bot(r - ring_wd' - ho, -d + ring_ht' + oo, r + ho, -d - oo); z.cent.top = 1/2[z2top, z4top]; z.cent.bot = 1/2[z0bot, z2bot]; 1/2[z1, z2] = 1/2[z.cent.top, z.cent.bot]; z1 - z2 = whatever*(y.cent.bot - y.cent.top, x.cent.top - x.cent.bot) if italic: yscaled 2 fi; % line is at rt angles to line joining circles lft x1 = l; draw z1 -- z2; labels(1,2); set_ic 1/2[charht, chardp] + if italic: 2 else: 1 fi * 4v#; endchar; %}}} %{{{ Draw per-mille in the same was as per-cent but with smaller rings ring_wd# := 4.5u#; ring_ht# := 4.5v#; ring_wd'# := 4.6u#; ring_ht'# := 4.6v#; define_whole_pixels(ring_wd, ring_wd'); define_whole_vertical_pixels(ring_ht, ring_ht'); lowres_fix(ring_wd, ring_wd') 1.2; lowres_fix(ring_ht, ring_ht') 1.2; iff known code.per_thousand: "per thousand sign"; ma_char(code.per_thousand, ring_wd# + 2ring_wd'# + sp# - 3/4u#, asc_ht#, if italic: 1/2desc_dp# else: 0v# fi)(1/2,1/2); draw_circle.top(l - ho, h + oo, l + ring_wd + ho, h - ring_ht - oo); draw_circle.rt(r - ring_wd' - ho, -d + ring_ht' + oo, r + ho, -d - oo); draw_circle.mid(r - 2ring_wd' - sp - ho, -d + ring_ht' + oo, r - ring_wd' - sp + ho, -d - oo); 1/2[z1bar, z2bar] = 1/2[z1top, z3mid]; y1bar = 1/4[y0top,y1top]; x1bar = 0.6[x1mid, x0mid]; draw z1bar -- z2bar; labels(1bar, 2bar); set_ic chardp + 3/4ring_ht#; endchar; %}}} %}}} %{{{ Bullet & ballot box iff known code.bullet: "bullet"; ma_char(code.bullet, bullet_wd#, 1/2bullet_ht# + golden_ratio*x_ht#, -(golden_ratio*x_ht# - 1/2bullet_ht#))(1,1); fill fullcircle xscaled bullet_wd yscaled bullet_ht shifted (1/2w, h - 1/2bullet_ht); endchar; iff known code.ballotbox: "ballot box"; ma_char(code.ballotbox, 12u#, 12v#, 0v#)(1,1); box_points; draw_box; set_ic_tr; endchar; %}}} %{{{ NULL character, `Compound Word Mark' iff known code.null: "null glyph"; ma_char(code.null, 0pt#, 0pt#, 0pt#)(0,0); endchar; iff known code.cwm: "compound word mark"; ma_char(code.cwm, 0pt#, 0pt#, 0pt#)(0,0); endchar; %}}} %{{{ Visible space (Cork again) iff known code.ascii.visible_space: "visible symbol for ASCII space character"; ma_char(code.ascii.visible_space, 6u#, 1/2pn.ht#, 3v#)(1/2,1/2); if 1/2[l,r] <> good.x 1/2[l,r]: change_width; fi lft z1 = (l - eps, 0); rt z2 = (r, 0); bot z3 = (1/2[l,r], -d - eps); draw z1 -- z2 -- z3 -- cycle; labels(1,2,3); endchar; %}}} %{{{ Greater-than and less-than symbols iff known code.greater: ma_sym(code.greater, hratio * sqrt3 * (4v# - 1/2pn.ht#) + 2pn.wd#, 8v#) draw (x.l, y.t) -- (x.r, y.m) -- (x.l, y.b); endchar; iff known code.less: ma_sym(code.less, hratio * sqrt3 * (4v# - 1/2pn.ht#) + 2pn.wd#, 8v#) draw (x.r, y.t) -- (x.l, y.m) -- (x.r, y.b); endchar; %}}} %{{{ Trypetiper quote marks -- ack! ppht! iff known code.tick.dbl: "typewriter double quotation marks"; ma_char(code.tick.dbl, pn.wd# + 5u#, cap_ht#, 0pt#)(2/3,1/3); top y1a = top y1b = h; bot y2a = bot y2b = x_ht; lft x1a - 2u = lft x2a = l; rt x1b = rt x2b + 2u = r; draw z1a -- z2a; draw z1b -- z2b; labels(1a, 1b, 2a, 2b); set_ic_tr; endchar; iff known code.tick: "small tick mark"; ma_char(code.tick, pn.wd# + 3u#, cap_ht#, 0pt#)(2/3,1/3); top rt z1 = (r, h); bot lft z2 = (l, x_ht); draw z1--z2; labels(1,2); set_ic_tr; endchar; iff known code.backtick: "reversed small tick mark"; ma_char(code.backtick, pn.wd# + 3u#, cap_ht#, 0pt#)(2/3,1/3); top lft z1 = (l, h); bot rt z2 = (r, x_ht); draw z1--z2; labels(1,2); set_ic_tr; endchar; %}}} %{{{ ASCII circumflex symbol iff known code.ascii.circumflex: "ASCII circumflex"; ma_sym(code.ascii.circumflex, pn.wd# + 5u#, 1/2pn.ht# + 4v#); draw (x.l, y.b) -- (x.m, y.t) -- (x.r, y.b); endchar; %}}} %{{{ ASCII underscore character iff known code.ascii.underscore: "ASCII underscore"; ma_char(code.ascii.underscore, 6u#, pn.ht#, 0pt#)(1,1); bot lft z1 = (l, 0); bot rt z2 = (r, 0); draw z1 -- z2; labels(1,2); endchar; %}}} %{{{ Vertical bar iff known code.vert: "vertical bar"; ma_char(code.vert, pn.wd#, asc_ht#, 1/2brack_dp#)(1,1); if 1/2w <> good.x 1/2w: change_width; fi top z1 = (1/2w, h); bot z2 = (1/2w, -d); draw z1 -- z2; set_ic_tr; endchar; %}}} %{{{ Swung dash/ASCII tilde if known code.ascii.tilde and unknown code.swung_dash: code.swung_dash = code.ascii.tilde; fi iff known code.swung_dash: ma_sym(code.swung_dash, 8u#, 4v#); top z1 = (x.l, y.m); bot z5 = (x.r, y.m); z3 = 1/2[z1,z5]; x2 = 1/2[x1,x3]; x4 = 1/2[x3,x5]; y2 = y.t; y4 = y.b; draw z1{up} ... z2{right} ... z3 ... z4{right} ... {up}z5; labels(1,2,3,4,5); set_ic_tr; endchar; %}}} %{{{ arrows %{{{ generic arrow macro % Arrows in Malvern are deliberately simplified shapes numeric arrow_wd#, arrow_ht#; arrow_wd# = 6u#; arrow_ht# = 6v#; define_pixels(arrow_wd, arrow_ht); vardef draw_arrow@#(expr hbarp, vbarp, lheadp, rheadp, uheadp, dheadp) = if hbarp: lft x1@#h = l; rt x2@#h = r; y1@#h = y2@#h = good.y (golden_ratio*x_ht); draw z1@#h -- z2@#h; labels(1@#h, 2@#h); if lheadp: z1@#l = z1@#h + whatever*ne; z2@#l = z1@#h + whatever*se; top y1@#l = vround (y1@#h + 1/2arrow_ht); bot y2@#l = vround (y1@#h - 1/2arrow_ht); draw z1@#l -- z1@#h -- z2@#l; labels(1@#l, 2@#l); fi if rheadp: z1@#r = z2@#h + whatever*se; z2@#r = z2@#h + whatever*ne; top y1@#r = vround (y2@#h + 1/2arrow_ht); bot y2@#r = vround (y2@#h - 1/2arrow_ht); draw z1@#r -- z2@#h -- z2@#r; labels(1@#r, 2@#r); fi fi if vbarp: top y1@#v = h; bot y2@#v = -d; x1@#v = x2@#v = good.x 1/2[l,r]; draw z1@#v -- z2@#v; labels(1@#v, 2@#v); if uheadp: z1@#u = z1@#v + whatever*ne; z2@#u = z1@#v + whatever*se; lft x1@#u = hround (x1@#v - 1/2arrow_wd); rt x2@#u = hround (x1@#v + 1/2arrow_wd); draw z1@#u -- z1@#v -- z2@#u; labels(1@#u, 2@#u); fi if dheadp: z1@#d = z2@#v + whatever*se; z2@#d = z2@#v + whatever*ne; lft x1@#d = hround (x2@#v - 1/2arrow_wd); rt x2@#d = hround (x2@#v + 1/2arrow_wd); draw z1@#d -- z2@#v -- z2@#d; labels(1@#d, 2@#d); fi fi enddef; %}}} generic arrow macros iff known code.arrow.left: ma_sym(code.arrow.left, 12u#, arrow_ht#); draw_arrow(true, false, true, false, false, false); endchar; iff known code.arrow.right: ma_sym(code.arrow.right, 12u#, arrow_ht#); draw_arrow(true, false, false, true, false, false); endchar; iff known code.arrow.left_right: ma_sym(code.arrow.left_right, 12u#, arrow_ht#); draw_arrow(true, false, true, true, false, false); endchar; iff known code.arrow.down: ma_sym(code.arrow.down, arrow_wd#, 12v#); draw_arrow(false, true, false, false, false, true); endchar; iff known code.arrow.up: ma_sym(code.arrow.up, arrow_wd#, 12v#); draw_arrow(false, true, false, false, true, false); endchar; iff known code.arrow.up_down: ma_sym(code.arrow.up_down, arrow_wd#, 12v#); draw_arrow(false, true, false, false, true, true); endchar; iff known code.arrow.all: ma_sym(code.arrow.all, 12u#, 12v#); draw_arrow(true, true, true, true, true, true); endchar; % These sextension segments need some work... iff known code.arrow.horiz_ex: ma_sym(code.arrow.horiz_ex, 5u#, arrow_ht#); rt z1 = (l, axis_ht); lft z2 = (r, axis_ht); draw z1--z2; labels(1,2); set_ic axis_ht#; endchar; iff known code.arrow.vert_ex: ma_sym(code.arrow.vert_ex, arrow_wd#, 5v#); draw_arrow(false, true, false, false, false, false); endchar; %}}} arrows %{{{ blank space % Note that the blank space has 3 properties that distinguish it from % a simple space as genberated by TeX: % -- it has height and depth % -- it has an italic correction % -- it is (approx) 1/3em rather than approx 1/4em iff known code.blank_space: ma_char(code.blank_space, 5u#, body_ht#, body_dp#)(0,0) set_ic_tr; endchar; %}}} blank space %{{{ division sign iff known code.divide: "division sign"; ma_sym(code.divide, 8u#, 8v#); draw (x.l, axis_ht) -- (x.r, axis_ht); z1dot = (x.m, y.t); z2dot = (x.m, y.b); draw_dot1dot; draw_dot2dot; labels(1ot, 2dot); set_ic axis_ht#; endchar; %}}} division sign %{{{ logical negation iff known code.logical_not: "logical negation sign"; ma_sym(code.logical_not, 8u#, 6v#); draw (x.l, y.t) -- (x.r, y.t) -- (x.r, y.b); set_ic_tr; endchar; %}}} logical negation %}}} masyms.mf %Local variables: %fold-folded-p: t %End: