% Set the following codes nonnegative to get the corresponding characters: % \\{minus}, \\{pm}, \\{oplus}, \\{otimes}, % \\{cup}, \\{cap}, \\{meet}, \\{join}, % \\{dnarrow}, \\{uparrow}, \\{lftarrow}, \\{rtarrow}, \\{dblarrow}, % \\{subset}, \\{supset}, \\{elt}, % \\{neq}, \\{leq}, \\{geq}, \\{eqv}, \\{sim}, % \\{infinity}, \\{forall}, \\{exists}, \\{not}, % \\{sharp}, \\{dollar}, \\{at}, \\{rslash}, % \\{cdot}, \\{int}, \\{diamond}, % \\{lbrace}, \\{rbrace}, \\{vert}, \\{under}, \\{squotes}. if minus>=0: "Minus sign"; cpen; if fixwidth=0: if pa+6pu>ph: call charbegin(minus,14,0,0,ph,ph-2pa,pa.slant-.5pu); else: call charbegin(minus,14,0,0,6pu+pa,6pu-pa,pa.slant-.5pu); fi; else: call charbegin(minus,9,0,0,3.5pu+pa,3.5pu-pa,0); fi; lft10x1=round u; x2=r-x1; y1=y2=a; w10 draw 1..2; % bar fi. if pm>=0: "Plus or minus sign"; cpen; if fixwidth=0: if pa+6pu>ph: call charbegin(pm,14,0,0,ph,ph-2pa,0); top10y1=h; else: call charbegin(pm,14,0,0,6pu+pa,6pu-pa,0); top10y1=a+6u; fi; else: call charbegin(pm,9,0,0,3.5pu+pa,3.5pu-pa,0); top10y1=a+3.5u; fi; .5[y1,y2]=a; x1=x2=.5r; lft10x3=round u; x4=r-x3; y3=y4=a; w10 draw 1..2; % stem draw 3..4; % plus bar x5=x3; x6=x4; y5=y6=y2; draw 5..6; % minus bar fi. if oplus>=0: "Circle-plus operator"; call charbegin(oplus,18,0,0,ph,ph-2pa,pa.slant-.5pu); cpen; lft0x6=round u; y6=a; x8=r-x8; top0y8=h+oo; call circle(1,2,3,4,5,6,7,8,w0); % bowl w0 draw 6..2; % bar draw 4..8; % stem fi. if otimes>=0: "Circle-times operator"; call charbegin(otimes,18,0,0,ph,ph-2pa,pa.slant-.5pu); cpen; lft0x6=round u; y6=a; x8=r-x8; top0y8=h+oo; call circle(1,2,3,4,5,6,7,8,w0); % bowl w0 draw 7..3; % upper left to lower right diagonal draw 5..1; % lower left to upper right diagonal fi. if cup>=0: "Set union sign"; call charbegin(cup,13,0,0,ph,ph-2pa,.5[px,ph].slant-.5pu); cpen; lft10x1=round u; x2=x1; x3=r-x3; x4=x5=r-x1; y1=good10(.5[m,h]); .5[y1,y3]=a; y2=y4=2/3[y1,y3]; y5=y1; call qcirc(3,6,2,w10); call qcirc(3,7,4,w10); % cup w10 draw 1..2; draw 4..5; % stems fi. if cap>=0: "Set intersection sign"; call charbegin(cap,13,0,0,ph,ph-2pa,.5[px,ph].slant-.5pu); cpen; lft10x1=round u; x2=x1; x3=r-x3; x4=x5=r-x1; y3=good10(.5[m,h]); .5[y1,y3]=a; y2=y4=2/3[y1,y3]; y5=y1; call qcirc(3,6,2,w10); call qcirc(3,7,4,w10); % cap w10 draw 1..2; draw 4..5; % stems fi. if meet>=0: "Lattice infimum (logical AND) sign"; call charbegin(meet,13,0,0,ph,ph-2pa,.5[px,ph].slant-.5pu); cpen; lft10x1=round u; x3=r-x3; x5=r-x1; y3=good10(.5[m,h]); .5[y1,y3]=a; y5=y1; w10 draw 1..3..3..5; % diagonals fi. if join>=0: "Lattice supremum (logical OR) sign"; call charbegin(join,13,0,0,ph,ph-2pa,.5[px,ph].slant-.5pu); cpen; lft10x1=round u; x3=r-x3; x5=r-x1; y1=good10(.5[m,h]); .5[y1,y3]=a; y5=y1; w10 draw 1..3..3..5; % diagonals fi. if dnarrow>=0: "Downward arrow"; call charbegin(dnarrow,9,0,0,ph,ph-2pa,0); cpen; top10y2=h; .5[y1,y2]=a; y0=bot10y1; x0=x1=x2=x5=x8=good10 .5r; w10 draw 1..2; % stem vpen; bot7y8=y0; lpen#; w10 draw 0..8; rpen#; w10 draw 0..8; % clean the top y5-y8=y8-y3=-.24h-eps; y3=y4=y6=y7; x3-x6=x1-x3=x4-x1=x7-x4=3u+eps; lpen#; w10 draw (5..)8..3(..6); % erase excess at left vpen; draw (|w7|5..)8..|w6|3(..6); % left point rpen#; w10 draw (5..)8..4(..7); % erase excess at right vpen; draw (|w7|5..)8..|w6|4(..7); % right point fi. if uparrow>=0: "Upward arrow"; call charbegin(uparrow,9,0,0,ph,ph-2pa,.75ph.slant+.5pw-pu); cpen; top10y1=y0=h; .5[y1,y2]=a; x0=x1=x2=x5=x8=good10 .5r; w10 draw 1..2; % stem vpen; top7y8=y0; lpen#; w10 draw 0..8; rpen#; w10 draw 0..8; % clean the top y5-y8=y8-y3=.24h+eps; y3=y4=y6=y7; x3-x6=x1-x3=x4-x1=x7-x4=3u+eps; lpen#; w10 draw (5..)8..3(..6); % erase excess at left vpen; draw (|w7|5..)8..|w6|3(..6); % left point rpen#; w10 draw (5..)8..4(..7); % erase excess at right vpen; draw (|w7|5..)8..|w6|4(..7); % right point fi. if lftarrow>=0: "Leftward arrow"; call charbegin(lftarrow,18,0,0,.24ph+.5prt+pa,.24ph+.5prt-pa,pa.slant-.5pu); cpen; lft10x1=x0=round u; rt10x2=round(r-u); y1=y2=y5=y8=good10 a; w10 draw 1..2; % bar hpen; lft1x8=x0; x5-x8=x8-x3=-fixwidth[3u,6u]-eps; x3=x4=x6=x7; y3-y6=y1-y3=y4-y1=y7-y4=.24h+eps; lpen#; w10+w1 draw (5..)8..3(..6); % erase excess at lower left hpen; draw (|w1|5..)8..|w0|3(..6); % lower point lpen#; w10+w1 draw (5..)8..4(..7); % erase excess at upper left hpen; draw (|w1|5..)8..|w0|4(..7); % upper point fi. if rtarrow>=0: "Rightward arrow"; call charbegin(rtarrow,18,0,0,.24ph+.5prt+pa,.24ph+.5prt-pa,pa.slant-.5pu); cpen; lft10x2=round u; rt10x1=x0=round(r-u); y1=y2=y5=y8=good10 a; w10 draw 1..2; % bar hpen; rt1x8=x0; x5-x8=x8-x3=fixwidth[3u,6u]+eps; x3=x4=x6=x7; y3-y6=y1-y3=y4-y1=y7-y4=.24h+eps; rpen#; w10+w1 draw (5..)8..3(..6); % erase excess at lower right hpen; draw (|w1|5..)8..|w0|3(..6); % lower point rpen#; w10+w1 draw (5..)8..4(..7); % erase excess at upper right hpen; draw (|w1|5..)8..|w0|4(..7); % upper point fi. if dblarrow>=0: "Left-and-right arrow"; call charbegin(dblarrow,18,0,0,.24ph+.5prt+pa+.2ph.fixwidth,.24ph+.5prt-pa, pa.slant-.5pu); cpen; lft10x2=x10=round u; rt10x1=x0=round(r-u); x11=x1; x12=x2; if fixwidth=0: y1=y2=y11=y12=good10 a; else: y1=y2=good10(a+.2h); y11=y12; .5[y11,y1]=a; w10 draw 11..12; % extra bar fi; w10 draw 1..2; % bar y5=y8=y1; y15=y18=y11; hpen; rt1x8=x0; lft1x18=x10; x5-x8=x8-x3=x13-x18=x18-x15=fixwidth[3u,5u]+eps; x3=x4=x6=x7; x13=x14=x16=x17; y3-y6=y1-y3=y4-y1=y7-y4=y13-y16=y11-y13=y14-y11=y17-y14=.24h+eps; rpen#; w10+w1 draw (5..)8..3(..6); % erase excess at lower right hpen; draw (|w1|5..)8..|w0|3(..6); % lower right point rpen#; w10+w1 draw (5..)8..4(..7); % erase excess at upper right hpen; draw (|w1|5..)8..|w0|4(..7); % upper right point lpen#; w10+w1 draw (15..)18..13(..16); % erase excess at lower left hpen; draw (|w1|15..)18..|w0|13(..16); % lower left point lpen#; w10+w1 draw (15..)18..14(..17); % erase excess at upper left hpen; draw (|w1|15..)18..|w0|14(..17); % upper left point fi. if subset>=0: "Proper subset sign"; call charbegin(subset,18,0,0,.5[px,ph]+prt/2,.5[px,ph]+prt/2-2pa, .5[px,ph].slant-2pu); cpen; lft10x1=round 2.5u; x2=x3=r-x1; y2=good10 .5[m,h]; .5[y2,y3]=y1=good10 a; x4=x5=.5r; y4=y2; y5=y3; w10 draw 2..4{-1,0}..1{0,-1}..5{1,0}..3; % stroke fi. if supset>=0: "Proper superset sign"; call charbegin(supset,18,0,0,.5[px,ph]+prt/2,.5[px,ph]+prt/2-2pa, .5[px,ph].slant-2pu); cpen; lft10x2=round 2.5u; x2=x3=r-x1; y2=good10 .5[m,h]; .5[y2,y3]=y1=good10 a; x4=x5=.5r; y4=y2; y5=y3; w10 draw 2..4{1,0}..1{0,-1}..5{-1,0}..3; % stroke fi. if elt>=0: "Element sign"; call charbegin(elt,12,0,0,.5[px,ph]+prt/2,.5[px,ph]+prt/2-2pa, .5[px,ph].slant-.5pu); cpen; rt10x1=round(r-u); lft10x3=round u; x5=x6=x1; x2=x4=.5(r+2u); y1=y2=good10(.5[m,h]); y3=y6=a; y4=y5; .5[y5,y1]=y6; w10 draw 1..2{-1,0}..3{0,-1}..4{1,0}..5; % bowl draw 3..6; % bar fi. if neq>=0: "Unequal sign"; call charbegin(neq,18,0,0,ph+pb,ph+pb-2pa,(pa+.5(px-pe)).slant-1.5pu); cpen; lft10x1=round u; x3=x1; x2=x4=r-x1; y1=y2; y3=y4; y1-y3=round(m-e); .5[y1,y3]=a; w10 draw 1..2; % upper bar draw 3..4; % lower bar rt10x5=round(r-2u); lft10x6=round 2u; top10y5=h+b; .5[y5,y6]=a; draw 5..6; % diagonal fi. if leq>=0: "Less than or equal to sign"; call charbegin(leq,18,0,0,ph,ph-2pa,ph.slant-2pu); cpen; lft10x1=round 2.5u; x2=x3=r-x1; top10y2=h; .5[y2,y3]=y1; y2-y1=(good10 .5[m,h])-(good10 a); w10 draw 2..1..1..3; % diagonals x4=x1; x5=x2; y4=y5; bot10y4=2a-h; draw 4..5; % bar fi. if geq>=0: "Greater than or equal to sign"; call charbegin(geq,18,0,0,ph,ph-2pa,(ph-.5(.5[px,ph]-pa)).slant-2pu); cpen; lft10x2=round 2.5u; x2=x3=r-x1; top10y2=h; .5[y2,y3]=y1; y2-y1=(good10 .5[m,h])-(good10 a); w10 draw 2..1..1..3; % diagonals x4=x1; x5=x2; y4=y5; bot10y4=2a-h; draw 4..5; % bar fi. if eqv>=0: "Equivalence or congruence sign"; call charbegin(eqv,18,0,0,px-pe+prt/2+pa,px-pe+prt/2-pa,(pa+ph-px).slant-.5pu); cpen; lft10x1=round u; x3=x5=x1; x2=x4=x6=r-x1; y1=y2; y3=y4=a; y5=y6; y1-y3=y3-y5=round(m-e); w10 draw 1..2; % upper bar draw 3..4; % middle bar draw 5..6; % lower bar fi. if sim>=0: "Similarity sign"; call charbegin(sim,18,0,0,.5(px-pe)+pa,0,pa.slant-.5pu); vpen; top10y1=round(a+.5(m-e)+eps); top10y1-bot10y2=round(m-e); lft10x3=round u; y5=.5[y1,y2]; y3=y2; y4=y1; x4=r-x3; x5=r-x5; call `a zdraw(3,1,5,2,4,w10,w10+deltaw,7.5u/(e-m)); % stroke fi. if infinity>=0: "Infinity"; call charbegin(infinity,18,0,0,px,0,.5px.slant-.5pu); new w98,w99; w99=round .25[w6,w7]; w98=2[w1,w2]; vpen; top99y2=m+oo; bot99y1=-oo; y2=y4; y1=y3; x1=lft2x2; rt2x3=x4; y5=y6=y7=.5[y1,y2]; lft0x7=round u; rt0x5=round(r-u); x6=.5[x7,x5]; new ss,mss; % reciprocal slope at center if w0=w98: mss=ss; ss=-u/m; else: if fixwidthâ? 0: mss=.75ss; ss=-1.5u/m; else: mss=.75ss; ss=-6u/m; fi; fi; call `a zdraw(7,4,6,1,5,w99,w98,ss); % lower right and upper left strokes w99 draw 5{0,1}..2{-1,0}..6{mss,-1}..3{-1,0}.. 7{0,1}; % upper right and lower left strokes fi. if forall>=0: "Universal quantifier"; call charbegin(forall,10,0,0,ph,0,ph.slant); cpen; lft10x1=0; x2=good10 .5r=.5[x1,x3]; top10y1=h; y3=y1; bot10y2=-o; y4=y5=good10m; new aa,bb; x4=aa[x1,x2]; y4=aa[y1,y2]; x5=bb[x3,x2]; y5=bb[y3,y2]; w10 draw 1..2..2..3; % diagonals draw 4..5; % bar fi. if exists>=0: "Existential quantifier"; call charbegin(exists,10,0,0,ph,0,ph.slant-.5pu); cpen; lft10x1=round u; rt10x2=round(r-u); x3=x5=x2; x4=x6-.25u=x1; top10y1=h; bot10y4=0; y2=y1; y5=y6=.5[y1,y3]; y3=y4; w10 draw 1..2..2..3..3..4; % upper bar, stem, lower bar draw 5..6; % middle bar fi. if not>=0: "Logical NOT"; call charbegin(not,12,0,0,px,0,.5[pe,px].slant-.5pu); cpen; lft10x1=round u; x2=x3=r-x1; y1=y2=good10 .5[e,m]; y2-y3=1.2(m-e); w10 draw 1..2..2..3; % bar and stem fi. if sharp>=0: "Sharp symbol (number sign or hash mark)"; call charbegin(sharp,15,0,0,ph,ph-2pa,(pa+.5(px-pe)).slant-1.5pu); cpen; lft10x1=round u; x3=x1; x2=x4=r-x1; y1=y2; y3=y4; y1-y3=round(m-e); .5[y1,y3]=a; w10 draw 1..2; % upper bar draw 3..4; % lower bar x5-2u=x1; x8+2u=x2; x6-x5=x8-x7; x6-x7=fixwidth[0,-3u]; y5=y7; y6=y8; top10y6=h; .5[y5,y6]=a; draw 5..6; % left diagonal draw 7..8; % right diagonal fi. if dollar>=0: "Dollar sign"; call charbegin(dollar,9,0,0,ph+pb,pb,ph.slant-.5pu); new w99; w99=round .3[w0,w4]; hpen; top0y1=h+oo; bot0y5=-oo; x1=x3=x5=good10 .5r; y3=.52h; lft99x2=round u; x4=r-x2; y6=y8=.5[y5,y3]; y7=y9=.5[y1,y3]; cpen; lft3x8=lft0x6=lft99x2; rt3x9=rt0x7=rt99x4; w3 draw 8; % lower bulb draw 9; % upper bulb hpen; w0 draw 6{0,-1}..5{1,0}; % lower left stroke draw 7{0,1}..1{-1,0}; % upper right stroke call `a sdraw(1,2,3,4,5,w99,w9,-h/(50u)); % middle stroke cpen; x10=x11=x3; top10y10=h+b; bot10y11=-b; w10 draw 10..11; % stem fi. if at>=0: "At sign"; call charbegin(at,14,0,0,ph,0,.5ph.slant+.5pw-.5pu); if fudgeâ? 1: new w0,w1; % lines will be thinner in fudged styles w0=round(fudge.fudge.pixels.pw+blacker); w1=round(fudge.fudge.pixels.pwi+blacker); fi; hpen; x1=x8=x10=.5r; x2=good1 4u; x3=x4=x5=r-x2; lft0x9=round u; x7=x11=x12=r-x9; x6=5/12[x5,x7]; top0y8=h+oo; bot0y10=-oo; y9=y10; y1=good6 .8[y10,y8]; y2=y3=y6=good6 .2[y10,y8]; y7=.5[y10,y8]; y11=good6 .1[y10,y8]; y12=.9[y10,y8]; y4=.8[y2,y1]; y5=2/3[y7,y6]; call `a darc(1,2,w1); % left part of inner bowl call `b darc(1,3,w0); % right part of inner bowl draw |w1|4..|w1#|5{0,-1}..|w0#|6{1,0}..7{0,1}; % stem and link call `c arc(8,7,w0); % right part of outer bowl call `d darc(8,9,w0); % left part of outer bowl w0 draw 10{1,0}..11(..12); % point if fudgeâ? 1: new w0,w1; % restore normal sizes in fudged styles w0=round(pixels.pw+blacker); w1=round(pixels.pwi+blacker); fi; fi. if rslash>=0: "Reverse slash"; call charbegin(rslash,9,0,0,ph+pb,ph+pb-2pa,0); cpen; lft10x2=round u; x2=r-x1; top10y2=h+b; .5[y1,y2]=a; w10 draw 1..2; % diagonal fi. if cdot>=0: "Period raised to axis height"; call charbegin(cdot,5,0,0,3.5pu+pa,0,0); cpen; new w99; w99=round 1.1w3; x1=good99 .5r; y1=a; w99 draw 1; % dot fi. if int>=0: "Integral sign"; call charbegin(int,9,0,0,ph,pd,0); hpen; rt2x1=rt0x2=round(r-u); y1=y2; lft2x9=lft0x8=round u; y8=y9; cpen; bot2y9=-.9d; y8-y7=y3-y1; hpen; x3=r-2.5u; x7=2.5u; top0y3=h; bot0y7=-d; x5=good1 .5r; y5=.5[y3,y7]; x4=x5+.5u; y4=y5+1/3(y3-y7); x6=x5-.5u; y6=y5-1/3(y3-y7); cpen; w2 draw 1; % upper bulb draw 9; % lower bulb hpen; draw |w0|2{0,1}..|w0#|3{-1,0}..|.5[w0,w1]|4{x6-x4,y6-y4}.. |w1#|5..|.5[w0,w1]|6{x6-x4,y6-y4}..|w0#|7{-1,0}..8{0,1}; % stem fi. if lbrace>=0: "Left brace"; call charbegin(lbrace,9,0,0,ph+pb,ph+pb-2pa,(ph+pb).slant+.5pw-pu); hpen; x2=x3=x5=x6=good1 .5r; x1-x2=x2-x4=3u+eps; x1=x7; top0y1=h+b; y4=.5[y1,y7]=.5[y2,y6]=.5[y3,y5]=good6 a; y1-y2=y3-y4=(y1-y4)/4; draw |w0#|1{3(x2-x1),y2-y1}..|w1#|2{0,-1}..|w1#|3{0,-1}.. |w0#|4{3(x4-x3),y4-y3}; % upper stem draw |w0#|7{3(x6-x7),y6-y7}..|w1#|6{0,1}..|w1#|5{0,1}.. |w0#|4{3(x4-x5),y4-y5}; % lower stem fi. if rbrace>=0: "Right brace"; call charbegin(rbrace,9,0,0,ph+pb,ph+pb-2pa,(ph+pb).slant+.5pwi-4pu); hpen; x2=x3=x5=x6=good1 .5r; x1-x2=x2-x4=-3u-eps; x1=x7; top0y1=h+b; y4=.5[y1,y7]=.5[y2,y6]=.5[y3,y5]=good6 a; y1-y2=y3-y4=(y1-y4)/4; draw |w0#|1{3(x2-x1),y2-y1}..|w1#|2{0,-1}..|w1#|3{0,-1}.. |w0#|4{3(x4-x3),y4-y3}; % upper stem draw |w0#|7{3(x6-x7),y6-y7}..|w1#|6{0,1}..|w1#|5{0,1}.. |w0#|4{3(x4-x5),y4-y5}; % lower stem fi. if vert>=0: "Vertical line (absolute value or length)"; call charbegin(vert,5,0,0,ph+pb,ph+pb-2pa,0); cpen; x1=x2=good10 .5r; top10y1=h+b; .5[y1,y2]=a; w10 draw 1..2; % stem fi. if under>=0: "Underbar suitable for < and >"; call charbegin(under,18,0,0,0,.5[px,ph]+prt/2-2pa+(px-pe),0); y22=good10 .5[m,h]; .5[y22,y23]=good10 a; y1=y2=y23-(m-e); cpen; lft10 x1=round 2.5u; x2=r-x1; w10 draw 1..2; % bar fi. if squotes>=0: "Straight double quotes"; call charbegin(squotes,9,0,0,ph,0,ph.slant+.5pwiii-2.5pu); new w99; if w3