[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

arrow kit (MF hackery)




Here's the latest of my MF hackery on the arrow kit. Changes include:

* Tried to make the use of hround(w-u)+eps vs. hround(w-u), etc.
  more consistent.  Also some fixes regarding lft/rt positioning.

* Cleaned up the code in a few cases.  Removed trailing whitespace.

* Adjusted the hookd and redesigned the curly arrows.

* Checked consistency of arrow designs: 

  While all the normal, siggle and dotted single/double arrow heads
  are based on the post-1992 CM designs (bigger and wider arrowheads), 
  the harpoons, the double arrows, featehrs, and double-headed arrows
  are still based on a modified  version of the old pre-1992 design.  

  The problems are these: Making the harpoon heads wider (as in
  post-1992 CM) is possible, but would be inconsistent with the double
  arrows.  Making the double arrows wider is not possible, however,
  since it would lead to overlaps if you have parallel arrow heads on
  the same side. (Two arrowheds of .24asc_height are just touching,
  but two arroheads of .36asc_height would overlap.  There woud be 
  no problem though for a single arrowhead of .36asc_height with a
  parallel line spaced .48asc_height away.)  Finally, making the 
  feather(s) wider might make them unsuitable for use as an arrow 
  end, which IMHO should be smaller than the arrowhead.  As for the
  double-headed arrows and thick arrows I'm not sure what to do.

* Some remaining tasks (and some potential for optimizing the code) 
  are indicated in the file header below.

This time I've included the whole file (packaged as shar file with
checksum) since a diff would have been bigger than the actual file.

Cheers, Ulrik.


#!/bin/sh
# This is a shell archive (produced by GNU sharut 4.2.1).
# To extract the files from this archive, save it to some FILE, remove
# everything before the `!/bin/sh' line above, then type `sh FILE'.
#
# Made on 1997-11-05 03:54 MET by <vieth@zarquon>.
# Source directory was `/home/vieth/misc/math-font/work/mathfont-0.54/yme'.
#
# Existing files will *not* be overwritten unless `-c' is specified.
#
# This shar contains:
# length mode       name
# ------ ---------- ------------------------------------------
#  57883 -rw-r--r-- ymearr.mf
#
save_IFS="${IFS}"
IFS="${IFS}:"
gettext_dir=FAILED
locale_dir=FAILED
first_param="$1"
for dir in $PATH
do
  if test "$gettext_dir" = FAILED && test -f $dir/gettext \
     && ($dir/gettext --version >/dev/null 2>&1)
  then
    set `$dir/gettext --version 2>&1`
    if test "$3" = GNU
    then
      gettext_dir=$dir
    fi
  fi
  if test "$locale_dir" = FAILED && test -f $dir/shar \
     && ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
  then
    locale_dir=`$dir/shar --print-text-domain-dir`
  fi
done
IFS="$save_IFS"
if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
then
  echo=echo
else
  TEXTDOMAINDIR=$locale_dir
  export TEXTDOMAINDIR
  TEXTDOMAIN=sharutils
  export TEXTDOMAIN
  echo="$gettext_dir/gettext -s"
fi
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    shar_n= shar_c='
'
  else
    shar_n=-n shar_c=
  fi
else
  shar_n= shar_c='\c'
fi
touch -am 1231235999 $$.touch >/dev/null 2>&1
if test ! -f 1231235999 && test -f $$.touch; then
  shar_touch=touch
else
  shar_touch=:
  echo
  $echo 'WARNING: not restoring timestamps.  Consider getting and'
  $echo "installing GNU \`touch', distributed in GNU File Utilities..."
  echo
fi
rm -f 1231235999 $$.touch
#
$echo $shar_n 'x -' 'lock directory' "\`_sh01268': "$shar_c
if mkdir _sh01268; then
  $echo 'created'
else
  $echo 'failed to create'
  exit 1
fi
# ============= ymearr.mf ==============
if test -f 'ymearr.mf' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'ymearr.mf' '(file already exists)'
else
  $echo 'x -' extracting 'ymearr.mf' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'ymearr.mf' &&
% experimental changes (UV, 31.10.97):
%
% arrow_ext_width#:=12u#;       (was: 14u#)
% 3/2arrow_ext_width#:=18u#;    (was: 4/3x, 18.66u#)
%
% more experimental changes (MC, 1.11.97):
%
% changed dot_sep to 1/6 arrow_ext_width
% made squiggly negation steeper
% made squiggly pieces shoot over a bit.
%
% still more changes (UV, 31.10.97):
%
% * checked arrow designs against Knuth's 1992 changes:
%
% - normal arrowheads (single/double/triple) use the new design
%   featuring wider and bigger arrowheads for single arrows
% - double-headed arrows and feathers, harpoons, double arrows,
%   continue to use the old (smaller) design
%
% TODO:
%
% - check design of thick arrowheads (bar -> rule_thickness)
% - check design of double-feathers vs. double-headed arrows
%
% - add slots for dashed arrows (no gapped versions needed):
%   left/right heads, left/right ends, extension, negated extension
%
% - optimize the code by saving frequently used building blocks,
%   e.g. arrowheads to be combined with bar, squiggle, dots
X
X
arrow_overshoot:=u-eps;
X
arrow_head_width#:=9u#;
arrow_ext_width#:=12u#;
arrow_gap_width#:=18u#;
X
dot_sep#:=arrow_ext_width#/6;
X
define_pixels(arrow_head_width,arrow_ext_width,arrow_gap_width);
define_whole_pixels(dot_sep);
X
def single_height = v_center(spread#+rule_thickness#) enddef;
def double_height = v_center(spread#+.48asc_height#) enddef;
def wide_double_height = v_center(.96asc_height#) enddef;
def triple_height = v_center(2spread#+.5asc_height#+rule_thickness#) enddef;
X
X
def char_negate(suffix c,t,b) = %c is center point; t is top point; b is bottom
pickup rule.nib;
w-x.t=x.b; y.t-y.c=y.c-y.b; draw z.t--z.b;
penlabels(t,c,b); enddef;
X
def char_center(suffix c) = % find center of type character
x.c=w/2; y.c=.5[-d,h]; enddef;
X
def fill_circle =
filldraw z8{right}...z1{z2-z8}...z2{down}...z3{z4-z2}...z4{left}
X  ...z5{z6-z4}...z6{up}...z7{z8-z6}...cycle;  % circle and interior
enddef;
X
X
% ?? left heads
X
cmchar "Single left arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_head,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis;
x1=hround(w+arrow_overshoot); lft x0=hround u-eps;
y3-y0=y0-y4=if monospace:.24 else:.36 fi asc_height+eps;
x3=x4=x0+if monospace:3u else:4u fi+eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.2[.5[z3,z4],z0];
numeric t; path p; p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
X --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
penlabels(0,1,2,3,4,5,6,9); endchar;
X
cmchar "Double left arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Head,arrow_head_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x1=x2=hround(w+arrow_overshoot); lft x7=hround u-eps; x8=x7;
y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
draw z1--z7; draw z2--z8;  % bars
pickup crisp.nib;
lft x0=hround u-eps; y0=good.y math_axis;
pos3(rule_thickness,0); pos4(rule_thickness,0);
y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0+6u+eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
erase filldraw z0..{z3-z9}z3--(0,y3)
X --(0,y4)--z4{z9-z4}..z0 & cycle;  % erase excess
numeric t; path p; p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y0)--(w,y0)));
filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --subpath (t,0) of\\(z3r{z9-z3}..z5r)--z3l{z9-z3}..z0 & cycle;  % arrowhead
penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
X
cmchar "Triple left arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_HEAD,arrow_head_width#,triple_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis;
x1=hround(w+arrow_overshoot); lft x0=hround u-eps;
x0'=x0''=x0; x1'=x1''=x1; y1'-y1=y1-y1''=spread; y0'=y1'; y0''=y1'';
pickup rule.nib;
draw z0'--z1'; draw z0''--z1''; % bars
pickup crisp.nib;
y3-y0'=y0''-y4=.24asc_height+eps; x3=x4=x0+6u+eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
erase filldraw z0..{z3-z9}z3--(0,y3)
X --(0,y4)--z4{z9-z4}..z0& cycle;
numeric t; path p; p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
%pickup rule.nib; draw z2--z1; pickup crisp.nib;
filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
X --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
penlabels(0,1,2,3,4,5,6,9,0',0'',1',1''); endchar;
X
cmchar "Thick left arrow head";
beginchar(slot_thickhead,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
penpos1(rule_thickness,90); penpos2(rule_thickness,90);
penpos3(bar,0); penpos4(bar,0);
y0=y1=y2=math_axis;
x1=hround(w+arrow_overshoot); lft x0=hround u-eps;
y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
penpos5(bar,angle(z4-z0)); z5l=z0;
penpos6(bar,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
numeric t; path p; p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --subpath (t,0) of\\(z3r{z9-z3}..z5r)
X --z3l{z9-z3}..z0 & cycle;  % arrowhead without stem
pickup rule.nib; draw z1--z2;  % stem
penlabels(0,1,2,3,4,5,6,9); endchar;
X
cmchar "Left double arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_doublehead,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis;
x1=hround(w+arrow_overshoot); lft x0=hround u-eps;
y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
numeric t; path p;  p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
path p; p=z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --z2l--z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
X --z3l{z9-z3}..z0 & cycle; % second arrowhead
filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
X --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
filldraw p shifted (x3r-x0,0);
penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
X
cmchar "Left feather";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_feather,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis;
x1-.5rule_thickness=hround 1.5u; rt x0=hround(w-3u);
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; p=z4l{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
path p; p=z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
X --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
path arrow;
arrow=z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
X --subpath (t,0) of\\(z3l{z9-z3}..z5r)
X --z3r{z9-z3}..z0 & cycle;
%p:=p shifted (2u,0); filldraw p;
arrow:=arrow shifted (7u-w+rule_thickness,0); filldraw arrow;
x11=hround(w+arrow_overshoot); x12=hround(3u+rule_thickness);
y11=y12=math_axis;
pickup rule.nib;
draw z11---z12;
penlabels(0,1,2,3,4,5,6,9,11,12); endchar;
X
cmchar "Left feathers";
beginchar(slot_feathers,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw arrow;
path p; p:= arrow shifted (3u,0); filldraw p;
x11=hround(w+arrow_overshoot); x12=hround(3u+rule_thickness);
y11=y12=math_axis;
pickup rule.nib;
draw z11---z12;
endchar;
X
cmchar "Single left mapsto head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_mapsfrom,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
lft x1=hround u; x2=hround(w+arrow_overshoot); x3=x4=x1;
y1=y2=math_axis; y3-y1=y1-y4=.24asc_height+eps;
draw z3--z4;  % stem
draw z1--z2;  % bar stub
penlabels(1,2,3,4); endchar;
X
cmchar "Double left mapsto head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Mapsfrom,arrow_head_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
lft x1=hround u; x6=x2=hround(w+arrow_overshoot); x5=x3=x4=x1;
X.5[y1,y5]=math_axis; y5-y1=spread;
y3-y5=y1-y4=.24asc_height+eps;
y1=y2; y5=y6;
draw z3--z4;  % stem
draw z1--z2;  % bar stub
draw z5--z6;  % bar stub
penlabels(1,2,3,4,5,6); endchar;
X
cmchar "Triple left mapsto head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_MAPSfrom,arrow_head_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
lft x1=hround u; x6=x8=x2=hround(w+arrow_overshoot); x5=x7=x3=x4=x1;
y1=y2=math_axis; y5=y6; y7=y8; y5-y1=y1-y7=spread;
y3-y5=y7-y4=.24asc_height+eps;
draw z3--z4;  % stem
draw z1--z2;  % bar stub
draw z5--z6;  % bar stub
draw z7--z8;  % bar stub
penlabels(1,2,3,4,5,6,7,8); endchar;
X
% ?? right heads
X
cmchar "Single right arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_headright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis;
x1=hround(-arrow_overshoot); rt x0=hround(w-u)+eps;
y3-y0=y0-y4=if monospace:.24 else:.36 fi asc_height+eps;
x3=x4=x0-if monospace:3u else:4u fi-eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.2[.5[z3,z4],z0];
numeric t; path p; p=z4l{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
X --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
penlabels(0,1,2,3,4,5,6,9); endchar;
X
cmchar "Double right arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Headright,arrow_head_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x1=x2=hround(-arrow_overshoot); rt x7=hround(w-u)+eps; x8=x7;
y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
draw z1--z7; draw z2--z8;  % bars
pickup crisp.nib;
rt x0=hround(w-u)+eps; y0=good.y math_axis;
pos3(rule_thickness,0); pos4(rule_thickness,0);
y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0-6u-eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
erase filldraw z0..{z3-z9}z3--(w,y3)
X --(w,y4)--z4{z9-z4}..z0 & cycle;  % erase excess
numeric t; path p; p=z4l{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y0)--(w,y0)));
filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
X --subpath (t,0) of\\(z3l{z9-z3}..z5r)--z3r{z9-z3}..z0 & cycle;  % arrowhead
penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
X
cmchar "Triple right arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_HEADright,arrow_head_width#,triple_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis;
x1=hround(-arrow_overshoot); rt x0=hround(w-u)+eps;
x0'=x0''=x0; x1'=x1''=x1; y1'-y1=y1-y1''=spread; y0'=y1'; y0''=y1'';
pickup rule.nib;
draw z0'--z1'; draw z0''--z1''; % bars
pickup crisp.nib;
y3-y0'=y0''-y4=.24asc_height+eps; x3=x4=x0-6u-eps;
pos5(rule_thickness,angle(z0-z4)); z5r=z0;
pos6(rule_thickness,angle(z0-z3)); z6r=z0;
z9=.381966[.5[z3,z4],z0];
erase filldraw z0..{z3-z9}z3--(w,y3)
X --(w,y4)--z4{z9-z4}..z0& cycle;
numeric t; path p; p=z4l{z9-z4}..z6l;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
%pickup rule.nib; draw z2--z1; pickup crisp.nib;
filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6l)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5l)
X --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
penlabels(0,1,2,3,4,5,6,9,0',0'',1',1''); endchar;
X
cmchar "Thick right arrow head";
beginchar(slot_thickheadright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
penpos1(rule_thickness,90); penpos2(rule_thickness,90);
penpos3(bar,0); penpos4(bar,0);
y0=y1=y2=math_axis;
x1=hround(-arrow_overshoot); rt x0=hround(w-u)+eps;
y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0-3u-eps;
penpos5(bar,angle(z4-z0)); z5l=z0;
penpos6(bar,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
numeric t; path p; p=z4l{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
X --subpath (t,0) of\\(z3l{z9-z3}..z5r)
X --z3r{z9-z3}..z0 & cycle;  % arrowhead without stem
pickup rule.nib; draw z1--z2;  % stem
penlabels(0,1,2,3,4,5,6,9); endchar;
X
cmchar "Right double arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_doubleheadright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis;
x1=hround(-arrow_overshoot); rt x0=hround(w-u)+eps;
y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0-3u-eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
numeric t; path p; p=z4l{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l)));  x2=xpart point t of p;
path p; p=z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
X --z2l--z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
X --z3r{z9-z3}..z0 & cycle; % second arrowhead
filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
X --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
filldraw p shifted (x3l-x0,0);
penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
X
cmchar "Right feather";
beginchar(slot_featherright,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup crisp.nib;
X arrow:=arrow reflectedabout ((w/2+eps,-d),(w/2+eps,h));
filldraw arrow;
x11=hround(-arrow_overshoot); x12=hround(w-3u-rule_thickness);
y11=y12=math_axis;
pickup rule.nib;
draw z11---z12;
endchar;
X
cmchar "Right feathers";
beginchar(slot_feathersright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
p:= p reflectedabout ((w/2+eps,-d),(w/2+eps,h));
filldraw p; filldraw arrow;
x11=hround(-arrow_overshoot); x12=hround(w-3u-rule_thickness);
y11=y12=math_axis;
pickup rule.nib;
draw z11---z12;
endchar;
X
cmchar "Single right mapsto";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_mapsfromright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
rt x1=hround(w-u); x2=hround(-arrow_overshoot); x3=x4=x1;
y1=y2=math_axis; y3-y1=y1-y4=.24asc_height+eps;
draw z3--z4;  % stem
draw z1--z2;  % bar stub
penlabels(1,2,3,4); endchar;
X
cmchar "Double right mapsto";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Mapsfromright,arrow_head_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
rt x1=hround(w-u); x6=x2=hround(-arrow_overshoot); x5=x3=x4=x1;
X.5[y1,y5]=math_axis; y5-y1=spread; y1=y2; y5=y6;
y3-y5=y1-y4=.24asc_height+eps;
draw z3--z4;  % stem
draw z1--z2;  % bar stub
draw z5--z6;  % bar stub
penlabels(1,2,3,4,5,6); endchar;
X
cmchar "Triple right mapsto";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_MAPSfromright,arrow_head_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
rt x1=hround(w-u); x6=x8=x2=hround(-arrow_overshoot); x5=x7=x3=x4=x1;
y1=y2=math_axis; y5=y6; y7=y8; y5-y1=y1-y7=spread;
y3-y5=y7-y4=.24asc_height+eps;
draw z3--z4;  % stem
draw z1--z2;  % bar stub
draw z5--z6;  % bar stub
draw z7--z8;  % bar stub
penlabels(1,2,3,4,5,6,7,8); endchar;
X
% 4 special left heads
X
cmchar "Squiggly left arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_squighead,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis; x1=hround(w-2u); lft x0=hround u-eps;
y3-y0=y0-y4=if monospace:.24 else:.36 fi asc_height+eps;
x3=x4=x0+if monospace:3u else:4u fi+eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.2[.5[z3,z4],z0];
numeric t; path p; p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
X --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
x10=w; y10=math_axis+.12asc_height+eps;
x11=x10+o; y11=y10;
pickup rule.nib;
draw z1{right}..z10{right}..z11;
penlabels(0,1,2,3,4,5,6,9,10); endchar;
X
cmchar "Single left dashed arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_dashhead,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis; x1=x2+eps; lft x0=hround u-eps;
y3-y0=y0-y4=if monospace:.24 else:.36 fi asc_height+eps;
x3=x4=x0+if monospace:3u else:4u fi+eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.2[.5[z3,z4],z0];
numeric t; path p; p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
X --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
pickup rule.nib;
y13=y12=y11=y10=y0; x10=w-.5dot_sep;
x12-x13=x11-x12=x10-x11=dot_sep;
drawdot z10; drawdot z11; drawdot z12;
penlabels(0,1,2,3,4,5,6,9,10,11,12); endchar;
X
cmchar "Double left dashed arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Dashhead,arrow_head_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
lft x7=hround u-eps; x8=x7; x1=x2=hround(w+arrow_overshoot);
y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
X
y20=y21=y22=y1;
y30=y31=y32=y2;
x20=x30=w-.5dot_sep;
x20-x21=x21-x22=x30-x31=x31-x32=dot_sep;
drawdot z20; drawdot z21; drawdot z22;
drawdot z30; drawdot z31; drawdot z32;
X
pickup crisp.nib;
lft x0=hround u-eps; y0=good.y math_axis;
pos3(rule_thickness,0); pos4(rule_thickness,0);
y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0+6u+eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
erase filldraw z0..{z3-z9}z3--(0,y3)
X --(0,y4)--z4{z9-z4}..z0 & cycle;  % erase excess
numeric t; path p; p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y0)--(w,y0)));
filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --subpath (t,0) of\\(z3r{z9-z3}..z5r)--z3l{z9-z3}..z0 & cycle;  % arrowhead
penlabels(0,1,2,3,4,5,6,7,8,9,20,21,30,31); endchar;
X
cmchar "Triple left dashed arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_DASHhead,arrow_head_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis; x1=x2+eps;
lft x0=hround u-eps; x0'=x0''=x0; y0'-y0=y0-y0''=spread;
X
x53=x53'=x53''=w-.5dot_sep;
x51-x50=x52-x51=x53-x52=dot_sep;
x50=x50'=x50''; x51=x51'=x51''; x52=x52'=x52'';
y50=y51=y52=y53=math_axis;
y50'=y51'=y52'=y53'=math_axis+spread;
y50''=y51''=y52''=y53''=math_axis-spread;
drawdot z50; drawdot z51; drawdot z52; drawdot z53;
drawdot z50'; drawdot z51'; drawdot z52'; drawdot z53';
drawdot z50''; drawdot z51''; drawdot z52''; drawdot z53'';
X
pickup crisp.nib;
y3-y0'=y0''-y4=.24asc_height+eps; x3=x4=x0+6u+eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
erase filldraw z0..{z3-z9}z3--(0,y3)
X --(0,y4)--z4{z9-z4}..z0& cycle;
numeric t; path p; p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
X --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
penlabels(0,1,2,3,4,5,6,9,0',0''); endchar;
X
% 4 special right heads
X
cmchar "Squiggly right arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_squigright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis; x1=hround (2u); rt x0=hround(w-u)+eps;
y3-y0=y0-y4=if monospace:.24 else:.36 fi asc_height+eps;
x3=x4=x0-if monospace:3u else:4u fi-eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.2[.5[z3,z4],z0];
numeric t; path p; p=z4l{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
X --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
x10=0; y10=math_axis+.12asc_height+eps;
x11=-o; y11=y10;
pickup rule.nib;
draw z11..z10{right}..z1{right};
penlabels(0,1,2,3,4,5,6,9,10); endchar;
X
cmchar "Single right dashed arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_dashright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis; x1=x2-eps; rt x0=hround(w-u)+eps;
y3-y0=y0-y4=if monospace:.24 else:.36 fi asc_height+eps;
x3=x4=x0-if monospace:3u else:4u fi-eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.2[.5[z3,z4],z0];
numeric t; path p; p=z4l{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
X --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
pickup rule.nib;
y13=y12=y11=y10=y0; x10=.5dot_sep;
x13-x12=x12-x11=x11-x10=dot_sep;
drawdot z10; drawdot z11; drawdot z12; drawdot z13;
penlabels(0,1,2,3,4,5,6,9,10,11,12); endchar;
X
cmchar "Double right dashed arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Dashright,arrow_head_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x1=x2=hround(-arrow_overshoot); rt x7=w-hround u-eps; x8=x7;
y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
X
y20=y21=y22=y1;
y30=y31=y32=y2;
x20=x30=.5dot_sep;
x21-x20=x22-x21=x31-x30=x32-x31=dot_sep;
drawdot z20; drawdot z21; drawdot z22;
drawdot z30; drawdot z31; drawdot z32;
X
pickup crisp.nib;
rt x0=hround(w-u)+eps; y0=good.y math_axis;
pos3(rule_thickness,0); pos4(rule_thickness,0);
y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0-6u-eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
erase filldraw z0..{z3-z9}z3--(w,y3)
X --(w,y4)--z4{z9-z4}..z0 & cycle;  % erase excess
numeric t; path p; p=z4l{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y0)--(w,y0)));
filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
X --subpath (t,0) of\\(z3l{z9-z3}..z5r)--z3r{z9-z3}..z0 & cycle;  % arrowhead
penlabels(0,1,2,3,4,5,6,7,8,9,20,21,30,31); endchar;
X
cmchar "Triple right dashed arrow head";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_DASHright,arrow_head_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis; x1=x2-eps; rt x0=hround(w-u)+eps;
x0'=x0''=x0; y0'-y0=y0-y0''=spread;
X
x50=x50'=x50''=.5dot_sep;
x51-x50=x52-x51=x53-x52=dot_sep;
x51=x51'=x51'';x 52=x52'=x52''; x53=x53'=x53'';
y50=y51=y52=y53=math_axis;
y50'=y51'=y52'=y53'=math_axis+spread;
y50''=y51''=y52''=y53''=math_axis-spread;
drawdot z50; drawdot z51; drawdot z52; drawdot z53;
drawdot z50'; drawdot z51'; drawdot z52'; drawdot z53';
drawdot z50''; drawdot z51''; drawdot z52''; drawdot z53'';
X
pickup crisp.nib;
y3-y0'=y0''-y4=.24asc_height+eps; x3=x4=x0-6u-eps;
penpos5(bar,angle(z0-z4)); z5r=z0;
penpos6(bar,angle(z0-z3)); z6r=z0;
z9=.381966[.5[z3,z4],z0];
erase filldraw z0..{z3-z9}z3--(w,y3)
X --(w,y4)--z4{z9-z4}..z0& cycle;
numeric t; path p; p=z4l{z9-z4}..z6l;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6l)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5l)
X --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
penlabels(0,1,2,3,4,5,6,9,0',0''); endchar;
X
% 8 simple left arrow ends
X
cmchar "Single left arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_NONE,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
lft x1=hround u; x2=hround(w+arrow_overshoot);
y1=y2=math_axis;
draw z1--z2;
penlabels(1,2); endchar;
X
cmchar "Double left arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Headnone,arrow_head_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
lft x1=hround u; x1=x3; x2=x4=hround(w+arrow_overshoot);
y1=y2; y3=y4; y1-y3=spread; .5[y1,y3]=math_axis;
draw z1--z2; draw z3--z4;  % bars
penlabels(1,2,3,4); endchar;
X
cmchar "Wide double left arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_arrowsnone,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup rule.nib;
lft x1=hround u; x1=x3; x2=x4=hround(w+arrow_overshoot);
y1=y2=math_axis+.24asc_height+eps;
y3=y4=math_axis-.24asc_height-eps;
draw z1--z2; draw z3--z4;  % bars
penlabels(1,2,3,4); endchar;
X
cmchar "Triple left arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_HEADnone,arrow_head_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
lft x1=hround u; x1=x3=x5; x2=x4=x6=hround(w+arrow_overshoot);
y1=y2; y3=y4=math_axis; y5=y6; y1-y3=y3-y5=spread;
draw z1--z2; draw z3--z4; draw z5--z6; % bars
penlabels(1,2,3,4,5,6); endchar;
X
cmchar "Left squiggly arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_squignone,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
squig_u:=.25arrow_ext_width;
acc_w:=0;
x2:=w; y2:=math_axis+.12asc_height+eps;
x0=x2+o; y0=y2; draw z0..z2;
forever:
X exitif (acc_w+squig_u > w);
X x1:=x2; y1:=y2;
X x2:=x1-squig_u; y2:=math_axis-(y1-math_axis);
X draw z1{left}..{left}z2;
X acc_w:=acc_w+squig_u;
endfor
penlabels(1,2,3); endchar;
X
cmchar "Single left dashed arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_dashnone,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
2(w-x10)=dot_sep; y10=math_axis; drawdot z10;
for j=11 thru 14:
X  x[j-1]-x[j]=dot_sep; y[j]=y[j-1]; drawdot z[j];
endfor
penlabels(range 10 thru 14); endchar;
X
cmchar "Double left dashed arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Dashnone,arrow_head_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x10=x20=w-.5dot_sep;
y10-y20=spread; .5[y10,y20]=math_axis;
drawdot z10; drawdot z20;
for j=11 thru 14:
X  x[j-1]-x[j]=dot_sep; y[j]=y[j-1]; drawdot z[j];
X  x[j]=x[j+10]; y[j+10]=y[j+10-1]; drawdot z[j+10];
endfor
penlabels(range 10 thru 14,range 20 thru 24); endchar;
X
cmchar "Triple left dashed arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_DASHnone,arrow_head_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
x10=x20=x30=w-.5dot_sep;
y10-y20=y20-y30=spread; .5[y10,y30]=math_axis;
drawdot z10; drawdot z20; drawdot z30;
for j=11 thru 14:
X  x[j-1]-x[j]=dot_sep; y[j]=y[j-1]; drawdot z[j];
X  x[j]=x[j+10]=x[j+20];
X  y[j+10]=y[j+10-1]; drawdot z[j+10];
X  y[j+20]=y[j+20-1]; drawdot z[j+20];
endfor
penlabels(range 10 thru 14,range 20 thru 24,range 30 thru 34); endchar;
X
% 8 simple right arrow ends
X
cmchar "Single right arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_headrightnone,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
rt x1=hround(w-u); x2=hround(-arrow_overshoot);
y1=y2=math_axis;
draw z1--z2;
penlabels(1,2); endchar;
X
cmchar "Double right arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Headrightnone,arrow_head_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
rt x1=hround(w-u); x1=x3; x2=x4=hround(-arrow_overshoot);
y1=y2; y3=y4; y1-y3=spread; .5[y1,y3]=math_axis;
draw z1--z2; draw z3--z4;  % bars
penlabels(1,2,3,4); endchar;
X
cmchar "Wide double right arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_arrowsrightnone,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup rule.nib;
rt x1=hround(w-u); x1=x3; x2=x4=hround(-arrow_overshoot);
y1=y2=math_axis+.24asc_height+eps;
y3=y4=math_axis-.24asc_height-eps;
draw z1--z2; draw z3--z4;  % bars
penlabels(1,2,3,4); endchar;
X
cmchar "Triple right arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_HEADrightnone,arrow_head_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
rt x1=hround(w-u); x1=x3=x5; x2=x4=x6=hround(-arrow_overshoot);
y1=y2; y3=y4=math_axis; y5=y6; y1-y3=y3-y5=spread;
draw z1--z2; draw z3--z4; draw z5--z6; % bars
penlabels(1,2,3,4,5,6); endchar;
X
cmchar "Right squiggly arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_squigrightnone,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
squig_u:=.25arrow_ext_width;
acc_w:=0;
x2:=0; y2:=math_axis+.12asc_height+eps;
x0=x2-o; y0=y2; draw z0..z2;
forever:
X exitif (acc_w+squig_u > w);
X x1:=x2; y1:=y2;
X x2:=x1+squig_u; y2:=math_axis-(y1-math_axis);
X draw z1{right}..{right}z2;
X acc_w:=acc_w+squig_u;
endfor
penlabels(1,2,3); endchar;
X
cmchar "Single right dashed arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_dashrightnone,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
x10=.5dot_sep; y10=math_axis; drawdot z10;
for j=11 thru 14:
X  x[j]-x[j-1]=dot_sep; y[j]=y[j-1]; drawdot z[j];
endfor
penlabels(range 10 thru 14); endchar;
X
cmchar "Double right dashed arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Dashrightnone,arrow_head_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x10=x20=.5dot_sep;
y10-y20=spread; .5[y10,y20]=math_axis;
drawdot z10; drawdot z20;
for j=11 thru 14:
X  x[j]-x[j-1]=dot_sep; y[j]=y[j-1]; drawdot z[j];
X  x[j]=x[j+10]; y[j+10]=y[j+10-1]; drawdot z[j+10];
endfor
penlabels(range 10 thru 14,range 20 thru 24); endchar;
X
cmchar "Triple right dashed arrow end";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_DASHrightnone,arrow_head_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
x10=x20=x30=.5dot_sep;
y10-y20=y20-y30=spread; .5[y10,y30]=math_axis;
drawdot z10; drawdot z20; drawdot z30;
for j=11 thru 14:
X  x[j]-x[j-1]=dot_sep; y[j]=y[j-1]; drawdot z[j];
X  x[j]=x[j+10]=x[j+20];
X  y[j+10]=y[j+10-1]; drawdot z[j+10];
X  y[j+20]=y[j+20-1]; drawdot z[j+20];
endfor
penlabels(range 10 thru 14,range  20 thru 24,range  30 thru 34); endchar;
X
% 6 arrow extension pieces
X
cmchar "Single arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_singleext,arrow_ext_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
x1=hround(-arrow_overshoot); x2=w-x1;
y1=y2=math_axis;
draw z1--z2;  % bar
penlabels(1,2); endchar;
X
cmchar "Double arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_doubleext,arrow_ext_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x1=x3=hround(-arrow_overshoot); x2=x4=w-x1;
y1=y2; y3=y4; y1-y3=spread; .5[y1,y3]=math_axis;
draw z1--z2;  % upper bar
draw z3--z4;  % lower bar
penlabels(1,2,3,4); endchar;
X
cmchar "Wide double arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_widedoubleext,arrow_ext_width#,wide_double_height);
adjust_fit(0,0); pickup rule.nib;
x1=x3=hround(-arrow_overshoot); x2=x4=w-x1;
y1=y2=math_axis+.24asc_height+eps;
y3=y4=math_axis-.24asc_height-eps;
draw z1--z2;  % upper bar
draw z3--z4;  % lower bar
penlabels(1,2,3,4); endchar;
X
cmchar "Triple arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_tripleext,arrow_ext_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
x1=x3=x5=hround(-arrow_overshoot); x2=x4=x6=w-x1;
y1=y2; y3=y4=math_axis; y5=y6; y1-y3=y3-y5=spread;
draw z1--z2;  % upper bar
draw z3--z4;  % lower bar
draw z5--z6;  % middle bar
penlabels(1,2,3,4,5,6); endchar;
X
cmchar "Squiggly arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_SQUIG,arrow_ext_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
y2=y4; y1=y3=y5; y3-y4=.24asc_height+eps;
X.5[y3,y4]=math_axis;
x2-x1=x3-x2=x4-x3=x5-x4;
x1=0; x5=w;
x0=x1-o;x6=x5+o;
y0=y1; y6=y5;
draw z0..z1{right}..z2{right}..z3{right}..z4{right}..{right}z5..z6;
penlabels(1,2,3,4,5); endchar;
X
cmchar "Squiggly left gaped arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_squiggapleft,arrow_ext_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
y2=y4; y1=y3=y5; y3-y4=.24asc_height+eps;
X.5[y3,y4]=math_axis;
x2-x1=x3-x2=x4-x3=x5-x4;
x1=0; x5=w;
x0=x1-o; y0=y1;
path p; p:=z1{right}..z2{right}..z3{right}..z4{right}..{right}z5;
numeric t; t=xpart(p intersectiontimes((5/6w,-d)--(5/6w,h)));
draw z0..z1{right}..z2{right}..z3{right}..
X        z4{right}..{direction t of p}(point t of p);
penlabels(1,2,3,4,5); endchar;
X
cmchar "Squiggly right gaped arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_squiggapright,arrow_ext_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
y2=y4; y1=y3=y5; y3-y4=.24asc_height+eps;
X.5[y3,y4]=math_axis;
x2-x1=x3-x2=x4-x3=x5-x4;
x1=0; x5=w;
x6=x5+o; y5=y6;
path p; p:=z1{right}..z2{right}..z3{right}..z4{right}..{right}z5;
numeric t; t=xpart(p intersectiontimes((1/6w,-d)--(1/6w,h)));
draw (point t of p){direction t of p}..z2{right}..z3{right}..
X    z4{right}..{right}z5..z6;
penlabels(1,2,3,4,5); endchar;
X
cmchar "Single dashed arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_DASH,arrow_ext_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
x0=0; y0=math_axis;
2(x1-x0)=dot_sep; y1=y0; drawdot z1;
for j=2 thru 6:
X  x[j]-x[j-1]=dot_sep; y[j]=y[j-1]; drawdot z[j];
endfor
penlabels(0,range 1 thru 6); endchar;
X
cmchar "Double dashed arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Dashext,arrow_ext_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x0=x10=0; y0-y10=spread; .5[y0,y10]=math_axis;
2(x1-x0)=dot_sep; x1=x11; y1=y0; y11=y10;
drawdot z1; drawdot z11;
for j=2 thru 6:
X  x[j]-x[j-1]=dot_sep; y[j]=y[j-1]; drawdot z[j];
X  x[j]=x[j+10]; y[j+10]=y[j+10-1]; drawdot z[j+10];
endfor
penlabels(0,range 1 thru 6,range 11 thru 16); endchar;
X
cmchar "Triple dashed arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_DASHext,arrow_ext_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
x0=x10=x20=0; y0-y10=y10-y20=spread; .5[y0,y20]=math_axis;
2(x1-x0)=dot_sep; x1=x11=x21; y1=y0; y11=y10; y21=y20;
drawdot z1; drawdot z11; drawdot z21;
for j=2 thru 6:
X  x[j]-x[j-1]=dot_sep; y[j]=y[j-1]; drawdot z[j];
X  x[j]=x[j+10]=x[j+20];
X  y[j+10]=y[j+10-1]; drawdot z[j+10];
X  y[j+20]=y[j+20-1]; drawdot z[j+20];
endfor
penlabels(0,range 1 thru 6,range 11 thru 16,range 21 thru 26); endchar;
X
% 8 arrow negation pieces
X
cmchar "Single arrow negation";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_NEG,4u#,single_height);
adjust_fit(-(2u#+letter_fit#),-(2u#+letter_fit#)); pickup rule.nib;
y1=math_axis;
y3-y1=.24asc_height+eps;
char_center(100); top y101=top y3; x101=x100+2u;
char_negate(100,101,102);
endchar;
X
cmchar "Double arrow negation";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_doubleneg,4u#,double_height);
adjust_fit(-(2u#+letter_fit#),-(2u#+letter_fit#)); pickup rule.nib;
y1-y3=spread; .5[y1,y3]=math_axis;
y5-y1=.24asc_height+eps;
char_center(100); top y101=top y5; x101=x100+2u;
char_negate(100,101,102);
endchar;
X
cmchar "Wide double arrow negation";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_widedoubleneg,4u#,wide_double_height);
adjust_fit(-(2u#+letter_fit#),-(2u#+letter_fit#)); pickup rule.nib;
y1=math_axis+.24asc_height+eps;
y5-y1=.24asc_height+eps;
char_center(100); top y101=top y5; x101=x100+2u;
char_negate(100,101,102);
endchar;
X
cmchar "Triple arrow negation";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_tripleneg,4u#,triple_height);
adjust_fit(-(2u#+letter_fit#),-(2u#+letter_fit#)); pickup rule.nib;
y1-y3=2spread; .5[y1,y3]=math_axis;
y5-y1=.24asc_height+eps;
char_center(100); top y101=top y5; x101=x100+2u;
char_negate(100,101,102);
endchar;
X
cmchar "Squiggly arrow negation";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_squigneg,3u#,single_height);
adjust_fit(-(1.5u#+letter_fit#),-(1.5u#+letter_fit#)); pickup rule.nib;
y1=math_axis;
y3-y1=.24asc_height+eps;
char_center(100); top y101=top y3; x101=x100+1.5u;
char_negate(100,101,102);
endchar;
X
cmchar "Single dashed arrow negation";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_dashneg,4u#,single_height);
adjust_fit(-(2u#+letter_fit#),-(2u#+letter_fit#));  pickup rule.nib;
y1=math_axis;
y3-y1=.24asc_height+eps;
char_center(100); top y101=top y3; x101=x100+2u;
char_negate(100,101,102);
endchar;
X
cmchar "Double dashed arrow negation";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Dashneg,4u#,double_height);
adjust_fit(-(2u#+letter_fit#),-(2u#+letter_fit#));  pickup rule.nib;
y1-y3=spread; .5[y1,y3]=math_axis;
y5-y1=.24asc_height+eps;
char_center(100); top y101=top y5; x101=x100+2u;
char_negate(100,101,102);
endchar;
X
cmchar "Triple dashed arrow negation";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_DASHneg,4u#,triple_height);
adjust_fit(-(2u#+letter_fit#),-(2u#+letter_fit#));  pickup rule.nib;
y1-y3=2spread; .5[y1,y3]=math_axis;
y5-y1=.24asc_height+eps;
char_center(100); top y101=top y5; x101=x100+2u;
char_negate(100,101,102);
endchar;
X
% 8 arrow negated extensions
X
cmchar "Single negated arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_NEGEXT,arrow_ext_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
x1=hround(-arrow_overshoot); x2=w-x1;
y1=y2=math_axis;
draw z1--z2;  % bar
y3-y1=.24asc_height+eps;
char_center(100); top y101=top y3; x101=x100+2u;
char_negate(100,101,102);
penlabels(1,2); endchar;
X
cmchar "Double negated arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_doublenegext,arrow_ext_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x1=x3=hround(-arrow_overshoot); x2=x4=w-x1;
y1=y2; y3=y4; y1-y3=spread; .5[y1,y3]=math_axis;
draw z1--z2;  % upper bar
draw z3--z4;  % lower bar
y5-y1=.24asc_height+eps;
char_center(100); top y101=top y5; x101=x100+2u;
char_negate(100,101,102);
penlabels(1,2,3,4); endchar;
X
cmchar "Wide double negated arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_widedoublenegext,arrow_ext_width#,wide_double_height);
adjust_fit(0,0); pickup rule.nib;
x1=x3=hround(-arrow_overshoot); x2=x4=w-x1;
y1=y2=math_axis+.24asc_height+eps;
y3=y4=math_axis-.24asc_height-eps;
draw z1--z2;  % upper bar
draw z3--z4;  % lower bar
y5-y1=.24asc_height+eps;
char_center(100); top y101=top y5; x101=x100+2u;
char_negate(100,101,102);
penlabels(1,2,3,4); endchar;
X
cmchar "Triple negated arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_triplenegext,arrow_ext_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
x1=x3=x5=hround(-arrow_overshoot); x2=x4=x6=w-x1;
y1=y2; y3=y4=math_axis; y5=y6; y1-y3=y3-y5=spread;
draw z1--z2;  % upper bar
draw z3--z4;  % lower bar
draw z5--z6;  % middle bar
y7-y1=.24asc_height+eps;
char_center(100); top y101=top y7; x101=x100+2u;
char_negate(100,101,102);
penlabels(1,2,3,4,5,6); endchar;
X
cmchar "Squiggly negated arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_squignegext,arrow_ext_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
y2=y4; y1=y3=y5; y3-y4=.24asc_height+eps;
X.5[y3,y4]=math_axis;
x2-x1=x3-x2=x4-x3=x5-x4;
x1=0; x5=w;
x0=x1-o; x6=x5+o;
y0=y1; y6=y5;
draw z0..z1{right}..{right}z2..{right}z3..{right}z4..{right}z5..z6;
y6:=math_axis+.24asc_height+eps;
char_center(100); top y101=top y6; x101=x100+1.5u;
char_negate(100,101,102);
penlabels(1,2,3,4,5); endchar;
X
cmchar "Single dashed negated arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_dashnegext,arrow_ext_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
x0=0; y0=math_axis;
2(x1-x0)=dot_sep; y1=y0; drawdot z1;
for j=2 thru 6:
X  x[j]-x[j-1]=dot_sep; y[j]=y[j-1]; drawdot z[j];
endfor
y9-y0=.24asc_height+eps;
char_center(100); top y101=top y9; x101=x100+2u;
char_negate(100,101,102);
penlabels(0,range 1 thru 6); endchar;
X
cmchar "Double dashed negated arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Dashnegext,arrow_ext_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x0=x10=0; y0-y10=spread; .5[y0,y10]=math_axis;
2(x1-x0)=dot_sep; x1=x11; y1=y0; y11=y10;
drawdot z1; drawdot z11;
for j=2 thru 6:
X  x[j]-x[j-1]=dot_sep; y[j]=y[j-1]; drawdot z[j];
X  x[j]=x[j+10]; y[j+10]=y[j+10-1]; drawdot z[j+10];
endfor
y9-y0=.24asc_height+eps;
char_center(100); top y101=top y9; x101=x100+2u;
char_negate(100,101,102);
penlabels(0,range 1 thru 6,range 11 thru 16); endchar;
X
cmchar "Triple dashed negated arrow extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_DASHnegext,arrow_ext_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
x0=x10=x20=0; y0-y10=y10-y20=spread; .5[y0,y20]=math_axis;
2(x1-x0)=dot_sep; x1=x11=x21; y1=y0; y11=y10; y21=y20;
drawdot z1; drawdot z11; drawdot z21;
for j=2 thru 6:
X  x[j]-x[j-1]=dot_sep; y[j]=y[j-1]; drawdot z[j];
X  x[j]=x[j+10]=x[j+20];
X  y[j+10]=y[j+10-1]; drawdot z[j+10];
X  y[j+20]=y[j+20-1]; drawdot z[j+20];
endfor
y9-y1=.24asc_height+eps;
char_center(100); top y101=top y9; x101=x100+2u;
char_negate(100,101,102);
penlabels(0,range 1 thru 6,range 11 thru 16, range 21 thru 26); endchar;
X
% 8 arrow gaps
X
cmchar "Single gap";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_GAP,arrow_ext_width#/3,single_height);
adjust_fit(0,0);
endchar;
X
cmchar "Double gap";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_doublegap,arrow_ext_width#/3,double_height);
adjust_fit(0,0);
endchar;
X
cmchar "Wide double gap";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_widedoublegap,arrow_ext_width#/3,wide_double_height);
adjust_fit(0,0);
endchar;
X
cmchar "Triple gap";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_triplegap,arrow_ext_width#/3,triple_height);
adjust_fit(0,0);
endchar;
X
cmchar "Squiggly gap";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_squiggap,arrow_ext_width#/3,single_height);
adjust_fit(0,0);
endchar;
X
cmchar "Single dashed gap";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_dashgap,arrow_ext_width#/3,single_height);
adjust_fit(0,0);
endchar;
X
cmchar "Double dashed gap";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Dashgap,arrow_ext_width#/3,double_height);
adjust_fit(0,0);
endchar;
X
cmchar "Triple dashed gap";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_DASHgap,arrow_ext_width#/3,triple_height);
adjust_fit(0,0);
endchar;
X
% 8 gap extensions
X
cmchar "Single gap extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_GAPEXT,arrow_gap_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
x1=hround(-arrow_overshoot); x2=w-x1;
x1'=hround(3/8w)+eps; x2'=hround(5/8w);
y1=y2=y1'=y2'=math_axis;
draw z1--z1'; draw z2--z2';
penlabels(1,2,1',2'); endchar;
X
cmchar "Double gap extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_doublegapext,arrow_gap_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x1=x3=hround(-arrow_overshoot); x2=x4=w-x1;
x1'=x3'=hround(3/8w); x2'=x4'=hround(5/8w);
y1=y2=y1'=y2'; y3=y4=y3'=y4';
y1-y3=spread; .5[y1,y3]=math_axis;
draw z1--z1'; draw z2--z2';  % upper bar
draw z3--z3'; draw z4--z4';  % lower bar
penlabels(1,2,3,4,1',2',3',4'); endchar;
X
cmchar "Wide double gap extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_widedoublegapext,arrow_gap_width#,wide_double_height);
adjust_fit(0,0); pickup rule.nib;
x1=x3=hround(-arrow_overshoot); x2=x4=w-x1;
x1'=x3'=hround(3/8w); x2'=x4'=hround(5/8w);
y1=y2=y1'=y2'=math_axis+.24asc_height+eps;
y3=y4=y3'=y4'=math_axis-.24asc_height-eps;
draw z1--z1'; draw z2--z2';  % upper bar
draw z3--z3'; draw z4--z4';  % lower bar
penlabels(1,2,3,4,1',2',3',4'); endchar;
X
cmchar "Triple gap extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_triplegapext,arrow_gap_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
x1=x3=x5=hround(-arrow_overshoot); x2=x4=x6=w-x1;
x1'=x3'=x5'=hround(3/8w); x2'=x4'=x6'=hround(5/8w);
y1=y2=y1'=y2'; y3=y4=y3'=y4'=math_axis; y5=y6=y5'=y6';
y1-y3=y3-y5=spread;
draw z1--z1'; draw z2--z2';  % upper bar
draw z3--z3'; draw z4--z4';  % middle bar
draw z5--z5'; draw z6--z6';  % lower bar
penlabels(1,2,3,4,5,6,1',2',3',4',5',6'); endchar;
X
cmchar "Squiggly gap extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_squiggapext,arrow_ext_width#,single_height);
adjust_fit(0,0);
y2=y4; y1=y3=y5; y3-y4=.24asc_height+eps;
X.5[y3,y4]=math_axis;
x1=0; x5=w; x5-x4=x4-x3=x3-x2=x2-x1;
x0=x1-o; x6=x5+o;
y0=y1; y6=y5;
pickup rule.nib;
path p; p:=z1{right}..z2{right}..z3{right}..z4{right}..z5{right};
numeric t[];
t1=xpart(p intersectiontimes((1/3w,-d)--(1/3w,h)));
t2=xpart(p intersectiontimes((2/3w,-d)--(2/3w,h)));
draw z0..z1{right}..z2{right}..{direction t1 of p}(point t1 of p);
draw (point t2 of p){direction t2 of p}..z4{right}..z5{right}..z6;
penlabels(1,2,3,4,5); endchar;
X
cmchar "Single dash gap extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_dashgapext,arrow_gap_width#,single_height);
adjust_fit(0,0); pickup rule.nib;
x0=0; y0=math_axis;
2(x1-x0)=dot_sep; x1'=w-x1; y1'=y1=y0;
drawdot z1; drawdot z1';
for j=2 thru 4:
X  w-x[j]'=x[j]=x[j-1]+dot_sep; y[j]'=y[j]=y0;
X  drawdot z[j]; drawdot z[j]';
endfor
penlabels(0,1,2,3,4,1',2',3',4'); endchar;
X
cmchar "Double dash gap extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_Dashgapext,arrow_gap_width#,double_height);
adjust_fit(0,0); pickup rule.nib;
x0=0; y0-y10=spread; .5[y0,y10]=math_axis;
2(x1-x0)=dot_sep; x1=x11; x1'=x11'=w-x1;
y1'=y1=y0; y11'=y11=y10;
drawdot z1; drawdot z1';
drawdot z11; drawdot z11';
for j=2 thru 4:
X  w-x[j]'=x[j]=x[j-1]+dot_sep; y[j]'=y[j]=y0;
X  x[j]=x[j+10]; x[j]'=x[j+10]';
X  y[j+10]'=y[j+10]=y[j+10-1];
X  drawdot z[j]; drawdot z[j]';
X  drawdot z[j+10]; drawdot z[j+10]';
endfor
penlabels(0,1,2,3,4,11,12,13,14,1',2',3',4',11',12',13',14'); endchar;
X
cmchar "Triple dash gap extension";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_DASHgapext,arrow_gap_width#,triple_height);
adjust_fit(0,0); pickup rule.nib;
x0=0; y0-y10=y10-y20=spread; .5[y0,y20]=math_axis;
2(x1-x0)=dot_sep; x1=x11=x21; x1'=x11'=x21'=w-x1;
y1'=y1=y0; y11'=y11=y10; y21'=y21=y20;
drawdot z1; drawdot z1';
drawdot z11; drawdot z11';
drawdot z21; drawdot z21';
for j=2 thru 4:
X  w-x[j]'=x[j]=x[j-1]+dot_sep; y[j]'=y[j]=y0;
X  x[j]=x[j+10]=x[j+20]; x[j]'=x[j+10]'=x[j+20]';
X  y[j+10]'=y[j+10]=y[j+10-1];
X  y[j+20]'=y[j+20]=y[j+20-1];
X  drawdot z[j]; drawdot z[j]';
X  drawdot z[j+10]; drawdot z[j+10]';
X  drawdot z[j+20]; drawdot z[j+20]';
endfor
penlabels(0,1,2,3,4,11,12,13,14,21,22,23,24,
X  1',2',3',4',11',12',13',14',21',22',23',24'); endchar;
X
% 8 left or right harpoons
X
path topleft, topright, botleft, botright;
X
cmchar "Left harpoon up";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_harpoonup,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis;
x1=hround(w+arrow_overshoot); lft x0=hround u;
y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
%y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0+4u+eps;
pos5(bar,angle(z4-z0)); z5l=z0;
pos6(bar,angle(z3-z0)); z6l=z0;
numeric t; path p; p=z4r..{2(x0-x4),y0-y4}z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
topleft=z0--(x0,y2l)---z1l..z1r---z2r
X ..subpath (t,0) of\\(z3r..{2(x0-x3),y0-y3}z5r)
X --z3l..{2(x0-x3),y0-y3}cycle;  % arrowhead and stem
filldraw topleft;
penlabels(0,1,2,3,4,5,6); endchar;
X
cmchar "Right harpoon up";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_harpoonupright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
topright:=topleft reflectedabout ((w/2,0),(w/2,h));
filldraw topright; endchar;
X
cmchar "Left harpoon down";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_harpoondown,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
botleft:=topleft reflectedabout ((0,math_axis),(w,math_axis));
filldraw botleft; endchar;
X
cmchar "Right harpoon down";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_harpoondownright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup crisp.nib;
botright:=topright reflectedabout ((0,math_axis),(w,math_axis));
filldraw botright; endchar;
X
cmchar "Left harpoons up";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_harpoonsup,arrow_head_width#,double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw topleft shifted (0,.5spread+eps);
pickup rule.nib;
y0=y1=math_axis-.5spread-eps;
x1=hround(w+arrow_overshoot); lft x0=hround u;
draw z0--z1;
endchar;
X
cmchar "Left harpoons down";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_harpoonsdown,arrow_head_width#,double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw botleft shifted (0,-.5spread-eps);
pickup rule.nib;
y0=y1=math_axis+.5spread+eps;
x1=hround(w+arrow_overshoot); lft x0=hround u;
draw z0--z1;
endchar;
X
cmchar "Right harpoons up";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_harpoonsupright,arrow_head_width#,double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw topright shifted (0,.5spread+eps);
pickup rule.nib;
y0=y1=math_axis-.5spread-eps;
x1=hround(-arrow_overshoot); rt x0=hround(w-u);
draw z0--z1;
endchar;
X
cmchar "Right harpoons down";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_harpoonsdownright,arrow_head_width#,double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw botright shifted (0,-.5spread-eps);
pickup rule.nib;
y0=y1=math_axis+.5spread+eps;
x1=hround(-arrow_overshoot); rt x0=hround (w-u);
draw z0--z1;
endchar;
X
cmchar "Left harpoons";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_harpoons,arrow_head_width#,double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw topleft shifted (0,.5spread+eps);
filldraw botleft shifted (0,-.5spread-eps);
endchar;
X
cmchar "Right harpoons";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_harpoonsright,arrow_head_width#,double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw topright shifted (0,.5spread+eps);
filldraw botright shifted (0,-.5spread-eps);
endchar;
X
% 6 left or right double arrows
X
path ldarr, rdarr;
X
cmchar "Left arrows";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_arrows,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,90); pos2(rule_thickness,90);
pos3(rule_thickness,0); pos4(rule_thickness,0);
y0=y1=y2=math_axis;
x1=hround(w+arrow_overshoot); lft x0=hround u;
y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
%y3-y0=y0-y4=.36asc_height+eps; x3=x4=x0+4u+eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.381966[.5[z3,z4],z0];
%z9=.2[.5[z3,z4],z0];
numeric t; path p; p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
ldarr=z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
X --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
X --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
filldraw ldarr shifted (0,.24asc_height+eps);
filldraw ldarr shifted (0,-.24asc_height-eps);
%filldraw ldarr shifted (0,y2-y4+eps); % top arrow
%filldraw ldarr shifted (0,y2-y3-eps); % bottom arrow
endchar;
X
cmchar "Left arrows up";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_arrowsup,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw ldarr shifted (0,.24asc_height+eps);
pickup rule.nib;
y0=y1=math_axis-.24asc_height-eps;
x1=hround(w+arrow_overshoot); lft x0=hround u;
draw z0--z1;
endchar;
X
cmchar "Left arrows down";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_arrowsdown,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw ldarr shifted (0,-.24asc_height-eps);
pickup rule.nib;
y0=y1=math_axis+.24asc_height+eps;
x1=hround(w+arrow_overshoot); lft x0=hround u;
draw z0--z1;
endchar;
X
cmchar "Right arrows";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_arrowsright,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup crisp.nib;
rdarr:=ldarr reflectedabout ((w/2,0),(w/2,h));
filldraw rdarr shifted (0,.24asc_height+eps);
filldraw rdarr shifted (0,-.24asc_height-eps);
endchar;
X
cmchar "Right arrows up";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_arrowsupright,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw rdarr shifted (0,.24asc_height+eps);
pickup rule.nib;
y0=y1=math_axis-.24asc_height-eps;
x1=hround(-arrow_overshoot); rt x0=hround (w-u);
draw z0--z1;
endchar;
X
cmchar "Right arrows down";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_arrowsdownright,arrow_head_width#,wide_double_height);
adjust_fit(0,0); pickup crisp.nib;
filldraw rdarr shifted (0,-.24asc_height-eps);
pickup rule.nib;
y0=y1=math_axis+.24asc_height+eps;
x1=hround(-arrow_overshoot); rt x0=hround (w-u);
draw z0--z1;
endchar;
X
% 4 left or right hooks
X
cmchar "Left hook up";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_hookup,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib; autorounded;
lft x2=hround u-eps; x1=x3; (rt x1-lft x2)=3u;
y1-y3=spread; y2=.5[y1,y3]; y3=y4=math_axis;
x4=hround(w+arrow_overshoot);
draw z1{left}...z2{down}...z3{right}---z4;  % hook
penlabels(1,2,3,4); endchar;
X
cmchar "Left hook down";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_hookdown,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib; autorounded;
lft x2=hround u-eps; x1=x3; (rt x1-lft x2)=3u;
y3-y1=spread; y2=.5[y1,y3]; y3=y4=math_axis;
x4=hround(w+arrow_overshoot);
draw z1{left}...z2{up}...z3{right}---z4;  % hook
penlabels(1,2,3,4); endchar;
X
cmchar "Right hook up";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_hookupright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib; autorounded;
rt x2=hround(w-u)+eps; x1=x3; (rt x2-lft x1)=3u;
y1-y3=spread; y2=.5[y1,y3]; y3=y4=math_axis;
x4=hround(-arrow_overshoot);
draw z1{right}...z2{down}...z3{left}---z4;  % hook
penlabels(1,2,3,4); endchar;
X
cmchar "Right hook down";
compute_spread(.45x_height#,.55x_height#);
beginchar(slot_hookdownright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib; autorounded;
rt x2=hround(w-u)+eps; x1=x3; (rt x2-lft x1)=3u;
y3-y1=spread; y2=.5[y1,y3]; y3=y4=math_axis;
x4=hround(-arrow_overshoot);
draw z1{right}...z2{up}...z3{left}---z4;  % hook
penlabels(1,2,3,4); endchar;
X
% 4 curly arrows
X
cmchar "Right curly up";
beginchar(slot_curlyupright,arrow_head_width#,.8asc_height#,0#);
adjust_fit(0,0); pickup rule.nib;
%numeric arrow_length; arrow_length=.66*(w-2u+eps);
x15=hround(-arrow_overshoot); y15=y10=math_axis;
rt x11=hround(w-u); x10=x12=.5[x11,x13];
y12-y10=spread; y11=.5[y10,y12];
x11-x13=spread; x13=x14; y13=y11; y14=-o;
path q; q=z15--z10{right}..tension0.8..{up}z11
X  ..tension0.8..{left}z12..tension0.8..{down}z13--z14;
draw q;
penlabels(10,11,12,13,14,15); endchar;
X
cmchar "Right curly down";
beginchar(slot_curlydownright,arrow_head_width#,.8asc_height#,0#);
adjust_fit(0,0); pickup rule.nib;
q:=q reflectedabout ((0,math_axis),(w,math_axis));
draw q; endchar;
X
cmchar "Left curly down";
beginchar(slot_curlydown,arrow_head_width#,.8asc_height#,0#);
adjust_fit(0,0); pickup rule.nib;
q:=q reflectedabout ((w/2+eps,-d),(w/2+eps,h));
draw q; endchar;
X
cmchar "Left curly up";
beginchar(slot_curlyup,arrow_head_width#,.8asc_height#,0#);
adjust_fit(0,0); pickup rule.nib;
q:=q reflectedabout ((0,math_axis),(w,math_axis));
draw q; endchar;
X
% 4 circle or bullet ends
X
cmchar "Left circle";
beginchar(slot_circhead,arrow_head_width#,.8asc_height#,0#);
adjust_fit(0,0); pickup rule.nib; autorounded;
numeric circ_diam; circ_diam=5u;
y6=math_axis; y8=y2+.5circ_diam; lft x6=u;
x6=x2-circ_diam;
circle_points; draw_circle;
x9=hround(w+arrow_overshoot); y9=y10=y2; x10=x2+.5rule_thickness;
draw z9---z10;
penlabels(1,2,3,4,5,6,7,8,9,10); endchar;
X
cmchar "Left bullet";
beginchar(slot_bullethead,arrow_head_width#,.8asc_height#,0#);
adjust_fit(0,0); pickup rule.nib; autorounded;
numeric circ_diam; circ_diam=5u;
y6=math_axis; y8=y2+.5circ_diam; lft x6=u;
x6=x2-circ_diam;
circle_points; fill_circle;
x9=hround(w+arrow_overshoot); y9=y10=y2; x10=x2+.5rule_thickness;
draw z9---z10;
penlabels(1,2,3,4,5,6,7,8,9,10); endchar;
X
cmchar "Right circle";
beginchar(slot_circheadright,arrow_head_width#,single_height);
adjust_fit(0,0); pickup rule.nib; autorounded;
numeric circ_diam; circ_diam=5u;
y2=math_axis; y8=y2+.5circ_diam; rt x2=w-u;
x6=x2-circ_diam;
circle_points; draw_circle;
x9=hround(-arrow_overshoot); y9=y10=y2; x10=x6-.5rule_thickness;
draw z9---z10;
penlabels(1,2,3,4,5,6,7,8,9,10); endchar;
X
cmchar "Right bullet";
beginchar(slot_bulletheadright,arrow_head_width#,.8asc_height#,0#);
adjust_fit(0,0); pickup rule.nib; autorounded;
numeric circ_diam; circ_diam=5u;
y2=math_axis; y8=y2+.5circ_diam; rt x2=w-u;
x6=x2-circ_diam;
circle_points; fill_circle;
x9=hround(-arrow_overshoot); y9=y10=y2; x10=x6-.5rule_thickness;
draw z9---z10;
penlabels(1,2,3,4,5,6,7,8,9,10); endchar;
X
endinput
SHAR_EOF
  $shar_touch -am 1105035297 'ymearr.mf' &&
  chmod 0644 'ymearr.mf' ||
  $echo 'restore of' 'ymearr.mf' 'failed'
  if ( md5sum --help </dev/null 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
  && ( md5sum --version </dev/null 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
    || $echo 'ymearr.mf:' 'MD5 check failed'
684c992a343bdfd69bb6c5568b982c45  ymearr.mf
SHAR_EOF
  else
    shar_count="`LC_ALL=C wc -c < 'ymearr.mf'`"
    test 57883 -eq "$shar_count" ||
    $echo 'ymearr.mf:' 'original size' '57883,' 'current size' "$shar_count!"
  fi
fi
$echo $shar_n 'x -' 'lock directory' '_sh01268:' $shar_c
if rm -fr _sh01268; then
  $echo 'removed'
else
  $echo 'failed to remove'
fi
exit 0