%% filename: cyrmax.mf %% version: 2.2 %% date: 1995/01/04 %% %% American Mathematical Society %% Technical Support %% Publications Technical Group %% 201 Charles Street %% Providence, RI 02904 %% USA %% tel: (401) 455-4080 %% (800) 321-4267 (USA and Canada only) %% fax: (401) 331-3842 %% email: tech-support@ams.org %% %% Copyright 1995 Humanities and Arts Computing Center, University of %% Washington. %% %% Unlimited copying and redistribution of this file are permitted as %% long as this file is not modified. Modifications, and distribution %% of modified versions, are permitted, but only if the resulting file %% is renamed. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def slantswitch = slant:=-slant; currenttransform:= identity slanted slant yscaled aspect_ratio scaled granularity; enddef; %reverse slant so that mirror() will work def lowerfit = 0 enddef; transform MIRROR; MIRROR=identity reflectedabout(origin,up); % produce a mirror image of current picture reflected about a vertical axis def mirror (expr axis) = currentpicture:=currentpicture transformed MIRROR shifted (2axis,0); slantswitch; % restore normal slant enddef; vardef armup(suffix \$,\$\$,@)(expr darkness,jut) = % arm from |z\$| to |z\$\$| x@0=good.x(x\$\$r-jut); y@0=y\$l; if serifs: y@1=y\$r; z@1=z\$\$r-whatever*(z@0-z\$\$r); z@2=.5[z\$r,z@1]; filldraw z\$\$l{z@1-z\$\$l}...darkness[z@1,.5[z@2,z\$\$l] ]...z@2 ---z\$r--z\$l--z@0--z\$\$r--cycle; % arm and beak else: filldraw z\$l--z\$r--z@0--z\$\$r--cycle; fi % sans-serif arm penlabels(@0,@1,@2); enddef; def varwid = if serifs: if hefty: vair else: 1.5cap_hair fi else: vair fi enddef; vardef cyrsanserif(suffix \$) = x\$.css.r=x\$r; x\$.css.l=x\$l; x\$.css=x\$; y\$.css.r=y\$r-2slab; y\$.css.l=y\$l-2slab; y\$.css=y\$-2slab; filldraw stroke z\$e--z\$.css.e; enddef; vardef lcyrsanserif(suffix \$) = numeric cssdif; cssdif=.5(x\$r-x\$l); if cssdif<0: cssdif:=-cssdif; fi x\$'.css.r=x\$r+cssdif; x\$'.css.l=x\$l+cssdif; x\$'.css=x\$+cssdif; y\$'.css.r=y\$'.css.l=y\$'.css=bot y\$ + slab; x\$.css.r=x\$r+cssdif; x\$.css.l=x\$l+cssdif; x\$.css=x\$+cssdif; y\$.css.r=y\$r-2slab; y\$.css.l=y\$l-2slab; y\$.css=y\$-2slab; filldraw stroke z\$'.css.e--z\$.css.e; enddef; vardef rcyrsanserif(suffix \$) = numeric cssdif; cssdif=.5(x\$r-x\$l); if cssdif<0: cssdif:=-cssdif; fi x\$'.css.r=x\$r-cssdif; x\$'.css.l=x\$l-cssdif; x\$'.css=x\$-cssdif; y\$'.css.r=y\$'.css.l=y\$'.css=bot y\$ + slab; x\$.css.r=x\$r-cssdif; x\$.css.l=x\$l-cssdif; x\$.css=x\$-cssdif; y\$.css.r=y\$r-2slab; y\$.css.l=y\$l-2slab; y\$.css=y\$-2slab; filldraw stroke z\$'.css.e--z\$.css.e; enddef; numeric flouradjust; flouradjust=.09designsize; vardef cyr_serif(suffix \$,\$\$,@) % serif at |z\$| for stroke from |z\$\$| (expr darkness,jut) suffix modifier = pickup crisp.nib; numeric bracket_height; pair downward; bracket_height=if dark.modifier: 1.5 fi\\ bracket; if y\$y@2: y@2:=y@1; fi else: y@2=max(y\$-bracket_height,y\$\$); bot y@1+slab=top y@0-eps=tiny.top y\$; downward=z\$\$-z\$; if y@1x@2-eps: x@3:=x@2-eps; fi fi pair corner; ypart corner=y@1; corner=z@2+whatever*downward; pair flourish; xpart flourish= x@0 if jut > 0: + cyrflwd else: - cyrflwd fi; ypart flourish= y@0 - cyrflht; if (designsize < 15pt): pair flourishcorner; xpart flourishcorner=flouradjust[x@2,(xpart flourish)]; ypart flourishcorner=ypart flourish; %if jut > 0: -1.5 else: +1.5 fi; filldraw z@2{z\$-z\$\$} ...darkness[corner,.5[z@1,z@2] ]{z@1-z@2} ...{jut,0}z@1--z@0{down}...{jut,-1}flourish--flourishcorner{-jut,0} ...{-jut,0}(x\$,y@0)--z@3--cycle; % the serif else: filldraw z@2{z\$-z\$\$} ...darkness[corner,.5[z@1,z@2] ]{z@1-z@2} ...{jut,0}z@1--z@0{down}...{jut,-1}flourish{-jut,0} ...{-jut,0}(x\$,y@0)--z@3--cycle; % the serif fi labels (@0,@1,@2,@3); enddef; def dish_cyr_serif(suffix \$,\$\$,@)(expr left_darkness,left_jut) (suffix @@)(expr right_darkness,right_jut) suffix modifier = cyr_serif(\$,\$\$,@,left_darkness,-left_jut) modifier; cyr_serif(\$,\$\$,@@,right_darkness,right_jut) modifier; enddef; def l_cyr_serif(suffix \$,\$\$,@)(expr left_darkness,left_jut) (suffix @@)(expr right_darkness,right_jut) suffix modifier = cyr_serif(\$,\$\$,@,left_darkness,-left_jut) modifier; serif(\$,\$\$,@@,right_darkness,right_jut) modifier; enddef; def r_cyr_serif(suffix \$,\$\$,@)(expr left_darkness,left_jut) (suffix @@)(expr right_darkness,right_jut) suffix modifier = serif(\$,\$\$,@,left_darkness,-left_jut) modifier; cyr_serif(\$,\$\$,@@,right_darkness,right_jut) modifier; enddef; % cyrbrev is called with suffix, dummy_suffix e.g. % cyrbrev(2,q) where the breve will be centered % above x2 using dummy suffixes q_1, q_2 etc. def cyrbrev (suffix \$,@) = pickup crisp.nib; pos@_1(vair,-180); pos@_3(vair,0); top y@_1=top y@_3=h; lft x@_1r=hround(x\$-4u-.5vair); rt x@_3r=hround(x\$+4u+.5vair); numeric mid_thickness; mid_thickness=vround 1/3[vair,stem]; pos@_2(mid_thickness,-90); x@_2=x\$; bot y@_2r=y\$+dot_size; filldraw stroke z@_1e{down}...z@_2e{right}...{up}z@_3e; % stroke pos@_11(dot_size,0); pos@_12(dot_size,90); pos@_13(dot_size,0); pos@_14(dot_size,90); lft x@_11l=lft x@_1r; rt x@_13r=rt x@_3r; y@_11=y@_12=y@_13=y@_14=h; x@_12=x@_11; x@_14=x@_13; dot(@_11,@_12); dot(@_13,@_14); penlabels(@_1,@_2,@_3,@_11,@_13); enddef; boolean altaccent; altaccent=false; % altaccent inhibits right side dot def nucyrbrev (suffix \$,@) = pickup crisp.nib; pos@_1(vair,-180); pos@_3(vair,0); top y@_1=top y@_3=y@_2r+cyrspread; lft x@_1r=hround(x\$-4u-.5vair); rt x@_3r=hround(x\$+4u+.5vair); numeric mid_thickness; mid_thickness=vround 1/3[vair,stem]; pos@_2(mid_thickness,-90); x@_2=x\$; bot y@_2r=y\$+.5dot_size; filldraw stroke z@_1e{down}...z@_2e{right}...{up}z@_3e; % stroke if square_dots: % relax else: pos@_11(dot_size,0); pos@_12(dot_size,90); pos@_13(dot_size,0); pos@_14(dot_size,90); lft x@_11l=lft x@_1r; rt x@_13r=rt x@_3r; y@_11=y@_12=y@_13=y@_14=y@_2r+cyrspread; x@_12=x@_11; x@_14=x@_13; dot(@_11,@_12); if altaccent: % relax else: dot(@_13,@_14); fi fi penlabels(@_1,@_2,@_3,@_11,@_13); enddef; % flip rotates 180 degrees about the centerpoint whose suffix is passed def flip (suffix \$) = picture V; transform FLIP; y\$:=y\$*aspect_ratio; FLIP=identity rotatedaround(z\$,180) shifted(2slant*y\$,0); V=currentpicture transformed FLIP; currentpicture:=V; enddef; def dot_sharp_values = numeric dot_diam#; dot_diam#=max(dot_size#,cap_curve#); numeric dot_top#; dot_top#=min(asc_height#,10/7x_height#+.5dot_diam#); enddef; % umlaut % calling specification is (xx,q) where xx is a point over which to center % the umlaut, q is a dummy suffix which may be used def umlaut (suffix \$,@) = dot_sharp_values; define_whole_blacker_pixels(dot_diam); pickup tiny.nib; pos@_1(dot_diam,0); pos@_2(dot_diam,90); x@_1=x@_2=x\$-dot_diam; top y@_2r=2dot_diam+y\$; y@_1=.5[y@_2l,y@_2r]; dot(@_1,@_2); % dot pos@_3(dot_diam,0); pos@_4(dot_diam,90); x@_3=x@_4=x\$+1.75u; top y@_4r=2dot_diam+y\$; y@_3=.5[y@_4l,y@_4r]; dot(@_3,@_4); % dot enddef;