home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / unixtex-6.1b-bin3.lha / lib / texmf / fonts / ams / euler / src / ebigop.mf next >
Text File  |  1996-10-12  |  44KB  |  960 lines

  1. %% @metafontfile{
  2. %%     filename="ebigop.mf",
  3. %%     version="2.1a",
  4. %%     date="23-SEP-1991",
  5. %%     filetype="Metafont: driver",
  6. %%     copyright="Copyright (C) American Mathematical Society,
  7. %%            all rights reserved.  Copying of this file is
  8. %%            authorized only if either:
  9. %%            (1) you make absolutely no changes to your copy
  10. %%                including name; OR
  11. %%            (2) if you do make changes, you first rename it to some
  12. %%                other name.",
  13. %%     author="American Mathematical Society",
  14. %%     address="American Mathematical Society,
  15. %%            Technical Support Department,
  16. %%            P. O. Box 6248,
  17. %%            Providence, RI 02940,
  18. %%            USA",
  19. %%     telephone="401-455-4080 or (in the USA) 800-321-4AMS",
  20. %%     email="Internet: Tech-Support@Math.AMS.org",
  21. %%     codetable="ISO/ASCII",
  22. %%     checksumtype="line count",
  23. %%     checksum="959",
  24. %%     keywords="amsfonts, tex, metafont , euler ",
  25. %%     abstract="This is the driver file for use with 
  26. %%            the euler extension font in AMSFonts 2.1."
  27. %%     }
  28. %
  29. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  30. % The Computer Modern Math-Extension family (by D. E. Knuth, 1979--1985)
  31. % Special version for characters redesigned to blend with Euler
  32.  
  33. % This is the driver file for EUEX fonts
  34. font_coding_scheme:="euler substitutions only";
  35. mode_setup; font_setup;
  36.  
  37. def t_ = transformed currenttransform enddef; 
  38. transform skewit; skewit=identity;  % 5/24/91 NGB
  39.  
  40. def bulb(suffix $,$$,$$$) =
  41.  z$$$r=z$$r;
  42. %pair trueup; (z5+trueup)t_=z5+(0,y$$r-y$r);
  43. pair trueup; (z5+trueup) transformed skewit=z5+(0,y$$r-y$r); %5/24/91 NGB
  44.  path_.l:=z$l{x$$r-x$r,0}...{trueup}z$$l;
  45. {{less_tense;
  46.  filldraw path_.l--z$$r{-trueup}...{x$r-x$$r,0}z$r--cycle}}; % link
  47.  path_.r:=z$$$l{-trueup}..z$$$r{trueup}; % near-circle
  48.  filldraw subpath(0,xpart(path_.r intersectiontimes path_.l)) of path_.r
  49.   --z$$r{trueup}..cycle; % bulb
  50.  enddef;
  51.  
  52. % characters modified from BIGOP
  53. charlist oct"110": oct"111";  % contour integral signs
  54. charlist oct"122": oct"132";  % integral signs
  55. charlist oct"120": oct"130";  % summation signs
  56. charlist oct"121": oct"131";  % product signs
  57. charlist oct"140": oct"141";  % coproduct signs
  58.  
  59. % characters modified from BIGDEL (braces in different positions)
  60. charlist oct"010": oct"012": oct"014": oct"016": oct"070";  % left braces
  61. charlist oct"011": oct"013": oct"015": oct"017": oct"071";  % right braces
  62. extensible oct"070": oct"070",oct"074",oct"072",oct"076";  % left brace
  63. extensible oct"071": oct"071",oct"075",oct"073",oct"076";  % right brace
  64. extensible oct"072": oct"070",0,oct"072",oct"076";  % sharp left parenthesis
  65. extensible oct"073": oct"071",0,oct"073",oct"076";  % sharp right parenthesis
  66. extensible oct"076": 0,0,0,oct"076";  % brace extension modules only
  67. extensible oct"100": oct"070",0,oct"073",oct"076";  % left moustache
  68. extensible oct"101": oct"071",0,oct"072",oct"076";  % right moustache
  69. % the horizontal braces are included too
  70. heavy_rule_thickness:=bold+dw; % this is the main change: big braces not so dark
  71. heavy_rule_thickness#:=curve#+(curve#-stem#);
  72.  
  73. % arrows (taken from SYMBOL, SYM, and ROMSS, with longer and thicker arrowheads)
  74. bar:=rule_thickness;  % this makes the arrowheads thicker
  75. % the half arrows from ROMSS are moved to different font positions
  76. % infinity (taken from SYMBOL, made heavier)
  77.  
  78. cmchar "\textstyle integral sign";
  79. beginchar(oct"122",12u#,0,100/54dh#);
  80. italcorr 0.5u#; % \TeX\ kerning between upper limit and lower limit
  81. adjust_fit(-1u#,-1u#-ic#); pickup fine.nib;
  82. pos1(dot_size,0); pos2(.75[hair,stem],0); pos3(vair,90); pos4(stem,180);
  83. pos5(.4[stem,curve],180); pos5'(.4[stem,curve],0); z5'=z5; pos6(stem,0);
  84. pos7(vair,-90); pos8(.75[hair,stem],-180); pos9(dot_size,-180);
  85. rt x1r=hround(w-u); x9=w-x1; x7=w-x3=3u;
  86. x5=.5[x4,x6]; x4-x6=1.2u; lft x5r=hround(.5w-.5stem);
  87. top y3r=0; bot y7r=-d; y9-.5(.4[stem,curve])=vround(top y7l+.25(.4[stem,curve]));
  88. y3-y1=y9-y7; y5=.5[y3,y7]=.5[y4,y6]; y4-y6=.6(y3-y7);
  89. transform skewit;
  90.  z5 transformed skewit=z5; (z5+right) transformed skewit = z5+right;
  91.  z3 transformed skewit=z3-u*right;
  92. %% code changed for Version 2.1 to allow for odd aspect ratio. 5/24/91 NGB
  93. %skewit:=skewit transformed currenttransform;
  94. %save currenttransform; transform currenttransform; currenttransform:=skewit;
  95. transform newskew; newskew:=skewit transformed currenttransform;
  96. save currenttransform; transform currenttransform; currenttransform:=newskew;
  97. %%%%%%%end of change
  98. bulb(3,2,1); bulb(7,8,9);  % bulbs
  99. filldraw stroke z3e{left}...z4e{(z5e-z4e)xscaled 1.1}
  100.  ..tension atleast 1 and atleast .8..{z5-z4}z5e;  % upper stem
  101. filldraw stroke z5'e{z6-z5}..tension atleast.8 and atleast 1
  102.  ..{(z6e-z5'e)xscaled 1.1}z6e...{left}z7e;  % lower stem
  103. penlabels(1,2,3,4,5,6,7,8,9); endchar;
  104.  
  105. cmchar "\displaystyle integral sign";
  106. beginchar(oct"132",18u#,0,200/54dh#);
  107. italcorr 2u#; % \TeX\ kerning between upper limit and lower limit
  108. adjust_fit(-4u#,-4u#-ic#); pickup fine.nib;
  109. numeric bulb_size, max_size;
  110. bulb_size=hround(.8[stem,curve]); max_size=hround(bold+.2dw);
  111. pos1(bulb_size,0); pos2(.75[hair,stem],0); pos3(vair,90); pos4(.4[stem,curve],180);
  112. pos5(max_size,180); pos5'(max_size,0); z5'=z5; pos6(.4[stem,curve],0);
  113. pos7(vair,-90); pos8(.75[hair,stem],-180); pos9(bulb_size,-180);
  114. rt x1r=hround(w-u); x9=w-x1; x7=w-x3=3u;
  115. x5=.5[x4,x6]; x4-x6=4.8u; lft x5r=hround(.5w-.5stem);
  116. top y3r=0; bot y7r=-d;
  117. y9-.5bulb_size=vround(top y7l+.25bulb_size); y3-y1=y9-y7;
  118. y5=.5[y3,y7]=.5[y4,y6]; y4-y6=.6(y3-y7);
  119. transform skewit;
  120.  z5 transformed skewit=z5; (z5+right) transformed skewit = z5+right;
  121.  z3 transformed skewit=z3-4u*right;
  122. %% code changed for Version 2.1 to allow for odd aspect ratio. 5/24/91 NGB
  123. %skewit:=skewit transformed currenttransform;
  124. %save currenttransform; transform currenttransform; currenttransform:=skewit;
  125. transform newskew; newskew:=skewit transformed currenttransform;
  126. save currenttransform; transform currenttransform; currenttransform:=newskew;
  127. %%%%%%%end of change
  128. bulb(3,2,1); bulb(7,8,9);  % bulbs
  129. filldraw stroke z3e{left}...z4e{(z5e-z4e)xscaled 1.1}
  130.  ..tension atleast 1 and atleast .8..{z5-z4}z5e;  % upper stem
  131. filldraw stroke z5'e{z6-z5}..tension atleast.8 and atleast 1
  132.  ..{(z6e-z5'e)xscaled 1.1}z6e...{left}z7e;  % lower stem
  133. penlabels(1,2,3,4,5,6,7,8,9); endchar;
  134.  
  135. cmchar "\textstyle contour integral sign";
  136. beginchar(oct"110",12u#,0,100/54dh#);
  137. italcorr 0.5u#; % \TeX\ kerning between upper limit and lower limit
  138. adjust_fit(-u#,-u#-ic#); pickup fine.nib;
  139. begingroup
  140. pos1(dot_size,0); pos2(.75[hair,stem],0); pos3(vair,90); pos4(stem,180);
  141. pos5(.4[stem,curve],180); pos5'(.4[stem,curve],0); z5'=z5; pos6(stem,0);
  142. pos7(vair,-90); pos8(.75[hair,stem],-180); pos9(dot_size,-180);
  143. rt x1r=hround(w-u); x9=w-x1; x7=w-x3=3u;
  144. x5=.5[x4,x6]; x4-x6=1.2u; lft x5r=hround(.5w-.5stem);
  145. top y3r=0; bot y7r=-d; y9-.5(.4[stem,curve])=vround(top y7l+.25(.4[stem,curve]));
  146. y3-y1=y9-y7; y5=.5[y3,y7]=.5[y4,y6]; y4-y6=.6(y3-y7);
  147. transform skewit;
  148.  z5 transformed skewit=z5; (z5+right) transformed skewit = z5+right;
  149.  z3 transformed skewit=z3-u*right;
  150. %% code changed for Version 2.1 to allow for odd aspect ratio. 5/24/91 NGB
  151. %skewit:=skewit transformed currenttransform;
  152. %save currenttransform; transform currenttransform; currenttransform:=skewit;
  153. transform newskew; newskew:=skewit transformed currenttransform;
  154. save currenttransform; transform currenttransform; currenttransform:=newskew;
  155. %%%%%%%end of change
  156. bulb(3,2,1); bulb(7,8,9);  % bulbs
  157. filldraw stroke z3e{left}...z4e{(z5e-z4e)xscaled 1.1}
  158.  ..tension atleast 1 and atleast .8..{z5-z4}z5e;  % upper stem
  159. filldraw stroke z5'e{z6-z5}..tension atleast.8 and atleast 1
  160.  ..{(z6e-z5'e)xscaled 1.1}z6e...{left}z7e;  % lower stem
  161. endgroup;
  162. pickup rule.nib; autorounded;
  163. draw fullcircle scaled .5w shifted z5;  % contour
  164. penlabels(1,2,3,4,5,6,7,8,9); endchar;
  165.  
  166. cmchar "\displaystyle contour integral sign";
  167. beginchar(oct"111",18u#,0,200/54dh#);
  168. italcorr 2u#; % \TeX\ kerning between upper limit and lower limit
  169. adjust_fit(-4u#,-4u#-ic#); pickup fine.nib;
  170. begingroup
  171. numeric bulb_size, max_size;
  172. bulb_size=hround(.8[stem,curve]); max_size=hround(bold+.2dw);
  173. pos1(bulb_size,0); pos2(.75[hair,stem],0); pos3(vair,90); pos4(.4[stem,curve],180);
  174. pos5(max_size,180); pos5'(max_size,0); z5'=z5; pos6(.4[stem,curve],0);
  175. pos7(vair,-90); pos8(.75[hair,stem],-180); pos9(bulb_size,-180);
  176. rt x1r=hround(w-u); x9=w-x1; x7=w-x3=3u;
  177. x5=.5[x4,x6]; x4-x6=4.8u; lft x5r=hround(.5w-.5stem);
  178. top y3r=0; bot y7r=-d;
  179. y9-.5bulb_size=vround(top y7l+.25bulb_size); y3-y1=y9-y7;
  180. y5=.5[y3,y7]=.5[y4,y6]; y4-y6=.6(y3-y7);
  181. transform skewit;
  182.  z5 transformed skewit=z5; (z5+right) transformed skewit = z5+right;
  183.  z3 transformed skewit=z3-4u*right;
  184. %% code changed for Version 2.1 to allow for odd aspect ratio. 5/24/91 NGB
  185. %skewit:=skewit transformed currenttransform;
  186. %save currenttransform; transform currenttransform; currenttransform:=skewit;
  187. transform newskew; newskew:=skewit transformed currenttransform;
  188. save currenttransform; transform currenttransform; currenttransform:=newskew;
  189. %%%%%%%end of change
  190. bulb(3,2,1); bulb(7,8,9);  % bulbs
  191. filldraw stroke z3e{left}...z4e{(z5e-z4e)xscaled 1.1}
  192.  ..tension atleast 1 and atleast .8..{z5-z4}z5e;  % upper stem
  193. filldraw stroke z5'e{z6-z5}..tension atleast.8 and atleast 1
  194.  ..{(z6e-z5'e)xscaled 1.1}z6e...{left}z7e;  % lower stem
  195. endgroup;
  196. pickup rule.nib; autorounded;
  197. draw fullcircle scaled .5w shifted z5;  % contour
  198. penlabels(1,2,3,4,5,6,7,8,9); endchar;
  199.  
  200.  
  201. cmchar "\textstyle summation sign";
  202. beginchar(oct"120",19u#,0,10/6dh#);
  203. adjust_fit(0,0); pickup tiny.nib;
  204. numeric top_arm_thickness, bot_arm_thickness;
  205. top_arm_thickness=Vround(.7[rule_thickness,bold]);
  206. bot_arm_thickness=Vround(bold+dw);
  207. lft x1l=hround 2.2u; x1l=x2l; lft x4l=hround u; x3l-x1l=4/11(w-2u)-1.2u;
  208. top y1=0; bot y2=-top_arm_thickness-eps; bot y4=-d; y3=-.48d;
  209. numeric alpha[]; alpha1=((x3l-x1l)++(y2-y3))/(y2-y3);
  210. penpos1(alpha1*(curve-tiny),0); penpos2(alpha1*(curve-tiny),0);
  211. penpos3(alpha1*(curve-tiny),0);
  212. alpha2=diag_ratio(1,rule_thickness+dw-tiny,y3-y4,x3r-x4l);
  213. penpos4(alpha2*(rule_thickness+dw-tiny),0);
  214. z0=whatever[z2l,z3l]=z4l+whatever*(z3r-z4r);
  215. filldraw z1l--z2l--z0--z4l--z4r--z3r--z2r--z1r--cycle;  % diagonals
  216. pickup crisp.nib; pos5(top_arm_thickness,90); pos6(hair,0);
  217. top y5r=0; x5=x1; rt x6r=hround(w-3u); y6=good.y(y5l)-eps;
  218. {{save serifs; boolean serifs; serifs:=false;
  219. arm(5,6,a,.45,-.25u);    % upper arm and beak
  220. pos7(bot_arm_thickness,-90); pos8(hair,0);
  221. bot y7r=-d; z7l=whatever[z4,z3]; x7r:=x4; x8=x6+1.5u; y8=good.y(y7l)+eps;
  222. arm(7,8,b,.45,.25u);}};  % lower arm and beak
  223. penlabels(0,1,2,3,4,5,6,7,8); endchar;
  224.  
  225. cmchar "\displaystyle summation sign";
  226. beginchar(oct"130",26u#,0,14/6dh#); padded 1/6dh#;
  227. adjust_fit(0,0); pickup tiny.nib;
  228. numeric top_arm_thickness, bot_arm_thickness, thick_stem, thin_stem;
  229. thick_stem=bold+4dw; thin_stem=rule_thickness+2dw;
  230. top_arm_thickness=Vround(bold-.5dw);
  231. bot_arm_thickness=Vround(bold+2.5dw);
  232. lft x1l=hround 3u; x1l=x2l; lft x4l=hround u; x3l-x1l=4/11(w-2u)-2u;
  233. top y1=0; bot y2=-top_arm_thickness-eps; bot y4=-d; y3=-.48d;
  234. numeric alpha[]; alpha1=((x3l-x1l)++(y2-y3))/(y2-y3);
  235. penpos1(alpha1*(thick_stem-tiny),0); penpos2(alpha1*(thick_stem-tiny),0);
  236. penpos3(alpha1*(thick_stem-tiny),0);
  237. alpha2=diag_ratio(1,thin_stem-tiny,y3-y4,x3r-x4l);
  238. penpos4(alpha2*(thin_stem-tiny),0);
  239. z0=whatever[z2l,z3l]=z4l+whatever*(z3r-z4r);
  240. filldraw z1l--z2l--z0--z4l--z4r--z3r--z2r--z1r--cycle;  % diagonals
  241. pickup crisp.nib; pos5(top_arm_thickness,90); pos6(hair,0);
  242. top y5r=0; x5=x1; rt x6r=hround(w-4u); y6=good.y(y5l)-eps;
  243. {{save serifs; boolean serifs; serifs:=false;
  244. arm(5,6,a,.45,-.25u);  % upper arm and beak
  245. pos7(bot_arm_thickness,-90); pos8(hair,0);
  246. bot y7r=-d; z7l=whatever[z4,z3]; x7r:=x4; x8=x6+2.5u; y8=good.y(y7l)+eps;
  247. arm(7,8,b,.45,.25u);}};  % lower arm and beak
  248. penlabels(0,1,2,3,4,5,6,7,8); endchar;
  249.  
  250. cmchar "\textstyle product sign";
  251. beginchar(oct"121",18.5u#,0,10/6dh#);
  252. adjust_fit(.25u#,.25u#); pickup crisp.nib;
  253. numeric heavy_stem,light_stem;
  254. heavy_stem=hround(bold+dw); light_stem=rule_thickness;
  255. pos1(heavy_stem,0);pos2(heavy_stem,0); pos1'(heavy_stem,0);pos2'(heavy_stem,0);
  256. pos11(light_stem,90); pos12(light_stem,90); pos22(light_stem,90);
  257. lft x11=hround u; x1l-x11=x2l-x12=x22-x2r=hround cap_jut;
  258. x1=x1'=x2=x2';
  259. top y1=0; bot y2=-d; y11r=y1; y12l=y22l=y2;
  260. y11l-y1'=y2'-y12r=1.2bracket;
  261. filldraw z1r--z11r--serif_arc(11l,1'l)--reverse serif_arc(12r,2'l)
  262.  --z12l--z22l--serif_arc(22r,2'r)--cycle;  % left stem and serifs
  263. pos3(heavy_stem,0);pos4(heavy_stem,0); pos3'(heavy_stem,0);pos4'(heavy_stem,0);
  264. pos13(light_stem,90); pos14(light_stem,90); pos24(light_stem,90);
  265. x3=x3'=x4=x4'=w-x1; x13=x14=w-x11; x24=w-x22;
  266. y3=y13r=y1; y3'=y1'; y4'=y2'; y4=y14l=y24l=y2;
  267. filldraw z3l--z13r--serif_arc(13l,3'r)--reverse serif_arc(14r,4'r)
  268.  --z14l--z24l--serif_arc(24r,4'l)--cycle;  % right stem and serifs
  269. filldraw stroke z11e--z13e; % bar
  270. penlabels(1,1',2,2',3,3',4,4',11,12,13,14,22,24); endchar;
  271.  
  272. cmchar "\displaystyle product sign";
  273. beginchar(oct"131",25.4u#,0,14/6dh#); padded 1/6dh#;
  274. adjust_fit(0,0); pickup crisp.nib;
  275. numeric heavy_stem,light_stem;
  276. heavy_stem=hround(bold+5dw); light_stem=Vround(rule_thickness+dw);
  277. pos1(heavy_stem,0);pos2(heavy_stem,0); pos1'(heavy_stem,0);pos2'(heavy_stem,0);
  278. pos11(light_stem,90); pos12(light_stem,90); pos22(light_stem,90);
  279. lft x11=hround u; x1l-x11=x2l-x12=x22-x2r=hround 1.6cap_jut;
  280. x1=x1'=x2=x2';
  281. top y1=0; bot y2=-d; y11r=y1; y12l=y22l=y2;
  282. y11l-y1'=y2'-y12r=1.8bracket;
  283. filldraw z1r--z11r--serif_arc(11l,1'l)--reverse serif_arc(12r,2'l)
  284.  --z12l--z22l--serif_arc(22r,2'r)--cycle;  % left stem and serifs
  285. pos3(heavy_stem,0);pos4(heavy_stem,0); pos3'(heavy_stem,0);pos4'(heavy_stem,0);
  286. pos13(light_stem,90); pos14(light_stem,90); pos24(light_stem,90);
  287. x3=x3'=x4=x4'=w-x1; x13=x14=w-x11; x24=w-x22;
  288. y3=y13r=y1; y3'=y1'; y4'=y2'; y4=y14l=y24l=y2;
  289. filldraw z3l--z13r--serif_arc(13l,3'r)--reverse serif_arc(14r,4'r)
  290.  --z14l--z24l--serif_arc(24r,4'l)--cycle;  % right stem and serifs
  291. filldraw stroke z11e--z13e; % bar
  292. penlabels(1,1',2,2',3,3',4,4',11,12,13,14,22,24); endchar;
  293.  
  294. cmchar "\textstyle coproduct sign";
  295. beginchar(oct"140",18.5u#,0,10/6dh#);
  296. adjust_fit(.25u#,.25u#); pickup crisp.nib;
  297. numeric heavy_stem,light_stem;
  298. heavy_stem=hround(bold+dw); light_stem=rule_thickness;
  299. pos1(heavy_stem,0);pos2(heavy_stem,0); pos1'(heavy_stem,0);pos2'(heavy_stem,0);
  300. pos11(light_stem,-90); pos12(light_stem,-90); pos22(light_stem,-90);
  301. lft x11=hround u; x1l-x11=x2l-x12=x22-x2r=hround cap_jut;
  302. x1=x1'=x2=x2';
  303. bot y1=-d; top y2=0; y11r=y1; y12l=y22l=y2;
  304. y1'-y11l=y12r-y2'=1.2bracket;
  305. filldraw z1r--z11r--serif_arc(11l,1'l)--reverse serif_arc(12r,2'l)
  306.  --z12l--z22l--serif_arc(22r,2'r)--cycle;  % left stem and serifs
  307. pos3(heavy_stem,0);pos4(heavy_stem,0); pos3'(heavy_stem,0);pos4'(heavy_stem,0);
  308. pos13(light_stem,-90); pos14(light_stem,-90); pos24(light_stem,-90);
  309. x3=x3'=x4=x4'=w-x1; x13=x14=w-x11; x24=w-x22;
  310. y3=y13r=y1; y3'=y1'; y4'=y2'; y4=y14l=y24l=y2;
  311. filldraw z3l--z13r--serif_arc(13l,3'r)--reverse serif_arc(14r,4'r)
  312.  --z14l--z24l--serif_arc(24r,4'l)--cycle;  % right stem and serifs
  313. filldraw stroke z11e--z13e; % bar
  314. penlabels(1,1',2,2',3,3',4,4',11,12,13,14,22,24); endchar;
  315.  
  316. cmchar "\displaystyle coproduct sign";
  317. beginchar(oct"141",25.4u#,0,14/6dh#); padded 1/6dh#;
  318. adjust_fit(0,0); pickup crisp.nib;
  319. numeric heavy_stem,light_stem;
  320. heavy_stem=hround(bold+5dw); light_stem=Vround(rule_thickness+dw);
  321. pos1(heavy_stem,0);pos2(heavy_stem,0); pos1'(heavy_stem,0);pos2'(heavy_stem,0);
  322. pos11(light_stem,-90); pos12(light_stem,-90); pos22(light_stem,-90);
  323. lft x11=hround u; x1l-x11=x2l-x12=x22-x2r=hround 1.6cap_jut;
  324. x1=x1'=x2=x2';
  325. bot y1=-d; top y2=0; y11r=y1; y12l=y22l=y2;
  326. y1'-y11l=y12r-y2'=1.8bracket;
  327. filldraw z1r--z11r--serif_arc(11l,1'l)--reverse serif_arc(12r,2'l)
  328.  --z12l--z22l--serif_arc(22r,2'r)--cycle;  % left stem and serifs
  329. pos3(heavy_stem,0);pos4(heavy_stem,0); pos3'(heavy_stem,0);pos4'(heavy_stem,0);
  330. pos13(light_stem,-90); pos14(light_stem,-90); pos24(light_stem,-90);
  331. x3=x3'=x4=x4'=w-x1; x13=x14=w-x11; x24=w-x22;
  332. y3=y13r=y1; y3'=y1'; y4'=y2'; y4=y14l=y24l=y2;
  333. filldraw z3l--z13r--serif_arc(13l,3'r)--reverse serif_arc(14r,4'r)
  334.  --z14l--z24l--serif_arc(24r,4'l)--cycle;  % right stem and serifs
  335. filldraw stroke z11e--z13e; % bar
  336. penlabels(1,1',2,2',3,3',4,4',11,12,13,14,22,24); endchar;
  337.  
  338. cmchar "\big left curly brace";
  339. beginchar(oct"010",9u#,rule_thickness#,2dh#-rule_thickness#);
  340. adjust_fit(.75u#,.75u#); left_curly(hair,stem); endchar;
  341.  
  342. cmchar "\Big left curly brace";
  343. beginchar(oct"012",10u#,rule_thickness#,3dh#-rule_thickness#);
  344. adjust_fit(u#,u#); left_curly(rule_thickness,.3[stem,bold]); endchar;
  345.  
  346. cmchar "\bigg left curly brace";
  347. beginchar(oct"014",11u#,rule_thickness#,4dh#-rule_thickness#);
  348. adjust_fit(1.25u#,1.25u#); left_curly(rule_thickness+.2dw,.7[stem,bold]); endchar;
  349.  
  350. cmchar "\Bigg left curly brace";
  351. beginchar(oct"016",11.5u#,rule_thickness#,5dh#-rule_thickness#);
  352. adjust_fit(1.5u#,1.5u#); left_curly(rule_thickness+.4dw,bold); endchar;
  353.  
  354. cmchar "Extensible left curly brace---top";
  355. beginchar(oct"070",12u#,0,1.5dh#);
  356. adjust_fit(2u#,2u#); pickup fine.nib;
  357. numeric min_breadth; min_breadth=hround(rule_thickness+.6dw);
  358. pos1(min_breadth,0); pos1'(min_breadth,0);
  359. pos2(heavy_rule_thickness,0); pos3(heavy_rule_thickness,0);
  360. rt x1r=rt x1'r=hround(w-1.5u+.5min_breadth);
  361. lft x2l=lft x3l=hround(.5w-.5heavy_rule_thickness);
  362. top y1=h-1; y3=-d-eps; y2=.5[y1,y3]; y1-y1'=min_breadth-fine;
  363. filldraw z1l{3(x2l-x1l),y2-y1}...z2l---z3l
  364.  --z3r---z2r...{3(x1r-x2r),y1'-y2}z1'r--z1r--cycle;  % stroke
  365. penlabels(1,2,3); endchar;
  366.  
  367. cmchar "Extensible left curly brace---bottom";
  368. beginchar(oct"072",12u#,0,1.5dh#);
  369. adjust_fit(2u#,2u#); pickup fine.nib;
  370. numeric min_breadth; min_breadth=hround(rule_thickness+.6dw);
  371. pos7(min_breadth,0); pos7'(min_breadth,0);
  372. pos5(heavy_rule_thickness,0); pos6(heavy_rule_thickness,0);
  373. rt x7r=rt x7'r=hround(w-1.5u+.5min_breadth);
  374. lft x5l=lft x6l=hround(.5w-.5heavy_rule_thickness);
  375. y5=h+eps; bot y7=1-d; y6=.5[y5,y7]; y7'-y7=min_breadth-fine;
  376. filldraw z5l---z6l...{3(x7l-x6l),y7-y6}z7l
  377.  --z7r--z7'r{3(x6r-x7r),y6-y7'}...z6r---z5r--cycle;  % stroke
  378. penlabels(5,6,7); endchar;
  379.  
  380. cmchar "Extensible left curly brace---middle";
  381. beginchar(oct"074",12u#,0,3dh#);
  382. adjust_fit(2u#,2u#); pickup fine.nib;
  383. numeric min_breadth; min_breadth=hround(rule_thickness+.6dw);
  384. pos4(min_breadth,0); pos4'(min_breadth,0);
  385. forsuffixes $=2,3,5,6: pos$(heavy_rule_thickness,0); endfor
  386. lft x4l=lft x4'l=hround(1.5u-.5min_breadth);
  387. x2=x3=x5=x6; lft x2l=hround(.5w-.5heavy_rule_thickness);
  388. y2=h+eps; y6=-d-eps; .5[y4,y4']=.5[y2,y6]=.5[y3,y5];
  389. y3-y4=(y2-y6)/4; y4-y4'=min_breadth-fine;
  390. filldraw z2l---z3l...{3(x4l-x3l),y4-y3}z4l
  391.  --z4'l{3(x5l-x4l),y5-y4'}...z5l---z6l--z6r---z5r
  392.  ...{3(x4r-x5r),.5[y4,y4']-y5}.5[z4r,z4'r]{3(x3r-x4r),y3-.5[y4,y4']}
  393.  ...z3r---z2r--cycle;  % stroke
  394. penlabels(2,3,4,5,6); endchar;
  395.  
  396. cmchar "Extensible curly brace---extension module";
  397. beginchar(oct"076",12u#,0,.5dh#);
  398. adjust_fit(2u#,2u#); pickup fine.nib;
  399. pos2(heavy_rule_thickness,0); pos3(heavy_rule_thickness,0);
  400. lft x2l=lft x3l=hround(.5w-.5heavy_rule_thickness); y2=h+eps; y3=-d-eps;
  401. filldraw stroke z2e--z3e;  % stem
  402. penlabels(2,3); endchar;
  403.  
  404. cmchar "\big right curly brace";
  405. beginchar(oct"011",9u#,rule_thickness#,2dh#-rule_thickness#);
  406. adjust_fit(.75u#,.75u#); right_curly(hair,stem); endchar;
  407.  
  408. cmchar "\Big right curly brace";
  409. beginchar(oct"013",10u#,rule_thickness#,3dh#-rule_thickness#);
  410. adjust_fit(u#,u#); right_curly(rule_thickness,.3[stem,bold]); endchar;
  411.  
  412. cmchar "\bigg right curly brace";
  413. beginchar(oct"015",11u#,rule_thickness#,4dh#-rule_thickness#);
  414. adjust_fit(1.25u#,1.25u#); right_curly(rule_thickness+.2dw,.7[stem,bold]); endchar;
  415.  
  416. cmchar "\Bigg right curly brace";
  417. beginchar(oct"017",11.5u#,rule_thickness#,5dh#-rule_thickness#);
  418. adjust_fit(1.5u#,1.5u#); right_curly(rule_thickness+.4dw,bold); endchar;
  419.  
  420. cmchar "Extensible right curly brace---top";
  421. beginchar(oct"071",12u#,0,1.5dh#);
  422. adjust_fit(2u#,2u#); pickup fine.nib;
  423. numeric min_breadth; min_breadth=hround(rule_thickness+.6dw);
  424. pos1(min_breadth,0); pos1'(min_breadth,0);
  425. pos2(heavy_rule_thickness,0); pos3(heavy_rule_thickness,0);
  426. lft x1l=lft x1'l=hround(1.5u-.5min_breadth);
  427. lft x2l=lft x3l=hround(.5w-.5heavy_rule_thickness);
  428. top y1=h-1; y3=-d-eps; y2=.5[y1,y3]; y1-y1'=min_breadth-fine;
  429. filldraw z1r{3(x2r-x1r),y2-y1}...z2r---z3r
  430.  --z3l---z2l...{3(x1l-x2l),y1'-y2}z1'l--z1l--cycle;  % stroke
  431. penlabels(1,2,3); endchar;
  432.  
  433. cmchar "Extensible right curly brace---bottom";
  434. beginchar(oct"073",12u#,0,1.5dh#);
  435. adjust_fit(2u#,2u#); pickup fine.nib;
  436. numeric min_breadth; min_breadth=hround(rule_thickness+.6dw);
  437. pos7(min_breadth,0); pos7'(min_breadth,0);
  438. pos5(heavy_rule_thickness,0); pos6(heavy_rule_thickness,0);
  439. lft x7l=lft x7'l=hround(1.5u-.5min_breadth);
  440. lft x5l=lft x6l=hround(.5w-.5heavy_rule_thickness);
  441. y5=h+eps; bot y7=1-d; y6=.5[y5,y7]; y7'-y7=min_breadth-fine;
  442. filldraw z5r---z6r...{3(x7r-x6r),y7-y6}z7r
  443.  --z7l--z7'l{3(x6l-x7l),y6-y7'}...z6l---z5l--cycle;  % stroke
  444. penlabels(5,6,7); endchar;
  445.  
  446. cmchar "Extensible right curly brace---middle";
  447. beginchar(oct"075",12u#,0,3dh#);
  448. adjust_fit(2u#,2u#); pickup fine.nib;
  449. numeric min_breadth; min_breadth=hround(rule_thickness+.6dw);
  450. pos4(min_breadth,0); pos4'(min_breadth,0);
  451. forsuffixes $=2,3,5,6: pos$(heavy_rule_thickness,0); endfor
  452. rt x4r=rt x4'r=hround(w-1.5u+.5min_breadth);
  453. x2=x3=x5=x6; lft x2l=hround(.5w-.5heavy_rule_thickness);
  454. y2=h+eps; y6=-d-eps; .5[y4,y4']=.5[y2,y6]=.5[y3,y5];
  455. y3-y4=(y2-y6)/4; y4-y4'=min_breadth-fine;
  456. filldraw z2r---z3r...{3(x4r-x3r),y4-y3}z4r
  457.  --z4'r{3(x5r-x4r),y5-y4'}...z5r---z6r--z6l---z5l
  458.  ...{3(x4l-x5l),.5[y4,y4']-y5}.5[z4l,z4'l]{3(x3l-x4l),y3-.5[y4,y4']}
  459.  ...z3l---z2l--cycle;  % stroke
  460. penlabels(2,3,4,5,6); endchar;
  461.  
  462. cmchar "Horizontal curly brace tip---down and left";
  463. beginchar(oct"172",.75dh#,heavy_rule_thickness#,0);
  464. adjust_fit(0,0); pickup fine.nib;
  465. numeric min_breadth; min_breadth=vround(rule_thickness+.6dw);
  466. pos1(min_breadth,90); pos1'(min_breadth,90);
  467. pos2(heavy_rule_thickness,90);
  468. bot y2l=0; bot y1l=bot y1'l=vround(y2-4.5u-.5min_breadth);
  469. .5[x1,x1']=-eps; x2=w+shrink_fit+eps; x1'-x1=min_breadth-fine;
  470. filldraw z1r{x2-x1,3(y2r-y1r)}...{right}z2r
  471.  --z2l{left}...{x1'-x2,3(y1-y2)}z1'l--z1l--cycle;  % stroke
  472. penlabels(1,2); endchar;
  473.  
  474. cmchar "Horizontal curly brace tip---down and right";
  475. beginchar(oct"173",.75dh#,heavy_rule_thickness#,0);
  476. adjust_fit(0,0); pickup fine.nib;
  477. numeric min_breadth; min_breadth=vround(rule_thickness+.6dw);
  478. pos1(min_breadth,90); pos1'(min_breadth,90);
  479. pos2(heavy_rule_thickness,90);
  480. bot y2l=0; bot y1l=bot y1'l=vround(y2-4.5u-.5min_breadth);
  481. .5[x1,x1']=w+shrink_fit+eps; x2=-eps; x1-x1'=min_breadth-fine;
  482. filldraw z1r{x2-x1,3(y2r-y1r)}...{left}z2r
  483.  --z2l{right}...{x1'-x2,3(y1-y2)}z1'l--z1l--cycle;  % stroke
  484. penlabels(1,2); endchar;
  485.  
  486. cmchar "Horizontal curly brace tip---up and left";
  487. beginchar(oct"174",.75dh#,heavy_rule_thickness#,0);
  488. adjust_fit(0,0); pickup fine.nib;
  489. numeric min_breadth; min_breadth=vround(rule_thickness+.6dw);
  490. pos1(min_breadth,90); pos1'(min_breadth,90);
  491. pos2(heavy_rule_thickness,90);
  492. bot y2l=0; top y1r=top y1'r=vround(y2+4.5u+.5min_breadth);
  493. .5[x1,x1']=-eps; x2=w+shrink_fit+eps; x1'-x1=min_breadth-fine;
  494. filldraw z1l{x2-x1,3(y2l-y1l)}...{right}z2l
  495.  --z2r{left}...{x1'-x2,3(y1-y2)}z1'r--z1r--cycle;  % stroke
  496. penlabels(1,2); endchar;
  497.  
  498. cmchar "Horizontal curly brace tip---up and right";
  499. beginchar(oct"175",.75dh#,heavy_rule_thickness#,0);
  500. adjust_fit(0,0); pickup fine.nib;
  501. numeric min_breadth; min_breadth=vround(rule_thickness+.6dw);
  502. pos1(min_breadth,90); pos1'(min_breadth,90);
  503. pos2(heavy_rule_thickness,90);
  504. bot y2l=0; top y1r=top y1'r=vround(y2+4.5u+.5min_breadth);
  505. .5[x1,x1']=w+shrink_fit+eps; x2=-eps; x1-x1'=min_breadth-fine;
  506. filldraw z1l{x2-x1,3(y2l-y1l)}...{left}z2l
  507.  --z2r{right}...{x1'-x2,3(y1-y2)}z1'r--z1r--cycle;  % stroke
  508. penlabels(1,2); endchar;
  509.  
  510. cmchar "Leftward arrow";
  511. compute_spread(.45x_height#,.55x_height#);
  512. beginchar(oct"040",18u#,v_center(spread#+rule_thickness#));
  513. adjust_fit(0,0); pickup crisp.nib;
  514. pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
  515. y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
  516. y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0+3u+eps;
  517. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  518. z9=.381966[.5[z3,z4],z0];
  519. numeric t; path p; p=z4r{z9-z4}..z6r;
  520. t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
  521. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  522.  --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
  523.  --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
  524. penlabels(0,1,2,3,4,5,6,9); endchar;
  525.  
  526. cmchar "Rightward arrow";
  527. compute_spread(.45x_height#,.55x_height#);
  528. beginchar(oct"041",18u#,v_center(spread#+rule_thickness#));
  529. adjust_fit(0,0); pickup crisp.nib;
  530. pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
  531. y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
  532. y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0-3u-eps;
  533. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  534. z9=.381966[.5[z3,z4],z0];
  535. numeric t; path p; p=z4l{z9-z4}..z6r;
  536. t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
  537. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  538.  --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
  539.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  540. penlabels(0,1,2,3,4,5,6,9); endchar;
  541.  
  542. cmchar "Left-and-right arrow";
  543. compute_spread(.45x_height#,.55x_height#);
  544. beginchar(oct"044",18u#,
  545.  v_center(if monospace:.6asc_height#+fi spread#+rule_thickness#));
  546. adjust_fit(0,0); pickup crisp.nib;
  547. pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
  548. y0=y1=y2=math_axis if monospace:+vround.3asc_height fi; lft x0=hround u;
  549. if monospace: x1+.5rule_thickness=hround(w-u) else: x1=.5w fi;
  550. y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0+3u+eps;
  551. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  552. z9=.381966[.5[z3,z4],z0];
  553. numeric t; path p; p=z4r{z9-z4}..z6r;
  554. t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
  555. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  556.  --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
  557.  --z3l{z9-z3}..z0 & cycle;  % left arrowhead and stem
  558. pos11(rule_thickness,90); pos12(rule_thickness,90); pos13(bar,0); pos14(bar,0);
  559. y10=y11=y12=math_axis if monospace:-vround.3asc_height fi;
  560. rt x10=hround(w-u);
  561. if monospace: x11-.5rule_thickness=hround u else: x11=.5w fi;
  562. y13-y10=y10-y14=.36asc_height+eps; x13=x14=x10-3u-eps;
  563. pos15(bar,angle(z14-z10)); z15l=z10; pos16(bar,angle(z13-z10)); z16l=z10;
  564. z19=.381966[.5[z13,z14],z10];
  565. numeric t; path p; p=z14l{z19-z14}..z16r;
  566. t=xpart(p intersectiontimes((0,y12l)--(w,y12l))); x12=xpart point t of p;
  567. filldraw z10..{z14-z19}z14r--subpath (0,t) of\\(z14l{z19-z14}..z16r)
  568.  --z12l---z11l..z11r---z12r--subpath (t,0) of\\(z13l{z19-z13}..z15r)
  569.  --z13r{z19-z13}..z10 & cycle;  % right arrowhead and stem
  570. penlabels(0,1,2,3,4,5,6,9,10,11,12,13,14,15,16,19); endchar;
  571.  
  572. cmchar "Upward arrow";
  573. beginchar(oct"042",9u#,asc_height#,asc_depth#);
  574. italcorr .76asc_height#*slant+.5crisp#-u#;
  575. adjust_fit(0,0); pickup crisp.nib;
  576. pos1(rule_thickness,0); pos2(rule_thickness,0);
  577. pos3(bar,90); pos4(bar,90);
  578. lft x1l=hround(.5w-.5rule_thickness); y1-.5rule_thickness=-d;
  579. x0=x1=x2; top y0=h; x0-x3=x4-x0=4u+eps;
  580. y3=y4=y0-.24asc_height-eps;
  581. pos5(bar,angle(z4-z0)); z5l=z0;
  582. pos6(bar,angle(z3-z0)); z6l=z0;
  583. z9=.381966[.5[z3,z4],z0];
  584. numeric t; path p; p=z4l{z9-z4}..z6r;
  585. t=xpart(p intersectiontimes((x2r,-d)--(x2r,h))); y2=ypart point t of p;
  586. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  587.  --z2r---z1r..z1l---z2l--subpath (t,0) of\\(z3l{z9-z3}..z5r)
  588.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  589. penlabels(0,1,2,3,4,5,6,9); endchar;
  590.  
  591. cmchar "Downward arrow";
  592. beginchar(oct"043",9u#,asc_height#,asc_depth#);
  593. adjust_fit(0,0); pickup crisp.nib;
  594. pos1(rule_thickness,0); pos2(rule_thickness,0);
  595. pos3(bar,90); pos4(bar,90);
  596. lft x1l=hround(.5w-.5rule_thickness); y1+.5rule_thickness=h;
  597. x0=x1=x2; bot y0=-d; x0-x3=x4-x0=4u+eps;
  598. y3=y4=y0+.24asc_height+eps;
  599. pos5(bar,angle(z4-z0)); z5l=z0;
  600. pos6(bar,angle(z3-z0)); z6l=z0;
  601. z9=.381966[.5[z3,z4],z0];
  602. numeric t; path p; p=z4r{z9-z4}..z6r;
  603. t=xpart(p intersectiontimes((x2r,-d)--(x2r,h))); y2=ypart point t of p;
  604. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  605.  --z2r---z1r..z1l---z2l--subpath (t,0) of\\(z3r{z9-z3}..z5r)
  606.  --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
  607. penlabels(0,1,2,3,4,5,6,9); endchar;
  608.  
  609. cmchar "Up-and-down arrow";
  610. beginchar(oct"154",9u#,body_height#,paren_depth#);
  611. adjust_fit(0,0); pickup crisp.nib;
  612. pos1(rule_thickness,0); pos2(rule_thickness,0);
  613. pos3(bar,90); pos4(bar,90);
  614. lft x1l=hround(.5w-.5rule_thickness); y1=.5[-d,h];
  615. x0=x1=x2; bot y0=-d-o; x0-x3=x4-x0=4u+eps;
  616. y3=y4=y0+.24asc_height+eps;
  617. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  618. z9=.381966[.5[z3,z4],z0];
  619. numeric t; path p; p=z4r{z9-z4}..z6r;
  620. t=xpart(p intersectiontimes((x2r,-d)--(x2r,h))); y2=ypart point t of p;
  621. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  622.  --z2r---z1r..z1l---z2l--subpath (t,0) of\\(z3r{z9-z3}..z5r)
  623.  --z3l{z9-z3}..z0 & cycle;  % lower arrowhead and stem
  624. pos11(rule_thickness,0); pos12(rule_thickness,0); z11=z1;
  625. pos13(bar,90); pos14(bar,90);
  626. x10=x11=x12; top y10=h+o; x10-x13=x14-x10=4u+eps;
  627. y13=y14=y10-.24asc_height-eps;
  628. pos15(bar,angle(z14-z10)); z15l=z10; pos16(bar,angle(z13-z10)); z16l=z10;
  629. z19=.381966[.5[z13,z14],z10];
  630. numeric t; path p; p=z14l{z19-z14}..z16r;
  631. t=xpart(p intersectiontimes((x12r,-d)--(x12r,h))); y12=ypart point t of p;
  632. filldraw z10..{z14-z19}z14r--subpath (0,t) of\\(z14l{z19-z14}..z16r)
  633.  --z12r---z11r..z11l---z12l--subpath (t,0) of\\(z13l{z19-z13}..z15r)
  634.  --z13r{z19-z13}..z10 & cycle;  % upper arrowhead and stem
  635. penlabels(0,1,2,3,4,5,6,9,10,11,12,13,14,15,16,19); endchar;
  636.  
  637. cmchar "Leftward top half arrow";
  638. compute_spread(.45x_height#,.55x_height#);
  639. beginchar(oct"030",18u#,v_center(spread#+rule_thickness#));
  640. adjust_fit(0,0); pickup crisp.nib;
  641. pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
  642. y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
  643. y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0+3u+eps;
  644. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  645. numeric t; path p; p=z4r..{2(x0-x4),y0-y4}z6r;
  646. t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
  647. filldraw z0--(x0,y2l)---z1l..z1r---z2r
  648.  ..subpath (t,0) of\\(z3r..{2(x0-x3),y0-y3}z5r)
  649.  --z3l..{2(x0-x3),y0-y3}cycle;  % arrowhead and stem
  650. penlabels(0,1,2,3,4,5,6); endchar;
  651.  
  652. cmchar "Leftward bottom half arrow";
  653. compute_spread(.45x_height#,.55x_height#);
  654. beginchar(oct"031",18u#,v_center(spread#+rule_thickness#));
  655. adjust_fit(0,0); pickup crisp.nib;
  656. pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
  657. y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
  658. y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0+3u+eps;
  659. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  660. numeric t; path p; p=z4r..{2(x0-x4),y0-y4}z6r;
  661. t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
  662. filldraw z0{2(x4-x0),y4-y0}..z4l
  663.  --subpath (0,t) of\\(z4r..{2(x0-x4),y0-y4}z6r)
  664.  ..z2l---z1l..z1r---(x0,y2r)--cycle;  % arrowhead and stem
  665. penlabels(0,1,2,3,4,5,6); endchar;
  666.  
  667. cmchar "Rightward top half arrow";
  668. compute_spread(.45x_height#,.55x_height#);
  669. beginchar(oct"032",18u#,v_center(spread#+rule_thickness#));
  670. adjust_fit(0,0); pickup crisp.nib;
  671. pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
  672. y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
  673. y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0-3u-eps;
  674. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  675. numeric t; path p; p=z4l..{2(x0-x4),y0-y4}z6r;
  676. t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
  677. filldraw z0--(x0,y2l)---z1l..z1r---z2r
  678.  ..subpath (t,0) of\\(z3l..{2(x0-x3),y0-y3}z5r)
  679.  --z3r..{2(x0-x3),y0-y3}cycle;  % arrowhead and stem
  680. penlabels(0,1,2,3,4,5,6); endchar;
  681.  
  682. cmchar "Rightward bottom half arrow";
  683. compute_spread(.45x_height#,.55x_height#);
  684. beginchar(oct"033",18u#,v_center(spread#+rule_thickness#));
  685. adjust_fit(0,0); pickup crisp.nib;
  686. pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
  687. y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
  688. y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0-3u-eps;
  689. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  690. numeric t; path p; p=z4l..{2(x0-x4),y0-y4}z6r;
  691. t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
  692. filldraw z0{2(x4-x0),y4-y0}..z4r
  693.  --subpath (0,t) of\\(z4l..{2(x0-x4),y0-y4}z6r)
  694.  ..z2l---z1l..z1r---(x0,y2r)--cycle;  % arrowhead and stem
  695. penlabels(0,1,2,3,4,5,6); endchar;
  696.  
  697. cmchar "Northeast arrow";
  698. beginchar(oct"045",18u#,asc_height#,asc_depth#);
  699. adjust_fit(0,0); pickup crisp.nib;
  700. x1-.5rule_thickness=hround u; rt x0=hround(w-u);
  701. y1-.5rule_thickness=-d; top y0=h;
  702. numeric theta,delta; theta=angle(z0-z1); delta=3u++.24asc_height;
  703. if abs(theta-45)<2.5: theta:=45; y1:=y0+x1-x0; fi % near-45$^\circ$ angle
  704. pos1(rule_thickness,90+theta); pos2(rule_thickness,90+theta);
  705. pos3(bar,theta); pos4(bar,theta);
  706. z3-z0=(-3u,.36asc_height) rotated theta;
  707. z4-z0=(-3u,-.36asc_height) rotated theta;
  708. pos5(bar,-90); z5l=z0; pos6(bar,-180); z6l=z0;
  709. z9=.381966[.5[z3,z4],z0];
  710. numeric t; path p; p=z4l{z9-z4}..z6r;
  711. t=xpart(p intersectiontimes (z1l--(z1l+2(z0-z1)))); z2l=point t of p;
  712. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  713.  --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
  714.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  715. penlabels(0,1,2,3,4,5,6,9); endchar;
  716.  
  717. cmchar "Southeast arrow";
  718. beginchar(oct"046",18u#,asc_height#,asc_depth#);
  719. adjust_fit(0,0); pickup crisp.nib;
  720. x1-.5rule_thickness=hround u; rt x0=hround(w-u);
  721. y1+.5rule_thickness=h; bot y0=-d;
  722. numeric theta,delta; theta=angle(z0-z1); delta=3u++.24asc_height;
  723. if abs(theta+45)<2.5: theta:=-45; y1:=y0+x0-x1; fi % near-45$^\circ$ angle
  724. pos1(rule_thickness,90+theta); pos2(rule_thickness,90+theta);
  725. pos3(bar,theta); pos4(bar,theta);
  726. z3-z0=(-3u,.36asc_height) rotated theta;
  727. z4-z0=(-3u,-.36asc_height) rotated theta;
  728. pos5(bar,180); z5l=z0; pos6(bar,90); z6l=z0;
  729. z9=.381966[.5[z3,z4],z0];
  730. numeric t; path p; p=z4l{z9-z4}..z6r;
  731. t=xpart(p intersectiontimes (z1l--(z1l+2(z0-z1)))); z2l=point t of p;
  732. filldraw z0..{z4-z9}z4r
  733.  --subpath (0,t) of\\(z4l{z9-z4}..z6r)
  734.  --z2l---z1l..z1r---z2r
  735.  --subpath (t,0) of\\(z3l{z9-z3}..z5r)
  736.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  737. penlabels(0,1,2,3,4,5,6,9); endchar;
  738.  
  739. cmchar "Northwest arrow";
  740. beginchar(oct"055",18u#,asc_height#,asc_depth#);
  741. adjust_fit(0,0); pickup crisp.nib;
  742. x1+.5rule_thickness=hround(w-u); lft x0=hround u;
  743. y1-.5rule_thickness=-d; top y0=h;
  744. numeric theta,delta; theta=angle(z1-z0); delta=3u++.24asc_height;
  745. if abs(theta+45)<2.5: theta:=-45; y1:=y0+x0-x1; fi % near-45$^\circ$ angle
  746. pos1(rule_thickness,-90+theta); pos2(rule_thickness,-90+theta);
  747. pos3(bar,-180+theta); pos4(bar,-180+theta);
  748. z4-z0=(3u,.36asc_height) rotated theta;
  749. z3-z0=(3u,-.36asc_height) rotated theta;
  750. pos5(bar,0); z5l=z0; pos6(bar,-90); z6l=z0;
  751. z9=.381966[.5[z3,z4],z0];
  752. numeric t; path p; p=z4l{z9-z4}..z6r;
  753. t=xpart(p intersectiontimes (z1l--(z1l+2(z0-z1)))); z2l=point t of p;
  754. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  755.  --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
  756.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  757. penlabels(0,1,2,3,4,5,6,9); endchar;
  758.  
  759. cmchar "Southwest arrow";
  760. beginchar(oct"056",18u#,asc_height#,asc_depth#);
  761. adjust_fit(0,0); pickup crisp.nib;
  762. x1+.5rule_thickness=hround(w-u); lft x0=hround u;
  763. y1+.5rule_thickness=h; bot y0=-d;
  764. numeric theta,delta; theta=angle(z1-z0); delta=3u++.24asc_height;
  765. if abs(theta-45)<2.5: theta:=45; y1:=y0+x1-x0; fi % near-45$^\circ$ angle
  766. pos1(rule_thickness,-90+theta); pos2(rule_thickness,-90+theta);
  767. pos3(bar,-180+theta); pos4(bar,-180+theta);
  768. z4-z0=(3u,.36asc_height) rotated theta;
  769. z3-z0=(3u,-.36asc_height) rotated theta;
  770. pos5(bar,90); z5l=z0; pos6(bar,0); z6l=z0;
  771. z9=.381966[.5[z3,z4],z0];
  772. numeric t; path p; p=z4l{z9-z4}..z6r;
  773. t=xpart(p intersectiontimes (z1l--(z1l+2(z0-z1)))); z2l=point t of p;
  774. filldraw z0..{z4-z9}z4r
  775.  --subpath (0,t) of\\(z4l{z9-z4}..z6r)
  776.  --z2l---z1l..z1r---z2r
  777.  --subpath (t,0) of\\(z3l{z9-z3}..z5r)
  778.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  779. penlabels(0,1,2,3,4,5,6,9); endchar;
  780.  
  781. cmchar "Double leftward arrow";
  782. compute_spread(.45x_height#,.55x_height#);
  783. beginchar(oct"050",18u#,v_center(spread#+rule_thickness#));
  784. adjust_fit(0,0); pickup rule.nib;
  785. lft x7=hround u-eps; x8=x7; x1=x2=w-x7;
  786. y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
  787. draw z1--z7; draw z2--z8;  % bars
  788. pickup crisp.nib; lft x0=hround u-eps; y0=good.y math_axis;
  789. pos3(rule_thickness,0); pos4(rule_thickness,0);
  790. y3-y1=y2-y4=.36asc_height+eps; x3=x4=x0+6u+eps;
  791. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  792. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  793. z9=.381966[.5[z3,z4],z0];
  794. erase filldraw z0..{z3-z9}z3--(0,y3)
  795.  --(0,y4)--z4{z9-z4}..z0 & cycle;  % erase excess
  796. numeric t; path p; p=z4r{z9-z4}..z6r;
  797. t=xpart(p intersectiontimes((0,y0)--(w,y0)));
  798. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  799.  --subpath (t,0) of\\(z3r{z9-z3}..z5r)--z3l{z9-z3}..z0 & cycle;  % arrowhead
  800. penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
  801.  
  802. cmchar "Double rightward arrow";
  803. compute_spread(.45x_height#,.55x_height#);
  804. beginchar(oct"051",18u#,v_center(spread#+rule_thickness#));
  805. adjust_fit(0,0); pickup rule.nib;
  806. lft x1=hround u-eps; x2=x1; x7=x8=w-x1;
  807. y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
  808. draw z1--z7; draw z2--z8;  % bars
  809. pickup crisp.nib; rt x0=hround(w-u)+eps; y0=good.y math_axis;
  810. pos3(rule_thickness,0); pos4(rule_thickness,0);
  811. y3-y1=y2-y4=.36asc_height+eps; x3=x4=x0-6u-eps;
  812. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  813. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  814. z9=.381966[.5[z3,z4],z0];
  815. erase filldraw z0..{z3-z9}z3--(w,y3)
  816.  --(w,y4)--z4{z9-z4}..z0 & cycle;  % erase excess
  817. numeric t; path p; p=z4l{z9-z4}..z6r;
  818. t=xpart(p intersectiontimes((0,y0)--(w,y0)));
  819. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  820.  --subpath (t,0) of\\(z3l{z9-z3}..z5r)--z3r{z9-z3}..z0 & cycle;  % arrowhead
  821. penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
  822.  
  823. cmchar "Double upward arrow";
  824. beginchar(oct"052",12u#,asc_height#,asc_depth#);
  825. adjust_fit(0,0); pickup rule.nib;
  826. compute_spread(.45x_height#,.55x_height#);
  827. bot y1=bot y2=-d-eps; top y7=h; y8=y7;
  828. x1=x7; x2=x8; x1-x2=spread; .5[x1,x2]=crisp.lft hround(crisp.rt .5w);
  829. draw z1--z7; draw z2--z8;  % bars
  830. pickup crisp.nib; top y0=h+eps; x0=good.x .5w;
  831. pos3(rule_thickness,90); pos4(rule_thickness,90);
  832. x2-x3=x4-x1=4u+eps; y3=y4=y0-.48asc_height-eps;
  833. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  834. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  835. z9=.381966[.5[z3,z4],z0];
  836. erase filldraw z0..{z3-z9}z3--(x3,h)
  837.  --(x4,h)--z4{z9-z4}..z0 & cycle;  % erase excess
  838. numeric t; path p; p=z4l{z9-z4}..z6r;
  839. t=xpart(p intersectiontimes((x0,-d)--(x0,h)));
  840. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  841.  --subpath (t,0) of\\(z3l{z9-z3}..z5r)--z3r{z9-z3}..z0 & cycle;  % arrowhead
  842. penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
  843.  
  844. cmchar "Double downward arrow";
  845. beginchar(oct"053",12u#,asc_height#,asc_depth#);
  846. adjust_fit(0,0); pickup rule.nib;
  847. compute_spread(.45x_height#,.55x_height#);
  848. top y1=top y2=h+eps; bot y7=-d; y8=y7;
  849. x1=x7; x2=x8; x1-x2=spread; .5[x1,x2]=crisp.lft hround(crisp.rt .5w);
  850. draw z1--z7; draw z2--z8;  % bars
  851. pickup crisp.nib; bot y0=-d-eps; x0=good.x .5w;
  852. pos3(rule_thickness,90); pos4(rule_thickness,90);
  853. x2-x3=x4-x1=4u+eps; y3=y4=y0+.48asc_height-eps;
  854. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  855. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  856. z9=.381966[.5[z3,z4],z0];
  857. erase filldraw z0..{z3-z9}z3--(x3,-d)
  858.  --(x4,-d)--z4{z9-z4}..z0 & cycle;  % erase excess
  859. numeric t; path p; p=z4r{z9-z4}..z6r;
  860. t=xpart(p intersectiontimes((x0,-d)--(x0,h)));
  861. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  862.  --subpath (t,0) of\\(z3r{z9-z3}..z5r)--z3l{z9-z3}..z0 & cycle;  % arrowhead
  863. penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
  864.  
  865. cmchar "Double left-and-right arrow";
  866. compute_spread(.45x_height#,.55x_height#);
  867. beginchar(oct"054",18u#,v_center(spread#+rule_thickness#));
  868. adjust_fit(if monospace: -u#,-u# else: 0,0 fi); pickup rule.nib;
  869. lft x7=hround u-eps; x8=x7; x1=x2=w-x7;
  870. y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
  871. draw z1--z7; draw z2--z8;  % bars
  872. pickup crisp.nib; lft x0=hround u-o; y0=good.y math_axis;
  873. pos3(rule_thickness,0); pos4(rule_thickness,0);
  874. y3-y1=y2-y4=.36asc_height+eps; x3=x4=x0+5u+eps;
  875. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  876. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  877. z9=.381966[.5[z3,z4],z0];
  878. erase filldraw z0..{z3-z9}z3--(0,y3)
  879.  --(0,y4)--z4{z9-z4}..z0 & cycle;  % erase excess at left
  880. numeric t; path p; p=z4r{z9-z4}..z6r;
  881. t=xpart(p intersectiontimes((0,y0)--(w,y0)));
  882. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  883.  --subpath (t,0) of\\(z3r{z9-z3}..z5r)
  884.  --z3l{z9-z3}..z0 & cycle;  % left arrowhead
  885. rt x10=hround(w-u)+o; y10=good.y math_axis;
  886. pos13(rule_thickness,0); pos14(rule_thickness,0);
  887. y13=y3; y14=y4; x13=x14=x10-5u-eps;
  888. pos15(rule_thickness,angle(z14-z10)); z15l=z10;
  889. pos16(rule_thickness,angle(z13-z10)); z16l=z10;
  890. z19=.381966[.5[z13,z14],z10];
  891. erase filldraw z10..{z13-z19}z13--(w,y13)
  892.  --(w,y14)--z14{z19-z14}..z10 & cycle;  % erase excess at right
  893. numeric t; path p; p=z14l{z19-z14}..z16r;
  894. t=xpart(p intersectiontimes((0,y10)--(w,y10)));
  895. filldraw z10..{z14-z19}z14r--subpath (0,t) of\\(z14l{z19-z14}..z16r)
  896.  --subpath (t,0) of\\(z13l{z19-z13}..z15r)
  897.  --z13r{z19-z13}..z10 & cycle; % right arrowhead
  898. penlabels(0,1,2,3,4,5,6,7,8,9,10,13,14,15,16,19); endchar;
  899.  
  900. cmchar "Double up-and-down arrow";
  901. beginchar(oct"155",12u#,body_height#,paren_depth#);
  902. adjust_fit(0,0); pickup rule.nib;
  903. compute_spread(.45x_height#,.55x_height#);
  904. bot y1=bot y2=-d-eps; top y7=h; y8=y7;
  905. x1=x7; x2=x8; x1-x2=spread; .5[x1,x2]=crisp.lft hround(crisp.rt .5w);
  906. draw z1--z7; draw z2--z8;  % bars
  907. pickup crisp.nib; top y0=h+o; x0=good.x .5w;
  908. pos3(rule_thickness,90); pos4(rule_thickness,90);
  909. x2-x3=x4-x1=4u+eps; y3=y4=y0-.4asc_height-eps;
  910. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  911. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  912. z9=.381966[.5[z3,z4],z0];
  913. erase filldraw z0..{z3-z9}z3--(x3,h)
  914.  --(x4,h)--z4{z9-z4}..z0 & cycle;  % erase excess at top
  915. numeric t; path p; p=z4l{z9-z4}..z6r;
  916. t=xpart(p intersectiontimes((x0,-d)--(x0,h)));
  917. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  918.  --subpath (t,0) of\\(z3l{z9-z3}..z5r)
  919.  --z3r{z9-z3}..z0 & cycle;  % top arrowhead
  920. bot y10=-d-o; x10=good.x .5w;
  921. pos13(rule_thickness,90); pos14(rule_thickness,90);
  922. x13=x3; x14=x4; y13=y14=y10+.4asc_height-eps;
  923. pos15(rule_thickness,angle(z14-z10)); z15l=z10;
  924. pos16(rule_thickness,angle(z13-z10)); z16l=z10;
  925. z19=.381966[.5[z13,z14],z10];
  926. erase filldraw z10..{z13-z19}z13--(x13,-d)
  927.  --(x14,-d)--z14{z19-z14}..z10 & cycle;  % erase excess at bottom
  928. numeric t; path p; p=z14r{z19-z14}..z16r;
  929. t=xpart(p intersectiontimes((x10,-d)--(x10,h)));
  930. filldraw z10..{z14-z19}z14l--subpath (0,t) of\\(z14r{z19-z14}..z16r)
  931.  --subpath (t,0) of\\(z13r{z19-z13}..z15r)
  932.  --z13l{z19-z13}..z10 & cycle;  % bottom arrowhead
  933. penlabels(0,1,2,3,4,5,6,7,8,9,13,14,15,16,19); endchar;
  934.  
  935. cmchar "Infinity";
  936. beginchar(oct"061",18u#,x_height#,0);
  937. italcorr .7x_height#*slant-.5u#;
  938. adjust_fit(0,0); pickup fine.nib;
  939. numeric theta,phi;
  940. if monospace: phi=-theta=90;
  941. else: phi=angle(4u,h); theta=angle(6u,-h); fi
  942. pos1(.2[vair,curve],180); pos2(.6[vair,curve],90+.5theta); pos3(curve,90+theta);
  943. pos4(curve,90+theta); pos5(.6[vair,curve],90+.5theta);
  944. pos6(.2[vair,curve],180); pos7(.3[vair,curve],270+.5phi);
  945. pos8(.35[vair,curve],270+phi); pos9(.3[vair,curve],270+.5phi);
  946. lft x1r=w-rt x6l=hround u; x2=x9=.4[x1,x8]; x5=x7=.6[x8,x6];
  947. if monospace: x2l:=x2r; x5r:=x5l; x7r:=x7l; x9l:=x9r; fi
  948. y1=y6=.5h; top y2r=top y7l=h+oo; bot y5l=bot y9r=-oo;
  949. x8=.5[x3,x4]=.5w; y8=.5[y3,y4]=.5h;
  950. y3-y4=h/3; z3-z4=whatever*dir theta;
  951. filldraw stroke z1e{up}...z2e{right}...z3e---z4e...z5e{right}
  952.  ...z6e{up}...z7e{left}...{-dir phi}z8e...{left}z9e...z1e{up}; % bowls
  953. penlabels(1,2,3,4,5,6,7,8,9); endchar;
  954.  
  955. font_x_height x_height#;
  956. font_quad 18u#+4letter_fit#;
  957. % (The calling file should give the other math extension font parameters.)
  958.  
  959. bye.
  960.