divert(-1)
#                                   `datumarrow(linespec,wid,ht)'
define(`datumarrow',`line `$1'
  M4_E: last line.end
  datum_ht = ifelse(`$3',,`textht',`$3')
  M4_P: vperp(last line,(datum_ht*2/sqrt(3)))
  M4_X: datum_ht/lin_leng(last line) between M4_E and last line.start 
  {ifsvg(,`m4fshade(m4fill,')line from M4_E to M4_E+M4_P/2 dnl
     then to M4_X then to M4_E-M4_P/2 then to M4_E ifsvg(`fill_(0)',`)')}')

#                          `Y14_frame( arg1, arg2, ... )
                             Each arg is a ;-separated sequence of 1 or more of
                               "string"[ wid val],
                               "(letter)",
                               or tolerance symbol.
                             The term "(letter)" expands to the circled letter.
                             The frame contains as many boxes as arguments.'
                            `Symbol definitions from ASME Y14.5 Appendix C'
define(`Y14_frameht',`textht*2')
define(`Y14_defaultwid',`textht*2')
#
define(`Y14_frame',`[ tmpthick = linethick; thicklines_
  right_; B:[ Y14_fram_($@) ]
  box wid B.wid ht Y14_frameht at B
  linethick = tmpthick ]')
define(`Y14_fram_',`ifelse(`$1',,,
`stacksplit_(`Y14',`$1',;) stackreverse_(`Y14')
 Bx: [stackdo_(`Y14',
 `[ifelse(index(Y14,`"('),0,
    `circle diam textht*5/3
     patsubst(Y14,`"(\(.\))"',`"\1"') ht textht*0.8 at last circle',
   index(Y14,`"'),0,
    `Y14 ifinstr(Y14,`wid ',,`wid textht*2/3*(len(Y14)-2)')',
   `Y14')]
   move right max(last [].wid+textht/2,Y14_defaultwid) with .c at last []; ')]
 ifelse(`$2',,,`{ line up Y14_frameht with .c at Here }')
 Y14_fram_(shift($@))') ')

#                           Each symbol definition has an abbreviated version
define(`Y14_straightness',
`line right textht*2 ')
define(`Y14_str_',`Y14_straightness($@)')

define(`Y14_flatness',
`line right textht*3/4 then down textht left textht/2 \
   then left textht*3/2 then up textht right textht/2 \
   then right textht*3/4 ')
define(`Y14_fla_',`Y14_flatness($@)')

define(`Y14_circularity',`circle diam textht*3/2 ')
define(`Y14_cir_',`Y14_circularity($@)')

define(`Y14_cylindricity',
`circle diam textht
 Y14_C: last circle
 Y14_R: (Rect_(last circle.rad,-30))
 Y14_A: (Rect_(textht,60))
 line from Y14_C+Y14_R+Y14_A to Y14_C+Y14_R-Y14_A/2
 line from Y14_C-Y14_R-Y14_A to Y14_C-Y14_R+Y14_A/2 ')
define(`Y14_cyl_',`Y14_cylindricity($@)')

define(`Y14_lineprofile',`arc from (textht,0) to (-textht,0) with .c at Here ')
define(`Y14_lin_',`Y14_lineprofile($@)')

define(`Y14_surfaceprofile',
`arc from (textht,0) to (-textht,0) with .c at Here
 line from last arc.start to last arc.end ')
define(`Y14_sur_',`Y14_surfaceprofile($@)')

define(`Y14_perpendicularity',
`line from (-textht,0) to (textht,0)
 line from (0,0) to (0,textht*3/2) ')
define(`Y14_per_',`Y14_perpendicularity($@)')

define(`Y14_angularity',
`line from (textht*3/2,0) to (0,0) then to (textht*3/2,textht*sqrt(3)/2) ')
define(`Y14_ang_',`Y14_angularity($@)')

define(`Y14_parallelism',
`line up textht*3/2*sqrt(3)/2 right textht*3/4
 move right textht*0.6
 line down textht*3/2*sqrt(3)/2 left textht*3/4 ')
define(`Y14_par_',`Y14_parallelism($@)')

define(`Y14_symmetry', dnl obsolete!
`line from (-textht/2,0) to (textht/2,0)
 line from (-textht/3,textht/4) to (textht/3,textht/4)
 line from (-textht/3,-textht/4) to (textht/3,-textht/4) ')
define(`Y14_sym_',`Y14_symmetry($@)')

define(`Y14_position',
`circle diam textht
 line up    textht*3/2 with .c at last circle
 line right textht*3/2 with .c at last circle ')
define(`Y14_pos_',`Y14_position($@)')

define(`Y14_concentricity', dnl obsolete!
`circle diam textht
 circle diam textht/2 at last circle ')
define(`Y14_con_',`Y14_concentricity($@)')

define(`Y14_circularrunout',
`arrow ht textht*0.8 wid textht*0.6 up textht*3/2 right textht*3/2 ')
define(`Y14_cir_',`Y14_circularrunout($@)')

define(`Y14_totalrunout',
`arrow <-> ht textht*0.8 wid textht*0.6 \
 down textht*3/2 left textht*3/2 then right textht*1.1 \
 then up textht*3/2 right textht*3/2 ')
define(`Y14_tot_',`Y14_totalrunout($@)')

define(`Y14_diameter',
`circle diam textht
 line up textht*3/2 right textht*3/4 with .c at last circle')
define(`Y14_dia_',`Y14_diameter($@)')

#                             The following are not Y14.5 but go well with them:

                             `r_box(angle,pos,string)
                              Rotated text on a white background
                              (requires pstricks)'
define(`r_box',
 `ifpstricks(`M4tmp: ifelse(`$2',,Here,`$2')
  command sprintf("\rput{%g}(%g,%g){",`$1',crl(M4tmp.x),crl(M4tmp.y))
  f_box(`$3') at Orig
 command "}%"')')
define(`crl',`int(`($1)'/scale*1000000)/1000000')

                             `r_dimen(linespec,offset,label,tic offset,<->,pos)
                              dimension_ with rotated text on white background'
define(`r_dimen',
 `M4tmp: dimension_(`$1',`$2',,,`$4',`$5')
  r_box(rp_ang*rtod_,ifelse(`$6',,M4tmp+vec_(0,`$2'),`$6'),`$3')')

                             `ctrline(linespec,cycle len)
                              Centerline'
define(`cdashl',0.1*scale)
define(`cgapl',0.03*scale)
define(`ctrline',`rpoint_(ifelse(`$1',,`to rvec_(linewid,0)',`$1'))
  define(`m4h',ifelse(`$2',,1*scale,`$2'))dnl
  m4xn = int(rp_len/2/(m4h))*2+1
  for i=1 to m4xn do {
    line to rvec_(rp_len/m4xn/2-cdashl/2-cgapl,0)
    move to rvec_(cgapl,0); line to rvec_(cdashl,0); move to rvec_(cgapl,0)
    line to rvec_(rp_len/m4xn/2-cdashl/2-cgapl,0) } ')

                             `ctrarcr(pos,radius,startang,endang,len)
                              Arc cr centerline'
define(`ctrarcr',`dnl
  define(`m5h',ifelse(`$5',,1*scale,`$5'))dnl
  rp_len = abs((`$2')*(`$4'-(`$3')))
  m5n = int(rp_len/2/(m5h))*2+1
  m5a = (rp_len/m5n/2-cdashl/2-cgapl)/(`$2')
  m5s = cdashl/(`$2')
  m5sa = `$3'
  for m4irr=1 to m5n do {
    arc from `$1'+(rect_(`$2',m5sa)) to `$1'+(rect_(`$2',m5sa+m5a)) \
      with .c at `$1'
    m5sa = m5sa+m5a+cgapl/(`$2')
    arc from `$1'+(rect_(`$2',m5sa)) to `$1'+(rect_(`$2',m5sa+m5s)) \
      with .c at `$1'
    m5sa = m5sa+m5s+cgapl/(`$2')
    arc from `$1'+(rect_(`$2',m5sa)) to `$1'+(rect_(`$2',m5sa+m5a)) \
      with .c at `$1'
    m5sa = m5sa+m5a
    } ')

define(`ASME_Y14-5_')

divert(0)dnl
