cmchar "Square subset sign"; compute_spread(5/4x_height#,3/2x_height#); % the spread of `$=$' beginchar(hex"3C",14u#,v_center(spread#+rule_thickness#)); adjust_fit(0,0); pickup rule.nib; lft x2=hround(1.5u+oo); x1=x4=hround(w-1.5u)+eps; x3=x2; y1-y4=spread; y2=y1; y3=y4; y1=math_axis+.5spread; draw z1--z2--z3--z4; % bars and stem labels(1,2,3,4); endchar; % This character is an alteration of the square subset or equal to sign % Changes: % 1) changed position of y1 to be .5 of the spread above the math_axis % 2) got rid of lower bar (points z8/z9,etc) and the extra spread#' amount % which was used in calculations for the lower bar % 3) name and code number and height changed, otherwise essentially the same cmchar "Square superset sign"; compute_spread(5/4x_height#,3/2x_height#); % the spread of `$=$' beginchar(hex"3D",14u#,v_center(spread#+rule_thickness#)); adjust_fit(0,0); pickup rule.nib; x1=x4=hround 1.5u-eps; rt x2=hround(w-1.5u-oo); x3=x2; y1-y4=spread; y2=y1; y3=y4; y1=math_axis+.5spread; draw z1--z2--z3--z4; % bars and stem labels(1,2,3,4); endchar; % This character is an alteration of the square superset or equal to sign % Changes: % 1) changed position of y1 to be .5 of the spread above the math_axis % 2) got rid of lower bar (points z8/z9,etc) and the extra spread#' amount % which was used in calculations for the lower bar % 3) name and code number and height changed, otherwise essentially the same cmchar "Diamond"; %beginchar(oct"063",2(.85asc_height#-math_axis#)+2u#,v_center(7u#)); beginchar(hex"33",2(.85asc_height#-math_axis#)+2u#, v_center(2(.85asc_height#-math_axis#))); italcorr math_axis#*slant; adjust_fit(0,0); pickup rule.nib; numeric a; a=.85asc_height-math_axis; x4=x8=good.x .5w; w:=r:=2x4; rt x2=w-lft x6=good.x(x4+a); y2=y6=.5[y4,y8]=.5cap_height; top y8=good.y(y2+a); draw z2--z4--z6--z8--cycle; labels(2,4,6,8); endchar; % This character is an alteration of the diamond operator % The four tips are equidistant from the center point (.5w,math_axis), % this distance being half of the cap height % and related to that in the square character % slightly less though, since it looks too big if the actually have same % length % Changes: % 1) To the amount a, which gives the distance of the tips from the center % 2) The width is related to the asc_height, so it changes with it % 3) name and code number and width changed, otherwise essentially the same % The numbers stay the same, for any referencing cmchar "Bowtie operator"; beginchar(hex"31",13u#,v_center(7u#)); italcorr math_axis#*slant; adjust_fit(0,0); pickup rule.nib; numeric a; a=round(1.1*math_axis); x1=x4=good.x 1.5u; x2=x3=w-x1; y1=y2=good.y(.5(cap_height-2a)); y3=y4=y1+2a; draw z1--z3--z2--z4--cycle; labels(1,2,3,4); endchar; % Arbitrary width given % Length of the bars at the edges are 2.2*math_axis length % and it's vertically aligned on the high, i.e., .5 cap height as opposed % to being aligned on the math axis cmchar "Leads to character extension"; compute_spread(.45x_height#,.55x_height#); beginchar(hex"3A",12u#,v_center(spread#+rule_thickness#)); adjust_fit(0,0); pickup rule.nib; numeric a; a=round(.45math_axis); y11=y13=y15=math_axis; y12-a=y14+a=good.y math_axis; x11=0; x15=w; x13=.5[x11,x15]; x12=.5[x11,x13]; x14=.5[x13,x15]; path p; p=z12{right}...z13...z14{right}; draw z11{dir(-angle direction 1 of p)}...z12{right}...z13... z14{right}...z15{dir(-angle direction 1 of p)}; penlabels(11,12,13,14,15); endchar; % This character is an extension to fit with the Leads to character with % arrowhead % This character goes from edge to edge and a series of these can be linked % as desired. % It has 2/3 the width of that character, and if this relation is kept, the % the curves should all match cmchar "Leads to character with arrowhead"; compute_spread(.45x_height#,.55x_height#); beginchar(hex"3B",18u#,v_center(spread#+rule_thickness#)); adjust_fit(0,0); pickup crisp.nib; pos3(bar,0); pos4(bar,0); y0=math_axis; rt x0=hround(w-u); y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0-3u-eps; pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0; z9=.381966[.5[z3,z4],z0]; numeric t[]; path p[]; (t1,t2)=(z4l{z9-z4}..z6r) intersectiontimes (z3l{z9-z3}..z5r); z10=(z4l{z9-z4}..z6r) intersectionpoint (z3l{z9-z3}..z5r); filldraw z0..{z4-z9}z4r--subpath (0,t1) of (z4l{z9-z4}..z6r) --z10--subpath (t2,0) of (z3l{z9-z3}..z5r)--z3r{z9-z3}..z0 & cycle; % arrowhead pickup rule.nib; numeric a; a=round(.45math_axis); y11=y13=y15=y16=y0; y12-a=y14+a=good.y math_axis; %x11=0; x15=2/3w; z17=lft z10; %x13=.5[x11,x15]; x12=.5[x11,x13]; x14=.5[x13,x15]; x16=.3[x15,x0]; x11=0; x15=0.7w; z17=lft z10; x13=.5[x11,x15]; x12=.5[x11,x13]; x14=.5[x13,x15]; x16=.5[x15,x0]; path p; p=z12{right}...z13...z14{right}; draw z11{dir(-angle direction 1 of p)}... z12{right}...z13...z14{right}...z16{right}...z17; penlabels(0,3,4,5,6,9,10,11,12,13,14,15,16); endchar; % This character uses the rightward arrow arrowhead % The width is the same as that of the regular arrow % An extension character can be added for longer squiggles cmchar "LASY \lhd triangle"; compute_spread(5/4x_height#,3/2x_height#); beginchar(44,14u#,v_center(spread#+rule_thickness#)); italcorr h#*slant-u#; adjust_fit(0,0); pickup rule.nib; lft x2=hround 1.5u-eps; x1=x3=w-x2; y1-y3=spread; y2=.5[y1,y3]=math_axis; draw z1--z2--z3--cycle; % triangle labels(1,2,3); endchar; % taken directly from CMR "less than" character % the path was closed to make a triangle cmchar "black LASY \lhd triangle"; compute_spread(5/4x_height#,3/2x_height#); beginchar(16,14u#,v_center(spread#+rule_thickness#)); italcorr h#*slant-u#; adjust_fit(0,0); pickup crisp.nib; lft x2=hround 1.5u-eps; x1=x3=w-x2; y1-y3=spread; y2=.5[y1,y3]=math_axis; filldraw z1--z2--z3--cycle; % triangle labels(1,2,3); endchar; cmchar "LASY \unlhd triangle"; compute_spread(.45x_height#,.55x_height#); spread#':=spread#; spread':=spread; % the spread of `$=$' compute_spread(5/4x_height#,3/2x_height#); beginchar(45,14u#,v_center(spread#'+spread#+rule_thickness#)); italcorr h#*slant-u#; adjust_fit(0,0); pickup rule.nib; lft x2=hround 1.5u-eps; x1=x3=w-x2; y1-y3=spread; y2=.5[y1,y3]; top y1=h; draw z1--z2--z3--cycle; % triangle x8=x1; x9=x2; y8=y9; y3-y9=spread'; draw z8--z9; % bar labels(1,2,3,8,9); endchar; % taken directly from CMR "less than or equal to sign" % the "less than" path was closed to make a triangle cmchar "LASY \rhd triangle"; compute_spread(5/4x_height#,3/2x_height#); beginchar(46,14u#,v_center(spread#+rule_thickness#)); italcorr math_axis#*slant-u#; adjust_fit(0,0); pickup rule.nib; rt x2=hround(w-1.5u)+eps; x1=x3=w-x2; y1-y3=spread; y2=.5[y1,y3]=math_axis; draw z1--z2--z3--cycle; % triangle labels(1,2,3); endchar; % taken directly from CMR "greater than" character % the path was closed to make a triangle cmchar "black LASY \rhd triangle"; compute_spread(5/4x_height#,3/2x_height#); beginchar(17,14u#,v_center(spread#+rule_thickness#)); italcorr math_axis#*slant-u#; adjust_fit(0,0); pickup crisp.nib; rt x2=hround(w-1.5u)+eps; x1=x3=w-x2; y1-y3=spread; y2=.5[y1,y3]=math_axis; filldraw z1--z2--z3--cycle; % triangle labels(1,2,3); endchar; cmchar "LASY \unrhd triangle"; compute_spread(.45x_height#,.55x_height#); spread#':=spread#; spread':=spread; % the spread of `$=$' compute_spread(5/4x_height#,3/2x_height#); beginchar(47,14u#,v_center(spread#'+spread#+rule_thickness#)); italcorr h#*slant-u#; adjust_fit(0,0); pickup rule.nib; lft x1=hround 1.5u-eps; x2=w-x1; x3=x1; y1-y3=spread; y2=.5[y1,y3]; top y1=h; draw z1--z2--z3--cycle; % triangle x8=x1; x9=x2; y8=y9; y3-y9=spread'; draw z8--z9; % bar labels(1,2,3,8,9); endchar; % taken directly from CMR "greater than or equal to sign" % the "greater than" path was closed to make a triangle cmchar "upwards pointing black triangle"; compute_spread(5/4x_height#,3/2x_height#); beginchar(hex"4B",spread#+rule_thickness#,v_center(11u#)); italcorr 0; adjust_fit(0,0); pickup crisp.nib; top y2= h+eps; y1=y3; y2-y1 = vround (h+d); x1-x3=spread; x2=.5[x1,x3]=good.x .5w; filldraw z1--z2--z3--cycle; % triangle labels(1,2,3); endchar; cmchar "downwards pointing black triangle"; compute_spread(5/4x_height#,3/2x_height#); beginchar(hex"4C",spread#+rule_thickness#,v_center(11u#)); italcorr 0; adjust_fit(0,0); pickup crisp.nib; bot y2= (-d)-eps; y1=y3; y1-y2 = vround (h+d); x1-x3=spread; x2=.5[x1,x3]=good.x .5w; filldraw z1--z2--z3--cycle; % triangle labels(1,2,3); endchar;