.de
.if\\nd .tm \\n(nl \\n(.t  \\$1
.de>X
.if\\nd .tm \\n(nl \\n(.t >X \\$1
.if(\\\\$3-77*360+(\\\\$1*30)+\\\\$2+30>\n(yr-77*360+(\n(mo*30)+\n(dy) .if \\nd=0 .tm\\\\$1/\\\\$2/\\\\$3 \\\\$4
\\..
.di>W
.tr/
\!.>X\\$1 "\\$2"
.di
.>W
.tr//
.rm>W
.rm>X
..
.nr;a 0 1
.nr;b 0
.nr;c 0
.nr;d 0
.nr;e 0
.nr;g 0 1
.nr;h 0
.nr;t 0
.ig
The following number registers are available:
  : BCDEFGIJKMNOPQRSUVXYZabcdefghijklmnqstuwyz0123456789
  ; ABCDEFGHIJKLMNOPQRSTUVWYZfjklmnopqrstuvwxyz23456789
  :A 1 automatic Mode, 0 Manual mode
  :H 7i view graph height
  :W 7i view graph width
  :r 110 min vs to ps ratio (110%)
  :p 18 default point size
  :v 20 vs
  :L    allowable line length
  :o    page offset
  :T    space between cutmarks and top of view graph
  M:    user's text terminated by .VE
  ::    is the tested scratch diversion
..
.dsBU \s-2\(bu\s0
.dsDA \(em
.dsCI \s-2\(ci\s0
.dsSQ \s-2\f1\(sq\fP\s0
.dsFS \s-2\(bx\s0
.dsRH \s-2\(rh\s0
.dsNU \ \ 
.dsRg \v'-0.35m'\s-4\(rg\s+4\v'0.35m'
.dsTm \v'-0.4m'\s-6TM\s+6\v'0.4m'
.dsSm \v'-0.4m'\s-6SM\s+6\v'0.4m'
.ig
	Vu-Graph start.
..
.deVG
.I:
.nr;h \\n(;h+1
.if\\nd .tm VG #\\n(;h 
.if\\n(.$ .if 12>\\$1 .nr :W \\$1i
.if\\n(:W-8i .nr :W 8i
.if\\n(.$>1 .if 16>\\$2 .nr :H \\$2i
.if\\n(.$>2 .if 5<\\$3 .if 37>\\$3  \{.nr :A 0
.nr:p \\$3
.nr:v \\n(:p*110/100
.if\\n(.$>3 .nr :v \\$4\}
.nr:L \\n(:W-0.5i
.nr:o 7.54i-\\n(:L/2
.ec
.deM: VE
.ps\\n(:p
.vs\\n(:v
.ll\\n(:Lu
.nr;g 0 1
.nf
..
.ig
	Vu-graph End.
	does all the fancy stuff.
..
.deVE
.ec\\
.if\\nd .tm VE(a) #\\n(;h  nl=\\n(nl %=\\n%
.amM:
.br
.U:
\\..
.if\\n(.$ \{\
.ie\\n(.$=1 .ds :N \\$1
.el.ie \\n(.$=2 .ds :N \\$1 \\$2
.el.ie \\n(.$=3 .ds :N \\$1 \\$2 \\$3
.el.ie \\n(.$=4 .ds :N \\$1 \\$2 \\$3 \\$4
.el.ie \\n(.$=5 .ds :N \\$1 \\$2 \\$3 \\$4 \\$5
.el.ie \\n(.$=6 .ds :N \\$1 \\$2 \\$3 \\$4 \\$5 \\$6
.el.ie \\n(.$=7 .ds :N \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7
.el.ie \\n(.$=8 .ds :N \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
.el.if \\n(.$>8 .ds :N \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 \}
.di::
.M:
.di
.if\\n(;g \{\
.tmWARNING - Lists not properly terminated in view graph number \\n(;h \\*(:N: \\n(;g .LEs are missing
.amM:
.Q:
\\..
.\}
.if\\n(:A .P:
.di::
.M:
.di
.if\\nd .tm . VE(b) final height \\n(dn, final width \\n(dl .z=\\n(.z nl=\\n(nl %=\\n%
.H:
.sp\\n(:Hu-\\n(dnu-\\n(:vp/2u-6p
.nr:o +\\n(:Lu-\\n(dlu/2u
.nr:L \\n(dl
.nr;X \\n(:Hu-\\n(dnu-\\n(:vp/2u-6p
.if\\nd .tm . VE(c) vertical space=\\n(;X, .o=\\n(.o, :L=\\n(:L, dl=\\n(dl .z=\\n(.z nl=\\n(nl %=\\n%
.po\\n(:ou
.if\\nd .tm . VE(d)  .o=\\n(.o .z=\\n(.z nl=\\n(nl nl=\\n(nl %=\\n%
.M:
.if\\nd .tm .   VE(e)  nl=\\n(nl
.F: "\\*(:N"
..
.ig
	header macro.
	sets up top part of view graph frame.
..
.deH:
.if\\nd .tm H:(a)
.br
.ll7.54i
.ft1
.ps10
.vs10
.if\\n(nl .bp
.pl8.5i
.if\\n(:H>7i .pl \\n(:Hu+1.5i
.lt7.54i
.tl''''
.ie!7i-\\n(:Hu .nr :T .75i
.el.nr :T 8.5i-\\n(:Hu/2u
.sp\\n(:Tu
.if!\\n(:W-7i \{\
.ps8
.vs8
.po7.54i-\\n(:Wu/2u
.lt\\n(:Wu
.tl'\(br\(rn\(rn'\(rn\(rn'\(rn\(rn\(br' \}
.if\\nd .tm . H:(b) nl=\\n(nl, :W=\\n(:W, :H=\\n(:H, :T=\\n(:T, .o=\\n(.o
..
.ig
	footer macro.
	does bottom of frame.
..
.deF:
.if\\nd .tm F:(a) .z=\\n(.z nl=\\n(nl
.br
.ie!\\n(:W-7i \{\
.po7.54i-\\n(:Wu/2u
.lt\\n(:Wu
.nr:x (\\n(:Hu+\\n(:Tu-10p)
.sp|\\n(:xu
.if\\nd .tm F:(b) .z=\\n(.z nl=\\n(nl :x=\\n(:x
.ps\\n(:p-2
.if\\n(.s>10 .ps 10
.vs10
.ft1
.tl'''\\$1\0\0'
.if\\nd .tm F:(c) .z=\\n(.z nl=\\n(nl
.ft1
.ps8
.vs3u
.nr:x (\\n(:Hu+\\n(:Tu+10p)
.sp|\\n(:xu
.if\\nd .tm F:(d) .z=\\n(.z nl=\\n(nl :x=\\n(:x
.tl'\(br\(ul\(ul'\(ul\(ul'\(ul\(ul\(br'
.if\\nd .tm F:(e) .z=\\n(.z nl=\\n(nl
.ps10
.vs12 
.br
\}
.el\{\
.nr:x (\\n(:Hu+\\n(:Tu+10p)
.sp|\\n(:xu
.po0
.lt7.5i
.ps\\n(:p-2
.if\\n(.s>10 .ps 10
.vs10
.ft1
.tl'\\$1'''
.sp
.ps10 \}
..
.ig
  G: sets nr G: to the value of the
  Nth argument of the invoking call.
  example:
  .nr G: 3
  .G: 13 5 7 9 11
..
.deG:
.nrG: \\$\\n(G:
..
.nrG: 4
.G: 2 4 6 8 10 12
.ig
	rounding macro.
	rounds number register :p
	down to next legal point size.
..
.deR:
.ie\\n(:p-35 .nr :p 36
.el.ie \\n(:p-34 .nr :p 35
.el.ie \\n(:p-33 .nr :p 34
.el.ie \\n(:p-32 .nr :p 33
.el.ie \\n(:p-31 .nr :p 32
.el.ie \\n(:p-30 .nr :p 31
.el.ie \\n(:p-29 .nr :p 30
.el.ie \\n(:p-28 .nr :p 29
.el.ie \\n(:p-27 .nr :p 28
.el.ie \\n(:p-26 .nr :p 27
.el.ie \\n(:p-25 .nr :p 26
.el.ie \\n(:p-24 .nr :p 25
.el.ie \\n(:p-23 .nr :p 24
.el.ie \\n(:p-22 .nr :p 23
.el.ie \\n(:p-21 .nr :p 22
.el.ie \\n(:p-20 .nr :p 21
.el.ie \\n(:p-19 .nr :p 20
.el.ie \\n(:p-18 .nr :p 19
.el.ie \\n(:p-17 .nr :p 18
.el.ie \\n(:p-16 .nr :p 17
.el.ie \\n(:p-15 .nr :p 16
.el.ie \\n(:p-14 .nr :p 15
.el.ie \\n(:p-13 .nr :p 14
.el.ie \\n(:p-12 .nr :p 13
.el.ie \\n(:p-11 .nr :p 12
.el.ie \\n(:p-10 .nr :p 11
.el.ie \\n(:p-9 .nr :p 10
.el.ie \\n(:p-8 .nr :p 9
.el.ie \\n(:p-7 .nr :p 8
.el.ie \\n(:p-6 .nr :p 7
.el.ie \\n(:p-5 .nr :p 6
.el.D: "view graph too large."
..
.ig
	macro to fit proper point size
	and vertical spacing.
..
.deP:
.if\\nd .tm P:(a)  .z=\\n(.z
.nr:p 36
.1:
.if\\nd .tm . P:(b)  .z=\\n(.z
.2:
.if\\nd .tm . P:(c) dn=\\n(dn, :H=\\n(:H, :v=\\n(:v, :p=\\n(:p .z=\\n(.z
.nr:v \\n(:H*\\n(:v/(\\n(dn+(3*\\n(:vp))
.nr:x 3*\\n(:p*\\n(:r/100 
.if(\\n(:v-\\n(:x) .nr :v \\n(:x
.if\\n(:A .tm View graph number \\n(;h   Final ps=\\n(:p, vs=\\n(:v 
..
.ig
	macro 1: expands diversion M:
	and continues to rescale :p (point-size)
	until view graph width fits.
..
.de1:
.nr:v \\n(:p*\\n(:r/100
.if\\nd .tm 1:(a) :v=\\n(:v :p=\\n(:p
.di::
.M:
.di
.if\\nd .tm . 1:(b) width of diversion is \\n(dl
.if\\n(dlu-\\n(:Lu \{\
.nr:p \\n(:L*\\n(:p/\\n(dl
.R:
.if\\nd .tm . 1:(c) too wide. trying ps \\n(:p
.1:\}
..
.de2:
.nr:v \\n(:p*\\n(:r/100
.if\\nd .tm 2:(a) :v=\\n(:v :p=\\n(:p
.di::
.M:
.di
.if\\nd .tm . 2:(b) height of diversion is \\n(dn
.if\\n(dn-\\n(:H \{\
.nr:p \\n(:H*\\n(:p/\\n(dn
.R:
.if\\nd .tm . 2:(c) too high. trying ps \\n(:p
.2:\}
..
.ig
	diagnostic macro.
	screams, then ignores rest of view graph.
..
.deD:
.tmerror in view graph number \\n(;h \\*(:N, file \\*(f..
.tm\\$1
\\.ig VG
..
.ig
	end macro.
	does last cut mark.
..
.deE:
.if\\nd .tm E: nl=\\n(nl
.if\\n(;h \{\
.nr:x \\n(:Tu+\\n(:Hu+\\n(:Tu
.sp|\\n(:xu
.if\\nd .tm E:(a) nl=\\n(nl :x=\\n(:x
.po0
.ft1
.ps10
.vs10
.lt7.54i
.tl''''
\}
..
.ig
	initialization.
..
.deI:
.nr:A 1
.if!\\n(:H .nr :H 7i
.if!\\n(:W .nr :W 7i
.nr:r 110
.nr:p 18
.nr:v 20
..
.ig
	reset parameters.
	(so things like .in +n don't keep
	happening when we divert)
..
.deU:
.in0
.po0
.ce0
.ne0
.hy0
..
.ig
---------------------------
| Extra macros start here |
---------------------------
..
.deS
.if\\nd .tm S
.nr:x \\n(:p
.nr:p \\n(.s-1
.R:
.ps\\n(:p
.nr:p \\n(:x
..
.deL
.if\\nd .tm L
.ps\\n(.s+1
..
.deTU
.if\\nd .tm TU .z=\\n(.z .l=\\n(.l .i=\\n(.i
.if\\n(.d=\\n(;t .sp -0.5
.L
.ft3
.ce1
.if\\n(.$=1 \\$1\l'|0\(ul'
.if\\n(.$=2 \\$1 \\$2\l'|0\(ul'
.if\\n(.$=3 \\$1 \\$2 \\$3\l'|0\(ul'
.if\\n(.$=4 \\$1 \\$2 \\$3 \\$4\l'|0\(ul'
.if\\n(.$=5 \\$1 \\$2 \\$3 \\$4 \\$5\l'|0\(ul'
.if\\n(.$=6 \\$1 \\$2 \\$3 \\$4 \\$5 \\$6\l'|0\(ul'
.if\\n(.$=7 \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7\l'|0\(ul'
.if\\n(.$=8 \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8\l'|0\(ul'
.if\\n(.$=9 \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9\l'|0\(ul'
.ft
.S
.sp0.5
.nr;t \\n(.d
..
.deT
.if\\nd .tm T .z=\\n(.z .l=\\n(.l .i=\\n(.i
.if\\n(.d=\\n(;t .sp -0.5
.L
.ft3
.ce1
.if\\n(.$=1 \\$1
.if\\n(.$=2 \\$1 \\$2
.if\\n(.$=3 \\$1 \\$2 \\$3
.if\\n(.$=4 \\$1 \\$2 \\$3 \\$4
.if\\n(.$=5 \\$1 \\$2 \\$3 \\$4 \\$5
.if\\n(.$=6 \\$1 \\$2 \\$3 \\$4 \\$5 \\$6
.if\\n(.$=7 \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7
.if\\n(.$=8 \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
.if\\n(.$=9 \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
.ft
.S
.sp0.5
.nr;t \\n(.d
..
.deR
.if\\nd .tm R
.ft1
..
.deI
.if\\nd .tm I
.ft2
..
.deB
.if\\nd .tm B
.ft3
..
.deBI
.if\\nd .tm BI
.ft4
..
.deCW
.if\\nd .tm CW
.ft5
..
.deMN
.nr:r \\\\$2
..
.deTS
.sp0.5
.rntm t:
..
.deTE
.sp0.5
.rnt: tm
..
.deEQ
.sp0.5
..
.deEN
.sp0.5
..
.dePS
.sp0.5
..
.dePE
.sp0.5
..
.deG1
.sp0.5
..
.deG2
.sp0.5
..
.deZ0
.fp1 H
.fp2 HI
.fp3 HB
.fp4 HX
.fp5 CW
..
.deZ1
.fp1 R
.fp2 I
.fp3 B
.fp4 BI
.fp5 CW
..
.deZ2
.fp1 PA
.fp2 PI
.fp3 PB
.fp4 PX
.fp5 CW
..
.ig
  L: List initialization called as follows:

  L: text-indent mark-indent  pad    type    marker-or-;a-type-format
                                             0 - marker
                                             1 - #
                                             2 - #)
                                             3 - (#)
                                             4 - [#]
                                             5 - <#>
                                             6 - {#}
         ;b           ;c      ;d              ;e     string ]g
  ;a is the outline incremented number register
  ;g is the lesting level for the list
..
.deL:
.if\\nd .tm L:(a) \\$1, \\$2, \\$3, \\$4, \\$5, ;g=\\n(;g .z=\\n(.z dn=\\n(dn
.if\\nd .tm .  L:(b) .i=\\n(.i .o=\\n(.o .l=\\n(.l .z=\\n(.z
.if\\n(;g=10 .D: "(L:): too many nested lists"
.if\\n(;g .A: 
.if\\n+(;g=1 .ds ]b \\n(.i
.nr;b \\n(.iu+0\\$1u 
.nr;c \\n(.iu+0\\$2u 
.nr;d 0\\$3 
.nr;e 0\\$4 
.ds]g \\$5
.if!\w\\$5 .ds ]g \&
.if!\w\\$5 .if \\n(;e .ds ]g 1
.nr;a 0 1
.if0\\$4 .af ;a \\$5 1
.in\\n(;bu
.ti\\n(;bu
..
.deLE
.if\\nd .tm LE
.if!\\n(;g .D: "LE: mismatched"
.if\\n(;g .B:
.if\\n(;g=0 .sp .5
..
.deLI
.if\\nd .tm LI(a) \\$1 ;a=\\n(;a ;b=\\n(;b ;c=\\n(;c ;d=\\n(;d ;e=\\n(;e ;g=\\n(;g dn=\\n(dn .d=\\n(.d
.if!\\n(;g .D: "LI: no lists active" 
.sp.5
.in\\n(;bu
.ds]0 \\*(]g
.if\\n(;e .ds ]0 \\n+(;a.
.if\\n(;e-1 .ds ]0 \\n(;a)
.if\\n(;e-2 .ds ]0 (\\n(;a)
.if\\n(;e-3 .ds ]0 [\\n(;a]
.if\\n(;e-4 .ds ]0 <\\n(;a>
.if\\n(;e-5 .ds ]0 {\\n(;a}
.if\\n(.$-1 .ds ]0 \\$1\ \\*(]0
.if\\n(.$ .if !\\n(.$-1 .ds ]0 \\$1
.nr;0 \w\\*(]0
.nr;1 \\n(;c
.if\\n(;d .nr ;1 \\n(;bu-\\n(;du-\\n(;0u
.if!\\n(;1 .nr ;1 0
.nr;0 \\n(;bu-\\n(;1u-\\n(;0u
.ti\\n(;1u
.if!\\n(;0 .nr ;0 \w u
.if\\nd .tm .  LI(b) marker=\\*(]0 ;0=\\n(;0 ;b=\\n(;b .d=\\n(.d
.nr;j \\n(.d
.if\w\\*(]0 \&\\*(]0\h\\n(;0u\&\c
..
.deBL
.if\\nd .tm BL .z=\\n(.z
.L: 3n 0 3n-\w'\\*(BU'u 0 \\*(BU
..
.deDL
.if\\nd .tm DL
.L: 3n 0 3n-\w'\\*(DA'u 0 \\*(DA
..
.deML
.if\\nd .tm ML
.if\\n(.$=0 .D: "ML: missing arg"
.L: \w\\$1u+1n 0 1n 0 "\\$1"
..
.deVL
.if\\nd .tm VL
.if!\\n(.$ .D: "VL: missing arg"
.L: 0\\$1n 0 0 0
..
.deOL
.if\\nd .tm OL
.ie!\\n(.$ \{\
.nrG: \\n(;g+1  
.G: 1 1 1 2 3 3 2 \}
.el.nr G: \\$1
.ie\\n(;g=0 .L: 5n 0 2n \\n(G: I
.el.ie \\n(;g=1 .L: 5n 0 2n \\n(G: A
.el.ie \\n(;g=2 .L: 5n 0 2n \\n(G: 1
.el.ie \\n(;g=3 .L: 5n 0 2n \\n(G: a
.el.ie \\n(;g=4 .L: 5n 0 2n \\n(G: 1
.el.ie \\n(;g=5 .L: 5n 0 2n \\n(G: a
.el.ie \\n(;g=6 .L: 5n 0 2n \\n(G: i
.el.L: 5n 0 2n \\n(G:
..
.deA:
.if\\nd .tm A:
.af;a 1
.ds]a \\n(;a \\*(]a
.ds]b \\n(;b \\*(]b
.ds]c \\n(;c \\*(]c
.ds]d \\n(;d \\*(]d
.ds]e \\n(;e \\*(]e
.ds]h \\*(]g \\*(]h
.if\\nd-1 .tm .  A: ]a \\*(]a
.if\\nd-1 .tm .  A: ]b \\*(]b
.if\\nd-1 .tm .  A: ]c \\*(]c
.if\\nd-1 .tm .  A: ]d \\*(]d
.if\\nd-1 .tm .  A: ]e \\*(]e
.if\\nd-1 .tm .  A: ]h \\*(]h
..
.deB:
.br
.nr;g -1
.C: nr ;a ]a \\*(]a
.C: nr ;b ]b \\*(]b
'in\\n(;bu
'ti\\n(;bu
.C: nr ;c ]c \\*(]c
.C: nr ;d ]d \\*(]d
.C: nr ;e ]e \\*(]e
.C: ds ]g ]h \\*(]h
.af;a 1
.if\\n(;e .af ;a \\*(]g
..
.ig
    C: pulls the first argument off a string and
       performs the operation dictated by the first
       argument of the macrocommand. Syntax:

   .C: operation argument string-name string
..
.deC:
.\\$1 \\$2 \\$4
.ds\\$3 \\$5 \\$6 \\$7 \\$8 \\$9
..
.ig
recursive .Q: terminates outstanding lists
..
.deQ:
.if\\nd .tm Q:
.LE 
.if\\n(;g .Q:
..
.Z\nf
.emE:
