divert(-1)
% Lettering.defs
% Lettering definitions

define(`Letter_init',
 `# Letter grid parameters
  lu = 0.07
  define(`grthick',`0.4')
  define(`letterlinethick',`(lu/0.07)*1.2')
  define(`ft2',`(linethick/2)pt__')
  linethick_(letterlinethick)

  ifelse(m4postprocessor,pstricks,
    ` \newgray{gridgray}{0.75}
      \newgray{lightgridgray}{0.80}
      \newgray{linegray}{0.40}',
  m4postprocessor,pgf,
    ` \definecolor{gridgray}{rgb}{0.433,0.433,0.433}
      \definecolor{lightgridgray}{rgb}{0.8,0.8,0.8}
      \definecolor{linegray}{rgb}{0.231,0.231,0.231}',
  m4postprocessor,mpost,
    ` define(`gridgray',`0.433,0.433,0.433')
      define(`lightgridgray',`0.8,0.8,0.8')
      define(`linegray',`0.231,0.231,0.231')',
# else
    ` define(`gridgray',`0.5 0.5 0.5')
      define(`lightgridgray',`0.8 0.8 0.8')
      define(`linegray',`0.3 0.3 0.3')')
  ifpstricks(`command `"\makeatletter \def\psas@@c{setlinecap 0 0 moveto"'
  command `"   0 0.1 L stroke 0 0 moveto } \makeatother"'')
`# Letter_init end'
  ')

# graph coordinate system
define(`gco',`(vscal_(lu,$1,$2))')

%                              `Stroke arrow
%                               stroke(linespec,vert offset,label,<-,linelabel)'
define(`setstroke',`ifmpost(
 `setrgb(0,0,0)',
 `psset_(linecolor=black,arrows=-)')dnl
  linethick_(0.3); arrowwid = 1.6pt__ ; arrowht = 3pt__')

define(`stroke',`rpoint_(`$1') ; { setstroke
  m4lth = linethick
  ifelse((`$2'),(),,`if (`$2') != 0 then { move to rvec_(0,`$2') }')
  ifelse(`$3',,,`ifelse(index(`$3',"),0,`{$3}',{"`$3'"})')
  ifelse(`$5',,,`$5':)line ifelse(`$4',,->,`$4') to rvec_(rp_len,0) dnl
    chop 3pt__ chop 0
  linethick_(m4lth) }
')

# non-normalized line at 90 deg to line argument
define(`perp',`(`$1'.start.y-`$1'.end.y),(`$1'.end.x-`$1'.start.x) ')

define(`grid',
` lthtmp = linethick; linethick = grthick
  ifmpost(`setrgb(gridgray)',`psset_(linecolor=gridgray)')
  for i=0 to $1 do {
   { line up ($2)*lu from gco(i,0) } }
  for j=0 to $2 do {
   { line right ($1)*lu from gco(0,j) } }
  psset_(`linecolor=black')
  linethick = lthtmp ')

define(`elarrow',`i = ifelse(`$7',,-1,`$7')
  for theta = `$1' to `$2' by `$3' do { i = i+1
    V[i]: `$4'+((`$5')*cosd(theta),(`$6')*sind(theta)) }
  fitcurve(V,i,->) ')

define(`charA',
`[Origin: gco(0,0) `#' `charA'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(3,6)+(0,-ft2) to gco(0,0)+(ft2,ft2)
 L2: line from gco(3,6)+(0,-ft2) to gco(6,0)+(-ft2,ft2)
  L3t: line invis from gco(0,2)+(0,ft2) right lu
 L3: line from Intersect_(L1,L3t) to Intersect_(L2,L3t)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu  ,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu  , lu*0.75,2)
  stroke(from L3.start to L3.end chop lu/3,-lu*0.75,3) ')
  box invis wid 6*lu ht 6*lu with .sw at Origin]')

define(`charB',
`[Origin: gco(0,0) `#' `charB'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
  mid = 3.3*lu-ft2
  topht = 6*lu-2*ft2-mid
 L2: line right_ 5*lu-2*ft2-mid/2
 L5: arc ccw to Here+(0,mid) with .c at Here+(0,mid/2)
 L3: line from (L1,Here) to Here
  l4l = 4.5*lu-2*ft2-topht/2
 L4: line from L1.start right_ l4l
 L7: arc cw to Here+(0,-topht) with .c at Here+(0,-topht/2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu/3,-lu*0.75,2)
  stroke(from L3.start to L3.end chop lu*.75 chop 0,-lu*0.75,3)
  move to L4.start+(0,.75*lu)
  {"4"}; line right l4l chop 3pt__ chop 0
  arcd(Here-(0,.75*lu+topht/2),.75*lu+topht/2,90,-30) cw ->
  "5" below ljust
  arcd(L2.end+(0,mid/2),mid/2+0.75*lu,15,-90) cw -> ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charC',
`[Origin: gco(0,0) `#' `charC'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  ifelse(`$1',,,`circle rad 3*lu-ft2 thick 0.3 dashed at gco(3,3)')
  arcr(gco(3,3),3*lu-ft2,atan2(2.5,1.5),atan2(-2,2.0))
  ifelse(`$1',,,`
  setstroke
  "1" at gco(3,6) above rjust
  arcd(gco(3,3),3.75*lu,105,atan2(-2,2.1)*rtod_) ->
  "2" at gco(3,6) above ljust
  arcd(gco(3,3),3.75*lu,75,atan2(2.5,1.5)*rtod_) cw -> ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charD',
`[Origin: gco(0,0) `#' `charD'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
  lr = 3*lu-ft2
 L2: line right 5*lu-ft2-lr
  arcd(Here+(0,lr),lr,-90,90)
  line to L1.start
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu/3 chop lu/8,-lu*0.75,2)
  move to L1.start+(0,.75*lu)
  {"3"}; line right 5*lu-ft2-lr chop 3pt__ chop 0
  arcd(Here-(0,.75*lu+lr),.75*lu+lr,90,-90) cw -> ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charE',
`[Origin: gco(0,0) `#' `charE'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
 L2: line right 5*lu-2*ft2
 L3: line from L1.start right 4.5*lu-2*ft2
 L4: line from gco(0,3.2)+(ft2,0) right 3*lu-2*ft2
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu/2 chop lu/3,-lu*0.75,2)
  stroke(from L3.start to L3.end chop lu*.75 chop lu/3,-lu*0.75,3)
  stroke(from L4.start to L4.end chop lu*.75 chop lu/3,-lu*0.75,4) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charF',
`[Origin: gco(0,0) `#' `charF'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
 L2: line from L1.start right 5*lu-2*ft2
 L3: line from gco(0,3.2)+(ft2,0) right 3*lu-2*ft2
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu*.75 chop lu/3,-lu*0.75,2)
  stroke(from L3.start to L3.end chop lu*.75 chop lu/3,-lu*0.75,3) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charG',
`[Origin: gco(0,0) `#' `charG'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  ifelse(`$1',,,`circle rad 3*lu-ft2 thick 0.3 dashed at gco(3,3)')
  L3: line from gco(3,3) to gco(5,3) then to gco(5,1)
  arcr(gco(3,3),3*lu-ft2,atan2(2.5,1.5),atan2(-2,2.0))
  ifelse(`$1',,,`
  setstroke
  "1" at gco(3,6) above rjust
  arcd(gco(3,3),3.75*lu,105,atan2(-2,2.1)*rtod_) ->
  "2" at gco(3,6) above ljust
  arcd(gco(3,3),3.75*lu,75,atan2(2.5,1.5)*rtod_) cw ->
  line from L3.start+(0,-.75*lu) right 1.2*lu chop .5*lu chop 0
  { "3" at last line.start rjust }
  arrow down 1.2*lu ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charH',
`[Origin: gco(0,0) `#' `charH'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
 L2: line from gco(5,6)+(0,-ft2) to gco(5,0)+(0,ft2)
 L3: line from gco(0,3.2)+(ft2,0) to gco(5,3.2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu/3, lu*0.75,2)
  stroke(from L3.start to L3.end chop lu*.75 chop lu/3,-lu*0.75,3) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charI',
`[Origin: gco(0,0) `#' `charI'
  ifelse(`$1',,,`grid(1,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3, lu*0.75,1) ')
  box invis wid 2*ft2 ht 6*lu with .sw at Origin]')

define(`charJ',
`[Origin: gco(0,0) `#' `charJ'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  v = (sqrt(2)-1)*4/3
  al = 2.5*lu-ft2
  bl = 2.0*lu-ft2/2
  CL: gco(2.5,4.0)+(0,-bl)
  E: ellipse ht 2*bl wid 2*al thick 0.3 ifelse(`$1',,invis,dashed) at CL
 L1: line from (E.e,gco(0,6)+(ft2,-ft2)) to E.e
  spline v to (E.e,E.s) then to (E.w,E.s) then to E.w
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3, lu*0.75,1)
  "2" at gco(-.5,1.5)
  spline v -> from gco(-0.4,0.75) to gco(-0.2,-0.65) then to gco(5.65,-0.65) \
    then to gco(5.65,2) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charK',
`[Origin: gco(0,0) `#' `charK'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
 L3t:line ifelse(`$1',,invis,dashed) thick 0.3 from L1.start \
  to gco(5,0)+(-ft2,ft2)
 L2: line from gco(4.5,6)+(0,-ft2) to gco(0,2)+(ft2,0)
 L3: line from Intersect_(L3t,L2) to L3t.end
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu*4/3 chop lu,-lu*0.75,2)
  stroke(from L3.start to L3.end chop lu*.75 chop lu/3, lu*0.75,3) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charL',
`[Origin: gco(0,0) `#' `charL'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
 L2: line to gco(5,0)+(-ft2,ft2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu/3,-lu*0.75,2) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charM',
`[Origin: gco(0,0) `#' `charM'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
 L2: line from gco(6,6)+(-ft2,-ft2) to gco(6,0)+(-ft2,ft2)
 L3: line from L1.start to gco(3,0)+(0,ft2)
 L4: line from L2.start to gco(3,0)+(0,ft2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu/3, lu*0.75,2)
  stroke(from L3.start to L3.end chop lu*.75 chop lu*2, lu*0.75,3)
  stroke(from L4.start to L4.end chop lu*.75 chop lu*2,-lu*0.75,4) ')
  box invis wid 6*lu ht 6*lu with .sw at Origin]')

define(`charN',
`[Origin: gco(0,0) `#' `charN'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
 L2: line from gco(5,6)+(0,-ft2) to gco(5,0)+(0,ft2)
 L3: line from L1.start to L2.end
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu/3, lu*0.75,2)
  stroke(from L3.start to L3.end chop lu*1.0 chop lu*1.5, lu*0.75,3) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charO',
`[Origin: gco(0,0) `#' `charO'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  circle rad 3*lu-ft2 at gco(3,3)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(3,6) above rjust
  arcd(gco(3,3),3.75*lu,105,atan2(-2,2.1)*rtod_) ->
  "2" at gco(3,6) above ljust
  arcd(gco(3,3),3.75*lu,75,atan2(-2,2.1)*rtod_+5) cw -> ')
  box invis wid 6*lu ht 6*lu with .sw at Origin]')

define(`charP',
`[Origin: gco(0,0) `#' `charP'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
 L2: line from gco(0,3)+(ft2,0) right 5*lu-ft2-(3*lu-ft2)/2
 L3: line from L1.start right 5*lu-ft2-(3*lu-ft2)/2
  arcd(Here+(0,-(3*lu-ft2)/2),(3*lu-ft2)/2,-90,90)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu*.75 chop lu/3,-lu*0.75,2)
  "3" at gco(0,6)+(0,lu*.75)
  line to (L3.end,Here) chop lu/2 chop 0
  arcd(Here+(0,-4.5*lu/2),4.5*lu/2,90,-90) cw -> ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charQ',
`[Origin: gco(0,0) `#' `charQ'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  circle rad 3*lu-ft2 at gco(3,3)
  rpoint_(from gco(3,3) to gco(5,0))
  ifelse(`$1',,,`{line dashed dashwid*0.8 thick 0.3 to rvec_(2*lu-ft2,0)}')
  L3: line from rvec_(2*lu-ft2,0) to rvec_(4*lu-ft2,0)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(3,6) above rjust
  arcd(gco(3,3),3.75*lu,105,atan2(-2,2.1)*rtod_) ->
  "2" at gco(3,6) above ljust
  arcd(gco(3,3),3.75*lu,75,atan2(-2,2.1)*rtod_+5) cw ->
  stroke(from L3.start to L3.end chop -lu/3 chop lu/3,-lu*0.75,3) ')
  box invis wid 6*lu ht 6*lu with .sw at Origin]')

define(`charR',
`[Origin: gco(0,0) `#' `charR'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
 L2: line from gco(0,3)+(ft2,0) right 5*lu-ft2-(3*lu-ft2)/2
 Lt4: line thick 0.3 ifelse(`$1',,invis,dashed) from gco(1,6)+(-ft2,-ft2) \
  to gco(5,0)+(-ft2,ft2)
 L4: line from Intersect_(Lt4,L2) to Lt4.end
 L3: line from L1.start right 5*lu-ft2-(3*lu-ft2)/2
  arcd(Here+(0,-(3*lu-ft2)/2),(3*lu-ft2)/2,-90,90)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu*.75 chop lu,-lu*0.75,2)
  stroke(from L4.start to L4.end chop lu chop lu*.5,-lu*0.75,4)
  "3" at gco(0,6)+(0,lu*.75)
  line to (L3.end,Here) chop lu/2 chop 0
  arcd(Here+(0,-4.5*lu/2),4.5*lu/2,90,-80) cw -> ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charS',
`[Origin: gco(0,0) `#' `charS'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  ah = 2.0*lu-ft2
  bh = 1.4*lu-ft2/2
  CH: gco(2.5,3.2)+(0,bh)
  ifelse(`$1',,,`ellipse ht 2*bh wid 2*ah thick 0.3 dashed at CH')
  al = 2.5*lu-ft2
  bl = 1.6*lu-ft2/2
  CL: gco(2.5,3.2)+(0,-bl)
  ifelse(`$1',,,`ellipse ht 2*bl wid 2*al thick 0.3 dashed at CL')
  i = 0
  V[i]: CH+(ah*cosd(20),bh*sind(20))
  for theta = 30 to 270 by 22.5 do { i = i+1
    V[i]: CH+(ah*cosd(theta),bh*sind(theta)) }
  for theta = 90-22.5 to -135 by -22.5 do { i = i+1
    V[i]: CL+(al*cosd(theta),bl*sind(theta)) }
  i = i+1
  V[i]: gco(0,1)+(ft2,0)
  fitcurve(V,i)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(1,5.5) above rjust
  elarrow(120,40,-20,CH,2.75*lu,2.15*lu)
  "2" at gco(2.0,4.5) above
  i = -1
  for theta = 150 to 270 by 30 do { i = i+1
    V[i]: CH+(1.25*cosd(theta),0.65*sind(theta))*lu }
  elarrow(60,-80,-20,CL,3.25*lu,2.35*lu,i)
  "3" at gco(0,0) above rjust
  elarrow(225,270,15,CL,3.25*lu,2.35*lu) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charT',
`[Origin: gco(0,0) `#' `charT'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(6,6)+(-ft2,-ft2)
 L2: line from gco(3,6)+(0,-ft2) to gco(3,0)+(0,ft2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3, lu*0.75,1)
  stroke(from L2.start to L2.end chop lu*2/3 chop lu/3,-lu*0.75,2) ')
  box invis wid 6*lu ht 6*lu with .sw at Origin]')

define(`charU',
`[Origin: gco(0,0) `#' `charU'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  v = (sqrt(2)-1)*4/3
  al = 2.5*lu-ft2
  bl = 2.0*lu-ft2/2
  CL: gco(2.5,4.0)+(0,-bl)
  E: ellipse ht 2*bl wid 2*al thick 0.3 ifelse(`$1',,invis,dashed) at CL
 L1: line from (E.w,gco(0,6)+(ft2,-ft2)) to E.w
 L2: line from (E.e,L1.start) to E.e
  spline v to (E.e,E.s) then to (E.w,E.s) then to E.w
  ifelse(`$1',,,`
  stroke(from L2.start to L2.end chop lu/3, lu*0.75,2)
  stroke(from L1.start to L1.end chop lu/3,-lu*0.75,1)
  "3" at gco(-.5,1.5)
  spline v -> from gco(-0.4,0.75) to gco(-0.2,-0.65) then to gco(5.65,-0.65) \
    then to gco(5.65,2) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charV',
`[Origin: gco(0,0) `#' `charV'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(3,0)+(0,ft2)
 L2: line to gco(6,6)+(-ft2,-ft2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu,-lu*0.75,1)
  stroke(from L2.end to L2.start chop lu, lu*0.75,2) ')
  box invis wid 6*lu ht 6*lu with .sw at Origin]')

define(`charW',
`[Origin: gco(0,0) `#' `charW'
  ifelse(`$1',,,`grid(8,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(2,0)+(0,ft2)
 L2: line from gco(4,6)+(0,-ft2) to L1.end
 L3: line from L2.start to gco(6,0)+(0,ft2)
 L4: line from gco(8,6)+(-ft2,-ft2) to L3.end
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu*1.5 chop lu*.5,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu*.75 chop lu*1.5,-lu*0.75,2)
  stroke(from L3.start to L3.end chop lu*2 chop lu*.5,-lu*0.75,3)
  stroke(from L4.start to L4.end chop lu*.75 chop lu*1.5,-lu*0.75,4) ')
  box invis wid 8*lu ht 6*lu with .sw at Origin]')

define(`charX',
`[Origin: gco(0,0) `#' `charX'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0.5,6)+(ft2,-ft2) to gco(6,0)+(-ft2,ft2)
 L2: line from gco(5.5,6)+(-ft2,-ft2) to gco(0,0)+(ft2,ft2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu, lu*0.75,1)
  stroke(from L2.start to L2.end chop lu,-lu*0.75,2) ')
  box invis wid 6*lu ht 6*lu with .sw at Origin]')

define(`charY',
`[Origin: gco(0,0) `#' `charY'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(3,3)+(0,ft2)
 L2: line from gco(6,6)+(-ft2,-ft2) to L1.end
 L3: line to gco(3,0)+(0,ft2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu, lu*0.75,1)
  stroke(from L2.start to L2.end chop lu,-lu*0.75,2)
  stroke(from L3.start to L3.end chop lu/3,-lu*0.75,3) ')
  box invis wid 6*lu ht 6*lu with .sw at Origin]')

define(`charZ',
`[Origin: gco(0,0) `#' `charZ'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0.5,6)+(ft2,-ft2) to gco(5,6)+(-ft2,-ft2)
 L2: line to gco(0,0)+(ft2,ft2)
 L3: line to gco(5,0)+(-ft2,ft2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3, lu*0.75,1)
  stroke(from L2.start to L2.end chop 1.5*lu chop lu,-lu*0.75,2)
  stroke(from L3.start to L3.end chop lu/3,-lu*0.75,3) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`char1',
`[Origin: gco(0,0) `#' `char1'
  ifelse(`$1',,,`grid(1,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3, lu*0.75,1) ')
  box invis wid 2*ft2 ht 6*lu with .sw at Origin]')

define(`char2',
`[Origin: gco(0,0) `#' `char2'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  ah = 2.0*lu-ft2
  bh = 1.4*lu-ft2/2
  CH: gco(2.5,3.2)+(0,bh)
  ifelse(`$1',,,`ellipse ht 2*bh wid 2*ah thick 0.3 dashed at CH')
  al = 2.5*lu-ft2
  bl = 1.6*lu-ft2/2
  CL: gco(2.5,3.2)+(0,-bl)
  ifelse(`$1',,,`ellipse ht 2*bl wid 2*al thick 0.3 dashed at CL')
  i = 0
  V[i]: CH+(ah*cosd(160),bh*sind(160))
  for theta = 150 to -90+22.5 by -22.5 do { i = i+1
    V[i]: CH+(ah*cosd(theta),bh*sind(theta)) }
  fitcurve(V,i)
  v = (sqrt(2)-1)*4/3
  spline v from V[i] to gco(2.8,3.0) then \
    to gco(1.5,2.6) then to gco(0,1.2)+(ft2,0) then to gco(0,0)+(ft2,ft2)
  psset_(`arrows=c-c') dnl
  L2: line to gco(5,0)+(-ft2,ft2)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(1,5.5) above rjust
  i = -1
  for theta = 120 to -60 by -20 do { i = i+1
    V[i]: CH+(2.75*cosd(theta),2.15*sind(theta))*lu }
  i=i+1; V[i]: gco(2.6,2.1)
  i=i+1; V[i]: gco(1.3,1.6)
  i=i+1; V[i]: gco(0.95,0.5)
  v = (sqrt(2)-1)*4/3
  spline v -> from V[0] to V[1]
  for n = 2 to i do { continue to V[n] }
  stroke(from L2.start to L2.end chop lu/3,-lu*0.75,2) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`char3',
`[Origin: gco(0,0) `#' `char3'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  ah = 2.0*lu-ft2
  bh = 1.4*lu-ft2/2
  CH: gco(2.5,3.2)+(0,bh)
  H: ellipse ht 2*bh wid 2*ah thick 0.3 ifelse(`$1',,invis,dashed) at CH
  al = 2.5*lu-ft2
  bl = 1.6*lu-ft2/2
  CL: gco(2.5,3.2)+(0,-bl)
  L: ellipse ht 2*bl wid 2*al thick 0.3 ifelse(`$1',,invis,dashed) at CL
  i = 0
  V[i]: CH+(ah*cosd(160),bh*sind(160))
  for theta = 150 to -90 by -20 do { i = i+1
    V[i]: CH+(ah*cosd(theta),bh*sind(theta)) }
  fitcurve(V,i)
  line from H.s to (gco(2,3)+(ft2,0),H.s)
  i = -1
  for theta = 90 to -135 by -22.5 do { i = i+1
    V[i]: CL+(al*cosd(theta),bl*sind(theta)) }
  i = i+1
  V[i]: gco(0,1)+(ft2,0)
  fitcurve(V,i)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(1,5.5) above rjust
  elarrow(120,-20,-20,CH,2.75*lu,2.15*lu)
  "2" at gco(4.6,3.5)
  elarrow(40,-80,-10,CL,3.25*lu,2.35*lu)
  "3" at gco(0,0) above rjust
  i = 0
  V[i]: CL+(3.25*cosd(220),2.35*sind(220))*lu
  elarrow(240,270,15,CL,3.25*lu,2.35*lu,0) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`char4',
`[Origin: gco(0,0) `#' `char4'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(4,6)+(-ft2,-ft2) to gco(4,0)+(-ft2,ft2)
 L2: line from L1.start to gco(0,1.5)+(ft2,-ft2)
 L3: line to (gco(5,1.5)+(-ft2,0),Here)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3 chop 0, lu*.75,1)
  stroke(from L2.start to L2.end chop lu chop lu/3,-lu*.75,2)
  stroke(from L3.start to L3.end chop lu/3 chop lu/2,-lu*.75,3) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`char5',
`[Origin: gco(0,0) `#' `char5'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  L1: line from gco(.5,6)+(0,-ft2) to gco(.5,3)
  L4: line from L1.start to gco(4.5,6)+(-ft2,-ft2)
  al = 2.5*lu-ft2
  bl = 2.0*lu-ft2/2
  CL: gco(2.5,4.0)+(0,-bl)
  i = 0
  V[i]: L1.end
  for theta = 125 to -135 by -25 do { i = i+1
    V[i]: CL+(al*cosd(theta),bl*sind(theta)) }
  i = i+1
  V[i]: gco(0,1)+(ft2,0)
  fitcurve(V,i)
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3 chop 0,-lu*.75,1)
  stroke(from L4.start to L4.end chop lu/3 chop 0, lu*.75,4)
  v = (sqrt(2)-1)*4/3
  "2" at gco(1.0,4.0) above
  elarrow(110,-80,-10,CL,al+lu*.75,bl+lu*.75)
  "3" at gco(0,0) above rjust
  i = 0
  V[i]: CL+((al+0.75*lu)*cosd(220),(bl+.75*lu)*sind(220))
  elarrow(240,270,15,CL,al+lu*.75,bl+lu*.75,0) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`char6',
`[Origin: gco(0,0) `#' `char6'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  ab = 2.5*lu-ft2
  bb = 3.0*lu-ft2
  Cb: gco(2.5,3.0)
  ifelse(`$1',,,`ellipse ht 2*bb wid 2*ab thick 0.3 dashed at Cb')
  i = -1
  for theta = -315 to 180-22.5 by 22.5 do { i = i+1
    if (theta<=-90) then {X:Cb; x=ab; y=bb } \
    else {X: gco(2.5,2); x=ab; y=2*lu-ft2 }
    V[i]: X+(x*cosd(theta),y*sind(theta)) }
  fitcurve(V,i)
  v = (sqrt(2)-1)*4/3
  ifelse(`$1',,,`
  setstroke
  "1" at gco(2,6) above
  x = ab+lu*.75; y = bb+lu*.75
  elarrow(90+22.5,270+22.5,22.5,Cb,x,y)
  "3" at gco(3,6) above
  elarrow(70,45,-12.5,Cb,x,y)
  "2" at gco(1.2,3.8) above
  elarrow(100,-50,-10,gco(2.5,2),ab+lu*.65,2*lu+lu*.65) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`char7',
`[Origin: gco(0,0) `#' `char7'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(5,6)+(-ft2,-ft2)
  { L1t: line invis to gco(1.3,0)
  L2t: line invis up lu from gco(2,0)+(-ft2,0) }
  psset_(`arrows=-') dnl
  arcto(Intersect_(L1t,L2t),L2t.start,2.5*lu)
  line to (Here,gco(2,0))
  ifelse(`$1',,,`
  stroke(from L1.start to L1.end chop lu/3, lu*0.75,1)
  stroke(from L1t.start to 4th last line.end chop lu/3 chop 0,
    lu*.75,2,thick 0.3,L1)
  L2: line <- up arrowht from gco(2.75,0)+(-ft2,ft2) 
  move to L1.end
  arcto(Intersect_(L1,L2),L2.start,(2.5-0.75)*lu,thick 0.3) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`char8',
`[Origin: gco(0,0) `#' `char8'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  ah = 2.0*lu
  bh = 1.4*lu
  CH: gco(2.5,6)+(0,-bh)
  H: ellipse ht 2*bh wid 2*ah at CH
  al = 2.5*lu
  bl = 1.6*lu+ft2/2
  CL: gco(2.5,3.2)+(0,ft2)+(0,-bl)
  L: ellipse ht 2*bl wid 2*al at CL
  ifelse(`$1',,,`
  setstroke
  x = ah+lu*.75; y = bh+lu*.75
  "1" at gco(2,6) above
  elarrow(110,205,15,CH,x,y)
  "2" at gco(3,6) above
  elarrow(70,-25,-15,CH,x,y)
  x = al+lu*.75; y = bl+lu*.75
  "3" at gco(0.2,2.6) above
  elarrow(150,260,10,CL,x,y)
  "4" at gco(4.8,2.6) above
  elarrow(30,-80,-10,CL,x,y) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`char9',
`[Origin: gco(0,0) `#' `char9'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  ab = 2.5*lu-ft2
  bb = 3.0*lu-ft2
  Cb: gco(2.5,3.0)
  ifelse(`$1',,,`ellipse ht 2*bb wid 2*ab thick 0.3 dashed at Cb')
  i = -1
  for theta = -135 to 360-22.5 by 22.5 do { i = i+1
    if (theta<=90) then {X:Cb; x=ab; y=bb } \
    else {X: gco(2.5,4); x=ab; y=2*lu-ft2 }
    V[i]: X+(x*cosd(theta),y*sind(theta)) }
  fitcurve(V,i)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(2,6) above
  elarrow(90+22.5,270+22.5,22.5,X,3.15*lu-ft2,2.65*lu-ft2)
  "2" at gco(3,6) above
  elarrow(80,-80,-10,Cb,ab+lu*.65,bb+lu*.65)
  "3" at gco(0,1)
  elarrow(225,270,15,Cb,3.15*lu,3.65*lu) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`char0',
`[Origin: gco(0,0) `#' `char0'
  ifelse(`$1',,,`grid(6,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  ab = 2.5*lu-ft2
  bb = 3.0*lu-ft2
  Cb: gco(2.5,3.0)
  ellipse ht 2*bb wid 2*ab at Cb
  ifelse(`$1',,,`
  setstroke
  "1" at gco(2,6) above
  elarrow(90+22.5,270,22.5,Cb,.65*lu+ab,.65*lu+bb)
  "2" at gco(3,6) above
  elarrow(70,-80,-10,Cb,ab+lu*.65,bb+lu*.65) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charAnd',
`[Origin: gco(0,0) `#' `fAnd'
  ifelse(`$1',,,`grid(5,6)')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  v = (sqrt(2)-1)*4/3
  spline v from gco(5,0)+(-ft2,ft2) \
   to gco(4.605,0.312) to gco(1.443,4.038) \
   to gco(1.335,4.198) to gco(1.134,4.597) to gco(1.103,4.938) \
   to gco(1.143,5.252) to gco(1.358,5.605) to gco(1.702,5.797) \
   to gco(2.236,5.857) to gco(2.637,5.772) to gco(2.981,5.499) \
   to gco(3.157,5.132) to gco(3.087,4.565) to gco(2.746,4.189) \
   to gco(2.415,3.895) to gco(2.009,3.621) to gco(1.522,3.339) \
   to gco(1.157,3.095) to gco(0.671,2.769) to gco(0.435,2.520) \
   to gco(0.227,2.215) to gco(0.101,1.636) to gco(0.234,1.165) \
   to gco(0.373,0.926) to gco(0.512,0.738) to gco(0.918,0.443) \
   to gco(1.190,0.340) to gco(1.427,0.274) to gco(2.140,0.166) \
   to gco(2.617,0.164) to gco(3.031,0.216) to gco(3.616,0.395) \
   to gco(4.017,0.600) to gco(4.121,0.676) to gco(4.482,1.017) \
   to gco(4.637,1.302) to gco(4.753,1.532) to gco(4.863,1.875)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(1.4,6) above
  spline -> from gco(1.0,6.2) to gco(.35,5.5) then to gco(.35,4) \
    then to gco(4.0,0)
  "2" at gco(2.6,6) above
  spline -> from gco(3.0,6.2) to gco(3.75,5.5) then to gco(3.75,3.9) \
    then to gco(1,2.4) then to gco(1,1.1) then to gco(2,.9)
  "3" at gco(4.2,2.4)
  spline -> from gco(4.1,1.8) to gco(3.8,1.3) then to gco(3,.9) \
    then to gco(2.2,.9) ')
  box invis wid 5*lu ht 6*lu with .sw at Origin]')

define(`charComma',
` circle fill_(0) rad ft2 at Here+(0,-3*lu+ft2)
  move to last circle.c
  arc cw from Here+(0,ft2) to Here+(0,-4*ft2) \
    with .c at Here+(-ft2,-1.5*ft2)
  move to last circle+(ft2,-ft2+3*lu)')

define(`charPeriod',
` circle fill_(0) rad ft2 at Here+(0,-3*lu+ft2)
  move to last circle+(ft2,-ft2+3*lu)')

define(`chara',
`[Origin: gco(0,0) `#' `chara'
  psset_(`arrows=c-c,linecolor=linegray') dnl
  circle rad 2*lu-ft2 with .c at gco(2,2)
 L3: line from gco(4,4)+(-ft2,-ft2) to gco(4,0)+(-ft2,ft2)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(1.5,3.0)
  arcd(gco(2,2),1.2*lu,130,265) ->
  "2" at gco(2.5,3.0)
  arcd(gco(2,2),1.2*lu,50,-85) -> cw
  stroke(from L3.start to L3.end chop lu/3 chop 0,lu*0.5,3) ')
  box invis wid 4*lu ht 4*lu with .sw at Origin]')

define(`charb',
`[Origin: gco(0,0) `#' `charb'
  psset_(`arrows=c-c,linecolor=linegray') dnl
  circle rad 2*lu-ft2 with .c at gco(2,2)
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3 chop 0,lu*0.5,1)
  "2" at gco(1.5,3.0)
  arcd(gco(2,2),1.2*lu,130,265) ->
  "3" at gco(2.5,3.0)
  arcd(gco(2,2),1.2*lu,50,-85) -> cw ')
  box invis wid 4*lu ht 6*lu with .sw at Origin]')

define(`charc',
`[Origin: gco(0,0) `#' `charc'
  ifelse(`$1',,,
   `circle outlined "linegray" rad 2*lu-ft2 thick 0.3 dashed lu/2 at gco(2,2)')
  psset_(`linecolor=linegray') dnl
  arcr(gco(2,2),2*lu-ft2,atan2(1.7,1),atan2(-1,1.6))
  ifelse(`$1',,,`
  setstroke
  "1" at gco(1.5,3.0)
  arcd(gco(2,2),1.2*lu,130,-45) ->
  "2" at gco(2.5,3.0)
  arcd(gco(2,2),1.2*lu,50,20) -> cw ht 0.75 * arrowht ')
  box invis wid 4*lu ht 4*lu with .sw at Origin]')

define(`chard',
`[Origin: gco(0,0) `#' `chard'
  psset_(`arrows=c-c,linecolor=linegray') dnl
  circle rad 2*lu-ft2 with .c at gco(2,2)
 L3: line from gco(4,6)+(-ft2,-ft2) to gco(4,0)+(-ft2,ft2)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(1.5,3.0)
  arcd(gco(2,2),1.2*lu,130,265) ->
  "2" at gco(2.5,3.0)
  arcd(gco(2,2),1.2*lu,50,-85) -> cw
  stroke(from L3.start to L3.end chop lu/3 chop 0,lu*0.5,3) ')
  box invis wid 4*lu ht 6*lu with .sw at Origin]')

define(`chare',
`[Origin: gco(0,0) `#' `chare'
  ifelse(`$1',,,
   `circle outlined "linegray" rad 2*lu-ft2 thick 0.3 dashed lu/2 at gco(2,2)')
  psset_(`linecolor=linegray') dnl
  arcr(gco(2,2),2*lu-ft2,atan2(0.2,2),atan2(-1,1.6))
 L3: line from last arc.start to (gco(0.2,0).x, last arc.start.y)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(1.5,3.0)
  arcd(gco(2,2),1.2*lu,130,-45) ->
  "2" at gco(2.5,3.0)
  arcd(gco(2,2),1.2*lu,50,20) -> cw ht 0.75 * arrowht ')
  stroke(from L3.end to L3.start chop lu*1.5 chop lu/3,-lu*0.5,3)
  box invis wid 4*lu ht 4*lu with .sw at Origin]')

define(`charf',
`[Origin: gco(0,0) `#' `charf'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L3: line from gco(0,4)+(ft2,0) to gco(2,4)+(-ft2,0)
 L1: line from gco(1,0)+(0,ft2) to gco(1,4.8)
  psset_(`linecolor=linegray') dnl
  arc cw to gco(3,5.5)+(0,0) with .c at gco(2.12,4.8)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.end to L1.start chop -lu/5 chop lu/3,-lu*0.75,1)
  "2" at gco(1.5,4.6)
  arcd(gco(2.12,4.8),0.6*lu,140,40) -> cw ht 0.75 * arrowht
  stroke(from L3.start to L3.end chop lu*.5 chop 0,-lu*0.75,3) ')
  box invis wid 3*lu ht 6*lu with .sw at Origin]')

define(`charg',
`[Origin: gco(0,0) `#' `charg'
  ifelse(`$1',,,
   `circle outlined "linegray" rad 2*lu-ft2 thick 0.3 dashed lu/2 at gco(2,0) ')
  psset_(`arrows=c-c,linecolor=linegray') dnl
  circle rad 2*lu-ft2 with .c at gco(2,2)
 L3: line from gco(4,4)+(-ft2,-ft2) to gco(4,0)+(-ft2,0)
  psset_(`linecolor=linegray') dnl
  arcr(gco(2,0),2*lu-ft2,0,atan2(-1,-1.5)) cw
  ifelse(`$1',,,`
  setstroke
  "1" at gco(1.5,3.0)
  arcd(gco(2,2),1.2*lu,130,265) ->
  "2" at gco(2.5,3.0)
  arcd(gco(2,2),1.2*lu,50,-85) -> cw
  "4" at gco(0.7,-0.6)
  arcd(gco(2,0),1.2*lu,-135,-45) -> ht 0.75 * arrowht
  stroke(from L3.start to L3.end chop lu*0 chop 0,lu*0.5,3) ')
  box invis wid 4*lu ht 6*lu with .sw at gco(0,-2)]')

define(`charh',
`[Origin: gco(0,0) `#' `charh'
  ifelse(`$1',,,
   `circle outlined "linegray" rad 2*lu-ft2 thick 0.3 dashed lu/2 at gco(2,2) ')
  psset_(`linecolor=linegray') dnl
  arcd(gco(2,2),2*lu-ft2,180,0) cw
  psset_(`arrows=c-c,linecolor=linegray') dnl
  line to gco(4,0)+(-ft2,ft2)
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3 chop 0,lu*0.5,1)
  "2" at gco(1.0,2.4)
  arcd(gco(2,2),1.2*lu,130,0) cw
  stroke(to (Here,gco(0,0)) chop -3pt__ chop lu/4) ')
  box invis wid 4*lu ht 6*lu with .sw at Origin]')

define(`chari',
`[Origin: gco(0,0) `#' `chari'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,0)+(ft2,ft2) to gco(0,4)+(ft2,-ft2)
 L2: line from gco(0,6)+(ft2,-ft2) to gco(0,5.5)+(ft2,0)
  ifelse(`$1',,,`
  setstroke
  stroke(from L2.start to L2.end+(0,-lu*.2) chop -lu*.7 chop 0,-lu*0.5,)
  "2" at last line.c+(0.1*lu,-0.2*lu) rjust
  stroke(from L1.end to L1.start chop lu/3 chop 0,-lu*0.5,1) ')
  box invis wid ft2*2 ht 6*lu with .sw at Origin]')

define(`charj',
`[Origin: gco(0,0) `#' `charj'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L2: line from gco(2,6)+(0,-ft2) to gco(2,5.5)
 L1: line from gco(2,4)+(0,-ft2) to gco(2,-0.8)
  psset_(`linecolor=linegray') dnl
  arc cw to gco(0,-1.5) with .c at gco(0.88,-0.8)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3 chop 0,-lu*0.5,1,solid)
  arcd(gco(0.88,-0.8),.62*lu,0,-135) cw -> ht 0.75*arrowht
  stroke(from L2.start to L2.end+(0,-lu*.2) chop -lu*.7 chop 0,-lu*0.5,)
  "2" at last line.c+(0.1*lu,-0.2*lu) rjust ')
  box invis wid 2*lu ht 6*lu with .sw at Origin+(0,-2*lu)]')

define(`chark',
`[Origin: gco(0,0) `#' `chark'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
 L2: line from gco(3.4,4)+(0,-ft2) to gco(0,1.6)+(ft2,ft2)
 L3t:line ifelse(`$1',,invis,dashed lu/2) thick 0.3 from gco(0,4)+(ft2,0) \
    to gco(4,0)+(-ft2,ft2)
 L3: line from Intersect_(L2,L3t) to L3t.end
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3 chop 0,-lu*0.5,1)
  stroke(from L2.start to L2.end chop lu/2 ,-lu*0.6,2)
  stroke(from L3.start to L3.end chop lu/2 ,-lu*0.6,3) ')
  box invis wid 4*lu ht 6*lu with .sw at Origin]')

define(`charl',
`[Origin: gco(0,0) `#' `charl'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,6)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3 chop 0,-lu*0.5,1) ')
  box invis wid 2*ft2 ht 6*lu with .sw at Origin]')

define(`charm',
`[Origin: gco(0,0) `#' `charm'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,4)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
  ifelse(`$1',,,
   `circle outlined "linegray" rad 1.5*lu-ft2/2 thick 0.3 dashed lu/2 \
      at gco(1.5,2.5)+(ft2/2,0)
    circle outlined "linegray" rad 1.5*lu-ft2/2 thick 0.3 dashed lu/2 \
      at gco(4.5,2.5)+(-ft2/2,0) ')
  psset_(`linecolor=linegray') dnl
  arcd(gco(1.5,2.5)+(ft2/2,0),1.5*lu-ft2/2,180,0) cw
  arcd(gco(4.5,2.5)+(-ft2/2,0),1.5*lu-ft2/2,180,0) cw
  psset_(`arrows=c-c,linecolor=linegray') dnl
  line from gco(3,2.5) to gco(3,0)+(0,ft2)
  line from gco(6,2.5)+(-ft2,0) to gco(6,0)+(-ft2,ft2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3 chop 0,-lu*0.5,1)
  "2" at gco(0.9,2.2)
  arcd(gco(1.5,2.5)+(ft2/2,0),0.75*lu-ft2/2,160,0) cw
  stroke(to (Here,gco(0,0)) chop -3pt__ chop lu/3)
  "3" at gco(3.9,2.2)
  arcd(gco(4.5,2.5)+(-ft2/2,0),0.75*lu-ft2/2,160,0) cw
  stroke(to (Here,gco(0,0)) chop -3pt__ chop lu/3) ')
  box invis wid 6*lu ht 4*lu with .sw at Origin]')

define(`charn',
`[Origin: gco(0,0) `#' `charn'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,4)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
  ifelse(`$1',,,
   `circle outlined "linegray" rad 2*lu-ft2 thick 0.3 dashed lu/2 at gco(2,2) ')
  psset_(`linecolor=linegray') dnl
  arcd(gco(2,2),2*lu-ft2,180,0) cw
  psset_(`arrows=c-c,linecolor=linegray') dnl
  line from gco(4,2)+(-ft2,0) to gco(4,0)+(-ft2,ft2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3 chop 0,-lu*0.5,1)
  "2" at gco(0.9,2.0)
  arcd(gco(2,2),1.25*lu,150,0) cw
  stroke(to (Here,gco(0,0)) chop -3pt__ chop lu/3) ')
  box invis wid 4*lu ht 4*lu with .sw at Origin]')

define(`charo',
`[Origin: gco(0,0) `#' `charo'
  psset_(`arrows=c-c,linecolor=linegray') dnl
  circle rad 2*lu-ft2 with .c at gco(2,2)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(1.5,3.0)
  arcd(gco(2,2),1.2*lu,130,265) ->
  "2" at gco(2.5,3.0)
  arcd(gco(2,2),1.2*lu,50,-85) -> cw ')
  box invis wid 4*lu ht 4*lu with .sw at Origin]')

define(`charp',
`[Origin: gco(0,0) `#' `charp'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,4)+(ft2,-ft2) to gco(0,-2)+(ft2,ft2)
  circle rad 2*lu-ft2 with .c at gco(2,2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3 chop 0,-lu*0.5,1)
  "2" at gco(1.5,3.0)
  arcd(gco(2,2),1.2*lu,130,265) ->
  "3" at gco(2.5,3.0)
  arcd(gco(2,2),1.2*lu,50,-85) -> cw ')
  box invis wid 4*lu ht 6*lu with .sw at Origin+(0,-2*lu)]')

define(`charq',
`[Origin: gco(0,0) `#' `charq'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(4,4)+(-ft2,-ft2) to gco(4,-2)+(-ft2,ft2)
  circle rad 2*lu-ft2 with .c at gco(2,2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3 chop 0,lu*0.5,3)
  "1" at gco(1.5,3.0)
  arcd(gco(2,2),1.2*lu,130,265) ->
  "2" at gco(2.5,3.0)
  arcd(gco(2,2),1.2*lu,50,-85) -> cw ')
  box invis wid 4*lu ht 6*lu with .sw at Origin+(0,-2*lu)]')

define(`charr',
`[Origin: gco(0,0) `#' `charr'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,4)+(ft2,-ft2) to gco(0,0)+(ft2,ft2)
  psset_(`linecolor=linegray') dnl
  arc cw from gco(0,3)+(ft2,0) to gco(2,3.85) rad 1.2*lu with .c at gco(1.5,2.5)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3,-lu*0.5,1)
  "2" at gco(.6,2) above
  arcd(gco(1.5,2.5),0.75*lu,140,60) -> cw ht 0.75 * arrowht ')
  box invis wid 2*lu ht 4*lu with .sw at Origin]')

define(`chars',
`[Origin: gco(0,0) `#' `chars'
  psset_(`arrows=c-c,linecolor=linegray') dnl
  ah = 1.6*lu
  bh = (4*lu-ft2-2.1*lu)/2 #0.95*lu-ft2/2
  CH: gco(2.0,2.1)+(0,bh)
  ifelse(`$1',,,`ellipse ht 2*bh wid 2*ah thick 0.3 dashed lu/2 at CH')
  al = 2.0*lu-ft2
  bl = (2.1*lu-ft2)/2
  CL: gco(2.0,2.1)+(0,-bl)
  ifelse(`$1',,,`ellipse ht 2*bl wid 2*al thick 0.3 dashed lu/2 at CL')
  i = -1
  for theta = 0 to 270 by 22.5 do { i = i+1
    V[i]: CH+(ah*cosd(theta),bh*sind(theta)) }
  for theta = 90-22.5 to -180 by -22.5 do { i = i+1
    V[i]: CL+(al*cosd(theta),bl*sind(theta)) }
  fitcurve(V,i)
  ifelse(`$1',,,`
  setstroke
  "1" at gco(0.5,3.5) above
  elarrow(120,40,-20,CH,(ah+.6*lu),(bh+.6*lu))
  "2" at gco(1.5,3.2)
  i = -1
  for theta = 150 to 270 by 30 do { i = i+1
    V[i]: CH+(lu*cosd(theta),lu*0.5*sind(theta)) }
  fitcurve(V,i)
  r = V[i].y-CL.y
  elarrow(60,-80,-20,CL,2.5*lu,r,i)
  "3" at gco(-.3,.9)
  elarrow(210,270,15,CL,2.5*lu,r) ')
  box invis wid 4*lu ht 4*lu with .sw at Origin]')

define(`chart',
`[Origin: gco(0,0) `#' `chart'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(1,0)+(0,ft2) to gco(1,6)+(0,-ft2)
 L2: line from gco(0,4)+(ft2,0) to gco(2,4)+(-ft2,0)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.end to L1.start chop lu/3,-lu*0.75,1)
  stroke(from L2.start to L2.end chop lu*.5 chop 0,-lu*0.75,2) ')
  box invis wid 2*lu ht 6*lu with .sw at Origin]')

define(`charu',
`[Origin: gco(0,0) `#' `charu'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L2: line from gco(4,4)+(-ft2,-ft2) to gco(4,0)+(-ft2,ft2)
  ifelse(`$1',,,
   `circle outlined "linegray" rad 2*lu-ft2 thick 0.3 dashed lu/2 at gco(2,2) ')
  line from gco(0,4)+(ft2,-ft2) to gco(0,2)+(ft2,0)
  psset_(`linecolor=linegray') dnl
  arcd(gco(2,2),2*lu-ft2,180,0)
  ifelse(`$1',,,`
  setstroke
  stroke(from L2.start to L2.end chop lu/3 chop 0,lu*0.5,2)
  "1" at gco(.9,2.0)
  arcd(gco(2,2),1.25*lu,210,-30) -> ')
  box invis wid 4*lu ht 4*lu with .sw at Origin]')

define(`charv',
`[Origin: gco(0,0) `#' `charv'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,4)+(ft2,-ft2) to gco(2,0)+(0,ft2)
 L2: line to gco(4,4)+(-ft2,-ft2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu chop lu/3,-lu*0.5,1)
  stroke(from L2.end to L2.start chop lu*.6,-lu*0.5,2) ')
  box invis wid 4*lu ht 4*lu with .sw at Origin]')

define(`charw',
`[Origin: gco(0,0) `#' `charw'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,4)+(ft2,-ft2) to gco(1.5,0)+(0,ft2)
 L2: line to gco(3,4)+(0,-ft2)
 L3: line to gco(4.5,0)+(0,ft2)
 L4: line to gco(6,4)+(-ft2,-ft2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu chop lu/3,-lu*0.5,1)
  stroke(from L2.end to L2.start chop lu*.6 chop lu,-lu*0.5,2)
  stroke(from L3.start to L3.end chop lu*1.5 chop lu/3,-lu*0.5,3)
  stroke(from L4.end to L4.start chop lu*.6 chop lu,-lu*0.5,4) ')
  box invis wid 6*lu ht 4*lu with .sw at Origin]')

define(`charx',
`[Origin: gco(0,0) `#' `charx'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0.5,4)+(0,-ft2) to gco(4,0)+(-ft2,ft2)
 L2: line from gco(3.5,4)+(0,-ft2) to gco(0,0)+(ft2,ft2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3,-lu*0.6,1)
  stroke(from L2.start to L2.end chop lu/3,lu*0.6,2) ')
  box invis wid 4*lu ht 4*lu with .sw at Origin]')

define(`chary',
`[Origin: gco(0,0) `#' `chary'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0,4)+(ft2,-ft2) to gco(2,0)+(0,ft2)
 L2x: gco(4,4)+(-ft2,-ft2)
 L2: line from L2x to 1.37<L2x,L1.end>
  C: Here-(perp(L2))/lin_leng(L2)*lu*1.1
  psset_(`linecolor=linegray') dnl
  arcd(C,lu*1.1,-30,-105) cw
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu chop lu/2,-lu*0.5,1)
  stroke(from L2.start to L2.end chop lu*.6 chop 0,-lu*0.5,2,solid)
  arcd(C,lu*.6,-30,-110) cw -> ht 0.75*arrowht ')
  box invis wid 4*lu ht 6*lu with .sw at Origin+(0,-2*lu)]')

define(`charz',
`[Origin: gco(0,0) `#' `charz'
  psset_(`arrows=c-c,linecolor=linegray') dnl
 L1: line from gco(0.5,4)+(ft2,-ft2) to gco(4,4)+(-ft2,-ft2)
 L2: line to gco(0,0)+(ft2,ft2)
 L3: line to gco(4,0)+(-ft2,ft2)
  ifelse(`$1',,,`
  setstroke
  stroke(from L1.start to L1.end chop lu/3 chop lu,-lu*0.6,1)
  stroke(from L2.start to L2.end chop lu,lu*0.6,2)
  stroke(from L3.start to L3.end chop lu/3,-lu*0.6,3) ')
  box invis wid 4*lu ht 4*lu with .sw at Origin]')

define(`xpnd',$*)
define(`Letters',
 `ifelse(`$1',,,`
    ifelse(substr(`$1',0,1),|,`charComma',substr(`$1',0,1),.,`charPeriod',
     `xpnd(char`'substr(`$1',0,1))')
    ifelse(substr(`$1',1,1),,,`move lu*.75/2*(')ifelse(substr(`$1',1,1),,,
      substr(`$1',1,1),8,17,substr(`$1',1,1),6,16,A`'substr(`$1',1,1),A ,3,
      substr(`$1',1,1))ifelse(substr(`$1',1,1),,,`-1)')
    Letters(substr(`$1',2)) ') ')

divert(0)dnl
