123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- \def\IgnoreLineBreaks{\catcode'15=9 \catcode'12=9}
- \def\IgnoreWhiteSpace{\catcode'11=9 \catcode'40=9 \IgnoreLineBreaks}
- \def\DontIgnoreWhiteSpace{\catcode'12=\active\catcode'15=5\catcode'11=10\catcode'40=10}
- %\font \pipefont= lcirclew10
- \font \pipefont= circle10
- \font \foofont = cmr10
- %\font \foofont = amr10
- \IgnoreWhiteSpace
- \let \adv=\advance
- \def\he{height}
- \def\wi{width}
- \def\de{depth}
- \newdimen \stroke
- \stroke= \fontdimen8\pipefont % thickness of line in circles
- \newdimen \radius \radius=6pt % radius of circles
- \newdimen\irad \irad=\radius\advance\irad by -.5\stroke
- \newdimen\orad \orad=\radius\advance\irad by .5\stroke
- \newbox\BStrutbox
- \setbox\BStrutbox\hbox{\vrule\wi0pt\he10pt\de10pt}
- \def\BoxStrut{\unhcopy\BStrutbox}
- % Arrows
- \newdimen\ArrowShift
- \ArrowShift=\fontdimen22\tensy
- \advance\ArrowShift by -0.5\stroke
- \def\StrikeOut #1
- { \setbox0\hbox{#1}
- \hbox to 1\wd0
- { \vrule \he\stroke\de0pt\wi\wd0
- \hskip-\wd0
- \unhbox0
- }
- }
- \def\LeftArrow
- { \hskip 0.5\stroke
- \StrikeOut{\lower\ArrowShift\hbox to 10pt{\tensy\char'40\hss}}
- }
- \def\RightArrow
- { \StrikeOut{\lower\ArrowShift\hbox to 10pt{\hss\tensy\char'41}}
- \hskip 0.5\stroke
- }
- \def\ArrowLine
- { \StrikeOut{\hskip 10pt\hskip 0.5\stroke}
- }
- \def\LeftToRight
- { \let\RightSideArrow=\ArrowLine
- \let\LeftSideArrow=\RightArrow
- }
- \def\RightToLeft
- { \let\LeftSideArrow=\ArrowLine
- \let\RightSideArrow=\LeftArrow
- }
- \def\NoArrows
- { \let\LeftSideArrow=\ArrowLine
- \let\RightSideArrow=\ArrowLine
- }
- % boxes around words
- \let\NonterminalFont=\tenrm
- \newbox\TStrutbox
- \setbox0\hbox{\NonterminalFont{Bg}}
- \setbox\TStrutbox\hbox{\vrule\wi0pt\he\ht0\de\dp0}
- \def\TextStrut{\unhcopy\TStrutbox}
- \def\HorzLine{\hrule \he \stroke \de 0pt}
- \def\HFil{\leaders\HorzLine\hfil}
- \def\HFill{\leaders\HorzLine\hfill}
- \def\Nonterminal#1
- {\setbox1\vbox to 0pt{
- \vss
- \hbox{\TextStrut\NonterminalFont\space#1\space\hskip-\stroke}
- \vss}
- \hbox{
- \BoxStrut
- \LeftSideArrow
- \lower\irad\vbox{
- \TopSquare
- \copy1
- \BotSquare}
- \RightSideArrow}
- }
- \def\TopSquare
- { \hbox{
- \vrule\he\stroke\de\irad\wi\stroke
- \vrule\he\stroke\de0pt\wi\wd1
- \vrule\he\stroke\de\irad\wi\stroke}
- }
- \def\BotSquare
- { \hbox{
- \vrule\he\orad\de0pt\wi\stroke
- \vrule\he\stroke\de0pt\wi\wd1
- \vrule\he\orad\de0pt\wi\stroke}
- }
- \def\\#1{\Nonterminal{#1}\HFil}
- \def\last#1{{\def\RightSideArrow{}\Nonterminal{#1}}}
- % piping
- %\def\foo{\rlap{\foofont\char'40}}
- \def\foo{\null}
- \def\FulVert{\vrule \wi\stroke\foo\hskip-\stroke}
- \def\TopVert{\vrule\de-\irad \wi\stroke\foo\hskip-\stroke}
- \def\BotVert{\vrule\he-\orad \wi\stroke\foo\hskip-\stroke}
- \def\Center#1,#2.
- {\hskip\radius\foo#1\lower.5\stroke\hbox{\pipefont#2}\hskip\radius}
- \def\ru{\char'10\hskip -2\radius}
- \def\rd{\char'11\hskip -2\radius}
- \def\ld{\char'12\hskip -2\radius}
- \def\lu{\char'13\hskip -2\radius}
- \def\thru{\hskip-\radius\vrule\he\stroke\de0pt\wi2\radius\hskip\radius\hskip-2\radius}
- \def\Center#1,#2.
- {\foo\hskip\radius#1{\pipefont#2\unskip}\hskip-\radius}
- \def\LT{\Center\BotVert,\lu.}
- \def\LU{\Center\FulVert,\lu.}
- \def\LL{\Center\FulVert,\ld.}
- \def\LB{\Center\TopVert,\ld.}
- \def\LMid{\Center\TopVert\BotVert,\rd\ru\thru.}
- \def\LMU{\Center\TopVert,\rd\thru.}
- \def\LML{\Center\BotVert,\ru\thru.}
- \def\LFD{\Center\FulVert,\ru\thru.}
- \def\LS{\Center\TopVert\BotVert,\rd\ru.}
- \def\RT{\Center\BotVert,\ru.}
- \def\RU{\Center\FulVert,\ru.}
- \def\RL{\Center\FulVert,\rd.}
- \def\RB{\Center\TopVert,\rd.}
- \def\RMid{\Center\TopVert\BotVert,\ld\lu\thru.}
- \def\RMU{\Center\TopVert,\ld\thru.}
- \def\RML{\Center\BotVert,\lu\thru.}
- \def\Cross{\Center\FulVert,\thru.}
- \def\LR{\Center,\thru.}
- \def\TB{\Center\FulVert,.}
- % ShiftBox
- \newbox\x
- \newbox\y
- \newbox\tempy
- \newbox\z
- \newbox\tempz
- \def\ShiftBox#1{
- \savemod
- \saverulebox
- \setbox\x
- \vbox{ \everycr{\noalign{{\modifyrulebox\global\setbox\z\hbox{}}}}
- \halign{&\setbox\x\hbox{##}
- \global \setbox\z\hbox{\unhbox\z\vrule\he\ht\x\de\dp\x\wi0pt}
- \unhbox\x
- \cr
- #1}}%
- \lower\ht\y\box\x\HFil
- \restoremod
- \restorerulebox
- }
- \def\saverulebox{
- \setbox\tempy\box\y
- \global \setbox\y\vbox{}
- \setbox\tempz\box\z
- \global \setbox\z\hbox{}
- }
- \def\restorerulebox{
- \global \setbox\y\box\tempy
- \global \setbox\z\box\tempz
- }
- \def\topmod{}
- \def\thisrow{\global\let\modifyrulebox\firstmod}
- \def\firstmod{
- \global\setbox\y\vbox{\hrule\he0pt\wi0pt\de\dp\z}
- \global\let\modifyrulebox\latermod
- }
- \def\latermod{
- \global\setbox\y\vbox{\unvbox\y\hrule\he\ht\z\de\dp\z\wi0pt}
- }
- \def\savemod{
- \let\tempmod\modifyrulebox
- \global \let\modifyrulebox\topmod
- }
- \def\restoremod{
- \global\let\modifyrulebox\tempmod
- }
- \DontIgnoreWhiteSpace
|