% Date: 2019/04/05

% Don't flash pictures of the characters as you draw them.
% This is dizzying, and UNIX can't do it anyway.
displaying := 0;

% If you want actual documentation, say 
% "mf knitnn" and then
% "gftodvi knitnn.2602gf" and then
% "dvipdfm knitnn"
% at a command prompt in the directory containing this file.
% This will give you a PDF with big pictures of all the characters in 
% the font with the important points labeled.

if known ps_output:
	font_coding_scheme := "T1-WGL4.enc";
fi

def purlfill = 
	if fonttype = purltype:
	fill 
	( -purlextend,-d-purlextend)--
	(w+purlextend,-d-purlextend)--
	(w+purlextend, h+purlextend)--
	( -purlextend, h+purlextend)--cycle;
	fi
enddef;

purltype = 0;
gridtype = 1;
foretype = 2;
bothtype = 3; % Both the grid and the symbols
counttype = 4;

if fonttype = counttype:
	% extra_endchar := extra_endchar & " pickup pencircle scaled 0.2pt; if w>0: draw (0,-d)--(0,h); draw (w,-d)--(w,h); fi ";
fi

def nogrid_charbox =
  if (fonttype = purltype) or (fonttype = gridtype):
  	currentpicture := nullpicture;
  fi
  enddef;
  
def leftgrid_charbox = 
  if (fonttype = purltype): currentpicture := nullpicture; fi
  if (fonttype = gridtype): currentpicture := nullpicture; fi
  if (fonttype = gridtype) or (fonttype = bothtype):
  	pickup pensquare scaled gridwidth;  
  	draw lft (w,h)--(0,h);
  	draw (0,h)--(0,-d);
  	draw (0,-d)--lft (w,-d);
  fi
enddef;

def rightgrid_charbox = 
  if (fonttype = purltype): currentpicture := nullpicture; fi
  if (fonttype = gridtype): currentpicture := nullpicture; fi
  if (fonttype = gridtype) or (fonttype = bothtype):
  	pickup pensquare scaled gridwidth;  
  	draw (w,h)--rt (0,h);
  	draw (w,h)--(w,-d);
  	draw rt (0,-d)--(w,-d);
  fi
enddef;

def topbotgrid_charbox = 
  if (fonttype = purltype): currentpicture := nullpicture; fi
  if (fonttype = gridtype): currentpicture := nullpicture; fi
  if (fonttype = gridtype) or (fonttype = bothtype):
  	pickup pensquare scaled gridwidth;  
  	draw (w,h)--(0,h);
  	draw (0,-d)--(w,-d);
  fi
enddef;

if gridfont:
def charbox =
	if fonttype = purltype:
		currentpicture := nullpicture;
	fi
	if fonttype = gridtype: currentpicture := nullpicture; fi
	if (fonttype = gridtype) or (fonttype = bothtype):
		pickup pencircle scaled gridwidth;
		fill (-gridwidth/2,-d-gridwidth/2)--(w+gridwidth/2,-d-gridwidth/2)--
			(w+gridwidth/2,h+gridwidth/2)--(-gridwidth/2,h+gridwidth/2)--cycle;
		if (w>0):
			unfill (gridwidth/2,-d+gridwidth/2)--(w-gridwidth/2,-d+gridwidth/2)--
		 	(w-gridwidth/2,h-gridwidth/2)--(gridwidth/2,h-gridwidth/2)--cycle;
		fi
	  fi
 enddef; 
else:
def charbox = nogrid_charbox enddef;
fi

def purlbox = charbox; purlfill; enddef;

% We don't need any symbols in the counting fonts because we will never
% actually show them and clearing them saves a bit of disk space.
if fonttype = counttype:
	def charbox = currentpicture := nullpicture; enddef;
	def purlbox = currentpicture := nullpicture; enddef;
fi

  picture symbolpic[];    
  path symbolpath[];

def fliphoriz(text beginning, ending) =
  ending := (beginning) reflectedabout ((.5w,0),(.5w,h));
  enddef;
def flipvert(text beginning, ending) =
  ending := (beginning) reflectedabout ((0,(h-d)/2),(w,(h-d)/2));
  ending := (ending) shifted (0,bottomgap-topgap);
  enddef;
  
pair arrowpoint;

def definearrow(text thepath, arrowlength, endpath) =
  
  arrowpoint := point infinity of thepath;  
  arrowdir := angle(direction infinity of thepath);
  endpath := arrowpoint + ((1,0) rotated (arrowdir+150) scaled arrowlength)
             --arrowpoint + ((1,0) rotated arrowdir scaled 0.5symbolwidth)
             --arrowpoint + ((1,0) rotated (arrowdir-150) scaled arrowlength)
             ; 
  enddef;

% Error symbols (glyphs that should not happen)

if known debugcables: else: boolean debugcables; debugcables = true; fi

picture errorsymbol[];
for k=1,2,3:
	errorsymbol[k] = nullpicture;
endfor
if debugcables:
	errorslashes = 4;
	if (fonttype=foretype) or (fonttype=bothtype):
		for j=1,2,3:
			for k=(1/errorslashes) step (1/errorslashes) until 0.99:
				addto errorsymbol[j] doublepath ((0,k[-dp,ht])--(k[wd,0],.001pt+ht)) withpen (pencircle scaled symbolwidth);
				addto errorsymbol[j] doublepath ((j*wd,k[-dp,ht])--(k[j*wd,(j-1)*wd],.001pt-dp)) withpen (pencircle scaled symbolwidth);
			endfor
			for k=0 step (1/errorslashes) until (j-1):
				addto errorsymbol[j] doublepath ((k*wd,-dp)--((k+1)*wd,ht)) withpen (pencircle scaled symbolwidth);
			endfor
		endfor
	fi
fi

% Arrow symbols
  
beginchar("s",wd#,ht#,dp#); "Slip one left"; 
  pickup symbol_pen;
  y1 = y2 = (h-d)/2-offset; 
  0.5[x1,x2]=w/2;
  rt x2 - lft x1 = ht+dp-2*smallgap;
  symbolpath0 := z1--z2;
  definearrow(symbolpath0)((x2-x1)/3)(symbolpath1);
  draw symbolpath0;
  draw symbolpath1;
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  charbox; endchar;
  
beginchar("S",wd#,ht#,dp#); "Slip one right";  
	fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  charbox; endchar;
  
beginchar("[",wd#,ht#,dp#); "Slip one left knitwise"; 
  pickup symbol_pen;
  y1 = y2 = (h-d)/2-offset; 
  0.5[x1,x2]=w/2;
  rt x2 - lft x1 = ht+dp-2*0.3[smallgap,mingap];
  symbolpath0 := z1--z2;
  definearrow(symbolpath0)((x2-x1)/3)(symbolpath1);
  draw symbolpath0;
  draw symbolpath1;
  0.5[y3,y4] = y1;
  0.5[x3,x4] = 0.5[lft x1, lft xpart point 0 of symbolpath1];
  z4 = z3+whatever*(1,2);
  y4-y3 = 1.5 ypart (point 2 of symbolpath1 - point 0 of symbolpath1);
  draw z3--z4;
  labels(1,2,3,4);
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  charbox; endchar;

beginchar("]",wd#,ht#,dp#); "Slip one right knitwise";  
	fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
	flipvert(currentpicture)(currentpicture);
  charbox; endchar;
  

beginchar("h",decrwidth(1,0),ht#,dp#); "Drop stitch"; 
  pickup symbol_pen;
  y1 = bot h-small_topgap;
  y2 = top -d+small_bottomgap;
  x1 = x2 =w/2;
  symbolpath0 := z1--z2;
  definearrow(symbolpath0)((y1-y2)/3)(symbolpath1);
  draw symbolpath0;
  draw symbolpath1;
  charbox; endchar;
  
beginchar("H",incrwidth(0,1),ht#,dp#); "Up arrow";  
  pickup symbol_pen;
  y1 = bot h-small_topgap;
  y2 = top -d+small_bottomgap;
  x1 = x2 =w/2;
  symbolpath0 := z1--z2;
  definearrow(reverse symbolpath0)((y1-y2)/3)(symbolpath1);
  draw symbolpath0;
  draw symbolpath1;
  charbox; endchar;

% Miscellaneous symbols

beginchar("O",incrwidth(0,1),ht#,dp#); "Yarn over";
  pickup symbol_pen;
  top z1 = (0.5w, h-topgap+o);
  bot z3 = (0.5w, bottomgap-d-o);
  x2-x4 = y1-y3; 0.5[x2,x4]=0.5w;
  y2 = y4 = 0.5[y1,y3];
  penpos1(symbolwidth,90);
  penpos2(symbolwidth,0);
  penpos3(symbolwidth,270);
  penpos4(symbolwidth,180);
  penstroke z1e..z2e..z3e..z4e..cycle;
  purlbox; endchar;

beginchar("@",wd#,ht#,dp#); "Bead";
  pickup symbol_pen;
  z1 = (0.5w, 0.667h);
  z3 = (x1,-d+h-y1);
  x2-x4 = y1-y3; 0.5[x2,x4]=0.5w;
  y2 = y4 = 0.5[y1,y3];
  fill z1..z2..z3..z4..cycle;
  unfill fullcircle scaled 0.3333(y1-y3) shifted 0.5[z1,z3];  
  charbox; endchar;

beginchar(ditto,incrwidth(0,0),ht#,dp#); "Wrap and turn"; 
  pickup symbol_pen;  
  z0 = 0.4[z1,z3] = 0.5[z2,z4];  
  x3=x1=w/2; y2=y4; y3-y1=x4-x2;
  
  z5 = z3 + 1.5((x4-x2)/2,0);
  z6 = z5 + ((x4-x2)/2,0) rotated 150;
  z7 = z5 + ((x4-x2)/2,0) rotated -150;
  
  y6 = h-wrapturngap;
  y1 = -d+wrapturngap;
  
  top (1-2spiralgap)[z0,z3]+(whatever,symbolwidth) = bot z7;
  
  symbolpath0 := 
  	(1-2spiralgap)[z0,z2]
  	..(1-2spiralgap)[z0,z3]
  	..(1-spiralgap)[z0,z4]
  	..z1
  	..z2
  	..z3{right}--z5;
  definearrow(symbolpath0)((x4-x2)/2)(symbolpath1);  
  draw symbolpath0;
  draw symbolpath1;
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  nogrid_charbox; endchar;
beginchar(19,incrwidth(0,0),ht#,dp#); "Reverse wrap and turn";
  fliphoriz(symbolpic0)(currentpicture); 
  currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  nogrid_charbox; endchar;
  
ligtable
ditto:
	ditto =: 19;
ligtable
"-":
"=":
	ditto |=: 19;
	
	
def drawM(expr topheight, bottomheight, mwidth, penwidth) =
  pickup pensquare scaled penwidth;
  rt x3 - lft x1 = 1.43 (y7-y1) = mwidth;
  y1 = y2 = y3;
  bot y7 = y8 = y9;
  topheight - y7 = y1-bottomheight;
  y4 = y10; y5 = y6;
  y8 - y5 = 0.4(x2 - x1);
  y8 - y4 = 1.6(y8 - y5);
  x1 = x7; x5 = x2; x6 = x3;
  x4 - x1 = x10 - x2 = 0.3penwidth;
  x8 = 0.6[x1,x2]; x9 - x2 = x8 - x1;
  x3 - x2 = x2 - x1;
  x1 = w - x3; 
  penpos1  (penwidth, 0);
  penpos7  (penwidth, 0);
  penpos5  (penwidth, 0);
  penpos6  (penwidth, 0);
  penpos2  (penwidth, 0);
  penpos3  (penwidth, 0);
  penpos4  (penwidth-2(x4-x1), 180);
  penpos10 (penwidth-2(x4-x1), 180);
  penpos8  (penwidth, 90);
  penpos9  (penwidth, 90);
  %draw z4{up}..z8{right}..z5{down}; draw z10{up}..z9{right}..z6{down};
  penstroke z1e--z7e;
  penstroke z4e{up}..z8e..z5e{down}--z2e; penstroke z10e{up}..z9e..z6e{down}--z3e;
  labels(1,2,3,4,5,6,7,8,9,10,4l,4r);
enddef;
 
beginchar("*",wd#,ht#,dp#); "Special instructions";
  pickup symbol_pen;     
  top z1 = (w/2,h-topgap+o);
  bot z2 = (w/2, -d+bottomgap-o);
  z3 - z4 = (z1-z2) rotated 60;
  z5 - z6 = (z1-z2) rotated 120;
  0.5[z3,z4] = 0.5 [z5,z6] = 0.5[z1,z2];
  for k=1,3,5:
  	z[k]' = 0.25[z[k],z[k+1]];
  	0.5[z[k+1]',z[k]']=0.5[z1,z2];
  	z[k]'' = 0.5[z[k],z[k+1]];
  	penpos[k]'(symbolwidth, angle (z[k]-z[k+1])+90);
  	penpos[k+1]'(symbolwidth, angle (z[k]-z[k+1])+90);
  	penpos[k]''((1/sqrt(3))*symbolwidth, angle (z[k]-z[k+1])+90);
  	draw z[k]--z[k]'; draw z[k+1]--z[k+1]';
  	penstroke z[k]'e{z[k+1]-z[k]}..z[k]''e..{z[k+1]-z[k]}z[k+1]'e;
  endfor
charbox; endchar;

%beginchar("a",wd#,ht#,dp#); "Small bobble";  
%  pickup symbol_pen;
%  top z1 = (0.5w, h-small_topgap+o);
%  bot z3 = (0.5w, small_bottomgap-d-o);
%  x2-x4 = y1-y3; 0.5[x2,x4]=0.5w;
%  y2 = y4 = 0.5[y1,y3];
%  pickup pensquare scaled symbolwidth rotated 45;
%  draw z1--z2; draw z2--z3; draw z3--z4; draw z4--z1;
%  drawdot 0.5[z1,z3];
%charbox; endchar;
beginchar(0,wd#,ht#,dp#); "Large bobble";  
  pickup symbol_pen;
  top z0 = (w/2, h-min_topgap) if offset=0: + (0,o) fi;
  bot z2 = (w/2, -d+min_bottomgap) if offset=0: - (0,o) fi;
  0.5[z1,z3] = 0.5[z0,z2];
  z1-z3 = (z2-z0) rotated 90;
  draw z0..z1..z2..z3..cycle;
charbox; endchar;


def drawhat(expr linewd) =
	pickup symbol_pen;
	top z1 = (w/2, h-min_topgap+o);
	x3-x1 = x1-x2; y3=y2;
	x3-x2 = standardheight;
	y1-y3 = (x1-x2);
	z3l = z3 + ((linewd/2,0) rotated (angle (z1-z3)-90));
	z3m = z3 + ((linewd/2,0) rotated (angle (z3-z1)));
	0.5[z3l,z3r] = z3;
	z2l = z2 + ((linewd/2,0) rotated (angle (z2-z1)-90));
	z2m = z2 + ((linewd/2,0) rotated (angle (z2-z1)));
	0.5[z2l,z2r] = z2;
	z1r = z3r + whatever*(z1-z3);
	z1r = z2r + whatever*(z2-z1);
	z1l3-z1 = z3l-z3;
	z1l2-z1 = z2l-z2;
	fill z3l---z1l3..z1l2---z2l..z2m..z2r---z1r---z3r..z3m..cycle;
enddef;

% Increases and decreases

beginchar(1,wd#,ht#,dp#); "Make 1 from N";
	% Fontforge keeps mangling this symbol, so I'm doing it the slow, hard, but reliable way.
	drawhat(symbolwidth);
	symbolpic0 := currentpicture; symbolpicwd0 := w;
	charbox; endchar;
beginchar(2,wd#,ht#,dp#); "Purl make 1 from N"; 
	drawhat(purl_symbolwidth);
	symbolpic1 := currentpicture; symbolpicwd1 := w;
	purlbox; endchar;
beginchar(3,wd#,ht#,dp#); "Make N from 1"; 
	flipvert(symbolpic0)(currentpicture); currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
	charbox; endchar;
beginchar(4,wd#,ht#,dp#); "Purl make N from 1";
	flipvert(symbolpic1)(currentpicture); currentpicture := currentpicture shifted ((w-symbolpicwd1)/2,0);
	purlbox; endchar;

beginchar("U",incrwidth(0,1),ht#,dp#); "Cast on"; 
	pickup symbol_pen; 
	bot y1 = bot y3 = -d+bottomgap;
	x1 = 0; x3 = w; x2 = w/2; top y2 = h-topgap;
	draw z1{right}..z2{left}..z3{right};
	nogrid_charbox; endchar;
beginchar("f",decrwidth(1,0),ht#,dp#); "Bind off knitwise"; 
	pickup symbol_pen; 
	x3-x1=wd; 0.5[x1,x3]=w/2; x2 = 0.5[x1,x3];
	y1 = y3 = (h-d)/2; top y2 = h-topgap;
	bot z4 = (w/2, -d+bottomgap);
	symbolpath0 := z1..z2{right}..z3;
	draw symbolpath0;
	%draw z4--bot z1;
	nogrid_charbox; endchar;
beginchar("F",decrwidth(1,0),ht#,dp#); "Bind off purlwise";
  if fonttype <> purltype:
	pickup purl_symbol_pen; 
	draw symbolpath0;
	fi
	nogrid_charbox; purlfill; endchar;
beginchar("Z",incrwidth(1,3),ht#,dp#); "Knit one doubly elongated"; 
 	pickup symbol_pen; 
  0.5[z1,z7] = top (w/2, -d+min_bottomgap);
  y1 = y7;
  x7 - x1 = 0.8(x8 - x0);
  0.5[x0,x8] = w/2;
  y0 = y8 = 0.5[y1,y2];
  x8 - x0 = y2 - y1;
  0.5[z2,z6] = bot (w/2, h-min_topgap);
  y2 = y6;
  x6 - x2 = 0.7(x7-x1);
  0.5[x3,x5] = w/2;
  y3 = y5 = 0.2[y1,y2];
  x5 - x3 = 0.5(x7-x1);

  x4 = w/2; y4 = y2;

   endangle := 110;
   midtension := 2;
   sidetension := 2;

	draw 
	z1{dir endangle}
	..z0{up}
	..z2{right}
	..tension sidetension
	..z3{left}
	..tension midtension
	..z4{right}
	..tension midtension
	..z5{left}
	..tension sidetension
	..z6{right}
	..z8{down}
	..z7{dir(-endangle)};
	
	charbox; endchar;

beginchar("z",incrwidth(1,2),ht#,dp#); "Knit one elongated"; 
	pickup symbol_pen; 
  0.5[z1,z5] = top (w/2, -d+small_bottomgap);
  y1 = y5;
  x5 - x1 = 0.8(x6-x0);
  0.5[x0,x6] = w/2;
  y0 = y6 = 0.5[y1,y2];
  x6 - x0 = y2 - y1;
  0.5[z2,z4] = bot (w/2, h-small_topgap);
  y2 = y4;
  x4 - x2 = 0.6(x5-x1);
  x3 = w/2; y3 = 0.2[y1,y2];

   endangle := 110;
   midtension := 1.5;

	draw 
	z1{dir endangle}..z0{up}..z2{right}..tension midtension..z3{left}
	..tension midtension..z4{right}..z6{down}..z5{dir(-endangle)};
	
	charbox; endchar;
beginchar("9",incrwidth(1,2),ht#,dp#); "CYCA knit one elongated";
	pickup symbol_pen;
	y0l=y0r; y1l=y1r; y2l=y2r;
	x0r=wd-x0l;
	x1r=wd-x1l;
	x2r=wd-x2l;
	z0l = top rt (mingap-ho,-d+small_bottomgap-o);
	y1l = bot h-small_topgap;
	x2r-x2l = y1l-y0l+2(smallgap-mingap-o/2);
	x1l = 0.23[x2l,x2r];
	y2l = 0.7[y0l,y1l];
	draw z0l..tension 3..z1l{left}..z2l{down}..tension 1.5..
		z2r{up}..z1r{left}..tension 3..z0r;
	labels(0l,1l,2l,0r,1r,2r);
	currentpicture := currentpicture shifted ((w-wd)/2,0);
	charbox; endchar;

	

beginchar(25,wd#/2,ht#,dp#); "Left end of a wide increase";
  pickup pensquare xscaled wideinctip yscaled wideincline;
  z1 = (w+cableextend,(h-topgap-d+bottomgap)/2);
  x2 = w/3; top y2 = h-min_topgap+o;
  fill bot lft z2{down}..bot z1{right}--top z1{left}..top rt z2{up}--top lft z2---cycle;
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  leftgrid_charbox; endchar;
beginchar(22,wd#/2,ht#,dp#); "Extender for a wide increase/decrease";
  z1 = (w+cableextend,(h-topgap-d+bottomgap)/2);
  x2 = 0-cableextend; y2 = y1;
  pickup pensquare scaled wideincline;
  draw rt z2 -- lft z1;
  topbotgrid_charbox; endchar;
beginchar(26,wd#/2,ht#,dp#); "Right end of a wide increase";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);  rightgrid_charbox; endchar;
beginchar(27,wd#/2,ht#,dp#); "Left end of a wide decrease";
  flipvert(symbolpic0)(currentpicture); currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);  leftgrid_charbox; endchar;
beginchar(28,wd#/2,ht#,dp#); "Right end of a wide decrease";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);  flipvert(currentpicture)(currentpicture); rightgrid_charbox; endchar;

beginchar(29,wd#,ht#,dp#); "Middle of a wide increase";
  pickup pensquare xscaled wideinctip yscaled wideincline;
  z1 = (-cableextend,(h-topgap-d+bottomgap)/2);
  z3 = (w+cableextend,(h-topgap-d+bottomgap)/2);
  x2 = w/2; bot y2 = -d+min_bottomgap-o;
  %draw z1{right}..z2{down};
  fill bot lft z2{up}..bot z1{left}--top z1{right}..top rt z2---bot rt z2--cycle;
  %draw z3{left}..z2{down};
  fill bot rt z2{up}..bot z3{right}--top z3{left}..top lft z2---bot lft z2--cycle;
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  topbotgrid_charbox;
 endchar;
beginchar(30,wd#,ht#,dp#); "Middle of a wide decrease";
  flipvert(symbolpic0)(currentpicture); currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
  topbotgrid_charbox;
  endchar;

if 5*wd# < symbolmaxwd#:

beginchar(31,if fonttype = counttype: decrwidth(5,1) else: 5wd# fi,ht#,dp#); "Make 1 from 5";
  pickup pensquare xscaled wideinctip yscaled wideincline;
  top z1 = (w/2,h-min_topgap+o);
  x2 = wd/3; bot y2 = bot y3 = -d+min_bottomgap-o;
  x3 - x1 = x1 - x2;
  z4 = 0.5[z1,z2]; z5 = 0.5[z1,z3];
  %draw z2{up}..z4{right}..z1{up};
  %draw z3{up}..z5{left}..z1{up};

	fill bot lft z2---top lft z2..top z4{right}..top lft z1{up}--top rt  z1---bot rt  z1..bot z4{left }..bot rt z2{down}--cycle;
	fill bot rt  z3---top rt  z3..top z5{left }..top rt  z1{up}--top lft z1---bot lft z1..bot z5{right}..bot lft z3{down}--cycle;

  charbox; endchar;
fi

beginchar("~",incrwidth(0,0),ht#,dp#); "Empty box (spacer)"; endchar;
beginchar("`",if fonttype = counttype: 0 else: 0.5wd# fi,ht#,dp#); "Empty box (spacer)"; endchar;
beginchar("'",if fonttype = counttype: 0 else: 0.5wd# fi,ht#,dp#); "Empty box (spacer)"; 
	if fonttype = purltype: fill (0,-d)--(w,-d)--(w,h)--(0,h)--cycle; fi
	endchar;


beginchar("m",incrwidth(0,1),ht#,dp#); "Make one";  
  pickup symbol_pen;
  drawM(h-topgap, -d+bottomgap, 0.5(h+d),symbolwidth);
  charbox; endchar;
beginchar("M",incrwidth(0,1),ht#,dp#); "Make one purlwise";  
  pickup purl_symbol_pen;
  drawM(h-topgap, -d+bottomgap, 0.5(h+d),purl_symbolwidth);
  purlbox; endchar;
  
%def drawB(expr topgap, bottomgap, symbolwidth) = 
%  x1 = x2 = x3; x4 = x5 = x6; x7=x8 + 0.05(x7-x1);
%  y1 = y4; y2 = y5; y3 = y6; y7 = 0.5[y1,y2]; y8 = 0.5[y2,y3];
%  top y3 = h-topgap; bot y1 = -d+bottomgap;
%  y2 = 0.51[y1,y3];
%  x7-x1 = 1.3(y2-y1);
%  x7-x6 = 0.7(x7-x1);
%  0.5[x7,x1]=w/2+ho;
%  z9=z10=z5; z11=rt z2;
%  
%  penpos11(symbolwidth,-90);
%  penpos5(symbolwidth,-90);
%  penpos8(symbolwidth,0);
%  penpos6(symbolwidth,90);
%  penpos2(symbolwidth,180);
%  penpos4(symbolwidth,-90);
%  penpos7(symbolwidth,0);
%  z10l=z5l; z9l=z5r; z10r = 0.4[z5,z5r];
%  z9r-z9l=z10l-z10r;
%  y3r=y6r; y3l=y6l; x3r=x2r=x1r; x3l=x2l=x1l;
%  y1r=y4r; y1l=y4l;
%  penstroke z11e--z5e--z10e{right}..z8e..z6e---z3e--z2e--z1e---z4e..z7e..z9e{left};
%
%enddef;
%  
%
%beginchar("b",wd#,ht#,dp#); "Knit tbl";  
%  pickup symbol_pen;
%  drawB(topgap, bottomgap, symbolwidth);
%  charbox; endchar;
%beginchar("B",wd#,ht#,dp#); "Purl tbl";
%  pickup purl_symbol_pen;
%  drawB(topgap, bottomgap, purl_symbolwidth);
%  purlbox; endchar;

beginchar("|",if fonttype <> counttype: overlinewd# else: 0 fi,ht#,dp#); "Divider";  
  if (fonttype = foretype) or (fonttype = bothtype):
  fill(0,-d-gridwidth/2-purlextend)--(0,h+gridwidth/2+purlextend)  
  	--(w,h+gridwidth/2+purlextend)--(w,-d-gridwidth/2-purlextend)
  	--cycle;
  fi
endchar;

%Twists

path twistpath[];

  pair time;

beginchar("x",incrwidth(0,1),ht#,dp#); "Twist slanting right";
  pickup symbol_pen;
  bot lft z0 = (0.5w-0.4 standardheight-ho,-d+small_bottomgap-o);
  bot rt  z4 = (0.5w+0.4 standardheight+ho,-d+small_bottomgap-o);
  top z2 = (0.5w, h-topgap+o);
  x3-x1 = 0.8(x0-x4); 0.5[x1,x3] = w/2;
  y1 = y3 = 0.7[y0,y2];
  twistpath0:=z0{curl 0.1}..z1{up}..z2..z3{down}..z4{curl 0.1};

  pathdir0 = angle (direction 0 of twistpath0);
  pathdir4 = angle (direction 4 of twistpath0);

  penpos0(symbolwidth, (pathdir0 + 90));
  penpos1(symbolwidth, 180);
  penpos2(symbolwidth, 270);
  penpos3(symbolwidth, 360);
  penpos4(symbolwidth, (pathdir4 + 90));

  z5 = z0; z6 = z1;
  penpos5(eraserwidth, (pathdir0 + 90));
  penpos6(eraserwidth, 180);

  time := (z5l{direction 0 of twistpath0}..z6l{up}) intersectiontimes
	(z3l{down}..z4l{direction 4 of twistpath0});
  twistpath1 := subpath (ypart(time),1) of (z3l{down}..z4l{direction 4 of twistpath0});
  time := (z5l{direction 0 of twistpath0}..z6l{up}) intersectiontimes
	(z3r{down}..z4r{direction 4 of twistpath0});
  twistpath2 := subpath (ypart(time),1) of (z3r{down}..z4r{direction 4 of twistpath0});
  fill twistpath1 & (point infinity of twistpath1--point infinity of twistpath2)
	& reverse twistpath 2 &
	(point 0 of twistpath2--point 0 of twistpath1) & cycle;

  time := (z5r{direction 0 of twistpath0}..z6r{up}) intersectiontimes
	(z3l{down}..z4l{direction 4 of twistpath0});
  twistpath1 := subpath (0,ypart(time)) of (z3l{down}..z4l{direction 4 of twistpath0});
  time := (z5r{direction 0 of twistpath0}..z6r{up}) intersectiontimes
	(z3r{down}..z4r{direction 4 of twistpath0});
  twistpath2:= subpath (0,ypart(time)) of (z3r{down}..z4r{direction 4 of twistpath0});
  fill twistpath1 & (point infinity of twistpath1--point infinity of twistpath2)
	& reverse twistpath 2 &
	(point 0 of twistpath2--point 0 of twistpath1) & cycle;

  penstroke z0e{direction 0 of twistpath0}..
	z1e{up}..z2e{left}..z3e{down}
	;%..z4e{direction 4 of twistpath0};

  symbolpic0 := currentpicture; symbolpicwd0 := w;
  labels(0,1,2,3,4,5);
  charbox; endchar;  
  
  numeric t[];
  
beginchar("t",incrwidth(0,1),ht#,dp#); "Twist slanting left";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  charbox; endchar;
  
beginchar("X",incrwidth(0,1),ht#,dp#); "Purl right twist";
  currentpicture := symbolpic0; currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
  purlbox; endchar;
beginchar("T",incrwidth(0,1),ht#,dp#); "Purl left twist";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  purlbox; endchar;

beginchar("b",wd#,ht#,dp#); "Right upside-down twist";
  flipvert(symbolpic0)(currentpicture); currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  charbox; endchar;  
beginchar("q",wd#,ht#,dp#); "Left upside-down twist";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  charbox; endchar;
beginchar("Q",wd#,ht#,dp#); "Purl right upside-down twist";
  currentpicture := symbolpic0; currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
  purlbox; endchar;
beginchar("B",wd#,ht#,dp#); "Purl left upside-down twist";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  purlbox; endchar;
  
%2/1 increases and decreases

def drawSSK(expr topheight,bottom) =
  bot rt  z1 = (0.5w+0.5 (topheight-bottom)+ho,bottom-o);
  top lft z2 = (0.5w-0.5 (topheight-bottom),   topheight+o);
  bot lft z3 = (0.5w-0.5 (topheight-bottom),   bottom-o);
  symbolpath0 := z1--z2--z3;
  draw symbolpath0;
enddef;
  
beginchar("<",decrwidth(2,1),ht#,dp#); "SSK or left-slant cable";
  pickup symbol_pen;
  drawSSK(h-topgap,-d+bottomgap);
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  charbox; endchar;  
beginchar(">",decrwidth(2,1),ht#,dp#); "k2tog or right-slant cable";
  fliphoriz(symbolpic0)(currentpicture); 
  currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  charbox; endchar;
  
beginchar("0",incrwidth(1,2),ht#,dp#); "Make 2 from 1";
  flipvert(symbolpic0)(currentpicture); 
  charbox; endchar;
beginchar("#",incrwidth(1,2),ht#,dp#); "Make 2 from 1";
  flipvert(symbolpic0)(currentpicture); 
  fliphoriz(currentpicture)(currentpicture); 
  charbox; endchar;

beginchar(";",decrwidth(2,1),ht#,dp#); "P2tog";  
  pickup purl_symbol_pen;
  draw symbolpath0;
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  purlbox; endchar;  
beginchar(":",decrwidth(2,1),ht#,dp#); "SSP";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  purlbox; endchar;
  
beginchar("j",incrwidth(0,1),ht#,dp#); "Lifted increase slanting left";
  pickup symbol_pen;
  top lft z1 = (0.5w-0.5 standardheight-ho,h-topgap+o);
  bot  rt z2 = (0.5w+0.5 standardheight,   -d+bottomgap-o);
  symbolpath0 := z2--z1;
  definearrow(symbolpath0)((y1-y2)/3)(symbolpath1);  
  draw symbolpath0; 
  draw symbolpath1;
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  charbox; endchar;
beginchar("i",incrwidth(0,1),ht#,dp#); "Lifted increase slanting right";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  charbox; endchar;
beginchar("J",incrwidth(0,1),ht#,dp#); "Purl increase slanting right";
  pickup purl_symbol_pen;
  draw symbolpath0; 
  draw symbolpath1;
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  purlbox; endchar;
beginchar("I",incrwidth(0,1),ht#,dp#); "Purl increase slanting left";  
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  purlbox; endchar;

beginchar("(",wd#,ht#,dp#); "Left-slanting line";
  pickup symbol_pen;
  top lft z1 = (0.5w-0.5 standardheight-ho,h-topgap+o);
  bot  rt z2 = (0.5w+0.5 standardheight,   -d+bottomgap-o);
  symbolpath0 := z2--z1;
	draw symbolpath0;
  charbox; endchar;
beginchar(")",wd#,ht#,dp#); "Right-slanting line";
  pickup symbol_pen;
	draw symbolpath0;
	fliphoriz(currentpicture)(currentpicture);
  charbox; endchar;
  
beginchar("y",incrwidth(1,2),ht#,dp#); "Knit front and back";
  pickup symbol_pen;
  bot lft z1 = (0.5w-0.495 Vwidth-ho,-d+bottomgap-o);
  top  rt z2 = (0.5w+0.495 Vwidth+ho,h-topgap+o);
  bot  rt z3 = (0.5w+0.495 Vwidth+ho,-d+bottomgap-o);
  top lft z4 = (0.5w-0.495 Vwidth-ho,h-topgap+o);
  % For some reason, mf2pt1 doesn't like it if I use 0.5 Vwidth
  z5 = whatever[z1,z2] = whatever[z3,z4];
  draw z1--z2;
  draw z4--z5;
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  charbox; endchar;  
beginchar("u",incrwidth(1,2),ht#,dp#); "Knit back and front";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  charbox; endchar;
beginchar("4",decrwidth(2,1),ht#,dp#); "Alternative SSK";
  flipvert(symbolpic0)(currentpicture); currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
  charbox; endchar;
beginchar("5",decrwidth(2,1),ht#,dp#); "Alternative K2tog";
  flipvert(symbolpic0)(currentpicture); currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
  fliphoriz(currentpicture)(currentpicture);
  charbox; endchar;
 
  
  
beginchar("7",incrwidth(1,2),ht#,dp#); "Alt front and back";
  pickup symbol_pen;
	x0 = x1 = x2;
	bot y0 = -d+small_bottomgap;
	top y1 = h-small_topgap;
	0.5[x3+ho,x0] = w/2;
	z3 = z2 + whatever*(-1.2,1);
	y3 = 0.9[y0,y1];
	y2 = 0.4[y0,y1];
	draw z2--z3; draw z1--z0;
	symbolpic0 := currentpicture; symbolpicwd0 := w;
	charbox; endchar;
beginchar("8",incrwidth(1,2),ht#,dp#); "Alt back and front";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  charbox; endchar;
	


beginchar("v",incrwidth(1,2),ht#,dp#); "Generic make 2 from 1";
  pickup symbol_pen;
  top  rt z1 = (0.5w+0.5 Vwidth+ho,h-topgap+o);
  bot y2 = -d+bottomgap-o; x2 = 0.5[x1,x3];
  top lft z3 = (0.5w-0.5 Vwidth-ho,h-topgap+o);
  symbolpath0 := z1--z2--z3;
  draw symbolpath0;
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  charbox; endchar;  
beginchar("V",incrwidth(1,2),ht#,dp#); "Purl make 2 from 1";  
  pickup purl_symbol_pen;
  draw symbolpath0;
  symbolpic1 := currentpicture; symbolpicwd1 := w;
  purlbox; endchar;
beginchar("6",wd#,ht#,dp#); "V with bar";
  pickup symbol_pen;
  currentpicture := symbolpic0; currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
  0.5[x0,x1]=w/2;
  y0=y1=0.6[-d+bottomgap,h-topgap];
  rt x1-lft x0 = Wwidth;
  draw z0--z1;
  charbox; endchar;  

beginchar("!",decrwidth(2,1),ht#,dp#); "Make 1 from 2";  
	flipvert(symbolpic0)(currentpicture); currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
  charbox; endchar;
beginchar("2",decrwidth(2,1),ht#,dp#); "Make 1 from 2 purlwise";  
	flipvert(symbolpic1)(currentpicture); currentpicture := currentpicture shifted ((w-symbolpicwd1)/2,0);
   purlbox; endchar;

%Double decreases and increases
  
beginchar("w",incrwidth(1,3),ht#,dp#); "make 3 from 1";
  pickup symbol_pen;
  top lft z1 = (0.5w-0.5 Wwidth-ho,h-small_topgap+o);
  bot z2 = (0.5w,-d+small_bottomgap-o);
  top  rt z3 = (0.5w+0.5 Wwidth+ho, h-small_topgap+o);
  z4 = 0.5[z1,z3];
  symbolpath0 := z1--z2--z3;
  draw symbolpath0;
  symbolpath1 := z2--z4;
  draw symbolpath1;
  charbox; endchar;  
beginchar("W",incrwidth(1,3),ht#,dp#); "Purl make 3 from 1";  
  pickup purl_symbol_pen;
  draw symbolpath0; draw symbolpath1;
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  purlbox; endchar;
beginchar("Y",incrwidth(1,3),ht#,dp#); "Make 3 from 1 with YO center";
  pickup symbol_pen;
  draw symbolpath0;
  top z4 = (0.5w, h-small_topgap+o);
  bot z5 = z4 - (0, 0.5Wwidth); %Better way?
  z6-z7 = (z4-z5) rotated 90; 0.5[z6,z7]=0.5[z4,z5];
  draw z4..z6..z5..z7..cycle;
  charbox; endchar;  

beginchar("E",incrwidth(1,3),ht#,dp#); "make 3 from 1 with purl center";
  pickup symbol_pen;
	if (fonttype = foretype) or (fonttype = bothtype):
	  currentpicture := symbolpic0; currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
	fi
	charbox;
	if (fonttype = purltype):
	  z1 = point 0 of symbolpath0;
	  z2 = point 1 of symbolpath0;
	  z3 = point 2 of symbolpath0;
	  fill z1--z2--z3--cycle;
	fi
  endchar;  

beginchar("&",incrwidth(1,3),ht#,dp#); "make 3 from 1 with knit center";
  pickup symbol_pen;
	if (fonttype = foretype) or (fonttype = bothtype):
	  currentpicture := symbolpic0; currentpicture := currentpicture shifted ((w-symbolpicwd0)/2,0);
	fi
	charbox;
	if (fonttype = purltype):
	  z1 = point 0 of symbolpath0;
	  z2 = point 1 of symbolpath0;
	  z3 = point 2 of symbolpath0;
	  fill z1--z2--z3--%z1--(0,h)--
	  		(w,h)--(w,-d)--(0,-d)--(0,h)--cycle;
	fi
  endchar;  

beginchar("A",decrwidth(3,1),ht#,dp#); "Make 1 from 3";
  pickup symbol_pen;
  bot lft z1 = (0.5w-0.5 biggerheight-ho,-d+small_bottomgap-o);
  bot  rt z3 = (0.5w+0.5 biggerheight+ho,-d+small_bottomgap-o);
  top z2 = (xpart z4, h-small_topgap+o);
  z4 = 0.5[z1,z3];
  symbolpath0 := z1--z2--z3;
  symbolpath1 := z2--z4;
  draw symbolpath0;
  draw symbolpath1;
  labels(1,2,3,4);
  charbox; endchar;  
beginchar("3",decrwidth(3,1),ht#,dp#); "Purl make 1 from 3";
  pickup purl_symbol_pen;
  draw symbolpath0;
  draw symbolpath1;
  purlbox; endchar;

beginchar("R",decrwidth(3,1),ht#,dp#); "k3tog";
  pickup symbol_pen;
  finesymbolwidth := 4/7symbolwidth;
  top  rt z0 = (0.5w+0.5 biggerheight,   h-small_topgap+o);
  bot lft z1 = (0.5w-0.5 biggerheight-ho,-d+small_bottomgap-o);
  bot  rt z3 = (0.5w+0.5 biggerheight,   -d+small_bottomgap-o);
   
  % The line z0--z4 is halfway between z0--z1 and z0--z3 as angles
  z4 = whatever[z1,z3];
  z4 = z0+whatever*(dir 0.5[angle(z1-z0),angle(z3-z0)]);
  z5 = 0.5[z1,z3];

  z2 = 0.5[z4,z5];

  z1' = 0.5[z1,z0];
  z3' = 0.2[z3,z0];	
  z2'' = z0;
  z2' = 0.2[z2,z2''];  
  penpos1(symbolwidth, -90+angle (z0-z1));
  penpos1'(symbolwidth, -90+angle (z0-z1));
  penpos3(symbolwidth, 0);
  penpos3'(symbolwidth, 0);
  
  z1''l = whatever[z1l,z1'l];
  z1''l = z0 + whatever*((z1-z0) rotated 90);
  penpos1''(finesymbolwidth, -90+angle (z0-z1));
  
  z3''r = (x3r,y0);
  penpos3''(finesymbolwidth, 0);

  penpos2(symbolwidth, -90+angle (z2''-z2));
  penpos2'(symbolwidth, -90+angle (z2''-z2));
  penpos2''(finesymbolwidth, -90+angle (z2''-z2));
  
  symbolpath1 := z1''l..z1'l---z1l..z1r---z1'r..z1''r;
  symbolpath2 := z2''l..z2'l---z2l..z2r---z2'r..z2''r;
  symbolpath3 := z3''l..z3'l---z3l..z3r---z3'r..z3''r;
  % Not penstroke because we want the endpoints to be rounded
  
  numeric t[];
  (t12,t21) = symbolpath1 intersectiontimes symbolpath2;
  (t23,t32) = symbolpath2 intersectiontimes symbolpath3;
  fill (subpath(0,t12) of symbolpath1 
  	-- subpath (t21,t23) of symbolpath2
  	-- subpath (t32,infinity) of symbolpath3
  	-- z3''r{z3''r-z3'r}..{z1-z0}cycle
  	);
  %pickup pencircle scaled 0.01pt;
  %draw symbolpath2; draw symbolpath3;

  symbolpic0 := currentpicture; symbolpicwd0 := w;
  labels(1,2,3,1',2',3',1r,1l,2r,2l,3r,3l,1'r,1'l,2'r,2'l,3'r,3'l, 1''r,1''l);
  
  symbolpath0 := z1--z0--z3--z2;
  charbox; endchar;  
beginchar("L",decrwidth(3,1),ht#,dp#); "SSSK";

	%draw subpath(0,2) of symbolpath0; 
	%draw point 3 of symbolpath0--point 1 of symbolpath0;
  fliphoriz(symbolpic0)(currentpicture);
  %currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  charbox; endchar;

beginchar("r",decrwidth(3,1),ht#,dp#); "LRC";
  pickup symbol_pen;
  bot lft z1 = (0.5w-0.5 biggerheight-ho,-d+small_bottomgap-o);
  top  rt z2 = (0.5w+0.5 biggerheight+ho,h-small_topgap+o);
  bot  rt z3 = (0.5w+0.5 biggerheight+ho,-d+small_bottomgap-o);
  top lft z4 = (0.5w-0.5 biggerheight-ho,h-small_topgap+o);
  x5 = 0.5w; y5 = 0.53[y1,y4];
  x6=x5; y6=y1;
  draw z1..z5..z2;
  draw z3--z5;
  draw z5--z6;
  
  symbolpic0 := currentpicture; symbolpicwd0 := w;
  labels(1,2,3,4,5,6,7);
  charbox; endchar;  
beginchar("l",decrwidth(3,1),ht#,dp#); "RLC";
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);
  charbox; endchar;
  
beginchar("a",decrwidth(3,1),ht#,dp#); "LRC";
  pickup symbol_pen;
  bot lft z1 = (0.5w-0.5 biggerheight-ho,-d+small_bottomgap-o);
  top  rt z2 = (0.5w+0.5 biggerheight+ho,h-small_topgap+o);
  bot  rt z3 = (0.5w+0.5 biggerheight+ho,-d+small_bottomgap-o);
  top lft z4 = (0.5w-0.5 biggerheight-ho,h-small_topgap+o);
  x5 = 0.5w; y5 = 0.6[y1,y4];
  top z6 = (0.5w, h-small_topgap+o);
  bot z7 = (0.5w, -d+small_bottomgap-o);
  draw z1--z5;
  draw z3--z5;
  draw z6--z7;
  charbox; endchar;  
  
% Rownumber triangles (modified from manfnt.mf)
  
trianglecharwd# = 19/3 pt#;

beginchar("}", trianglecharwd#, 6.25pt#, 0); "Triangle pointing right";
  if (fonttype = foretype) or (fonttype = bothtype):
  x1=x2=w-x3-max(purlextend, 0.5gridwidth)=4/3pt; y3=.5h;
  y1-y3=y3-y2; 
  y1-y2 = 1.3*(x3-x1); 
  % For an equilateral triangle, use 2/sqrt 3 = 1.1547
  fill z1--z2--z3--cycle;
  fi
  symbolpic0 := currentpicture; 
  labels(1,2,3); endchar;

beginchar("{", trianglecharwd#, 6.25pt#, 0); "Triangle pointing left";
  fliphoriz(symbolpic0)(currentpicture);
  endchar;

  
% Wrapped stitches

beginchar("?",wd#,ht#,dp#); "Left end of wrapped stitches";  
	pickup symbol_pen;
	x0r = x1r = x2r = w;
	y0r-y1r = y1r-y2r;
	y0m=y0r; y1m=y1r; y2m=y2r;
	y0l-y0r = y1l-y1r = y2l-y2r;
	
	if gridfont:
		h-small_topgap+o = top y0l;
		bot y2r = small_bottomgap-d;
		y1l = 2/3[y1r,y0r];
		x2l+ho = h-y0l+o;
		x0m = 0.4[x0l,x0r];
		x2m = 0.5[x2l,x2r];	
		z0l = z2l + whatever*(1,3);
		wraplines := 3;
	else:
		h-small_topgap-top y0r = bot y2r-small_bottomgap+d;	
		if (topgap>standardgap) or (bottomgap>standardgap): 
			wraplines := 2; else: wraplines:=3; fi
		if wraplines = 2: 
			y0r - y2r = 1.5(h-small_topgap-top y0r); 
			lft x2l+ho = smallgap;
		else:
			y0r - y1r = 1.5(h-small_topgap-top y0r); 
			lft x2l+ho = mingap;
		fi
		x0m = 0.2[x0l,x0r];
		x2m = 0.3[x2l,x2r];	
		y0l = 0.6[y0r,h-small_topgap+o];
		z0l = z2l + whatever*(1,4);
	fi
	
	z1l=whatever[z0l,z2l];
	z1m=whatever[z0m,z2m];
	pickup pensquare scaled symbolwidth;
	draw lft z0r--rt (0,y0r);
	if wraplines=3: draw lft z1r--rt (0,y1r); fi
	draw lft z2r--rt (0,y2r);
	symbolpic1 := currentpicture; symbolpicwd1 := w;
	currentpicture := nullpicture;	
	draw lft z0r---rt z0m;
	if wraplines=3: draw lft z1r---rt z1m; fi
	draw lft z2r---rt z2m;
	pickup symbol_pen;
	draw z0m{left}..z0l;
	if wraplines=3: draw z1m{left}..z1l; fi
	draw z2m{left}..z2l;	
	
	if gridfont: else:
	  draw bot (w/2,h-small_topgap+o) -- top (w/2, -d+small_bottomgap-o);
 	fi
	
	symbolpic0 := currentpicture; symbolpicwd0 := w;	
	labels(0r,0m,0l,1r,1m,1l,2r,2m,2l);
  charbox; endchar;
  
beginchar(23,wd#,ht#,dp#); "Middle of wrapped stitches";  
	pickup symbol_pen;
	currentpicture := symbolpic1; currentpicture := currentpicture shifted ((w-symbolpicwd1)/2,0);
	if gridfont: else:
  draw bot (w/2,h-small_topgap+o) -- top (w/2, -d+small_bottomgap-o);
  fi
 charbox; endchar;
beginchar(24,wd#,ht#,dp#); "Right end of wrapped stitches";  
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);  
  charbox; endchar;

ligtable "?":
 	"?" |=: 24;
ligtable 24:
	"?" |=: 24,
	24 =:| 23;
	
beginchar("1",wd#,ht#,dp#); "Left end of single-wrapped stitches";  
	pickup symbol_pen;
	x1r=w;
	y1m=y1r;
	
	if gridfont:
		if wd>ht+dp:
			y1l-y1r = (h+d)/3;
		else:
			y1l-y1r = (h+d)/4;
		fi
	else:
		y1l-y1r = (h+d)/5;
	fi
	x1m = 0.1[x1r,x1l];
	h-topgap+o-y1l = 1/2(y1r+d-bottomgap);
	rt x1l+ho = standardgap;
	wraplines := 1;
	if y1r<bottomgap-d: message("Your single-wrapped stitch symbol is too tall."); fi
	
	pickup pensquare scaled symbolwidth;
	draw lft z1r--rt (0,y1r);
	symbolpic1 := currentpicture; symbolpicwd1 := w;
	currentpicture := nullpicture;	
	draw lft z1r---rt z1m;
	pickup symbol_pen;
	draw z1m{left}..z1l;
	
	if gridfont: else:
	  draw bot (w/2,h-topgap+o) -- top (w/2, -d+bottomgap-o);
 	fi
	
	symbolpic0 := currentpicture; symbolpicwd0 := w;	
	labels(1r,1m,1l);
  charbox; endchar;
  
beginchar(17,wd#,ht#,dp#); "Middle of wrapped stitches";  
	pickup symbol_pen;
	currentpicture := symbolpic1; currentpicture := currentpicture shifted ((w-symbolpicwd1)/2,0);
	if gridfont: else:
  draw bot (w/2,h-small_topgap+o) -- top (w/2, -d+small_bottomgap-o);
  fi
 charbox; endchar;
beginchar(18,decrwidth(1,0),ht#,dp#); "Right end of wrapped stitches";  
  fliphoriz(symbolpic0)(currentpicture); currentpicture := currentpicture shifted (-(w-symbolpicwd0)/2,0);  
  charbox; endchar;

ligtable "1":
 	"1" |=: 18;
ligtable 18:
	"1" |=: 18,
	18 =:| 17;
	
% Outlines

if gridfont:

beginchar(5,wd#,ht#,dp#); "Top and bottom outlines";
	topbotgrid_charbox; endchar;

beginchar(6,0,ht#,dp#); "Vertical grid line";
	pickup pensquare scaled gridwidth;
	if (fonttype = gridtype) or (fonttype = bothtype):
	draw (0,-d)--(0,h);
	fi
endchar;
  
fi

