summaryrefslogtreecommitdiff
path: root/graphics/dratex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/dratex
Initial commit
Diffstat (limited to 'graphics/dratex')
-rw-r--r--graphics/dratex/AlDraTex.sty2262
-rw-r--r--graphics/dratex/DraTex.sty1636
-rw-r--r--graphics/dratex/Examples.tex2058
-rw-r--r--graphics/dratex/README2
-rw-r--r--graphics/dratex/TeXProject.sty2678
-rw-r--r--graphics/dratex/wotree.sty106
6 files changed, 8742 insertions, 0 deletions
diff --git a/graphics/dratex/AlDraTex.sty b/graphics/dratex/AlDraTex.sty
new file mode 100644
index 0000000000..dc44afbcab
--- /dev/null
+++ b/graphics/dratex/AlDraTex.sty
@@ -0,0 +1,2262 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% v 1.7
+% AlDraTex %
+% Copyright (C) 1992 Eitan M. Gurari %
+% %
+% This program can redistributed and/or modified under %
+% the terms of the LaTeX Project Public License %
+% Distributed from CTAN archives in directory %
+% macros/latex/base/lppl.txt; either version 1 of the %
+% License, or (at your option) any later version. %
+% %
+% However, you are allowed to modify this program %
+% without changing its name, if you modify its %
+% signature. Changes to the signature can be introduced %
+% with a directive of the form %
+% \message{signature} %
+% %
+% gurari@cse.ohio-state.edu %
+% http://http://www.cse.ohio-state.edu/~gurari/ %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\expandafter\edef\csname :RestoreCatcodes\endcsname{%
+ \catcode`\noexpand\noexpand\noexpand \^=\the\catcode`\^%
+}
+\catcode`\^=7
+\expandafter\edef\csname :RestoreCatcodes\endcsname{%
+ \csname :RestoreCatcodes\endcsname
+ \catcode`\noexpand \_=\the\catcode`\_%
+ \catcode`\noexpand :=\the\catcode`:%
+ \catcode`\noexpand &=\the\catcode`&%
+ \catcode`\noexpand \#=\the\catcode`\#%
+ \catcode`\noexpand \^^M=\the\catcode`\^^M%
+ \let\expandafter\noexpand
+ \csname:RestoreCatcodes\endcsname=\noexpand\undefined}
+\catcode`\:=11
+\ifx \AlDraTex\:undefined \def\AlDraTex{chart,diagram} \fi
+
+\newif\if:circle
+\newif\if:option
+\def\:CheckOption#1{ \def\:temp{#1}
+ \:optionfalse
+ \expandafter\:GetOptions\AlDraTex,,// }
+
+\def\:GetOptions#1,#2//{ \def\:next{#1}
+ \ifx \:next\empty
+ \else \ifx \:temp\:next \:optiontrue \let\:next=\relax
+ \else \def\:next{\:GetOptions#2//}
+ \fi \fi \:next }
+\def\:DefineExt#1{%
+ \Define#1{\begingroup \:DraCatCodes
+ \csname .:\string#1\endcsname}%
+ \expandafter\Define\csname .:\string#1\endcsname}
+\IntVar\:C \IntVar\:Ca
+\IntVar\:Cb \IntVar\:Cc \newtoks\:tk
+\DecVar\Va \DecVar\Vb
+\DecVar\:Vc \DecVar\:Vd \DecVar\:Ve
+
+\Define\:GetX(2){\Va=#1;}
+\Define\:GetY(2){\Vb=#2;}
+\Define\:GetXY(2){\Va=#1;\Vb=#2;}\Define\:GetExit(2){
+ \:Vc=#1; \IF \LtDec(\:Vc,0) \THEN \:Vc=-\:Vc; \FI
+ \:Vd=#2; \IF \LtDec(\:Vd,0) \THEN \:Vd=-\:Vd; \FI
+ \IF \LtDec(\:Vd,\:Vc) \THEN \:Vd=\:Vc; \FI
+ \Va=#1; \Vb=#2;
+ \IF \GtDec(\:Vd,0) \THEN \Va/\:Vd; \Vb/\:Vd; \FI }
+\Define\:GetEdgeFront(1){\def\:EdgeFront{#1}}
+\Define\:Count(1){\:C+1;}\let\Defend=\noexpand
+\def\KeepSpaces{\def\:Spaces{\catcode`\ =10 \relax}}
+\def\RemoveSpaces{\let\:Spaces=\relax}
+\RemoveSpaces\def\:edef#1#2{\edef\:Temp{\noexpand\Define
+ \noexpand#1{#2}}\:Temp }
+\:CheckOption{chart}\if:option
+ \edef\AlDraTex{\AlDraTex,pie,bar,xy}
+\else \:CheckOption{pie}\if:option
+ \edef\AlDraTex{\AlDraTex,chart}
+\else \:CheckOption{xy}\if:option
+ \edef\AlDraTex{\AlDraTex,chart}
+\else \:CheckOption{bar}\if:option
+ \edef\AlDraTex{\AlDraTex,chart}
+\fi\fi\fi\fi
+\:CheckOption{chart}\if:option
+ \def\Compute#1(#2){\def\NextDefine{\::Comp#1(#2)}\Define\:Comp(#2)}
+
+\def\::Comp#1(#2){\Define\:Temp(#2){}\ifx \:Temp\:Comp
+ \let\:Compute=\empty
+ \else \Define\:Compute(1){\:Comp(##1)\:Return#1}\fi}
+
+\Compute\I(1){}\Define\:ChooseColor(1){
+\IF \EqDec(#1,1) \THEN \SetBrush(0,0){}
+\ELSE\IF \EqDec(#1,2) \THEN
+ \SetBrush(2pt\du,1pt\du){ \PenSize(0.2pt)
+ \Units(1pt,1pt) \Move(0,-0.37) \Line(0,0.75)}
+\ELSE\IF \EqDec(#1,3) \THEN
+ \SetBrush(1pt\du,2pt\du){ \PenSize(0.2pt)
+ \Units(1pt,1pt) \Move(-0.37,0) \Line(0.75,0)}
+\ELSE\IF \EqDec(#1,4) \THEN
+ \SetBrush(2pt\du,2pt\du){ \PenSize(0.2pt)
+ \Units(1pt,1pt){\Move(-1,0)\Line(2,0)}
+ \Move(0,-1)\Line(0,2)}
+\ELSE\IF \EqDec(#1,5) \THEN
+ \SetBrush(5pt\du,2pt\du){ \PenSize(0.2pt)
+ \Units(1pt,1pt) \Move(0,-0.37) \Line(0,0.75)}
+\ELSE\IF \EqDec(#1,6) \THEN
+ \SetBrush(2pt\du,5pt\du){ \PenSize(0.2pt)
+ \Units(1pt,1pt) \Move(-0.37,0) \Line(0.75,0)}
+\ELSE
+ \SetBrush(#1pt\du,#1pt\du){
+ \Units(1pt,1pt)\PaintRect(0.37,0.37)}
+\FI\FI\FI\FI\FI\FI}
+\fi
+\:CheckOption{pie}\if:option
+ \Define\PieChart{\begingroup \:Spaces \:PieChart}
+
+\Define\:PieChart(1){\endgroup
+ \Table\:Temp{#1}
+ \:Ve=0; \:Temp(0,99){\:total}
+ \MarkLoc(o:) \MoveF(\:PieR) \MarkLoc(b:)
+ \DSeg\:Vd(o:,b:) \MoveToLoc(o:)
+ \:C=0; \:Temp(0,99){\:InsertSlice} } \Define\PieChartSpec(1){
+ \IF \EqText(,#1) \THEN\ELSE \:PieSpec(#1)
+ \FI \:PieCol}
+
+\Define\:PieSpec(3){
+ \:edef\:PieR{#2} \:edef\:LblDist{#3}
+ \IF \EqInt(1,#1) \THEN
+ \def\:ReturnComp##1{\:slice(\Val##1,\Val##1)}
+ \Define\:total(1){
+ \ifx \:Compute\empty \:Ve+##1;
+ \else \let\:Return=\:ReturnAdd \:Compute(##1)\fi}
+ \Define\:InsertSlice(1){
+ \ifx \:Compute\empty \:slice(##1,##1)
+ \else \let\:Return=\:ReturnComp\:Compute(##1) \fi}
+ \ELSE
+ \def\:ReturnComp##1{\edef\:tempa{\Val##1}}
+ \Define\:total(2){
+ \ifx \:Compute\empty \:Ve+##1;
+ \else \let\:Return=\:ReturnAdd \:Compute(##1)\fi}
+ \Define\:InsertSlice(2){
+ \ifx \:Compute\empty \:slice(##1,##2)
+ \else \let\:Return=\:ReturnComp\:Compute(##1)
+ \:slice(\:tempa,##2) \fi}
+ \FI }
+\def\:ReturnAdd#1{\:Ve+#1;}\Define\:slice(2){ \:C+1; \Va=#1; \Va/\:Ve;
+ \Va*360; {
+ \Va/2; \Rotate(\Val\Va) \:DetachSlice
+ \MarkLoc(o:)
+ \MoveF(1pt\du) \MarkLoc(x:) \CSeg\:SetEnEx(x:,o:)
+ \MoveToLoc(o:) \MoveF(\:LblDist) \:AdjChatLbl(0,99){\:MvLbl}
+ \SliceText(--#2--) \MoveToLoc(o:)
+ \Vb=\:Vd; \Vb+\Va; \Vb+\Va;
+ \DrawOvalArc(\:PieR,\:PieR)(\Val\:Vd,\Val\Vb)
+ \:Ca=0; \:PieColors(0,99){\:Ca+1;\:PaintPie}
+ {\RotateTo(\Val\:Vd) \LineF(\:PieR)}
+ \RotateTo(\Val\Vb) \LineF(\:PieR)
+ } \Rotate(\Val\Va) \:Vd+\Va; }
+
+\Define\:SetEnEx(2){\:Vc=#1; \Vb=#2; \EntryExit(\Val\:Vc,\Val\Vb,0,0)}
+\Define\DetachSlices(2){
+ \IF \EqInt(#2,0) \THEN
+ \Define\:DetachSlice{}
+ \ELSE\IF \EqText(,#1) \THEN
+ \def\:DetachSlice{ \MoveF(#2) }
+ \ELSE
+ \Table\:DSlice{#1}
+ \Define\:OptDSlice(1){
+ \IF \EqInt(\:C,##1) \THEN
+ \MoveF(#2)
+ \FI}
+ \Define\:DetachSlice{ \:DSlice(0,99){\:OptDSlice} }
+ \FI \FI } \Define\MovePieLabels(1){
+ \IF \EqText(,#1) \THEN
+ \Table\:AdjChatLbl{0,0,0}
+ \ELSE \Table\:AdjChatLbl{0,0,0&#1} \FI}
+
+\Define\:MvLbl(3){
+ \IF \EqInt(\:C,#1) \THEN \Move(#2,#3) \FI }
+\:DefineExt\:PieCol(1){\endgroup
+ \IF \EqText(,#1) \THEN
+ \ELSE \Table\:PieColors{#1} \FI}
+\Define\:PaintPie(1){{
+ \IF \EqInt(\:C,\:Ca) \THEN
+ \IF \GtDec(#1,0) \THEN
+ \:ChooseColor(#1)
+ \:Ve=\:PieR;
+ \IF \GtDec(\Va,90) \THEN
+ \Va=\:Vd; \Va+181;
+ \PaintOvalArc(\Val\:Ve,\Val\:Ve)(\Val\:Vd,\Val\Va)
+ \Va-1; \:Vd=\Va; \FI
+ \PaintOvalArc(\Val\:Ve,\Val\:Ve)(\Val\:Vd,\Val\Vb)
+ \RotateTo(\Val\Vb) \MoveF(\:PieR) \MarkLoc(a:)
+\MoveToLoc(o:) \RotateTo(\Val\:Vd) \MoveF(\:PieR)
+\MarkLoc(b:) \PaintQuad(o:,o:,a:,b:)
+ \MoveF(-0.5pt\du) \MarkLoc(b:) \MoveToLoc(o:)
+\Rotate(1) \MoveF(\:PieR) \MarkLoc(b':)
+\MoveToLoc(o:) \RotateTo(\Val\Vb) \MoveF(\:PieR)
+\MoveF(-0.5pt\du) \MarkLoc(a:) \MoveToLoc(o:)
+\Rotate(-1) \MoveF(\:PieR) \MarkLoc(a':)
+\PaintQuad(a:,a':,b':,b:)
+ \FI \FI }}\Define\Legend(1){ \AlignGrid(-1,\:LgEn)
+ \PictNode(2){ \EntryExit(-1,\:LgEn,0,0)
+ \DrawRect(\:LgSzX,\:LgSzY)
+ \IF \GtDec(##1,0) \THEN
+ \:ChooseColor(##1)
+ \IF \EqDec(##1,4) \THEN
+ \Move(0.05,0.05) \:Vd=\:LgSzX; \:Ve=\:LgSzY;
+ \:Vd-0.1; \:Ve-0.1;
+ \PaintRect(\Val\:Vd,\Val\:Ve) \Move(-0.05,-0.05)
+ \ELSE \PaintRect(\:LgSzX,\:LgSzY) \FI
+ \FI
+ \:Vd=\:LgSzX; \:Vd+5;
+ \:Ve=\:LgEn; \:Ve+1; \:Ve*\:LgSzY; \:Ve/2;
+ \Move(\Val\:Vd,\Val\:Ve)
+ \Text(--\ignorespaces##2--) }
+ \GridDiagram(#1)()()}
+
+\:DefineExt\LegendSpec(3){\endgroup
+ \:edef\:LgSzX{#1}\:edef\:LgSzY{#2}\:edef\:LgEn{#3}}
+
+\LegendSpec(10,10,0)
+\PieChartSpec(1,40,20)(0)
+\TextPar\Define\SliceText(1){\Text(--#1--)}
+\DetachSlices(,0) \MovePieLabels()
+
+\fi
+\:CheckOption{xy}\if:option
+ \Define\Axis(2){ \MoveToLoc(#1) \CSeg\:GetXY(#1,#2)
+ \begingroup \:Spaces \:axis}
+
+\Define\:axis(2){ \endgroup\:axs#1//{#2}}
+
+\def\:axs#1#2//#3{\::axs(#1,#2,#3)}
+\Define\::axs(3){ \SaveAll \Units(1pt,1pt)
+ \def\:tic{\:ticLn( \Val\:Vc,0)}
+\IF \EqText(W,#1) \THEN
+ \def\:MvTicTxt{\Move(-\:TxtPos,0)}
+ \IF \LtDec(\Va,0) \THEN \Move(\Val\Va,0) \:Vc=-\Va;
+ \ELSE \:Vc=\Va; \FI
+ \EntryExit(1,0,0,0) \Va=0;
+\ELSE\IF \EqText(E,#1) \THEN
+ \IF \GtDec(\Va,0) \THEN
+ \Move(\Val\Va,0) \:Vc=-\Va;
+ \ELSE \:Vc=\Va; \FI
+ \def\:MvTicTxt{\Move(\:TxtPos,0)}
+ \Va=0; \EntryExit(-1,0,0,0)
+\ELSE
+ \def\:tic{\:ticLn(0, \Val\:Vc)}
+ \IF \EqText(N,#1) \THEN
+ \IF \GtDec(\Vb,0) \THEN
+ \Move(0,\Val\Vb) \:Vc=-\Vb;
+ \ELSE \:Vc=\Vb; \FI
+ \EntryExit(0,-1,0,0)
+ \def\:MvTicTxt{\Move(0,\:TxtPos)}
+ \ELSE \EntryExit(0,1,0,0)
+ \IF \LtDec(\Vb,0) \THEN
+ \Move(0,\Val\Vb) \:Vc=-\Vb;
+ \ELSE \:Vc=\Vb; \FI
+ \def\:MvTicTxt{\Move(0,-\:TxtPos)}
+ \FI
+ \Vb=0;
+\FI\FI
+ \:Ca=#2; \IF \EqText(#2,-0) \THEN \:Ca=-1; \FI
+ \IF \LtInt(\:Ca,0) \THEN
+ \:Ca=-#2; { \Line(\Val\Va,\Val\Vb)
+\MarkLoc(bk:)
+\IF \EqDec(\Va,0) \THEN
+ \IF \GtDec(\Vb,0) \THEN
+ \ifx \:FrArrowHead\empty \else \Line(0,5) \fi
+ \Vb=\:ArrowLength;
+ \ELSE
+ \ifx \:FrArrowHead\empty \else \Line(0,-5) \fi
+ \Vb=-\:ArrowLength; \FI
+\ELSE
+ \IF \GtDec(\Va,0) \THEN
+ \ifx \:FrArrowHead\empty \else \Line(5,0) \fi
+ \Va=\:ArrowLength;
+ \ELSE
+ \ifx \:FrArrowHead\empty \else \Line(-5,0) \fi
+ \Va=-\:ArrowLength; \FI
+\FI
+\Move(\Val\Va,\Val\Vb) \MarkLoc(fr:) \:FrArrowHead }
+
+ \FI
+ \:C=\:Ca; \:C/10; \:C*10; \:Ca-\:C;
+ \IF \GtInt(\:Ca,4) \THEN \:Ca-5; \let\:PutTics=\:TicsByLoc \FI
+ \IF \EqInt(\:Ca,4) \THEN
+ \Define\:ticLn(2){\DoLine(##1,##2)(7pt\du){
+ \Units(1pt,1pt) \MoveF(-4) \LineF(2) }}
+ \:Ca-1;
+\ELSE \let\:ticLn=\Line \FI
+ \IF \LtInt(\:Ca,3) \THEN
+ \IF \GtDec(\:Vc,0) \THEN \:Vc= \:TicLn;
+ \ELSE \:Vc=-\:TicLn;
+\FI\FI
+\ifcase \Val\:Ca
+ \:Vc= 0; \def\:TxtPos{3} % 0
+ \or \:Vc=-\:Vc; \:Vd=\:TicLn; \:Vd+3; \edef\:TxtPos{\Val\:Vd} % 1
+\else \def\:TxtPos{3} \fi
+ \:Ca=\:C; \:Ca/10;
+ \Table\:Temp{#3} \:C=-1; \:Temp(0,99){\:Count}
+ \IF \GtInt(\:C,0) \THEN \:PutTics \FI \RecallAll}
+\Define\:PutTics{ \Va/\:C; \Vb/\:C;
+ { \:Temp(0,99){ {\PenSize(\:TicTh)\:tic} \:TicText } }
+ \IF \GtInt(\:Ca,0) \THEN
+ \:C*\:Ca; \Va/\:Ca; \Vb/\:Ca;
+ \IF \GtDec(\:Vc,\:TicLn) \THEN \:Vc= \:TicLn; \FI
+ \IF \LtDec(\:Vc,-\:TicLn) \THEN \:Vc=-\:TicLn; \FI
+ \:Vc*\:TicFc; { \let\:ticLn=\:Ln
+ \Do(0,\Val\:C){ {\PenSize(\:TicTh)\:tic}
+ \Move(\Val\Va,\Val\Vb) }}
+ \FI}\Define\:TicsByLoc{ \MarkLoc(x:)
+ \Define\:tempa(2){\MoveTo(0,##1) \MarkLoc(a:)
+ \MoveTo(0,##2) \MarkLoc(b:)
+ \LSeg\:Ve(a:,b:)}
+ \:Temp(0,0){\:tempa }
+ \Define\:tempa(2){ \MoveTo(0,##1) \MarkLoc(b:)
+ \LSeg\:Vd(a:,b:) \:Vd/\:Ve;
+ { \Va*\:Vd; \Vb*\:Vd; \MoveToLoc(x:)
+ \Move(\Val\Va,\Val\Vb)
+ {\PenSize(\:TicTh)\:tic} \:TicText(##2) }}
+ \:Temp(1,99){\:tempa } }\Define\:TicText(1){ \MarkLoc(o:)
+ \:MvTicTxt\TicText(--#1--) \MoveToLoc(o:)
+ \Move(\Val\Va,\Val\Vb)}
+
+\Define\TicSpec(3){
+ \:edef\:TicLn{#1} \:edef\:TicFc{#2} \:edef\:TicTh{#3}}
+
+\TicSpec(6,0.6,0.2 pt)
+
+\TextPar\Define\TicText(1){ \IF \EqText(,#1) \THEN
+ \ELSE \Text(--\strut#1--) \FI}
+\fi
+\:CheckOption{bar}\if:option
+ \:DefineExt\BarChart(1){\endgroup
+ \Table\:Chart{#1} \MarkLoc(Origin)
+ \XSaveUnits \:Ca=0; \Vb=0; \:Vc=0;
+\:Chart(0,999){\:Ca+1;\:MaxBar}
+\ifx \:Hchart\empty
+ \:Ca*10; \:Vc+\:BarGrdOver;
+\ifx H\:BarDir
+ \Move(\Val\:Vc,0) \MarkLoc(NE)
+ \Move(0,-\Val\:Ca) \MarkLoc(SE)
+ \Vb-\:Vc; \Move(\Val\Vb,0) \Move(-\:BarGrdUnder,0)
+ \MarkLoc(SW) \Move(0,\Val\:Ca) \MarkLoc(NW)
+ \edef\:BsLn{{\noexpand\Line(0,-10)}}
+\else
+ \Move(0,\Val\:Vc) \MarkLoc(NW)
+ \Move(\Val\:Ca,0) \MarkLoc(NE)
+ \Vb-\:Vc; \Move(0,\Val\Vb)
+ \Move(0,-\:BarGrdUnder) \MarkLoc(SE)
+ \Move(-\Val\:Ca,0) \MarkLoc(SW)
+ \edef\:BsLn{{\noexpand\Line(10,0)}}
+\fi \MoveToLoc(Origin)
+\else
+ \Va=\:Vc; \:Vd=\:Vc; \:Vd-\Vb; \Va/\:Vd;
+\ifx H\:BarDir
+ \Va*\:Hchart; \Move(\Val\Va,0)
+ \Move(\:BarGrdOver,0) \MarkLoc(NE)
+ \Move(0,-\:Vchart) \MarkLoc(SE)
+ \Move(-\:Hchart,0) \Move(-\:BarGrdOver,0)
+ \Move(-\:BarGrdUnder,0) \MarkLoc(SW)
+ \Move(0,\:Vchart) \MarkLoc(NW)
+ \:Ca*10; \edef\:BsLn{{\noexpand\Line(0,-10)}}
+\else
+ \Va*\:Vchart; \Move(0,\Val\Va)
+ \Move(0,\:BarGrdOver) \MarkLoc(NW)
+ \Move(\:Hchart,0) \MarkLoc(NE)
+ \Move(0,-\:Vchart) \Move(0,-\:BarGrdOver)
+ \Move(0,-\:BarGrdUnder) \MarkLoc(SE)
+ \Move(-\:Hchart,0) \MarkLoc(SW)
+ \:Ca*10; \edef\:BsLn{{\noexpand\Line(10,0)}}
+\fi \MoveToLoc(Origin)
+ \Va=\:Hchart; \Va/\:Ca;
+ \:Vc-\Vb; \:Vd=\:Vchart; \:Vd/\:Vc;
+ \:Hflip\Units(\Val\Va pt,\Val\:Vd pt)
+ \:Vc+\Vb;
+\fi
+ \def\:GrdLn{}
+\ifx \:BarGrdDist\empty \def\:BsLn{} \else
+ \let\du=\relax
+ \IF \GtInt(\:BarGrdDist,0) \THEN
+ \:Vd=\:Vc; \:Vd/\:BarGrdDist; \:C[\:Vd];
+ \IF \GtDec(\:C,\:Vd) \THEN \:C-1; \FI
+ \IF \GtInt(\:C,0) \THEN
+ \edef\:GrdLn{{ { \noexpand\noexpand\noexpand\:BsLn }
+ \PenSize(\:TicTh)
+ \noexpand\noexpand\noexpand\Do(1,\Val\:C){
+ \:Hflip{\noexpand\noexpand\noexpand\Move}(0,\:BarGrdDist)
+ { \:HflipMY{\noexpand\noexpand\noexpand\Line}(10,0) } }}}
+\:GridLoc(Max)
+
+ \FI
+ \Vb+\:Vc; \Vb-\:BarGrdUnder;
+ \Vb/\:BarGrdDist; \:C[\Vb];
+ \IF \LtDec(\:C,\:Vd) \THEN \:C+1; \FI
+ \IF \LtInt(\:C,0) \THEN
+ \edef\:GrdLn{
+ \ifx\:AddBarDepth\:AddBarDp\:HflipMY{\noexpand\Move}(-\:HBarx,\:VBarx)
+ \fi
+ { \noexpand\:BsLn }
+ \:GrdLn { \PenSize(\:TicTh)
+ \noexpand\Do(-1,\Val\:C){
+ \:Hflip{\noexpand\Move}(0,-\:BarGrdDist)
+ { \:HflipMY{\noexpand\Line}(10,0) } }}
+}
+\:GridLoc(Min)
+
+ \ELSE \edef\:GrdLn{{\ifx\:AddBarDepth\:AddBarDp
+ \:HflipMY{\noexpand\Move}(-\:HBarx,\:VBarx) \fi
+
+ {\noexpand\:BsLn} \:GrdLn}}
+ \FI
+ \MoveToLoc(Origin)
+ \FI
+ \let\du=\:SvDu
+\fi
+ \Va=0; \:Vc=0;
+ \:Chart(0,99){
+ \:Hflip\Move(0,\Val\:Vc)
+ \:NoBarClip() \:DrawBars}
+ \ifx\:AddBarDepth\:AddBarDp
+ \MoveToLoc(Origin) \:HflipMY\Move(-\:HBarx,\:VBarx) \MarkLoc(Origin)
+ \MoveToLoc(NW) \:HflipMY\Move(-\:HBarx,\:VBarx) \MarkLoc(NW)
+ \MoveToLoc(NE) \:HflipMY\Move(-\:HBarx,\:VBarx) \MarkLoc(NE)
+ \MoveToLoc(SW) \:HflipMY\Move(-\:HBarx,\:VBarx) \MarkLoc(SW)
+ \MoveToLoc(SE) \:HflipMY\Move(-\:HBarx,\:VBarx) \MarkLoc(SE)
+\fi
+ \XRecallUnits \MoveToLoc(Origin)
+ \let\:Return=\:undefined \:NoBarClip() } \Define\:DrawBar(2){
+ \:Bars(#1,#1){\:GetXY} \Vb-\Va;
+ \ifx \:Compute\empty \edef\:tempa{#2}
+ \else \def\:Return##1{\edef\:tempa{\Val##1}}\:Compute(#2)
+ \fi
+ \ifx H\:BarDir \Move(0,-\Val\Va)
+ \:DrawBr(\:tempa,-\Val\Vb) \:AddBarPaint(#1,\:tempa)
+ \Clip(\:tempa,-\Val\Vb)
+ \:AddBarDepth(#1,\:tempa) \:Cluster(\:tempa) \Move(0,\Val\Va)
+ \else \Move(\Val\Va,0)
+ \:DrawBr(\Val\Vb,\:tempa) \:AddBarPaint(#1,\:tempa)
+ \Clip(\Val\Vb,\:tempa)
+ \:AddBarDepth(#1,\:tempa) \:Cluster(\:tempa) \Move(-\Val\Va,0)
+ \fi }
+
+
+\Define\DrawBar(2){ \DrawRect(#1,#2)}
+
+\Define\:DrawBr(1){\MarkLoc(x:)\DrawBar(#1)\MoveToLoc(x:)}
+\:DefineExt\BarChartSpec(1){\endgroup
+ \IF \EqText(,#1) \THEN \ELSE \:BarSpc(#1) \FI \:BarCol }
+
+\Define\:BarSpc(2){
+ \let\:Temp=\:SeqBars \let\:BarDir=V \let\:newStck=\empty
+\let\:endnewStck=\empty
+\Define\:AddBarDepth(2){} \Define\:Cluster(1){}
+\:OptBars#1...// \Table\:Bars{#2}
+ \:C=-1; \:Bars(0,999){\:Count}
+ \ifx \:Temp\:TxtBar \IF \GtInt(\:C,1) \THEN
+ \:tk{#1,#2} \:aldwarn8{}
+ \FI \fi
+ \:Temp }\def\:OptBars#1#2#3#4//{\:OpBr(#1)\:OpBr(#2)\:OpBr(#3)}
+
+\Define\:OpBr(1){
+ \IF \EqText(H,#1) \THEN \let\:BarDir=H
+ \ELSE\IF \EqText(T,#1) \THEN \let\:Temp=\:TxtBar
+ \ELSE\IF \EqText(S,#1) \THEN \Define\:Cluster(1){ \:Vc-##1;
+ \:Hflip\Move(0,##1) }
+\def\:newStck{
+ \edef\:svMinBar{\Val\Vb} \Vb=0;
+ \edef\:svMaxBar{\Val\:Vc} \:Vc=0; }
+\def\:endnewStck {
+ \IF \LtDec(\:svMinBar,\Vb) \THEN \Vb=\:svMinBar; \FI
+ \IF \GtDec(\:svMaxBar,\:Vc) \THEN \:Vc=\:svMaxBar; \FI }
+
+
+ \ELSE\IF \EqText(3,#1) \THEN \let\:AddBarDepth=\:AddBarDp
+ \FI\FI\FI\FI } \def\:BarsCommand#1{\EqInt(\Val\:C,#1)\THEN
+ \Define\:DrawBars(}
+
+\Define\:SeqBars{
+ \IF \:BarsCommand01){ \:DrawBar(0,##1) \:GrdLn
+ \:HflipMY\Move(10,0) \:Vc=0;}
+ \Define\:MaxBar{\:maxBar}
+
+ \ELSE \IF \:BarsCommand12){ \:DrawBar(0,##1) \:DrawBar(1,##2)
+ \:slotgrdln
+ }
+ \Define\:MaxBar(2){
+ \:newStck \:maxBar(##1)\:maxBar(##2) \:endnewStck }
+
+ \ELSE \IF \:BarsCommand23){ \:DrawBar(0,##1)
+ \:DrawBar(1,##2) \:DrawBar(2,##3)
+ \:slotgrdln
+ }
+ \Define\:MaxBar(3){
+ \:newStck \:maxBar(##1)\:maxBar(##2)\:maxBar(##3) \:endnewStck }
+
+ \ELSE \IF \:BarsCommand34){ \:DrawBar(0,##1)
+ \:DrawBar(1,##2) \:DrawBar(2,##3) \:DrawBar(3,##4)
+ \:slotgrdln
+ }
+ \Define\:MaxBar(4){ \:newStck
+ \:maxBar(##1)\:maxBar(##2)\:maxBar(##3)\:maxBar(##4) \:endnewStck }
+
+ \ELSE \IF \:BarsCommand45){ \:DrawBar(0,##1)
+ \:DrawBar(1,##2) \:DrawBar(2,##3)
+ \:DrawBar(3,##4) \:DrawBar(4,##5)
+ \:slotgrdln
+ }
+ \Define\:MaxBar(5){ \:newStck \:maxBar(##1)
+ \:maxBar(##2)\:maxBar(##3)\:maxBar(##4)\:maxBar(##5) \:endnewStck }
+
+ \ELSE \:aldwarn7{}
+ \FI \FI \FI \FI \FI }\Define\:GOBBLE(1){}
+\Define\:AddBarDp(2){ \MarkLoc(a:)
+ \:HflipMY\Line(-\:HBarx,\:VBarx) \MarkLoc(b:)
+ \:HflipMY\Line(0,#2) \MarkLoc(c:)
+ \:HflipMY\Line(\:HBarx,-\:VBarx) \MarkLoc(d:)
+ \ifx \:Cluster\:GOBBLE \:TopIIIdTop
+ \else
+ \IF \GtInt(\:C,#1) \THEN\ELSE \:TopIIIdTop \FI
+ \fi
+ \:HflipMY\Move(\:HBarx,0) \MarkLoc(f:) \MoveToLoc(b:)
+ \:HflipMY\Move(0,-\:VBarx) \MarkLoc(b:) \CSeg\Clip(b:,f:)
+ \MoveToLoc(a:) }
+
+\Define\BarDepth(1){
+ \edef\:HBarx{#1pt\noexpand\du} \Va=#1; \Va*1.25;
+ \edef\:VBarx{\Val\Va pt\noexpand\du} }
+
+
+\BarDepth(3)
+
+\def\:Hflip#1(#2,#3){%
+ \ifx H\:BarDir #1(#3,#2)\else #1(#2,#3)\fi}
+\def\:HflipMY#1(#2,#3){%
+ \ifx H\:BarDir #1(#3,-#2)\else #1(#2,#3)\fi} \Define\:TopIIIdTop{
+ \:HflipMY\Line(\Val\Vb,0) \MarkLoc(e:)
+ \:HflipMY\Line(-\:HBarx,\:VBarx) \MarkLoc(f:)
+ {\LineToLoc(c:)}}\def\::Compute#1{\ifx \:Compute\empty
+ \edef\:tempa{#1}%
+ \else \def\:Return##1{\edef\:tempa{\Val##1}}\:Compute(#1)\fi}
+
+\Define\:TxtBar{
+ \Define\:DrawBars(2){
+ \MarkLoc(a:) \:Bars(0,0){\:GetXY} \Va+\Vb; \Va/2;
+\:HflipMY\Move(\Val\Va,0) \MarkLoc(BarBot)
+\::Compute{##1} \:Hflip\Move(0,\:tempa) \MarkLoc(BarTop)
+ \BarText(--##2--) \MoveToLoc(a:)
+ \:DrawBar(0,##1) \:GrdLn
+ \:HflipMY\Move(10,0) \:Vc=0;}
+ \Define\:MaxBar{\:maxTxtBar}}
+
+\Define\:maxTxtBar(2){\:maxBar(#1)}
+
+\TextPar\Define\BarText(1){
+ \:Hflip\Move(0,4pt\du) \:Hflip\EntryExit(0,-1,0,0)
+ \Text(--\ignorespaces#1--)}\:DefineExt\:BarCol(1){\endgroup
+ \IF \EqText(,#1) \THEN\ELSE
+ \Table\:Color{#1&0&0&0&0} \FI} \Define\:GetColor(1){\:Vc=#1;}
+
+\Define\:AddBarPaint(2){{ \PenSize(0.2pt)
+ \MarkLoc(a:) \MoveTo(0,0) \MarkLoc(b:)
+\ifx V\:BarDir \MoveTo(\Val\Vb,#2)
+\else \MoveTo(#2,-\Val\Vb) \fi
+\MarkLoc(c:) \MoveToLoc(a:) \Units(1pt,1pt)
+ \:Color(#1,#1){\:GetColor}
+ \IF \EqDec(\:Vc,2) \THEN
+ \:VrPnt
+ \ELSE\IF \EqDec(\:Vc,3) \THEN
+ \:HrPnt
+ \ELSE\IF \EqDec(\:Vc,4) \THEN
+ \PenSize(0.2pt) {\:VrPnt} \:HrPnt
+ \ELSE \IF \GtDec(\:Vc,0) \THEN
+ \:ChooseColor(\Val\:Vc)
+ \CSeg\PaintRect(b:,c:)
+ \FI \FI \FI \FI}}\Define\:VrPnt{ \CSeg\:GetXY(b:,c:) \:C[\Va];
+ \:Vc=\Va; \:Vc-2; \:Vc/1.5; \:C[\:Vc];
+ \:Vc=\:C; \:Vc*1.5; \:Vc-\Va; \:Vc/-2; \Move(\Val\:Vc,0)
+ \Do(0,\Val\:C){ {\Line(0,\Val\Vb)} \Move(1.5,0) } }
+\Define\:HrPnt{ \CSeg\:GetXY(b:,c:) \:C[\Vb];
+ \:Vc=\Vb; \ifx V\:BarDir \:Vc-2; \else \:Vc+2; \fi
+ \:Vc/1.5; \:C[\:Vc]; \:Vc=\:C; \:Vc*1.5;
+ \:Vc-\Vb; \:Vc/-2; \Move(0,\Val\:Vc)
+ \Do(0,\Val\:C){ {\Line(\Val\Va,0)}
+ \Move(0,\ifx H\:BarDir-\fi 1.5)} }
+\Define\BarClipOn{\Define\:NoBarClip(1){}}
+\Define\BarClipOff{\let\:NoBarClip=\Clip}
+
+\BarClipOff\Define\:maxBar(1){
+ \ifx \:Compute\empty \edef\:tempa{#1}
+ \else \def\:Return##1{\edef\:tempa{\Val##1}}\:Compute(#1)
+ \fi
+ \IF \GtDec(\:tempa,0) \THEN
+ \ifx \:Cluster\:GOBBLE
+ \IF \GtDec(\:tempa,\:Vc) \THEN \:Vc=\:tempa; \FI
+\else
+ \:Vc+\:tempa;
+\fi
+
+ \ELSE
+ \ifx \:Cluster\:GOBBLE
+ \IF \LtDec(\:tempa,\Vb) \THEN \Vb=\:tempa; \FI
+\else
+ \Vb-\:tempa;
+\fi
+
+ \FI}
+\Define\ChartSize(1){
+ \IF \EqText(,#1) \THEN
+ \def\:Hchart{} \def\:Vchart{}
+ \ELSE \:ChartSz(#1) \FI}
+
+\Define\:ChartSz(2){
+ \MarkLoc(o:) \Move(#1 \du,#2 \du) \MarkLoc(x:)
+ \CSeg\:GetXY(o:,x:) \edef\:Hchart{\Val\Va}
+ \edef\:Vchart{\Val\Vb} \MoveToLoc(o:) }
+
+\ChartSize()\let\:SvDu=\du
+
+\Define\:GridLoc(1){
+ \:Vd=\:C; \:Vd*\:BarGrdDist; \MoveToLoc(Origin)
+ \ifx V\:BarDir
+ \Move(10,0) \MarkLoc(#1)
+ \MoveToLL(Origin,#1)(NE,SE) \Move(0,\Val\:Vd)
+ \else
+ \Move(0,-10) \MarkLoc(#1)
+ \MoveToLL(Origin,#1)(SW,SE) \Move(\Val\:Vd,0)
+ \fi
+ \let\du=\:SvDu
+ \ifx\:AddBarDepth\:AddBarDp \:HflipMY\Move(-\:HBarx,\:VBarx) \fi
+ \let\du=\relax \MarkLoc(#1)}
+\Define\BarGrid(3){
+ \def\:BarGrdDist{#1} \def\:BarGrdUnder{#2}
+ \def\:BarGrdOver{#3}}
+\BarChartSpec(V,2.5,7.5)(0)\BarGrid(0,0,0)
+\Define\:slotgrdln{
+ \:HflipMY\Move(0,\Val\:Vc) \:GrdLn
+ \:HflipMY\Move(10,0) \:Vc=0; }
+
+\fi
+\:CheckOption{diagram}\if:option
+ \edef\AlDraTex{spread,grid,tree,\AlDraTex}
+\else \:CheckOption{spread}\if:option
+ \edef\AlDraTex{diagram,\AlDraTex}
+\else \:CheckOption{grid}\if:option
+ \edef\AlDraTex{diagram,\AlDraTex}
+\else \:CheckOption{tree}\if:option
+ \edef\AlDraTex{diagram,\AlDraTex}
+\fi\fi\fi\fi
+\:CheckOption{xy} \if:option \:circletrue \fi
+\:CheckOption{diagram}\if:option \:circletrue \fi
+\if:circle \Define\ArrowHeads(1){
+ \Define\:FrArrowHead{}
+ \Define\:BkArrowHead{}
+ \Define\:FrCrvArrowHead{}
+ \Define\:BkCrvArrowHead{}
+ \IF \GtInt(#1,0) \THEN
+ \Define\:FrArrowHead{\:ArrowHead(bk:,fr:)}
+ \Define\:FrCrvArrowHead{
+ \DSeg\RotateTo(2:,2':)
+ \MoveToLoc(2:) \MoveF(\:ArrowLength pt\du)
+ \MoveF(0.1 pt\du) \MarkLoc(1'':) \MarkLoc(2'':)
+ \MoveToLoc(2':) \MoveF(\:ArrowLength pt\du)
+ \MoveF(0.1 pt\du) \MarkLoc(1'':) \MarkLoc(2':)
+ \:ArrowHead(2'':,2:) }
+ \FI
+ \IF \GtInt(#1,1) \THEN
+ \Define\:BkArrowHead{\:ArrowHead(fr:,bk:)}
+ \Define\:BkCrvArrowHead{
+ \DSeg\RotateTo(1:,1':)
+ \MoveToLoc(1:) \MoveF(\:ArrowLength pt\du)
+ \MoveF(0.1 pt\du) \MarkLoc(1'':) \MarkLoc(1'':)
+ \MoveToLoc(1':) \MoveF(\:ArrowLength pt\du)
+ \MoveF(0.1 pt\du) \MarkLoc(1'':) \MarkLoc(1':)
+ \:ArrowHead(1'':,1:) }
+ \FI }
+
+\Define\:ArrowHead(2){
+ \LSeg\Va(#1,#2)
+ \IF \LtDec(\Va,\:ArrowLength) \THEN \:aldwarn0{}
+ \ELSE \MoveToLoc(#2) \DSeg\RotateTo(#1,#2)
+ \MoveF(-\:ArrowLength pt\du)
+ { \Ragged(\:ArrowRagged) \Rotate(90) \Va=\:ArrowWidth;
+ \Va/2; \MoveF(\Val\Va pt\du) \MarkLoc(#2')
+ \Va*2; \MoveF(-\Val\Va pt\du) \MarkLoc(#2'')
+ \:head(#2) } \MarkLoc(#2) \FI }
+
+\Define\ArrowSpec(1){\:ArSp(#1,)}
+
+\Define\:ArSp(2){
+ \IF \EqText(V,#1) \THEN \Define\:head(1){
+ { \Va/2; \MoveF(\Val\Va pt\du) \MarkLoc(a:)
+ \CSeg\:EdgeLine(a:,##1) }
+ \MarkLoc(a:) \CSeg\:EdgeLine(a:,##1)
+ \MarkLoc(a:) \CSeg\:EdgeLine(a:,##1') } \FI
+ \IF \EqText(H,#1) \THEN \Define\:head(1){
+ \MarkLoc(a:) \CSeg\:EdgeLine(a:,##1)
+ \MarkLoc(a:) \CSeg\:EdgeLine(a:,##1')
+ \MarkLoc(a:) \CSeg\:EdgeLine(a:,##1'')} \FI
+ \IF \EqText(F,#1) \THEN \Define\:head(1){\PaintQuad(##1,##1,##1',##1'')}
+ \FI
+ \IF \EqText(,#2) \THEN\ELSE \:ArrowHeadSpec(#2) \FI }
+
+\Define\:ArrowHeadSpec(4){ \:edef\:ArrowLength{#1}
+ \:edef\:ArrowWidth{#2} \:edef\:ArrowRagged{#3}}
+\ArrowHeads(0) \ArrowSpec(F,10,6,5) \:circlefalse \fi
+\:CheckOption{diagram}\if:option
+ \Define\NewNode(2){
+ \Define#1(1){
+ \Define\:FrameType{\csname \string#1:Frame\endcsname}
+ \Define\:NodeName{##1}
+ \Indirect\Define<##1.mvto>{#2} \:NodeBody}
+ \expandafter\Define\csname \string#1:Frame\endcsname}
+\Define\TextNode{
+ \TextPar\Define\:NodeBody(1){
+ \Object\:tmp{
+ \:NodeContent(--##1--)
+ \:FrameType }
+ \:SetNode }
+ \TextPar\Define\:NodeContent}
+
+\Define\PictNode{
+ \Define\:NodeBody(1){
+ \Object\:tmp{ \Object\:temp{\:NodeContent(##1)}
+ \:temp \:FrameType }
+ \:SetNode }
+ \TextPar\Define\:NodeContent}
+
+\TextNode(1){\Text(--#1--)}\Define\:SetNode{\:SetNodeA }
+
+\Define\:SetNodeA{ \:tmp
+ \MarkLoc(a:) \MoveToExit(0,0) \MarkLoc(\:NodeName)
+ \MoveToExit(1,1) \MarkLoc(\:NodeName;:11)
+ \MoveToLoc(a:) \:circlefalse }
+\Define\DefNode{
+ \Define\:SetNode{
+ \Indirect\let<\:NodeName :call> = \:tmp
+\def\:temp{\Indirect\let<\:NodeName :bdy> = }
+ \expandafter\:temp \csname \string \:tmp .\endcsname
+\Indirect\let<\:NodeName :frm> = \:FrameType
+\Indirect\let<\:NodeName :cnt> = \:NodeContent
+\Indirect\edef<\:NodeName :crc>{
+ \if:circle \noexpand\:circletrue
+ \else \noexpand\:circlefalse \fi}
+
+ \FigSize\Va\Vb{ \:SetNodeA } \Va/2; \Vb/2;
+\MarkLoc(\:NodeName) \Move(\Val\Va,\Val\Vb)
+\MarkLoc(\:NodeName;:11) \MoveToLoc(\:NodeName)
+
+ \:circlefalse
+ \Define\:SetNode{\:SetNodeA } }
+ \:DefNode
+}
+\def\:DefNode#1(#2){#1(#2)}
+\Define\PutNode(1){
+ \def\:NodeName{#1}
+ \Indirect{ \expandafter \let \csname \string \:tmp .\endcsname = }
+ <#1:bdy>
+ \Indirect<#1:crc>
+ \Indirect{ \let\:FrameType = }<#1:frm>
+ \Indirect{ \let\:NodeContent = }<#1:cnt>
+ \Indirect{ \let\:tmp = }<#1:call>
+ \ifx\:tmp\relax \:aldwarn{10}{#1}\fi
+ \:SetNodeA
+ \Indirect\let<\:NodeName :call> = \:undef
+\Indirect\let<\:NodeName :cnt> = \:undef
+\Indirect\let<\:NodeName :frm> = \:undef
+\Indirect\let<\:NodeName :bdy> = \:undef
+\Indirect\let<\:NodeName :crc> = \:undef
+ }
+\Define\ZeroNodesDim{
+ \def\MaxX{0} \def\MaxY{0}
+ \def\WidthX{0} \def\WidthY{0} }
+\Define\AddNodeDim(1){
+ \CSeg\:GetXY(#1,#1;:11)
+ \IF \GtDec(\Va,\MaxX) \THEN \edef\MaxX{\Val\Va} \FI
+ \Va*2; \edef\Widthx{\Val\Va} \Va+\WidthX; \edef\WidthX{\Val\Va}
+ \IF \GtDec(\Vb,\MaxY) \THEN \edef\MaxY{\Val\Vb} \FI
+ \Vb*2; \edef\Widthy{\Val\Vb} \Vb+\WidthY; \edef\WidthY{\Val\Vb} }
+
+\Define\NewCIRCNode(3){
+ \ifx \CIRC\:undefined \:aldwarn9\relax
+ \font\CIRC=lcircle10\space scaled\magstep5
+ \fi
+ \Define\:Temp(2){
+ \IF \EqText(,#3) \THEN
+ \NewNode(#1,\MoveToOval){
+ \Text(--\hbox to##1pt{%
+ \vrule height ##2pt depth ##2pt%
+ width0pt%
+ \hss\hbox to##2pt{%
+ \CIRC \char #2\hss}}--)}
+ \ELSE
+ \NewNode(#1,\MoveToOval){
+ \Text(--\hbox to##1pt{%
+ \hss\hbox to##2pt{%
+ \CIRC \char #3\hss}}--)
+ \Text(--\hbox to##1pt{%
+ \vrule height ##2pt depth ##2pt%
+ width0pt%
+ \hss\hbox to##2pt{%
+ \CIRC \char #2\hss}}--)}
+ \FI }
+ \setbox\:box=\hbox{\CIRC \char #2}
+ \IF \EqText(,#3) \ELSE \IF \GtInt(#3,#2) \THEN
+ \setbox\:box=\hbox{\CIRC \char #3}
+ \FI \FI
+ \edef\:tempa{\noexpand\Va=\:Cons\wd\:box;}
+ \:tempa \Vb=\Va; \Vb/2;
+ \edef\:tempa{\noexpand\:Temp(\Val\Va,\Val\Vb)}
+ \:tempa }
+\Define\NodeMargin(2){\def\:XNodeMargin{#1}\def\:YNodeMargin{#2}}
+\NodeMargin(2,2) \Define\GetNodeSize{
+ \MoveToExit(1,1)
+ \Move(\:XNodeMargin pt\du,\:YNodeMargin pt\du)
+ \MarkLoc(:11) \MoveToExit(0,0) \MarkLoc(:00)
+ \CSeg\:GetXY(:00,:11)}
+
+\Define\SetMinNodeSize{
+ \IF \LtDec(\Va,\:NodeX) \THEN \Va=\:NodeX; \FI
+ \IF \LtDec(\Vb,\:NodeY) \THEN \Vb=\:NodeY; \FI }
+
+
+\Define\MinNodeSize(1){\:MinNodeSize(#1,)}
+\Define\:MinNodeSize(2){
+ \IF \EqText(,#2) \THEN
+ \edef\:Temp{\noexpand\:MinNdSz(\csname :#1::\endcsname,)}
+ \ELSE
+ \def\:Temp{\:MinNdSz(#1,#2)}
+ \FI \:Temp}
+\Define\:MinNdSz(3){
+ \Va=#1; \Va/2; \edef\:NodeX{\Val\Va}
+ \Va=#2; \Va/2; \edef\:NodeY{\Val\Va} }
+
+\Define\SaveNodeSize(1){ \CSeg\:GetXY(#1,#1;:11)
+ \Va*2; \Vb*2;
+ \expandafter\edef\csname :#1::\endcsname{\Val\Va,\Val\Vb} }
+
+ \Define\:Temp{
+\def\SaveDrawSize(##1)##2{
+ \FigSize\Va\Vb{##2}
+ \expandafter\edef\csname :##1::\endcsname{\Val\Va,\Val\Vb} }
+ }\:Temp
+
+\MinNodeSize(0,0)\def\:NodeLine{\Line} \def\:NodeArc{\DrawOvalArc}
+\Define\SRectNodeSpec(1){\:edef\:ShadowSize{#1}}
+\Define\VRectNodeSpec(1){\:edef\:Vdepth{#1}}
+
+\VRectNodeSpec(4) \SRectNodeSpec(3) \def\NodeIx#1#2{#1=\:C;#2=\:Ca;}
+\NewNode(\RectNode,\MoveToRect){ \:RectShape }
+\NewNode(\VRectNode,\:MoveToVRect){ \:RectShape
+ \:Vc=\:Vdepth; \:Vc/2; \:NodeLine(\:Vdepth,-\Val\:Vc)
+ \:NodeLine(\Val\Va,0) {\:NodeLine(-\:Vdepth,\Val\:Vc)}
+ \:NodeLine(0,\Val\Vb) \:NodeLine(-\:Vdepth,\Val\:Vc) }
+\NewNode(\SRectNode,\MoveToRect){ \Units(1pt,1pt)
+ \GetNodeSize \SetMinNodeSize
+ \Move(-\Val\Va,-\Val\Vb) \Va*2; \Vb*2;
+ \:NodeLine(0,\Val\Vb) \:NodeLine(\Val\Va,0)
+ \PenSize(\:ShadowSize pt)
+ \:Ve=\:ShadowSize; \:Ve/2; \Va+\:ShadowSize;
+ \Move(\Val\:Ve,0) \Line(0,-\Val\Vb)
+ \Move(\Val\:Ve,-\Val\:Ve) \Line(-\Val\Va,0) }
+
+\Define\:RectShape{ \Units(1pt,1pt)
+ \GetNodeSize \SetMinNodeSize
+ \Move(-\Val\Va,-\Val\Vb) \Va*2; \Vb*2;
+ \:NodeLine(0,\Val\Vb) \:NodeLine(\Val\Va,0)
+ \:NodeLine(0,-\Val\Vb) \:NodeLine(-\Val\Va,0) }
+
+\Define\MoveToRect(3){
+ \CSeg[#2]\:GetX(#1,#1;:11)
+ \CSeg[#3]\:GetY(#1,#1;:11) \MoveToLoc(#1)
+ \Move(\Val\Va pt\du,\Val\Vb pt\du)}
+\NewNode(\RRectNode,\:MoveToRRect){ \Units(1pt,1pt)
+ \GetNodeSize \SetMinNodeSize
+ \Va+3; \Move(-\Val\Va,-\Val\Vb) \Va*2; \Vb*2;
+ \:Vc=\Va; \:Vc/4; \:Vd=\Vb; \:Vd/4;
+\IF \GtDec(\:Vc,9) \THEN \:Vc=9; \FI
+\IF \GtDec(\:Vd,9) \THEN \:Vd=9; \FI
+\Va-\:Vc; \Va-\:Vc; \Vb-\:Vd; \Vb-\:Vd;
+ { \Move (\Val\:Vc,\Val\:Vd)
+ \:NodeArc(\Val\:Vc,\Val\:Vd)(180,225) }
+ \Move(0,\Val\:Vd) \:NodeLine(0,\Val\Vb) \Move(\Val\:Vc,0)
+ \:NodeArc(\Val\:Vc,\Val\:Vd)(90,180)
+ \Move(0,\Val\:Vd) \:NodeLine(\Val\Va,0) \Move(0,-\Val\:Vd)
+ \:NodeArc(\Val\:Vc,\Val\:Vd)(45,90)
+ \:NodeArc(\Val\:Vc,\Val\:Vd)(0,45)
+ \Move(\Val\:Vc,0) \:NodeLine(0,-\Val\Vb) \Move(-\Val\:Vc,0)
+ \:NodeArc(\Val\:Vc,\Val\:Vd)(270,360)
+ \Move(0,-\Val\:Vd) \:NodeLine(-\Val\Va,0) \Move(0,\Val\:Vd)
+ \:NodeArc(\Val\:Vc,\Val\:Vd)(225,270)
+}\NewNode(\ORectNode,\:MoveToORect){ \Units(1pt,1pt)
+ \GetNodeSize \SetMinNodeSize \Va-2;
+ { \Move(\Val\Va,0) \:NodeArc(9,\Val\Vb)(-90,90) }
+ { \Move(-\Val\Va,0) \:NodeArc(9,\Val\Vb)(90,-90) }
+ \Move(-\Val\Va,\Val\Vb) \Va*2; \Vb*2;
+ \:NodeLine(\Val\Va,0)
+ { \Move(0,-\Val\Vb) \:NodeLine(-\Val\Va,0)} }
+\NewNode(\DRectNode,\:MoveToDRect){ \Units(1pt,1pt)
+ \GetNodeSize \SetMinNodeSize
+ { \Move(\Val\Va,0) \Move(9,0)
+ {\:NodeLine(-9,\Val\Vb)}
+ {\:NodeLine(-9,-\Val\Vb)} }
+ { \Move(-\Val\Va,0) \Move(-9,0) {\:NodeLine(9,\Val\Vb)}
+ {\:NodeLine(9,-\Val\Vb)} }
+ \Move(\Val\Va,\Val\Vb) \Va*2;
+ \:NodeLine(-\Val\Va,0) { \Move(0,-\Val\Vb)
+ \Move(0,-\Val\Vb)
+ \:NodeLine(\Val\Va,0)} }\Define\CircleNode{ \:circletrue \OvalNode}
+
+\NewNode(\OvalNode,\MoveToOval){
+ \Units(1pt,1pt) \GetNodeSize \Va/0.707; \Vb/0.707;
+ \SetMinNodeSize
+ \if:circle
+ \IF \LtDec(\Va,\Vb) \THEN \Va=\Vb;
+ \ELSE \IF \LtDec(\Vb,\Va) \THEN \Vb=\Va;
+ \FI \FI
+ \fi \:NodeArc(\Val\Va,\Val\Vb) (0,360) }
+\NewNode(\DiamondNode,\:MoveToDiamond){
+ \Units(1pt,1pt) \GetNodeSize
+ \Vb*1.66; \Va+\Vb; \Vb=\Va; \Vb*0.66; \SetMinNodeSize
+ \Move(0,\Val\Vb) \:NodeLine(-\Val\Va,-\Val\Vb)
+ \:NodeLine(\Val\Va,-\Val\Vb)
+ \:NodeLine(\Val\Va,\Val\Vb)
+ \:NodeLine(-\Val\Va,\Val\Vb)}\NewNode(\Node,\MoveToRect){ \:NoShape }
+
+\Define\:NoShape{
+ \GetNodeSize \SetMinNodeSize
+ \MoveToExit(0,0) \EntryExit(0,0,0,0) \Va*2; \Vb*2;
+ \Text(--\vbox to\Val\Vb pt{\hsize=\Val\Va pt
+ \leavevmode\hfil\vfil}--)}\Define\FcNode(1){
+ \edef\:Temp{\noexpand\Indirect\let<#1.mvto>=\noexpand\MoveToRect}
+ \:Temp \MarkLoc(#1) \Move(0.01pt\du,0.01pt\du)
+ \MarkLoc(#1;:11) \MoveToLoc(#1) }
+\Define\MoveToNodeDir(1){\edef\:Temp{\noexpand\::MvToExit(#1)}\:Temp}
+
+\Define\::MvToExit(2){
+ \DSeg\:Vc(#1,#2) \let\:Temp=\relax
+ \IF \EqDec(\:Vc,0) \THEN \MoveToNode(#1,1,0)
+ \ELSE \IF \EqDec(\:Vc,90) \THEN \MoveToNode(#1,0,1)
+ \ELSE \IF \EqDec(\:Vc,180)\THEN \MoveToNode(#1,-1,0)
+ \ELSE \IF \EqDec(\:Vc,270)\THEN \MoveToNode(#1,0,-1)
+ \ELSE \DSeg\Va(#1,#1;:11)
+\IF \LtDec(\:Vc,\Va) \THEN \:PreSrchExit(#1,1,\Val\:Ve,0,1)
+\ELSE \Vb=180; \Vb-\Va;
+ \IF \LtDec(\:Vc,\Vb) \THEN \:PreSrchExit(#1,\Val\:Ve,1,1,-1)
+ \ELSE \Vb=180; \Vb+\Va;
+ \IF \LtDec(\:Vc,\Vb) \THEN \:PreSrchExit(#1,-1,\Val\:Ve,1,-1)
+ \ELSE \Vb=360; \Vb-\Va;
+ \IF \LtDec(\:Vc,\Vb) \THEN\:PreSrchExit(#1,\Val\:Ve,-1,-1,1)
+ \ELSE \:PreSrchExit(#1,1,\Val\:Ve,-1,0)
+\FI\FI\FI\FI \FI\FI\FI\FI \:Temp }\Define\:PreSrchExit(5){
+ \def\:Temp{\def\:tempa{(#1,#2,#3}\:SearchExit(#1,#4,#5)} }
+\Define\:SearchExit(3){
+ \:Ve=#3; \:Ve-#2; \IF \LtDec(\:Ve,0) \THEN \:Ve=-\:Ve; \FI
+ \IF \LtDec(\:Ve,0.01) \THEN \let\:Temp=\relax
+ \ELSE
+ \:Ve=#2; \:Ve+#3; \:Ve/2; \edef\:tempb{\Val\:Ve}
+ \expandafter\MoveToNode\:tempa) \MarkLoc(x:)
+ \DSeg\:Vd(#1,x:)
+ \IF \GtDec(\:Vd,\:Vc) \THEN
+ \edef\:Temp{\noexpand\:SearchExit(#1,#2,\:tempb)}
+ \ELSE
+ \edef\:Temp{\noexpand\:SearchExit(#1,\:tempb,#3)}
+ \FI \FI \:Temp }\Define\TraceDiagramOn{\def\:TrcDiag##1{##1}}
+\Define\TraceDiagramOff{\def\:TrcDiag##1{}}
+\TraceDiagramOff \Define\TagNode(1){{\:TagNode(#1)}}
+
+\Define\::TagNode(1){ \let&=\relax
+ \xdef\:tgnd{\:tgnd&#1,\Val\:C..\Val\:Ca}}
+
+\Define\:bgDiTags{
+ \Define\:TagNode(1){}
+ \Define\:EdgeNode(1){}
+ \let\:svTgNd=\:tgnd \gdef\:tgnd{}
+ \let\:svEdNd=\:ednd \gdef\:ednd{} }
+
+\Define\:endDiTags{
+ \MarkLoc(o:)
+ \ifx\:tgnd\empty \else
+ \Table\:Temp{\:tgnd}
+ \:Temp(1,999){\:SetNdTg} \fi
+ \global\let\:tgnd=\:svTgNd
+ \ifx\:ednd\empty \else
+ \Table\:Temp{\:ednd}
+ \:C=0;
+ \:Temp(1,999){\::CurrEdge} \fi
+ \global\let\:ednd=\:svEdNd
+
+ \MoveToLoc(o:)}
+
+\Define\:SetNdTg(2){
+ \Indirect{ \Indirect\let<#1.mvto>= }<#2.mvto>
+ \MoveToLoc(#2) \MarkLoc(#1)
+ \MoveToLoc(#2;:11) \MarkLoc(#1;:11) }
+
+ \fi
+ \:CheckOption{diagram}\if:option
+ \Define\MoveToNode(3){
+ \XSaveUnits \Units(1pt,1pt)
+ \edef\:Temp{\noexpand\Indirect<#1.mvto>(#1,#2,#3)}
+ \:Temp \XRecallUnits }\Define\:MoveToVRect(3){
+ \MoveToRect(#1,#2,#3) \:Ve=\:Vdepth; \:Ve/2;
+ \:Vd=\:Ve; \:Vd/2;
+ \IF \GtDec(#2,0.98) \THEN \Move(-\Val\:Ve,0)
+ \IF \GtDec(#3,0.98) \THEN \Move(0,-\Val\:Vd)
+ \FI \FI
+ \IF \LtDec(#3,-0.98) \THEN \Move(0,\Val\:Vd)
+ \IF \LtDec(#2,-0.98) \THEN \Move(\Val\:Ve,0)
+ \FI \FI} \Define\:MoveToRRect(3){ \MoveToRect(#1,#2,#3)
+ \Va=#2; \IF \LtDec(\Va,0) \THEN \Va=-\Va; \FI
+ \Vb=#3; \IF \LtDec(\Vb,0) \THEN \Vb=-\Vb; \FI
+ \IF \GtDec(\Va,1) \THEN \Va=1; \FI
+ \IF \GtDec(\Vb,1) \THEN \Vb=1; \FI
+ \IF \LtDec(\Va,0.9) \THEN \Va=0; \Vb=0;
+ \ELSE \IF \LtDec(\Vb,0.9) \THEN \Va=0; \Vb=0;
+ \ELSE \Va-1; \Va=-\Va; \Vb-1; \Vb=-\Vb; \FI \FI
+ \IF \GtDec(#2,0) \THEN \Va=-\Va; \FI
+ \IF \GtDec(#3,0) \THEN \Vb=-\Vb; \FI
+ \Va*30; \Vb*30;
+ \Move(\Val\Va pt\du,\Val\Vb pt\du) }\Define\:MoveToORect(3){
+ \MoveToRect(#1,0,0) \MarkLoc(o:mv)
+ \MoveToRect(#1,#2,#3) \MarkLoc(x:mv) \MarkLoc(y:mv)
+ \CSeg\:GetX(o:mv,x:mv)
+ \MoveToRect(#1,1,0) \MarkLoc(a:mv) \LSeg\:Ve(a:mv,x:mv)
+\IF \LtDec(\:Ve,0.1) \THEN \Move(9pt\du,0)
+\ELSE \DSeg\:Ve(a:mv,x:mv)
+ \IF \LtDec(\:Ve,90) \THEN
+ \MoveToRect(#1,1,1) \MarkLoc(1:mv)
+ \DSeg\:Vd(o:mv,x:mv) \DSeg\:Ve(o:mv,1:mv)
+ \:Vd/\:Ve; \:Vd*90; \RotateTo(\Val\:Vd) \MoveToLoc(a:mv)
+ \MoveFToOval(9 pt\du,\Val\Vb pt\du) \MarkLoc(y:mv)
+ \ELSE \IF \GtDec(\:Ve,270)\THEN
+ \MoveToRect(#1,1,-1) \MarkLoc(1:mv)
+ \DSeg\:Vd(o:mv,x:mv) \DSeg\:Ve(o:mv,1:mv)
+ \:Vd-360; \:Ve-360; \:Vd/\:Ve;
+ \:Vd*90; \RotateTo(-\Val\:Vd) \MoveToLoc(a:mv)
+ \MoveFToOval(9 pt\du,\Val\Vb pt\du) \MarkLoc(y:mv)
+\FI \FI \FI
+ \MoveToRect(#1,-1,0) \MarkLoc(a:mv) \LSeg\:Ve(a:mv,x:mv)
+\IF \LtDec(\:Ve,0.1) \THEN \Move(-9pt\du,0)
+\ELSE \DSeg\:Ve(a:mv,x:mv)
+ \IF \GtDec(\:Ve,90) \THEN
+ \IF \LtDec(\:Ve,180) \THEN
+ \MoveToRect(#1,-1,1) \MarkLoc(1:mv)
+ \DSeg\:Vd(o:mv,x:mv) \DSeg\:Ve(o:mv,1:mv)
+ \:Vd-180; \:Ve-180; \:Vd/\:Ve;
+ \:Vd*90; \:Vd-180; \:Vd=-\:Vd;
+ \RotateTo(\Val\:Vd) \MoveToLoc(a:mv)
+ \MoveFToOval(9 pt\du,\Val\Vb pt\du) \MarkLoc(y:mv)
+ \ELSE\IF \LtDec(\:Ve,180) \THEN
+ \MoveToRect(#1,-1,-1) \MarkLoc(1:mv)
+ \DSeg\:Vd(o:mv,x:mv) \DSeg\:Ve(o:mv,1:mv)
+ \:Vd-180; \:Ve-180; \:Vd/\:Ve;
+ \:Vd*90; \:Vd+180; \:Vd=-\:Vd;
+ \RotateTo(\Val\:Vd) \MoveToLoc(a:mv)
+ \MoveFToOval(9 pt\du,\Val\Vb pt\du) \MarkLoc(y:mv)
+\FI \FI \FI \FI \MoveToLoc(y:mv) }\Define\:MoveToDRect(3){ \XSaveUnits
+ \MoveToRect(#1,0,0) \MarkLoc(o:mv)
+ \MoveToRect(#1,#2,#3) \MarkLoc(x:mv) \MarkLoc(y:mv)
+ \CSeg\:GetX(o:mv,x:mv)
+ \MoveToRect(#1,1,0) \MarkLoc(a:mv) \LSeg\:Ve(a:mv,x:mv)
+\IF \LtDec(\:Ve,0.1) \THEN \Move(9pt\du,0)
+\ELSE \DSeg\:Ve(a:mv,x:mv)
+ \IF \LtDec(\:Ve,90) \THEN
+ \Move(0,\Val\Vb) \MarkLoc(.:)
+ \Move(9,-\Val\Vb) \MarkLoc(..:)
+ \MoveToLL(.:,..:) \MarkLoc(y:mv)
+ \ELSE \IF \GtDec(\:Ve,270) \THEN
+ \Move(0,-\Val\Vb) \MarkLoc(.:)
+ \Move(9,\Val\Vb) \MarkLoc(..:)
+ \MoveToLL(.:,..:) \MarkLoc(y:mv)
+\FI \FI \FI
+ \MoveToRect(#1,-1,0) \MarkLoc(a:mv) \LSeg\:Ve(a:mv,x:mv)
+\IF \LtDec(\:Ve,0.1) \THEN \Move(-9pt\du,0)
+\ELSE \DSeg\:Ve(a:mv,x:mv)
+ \IF \GtDec(\:Ve,90) \THEN
+ \IF \LtDec(\:Ve,180)\THEN
+ \Move(0,\Val\Vb) \MarkLoc(.:)
+ \Move(-9,-\Val\Vb) \MarkLoc(..:)
+ \MoveToLL(.:,..:) \MarkLoc(y:mv)
+ \ELSE \IF \LtDec(\:Ve,270)\THEN
+ \Move(0,-\Val\Vb) \MarkLoc(.:)
+ \Move(-9,\Val\Vb) \MarkLoc(..:)
+ \MoveToLL(.:,..:) \MarkLoc(y:mv)
+\FI \FI \FI \FI
+\XRecallUnits \MoveToLoc(y:mv) }\Define\MoveToOval(3){
+ \CSeg[#2]\:GetX(#1,#1;:11)
+ \CSeg[#3]\:GetY(#1,#1;:11)
+ \MoveTo(0,0) \MarkLoc(00:)
+ \MoveTo(\Val\Va pt\du,\Val\Vb pt\du) \MarkLoc(11:)
+ \MoveToLoc(#1) \LSeg\Va(00:,11:)
+ \IF \GtDec(\Va,0.001) \THEN
+ \DSeg\RotateTo(00:,11:)
+ \CSeg\MoveFToOval(#1,#1;:11)
+ \FI}\Define\:MoveToDiamond(3){
+ \CSeg\:GetXY(#1,#1;:11)
+ \IF \LtDec(#2,0) \THEN \Va=-\Va; \FI
+ \IF \LtDec(#3,0) \THEN \Vb=-\Vb; \FI
+ \MoveToLoc(#1) \Move(\Val\Va pt\du,0) \MarkLoc(.:)
+ \MoveToLoc(#1) \Move(0,\Val\Vb pt\du) \MarkLoc(..:)
+ \CSeg\:GetXY(#1,#1;:11) \Va*#2; \Vb*#3;
+ \MoveToLoc(#1) \Move(\Val\Va pt\du,\Val\Vb pt\du)
+ \MarkLoc(..:..) \LSeg\Va(#1,..:..)
+ \IF \GtDec(\Va,0) \THEN \MoveToLL(.:,..:)(#1,..:..) \FI }
+
+ \fi
+ \:CheckOption{diagram}\if:option
+ \Define\EdgeSpec(1){\:EdgeSpec#1....//}
+\def\:EdgeSpec#1#2#3#4.//{\:EdSp(#1)\:EdSp(#2)\:EdSp(#3)}
+
+\Define\:EdSp(1){
+ \IF \EqText(L,#1) \THEN
+ \def\:EdgeLine{\Line} \def\:EdgeCurve{\Curve}
+ \FI
+ \IF \EqText(D,#1) \THEN
+ \let\:EdgeLine=\:DotLine \let\:EdgeCurve=\:DotCurve
+ \FI
+ \IF \EqText(C,#1) \THEN
+ \def\:LocByAddr##1(##2){ \MoveTo(##2)
+ \MarkLoc(;:) ##1(;:)}
+ \FI
+ \IF \EqText(T,#1) \THEN
+ \let\:LocByAddr=\relax
+ \FI
+ \IF \EqText(R,#1) \THEN
+ \Define\:EdgeCorner{
+ \MoveToLoc(fr:) \MarkLoc(nxt':) \MarkLoc(fr':)
+ \:SetEndCorner(fr:,bk:) \:SetEndCorner(nxt':,nxt:)
+ \:EdgeCurve(fr:,fr:1,nxt':1,nxt':) }
+ \FI
+ \IF \EqText(S,#1) \THEN
+ \Define\:EdgeCorner{\MoveToLoc(fr:) \MarkLoc(nxt':)}
+ \FI}
+
+\Define\:DotLine(1){
+ { \MarkLoc(a:) \Move(#1) \MarkLoc(b:)
+ \DSeg\RotateTo(a:,b:) \LineF(-\:thickness \du)
+ \MoveToLoc(a:) \LineF(\:thickness\du)}
+ \DoLine(#1)(3pt\du){
+ \Units(1pt,1pt) \MoveF(-0.5) \LineF(1) }}
+
+\Define\:DotCurve(4){
+ { \DSeg\RotateTo(#1,#2) \MoveToLoc(#1)
+ \divide\:thickness by2 \LineF(\:thickness \du) }
+ { \DSeg\RotateTo(#4,#3) \MoveToLoc(#4)
+ \divide\:thickness by2 \LineF(\:thickness \du) }
+ \DoCurve(#1,#2,#3,#4)(3pt\du){
+ \Units(1pt,1pt) \MoveF(-0.5) \LineF(1) } }
+
+\Define\EdgeAt(6){
+ \MoveToNode(#1,#2,#3) \MarkLoc(EdgeBack)
+ \Table\:EdgePath{#6}
+ \:EdgePath(0,0){\:GetEdgeFront}
+ \MoveToNode(#4,#5,\:EdgeFront) \:InsertEdge(#6)}\Define\Edge(2){
+ \Table\:EdgePath{#1&#2}
+ \:C=-1; \:EdgePath(0,99){\:Count}
+ \IF \EqDec(\:C,1) \THEN
+ \MoveToNodeDir(#1,#2) \MarkLoc(EdgeBack)
+ \MoveToNodeDir(#2,#1)
+ \ELSE \:EdgePath(2,2){\:LocByAddr\MoveToLoc} \MarkLoc(:)
+\MoveToNodeDir(#1,:) \MarkLoc(EdgeBack)
+\Define\:Temp(1){\def\:Temp{##1}}
+\:EdgePath(1,1){\:Temp}
+\:EdgePath(\Val\:C,\Val\:C){\:LocByAddr\MoveToLoc}
+\MarkLoc(EdgeFront) \MoveToNodeDir(\:Temp,EdgeFront) \FI
+ \Table\:EdgePath{#2} \:InsertEdge(#2) }\Define\EdgeTo(4){
+ \Table\:EdgePath{#4}
+ \:C=-1; \:EdgePath(0,1){\:Count}
+ \IF \EqDec(\:C,0) \THEN
+ \MoveToNode(#2,#3,#4) \MarkLoc(EdgeFront)
+ \MoveToNodeDir(#1,EdgeFront) \MarkLoc(EdgeBack)
+ \MoveToLoc(EdgeFront)
+ \ELSE \:EdgePath(1,1){\:LocByAddr\MoveToLoc} \MarkLoc(:)
+\MoveToNodeDir(#1,:) \MarkLoc(EdgeBack)
+\:EdgePath(0,0){\:GetEdgeFront}
+\MoveToNode(#2,#3,\:EdgeFront) \FI
+ \:InsertEdge(#4) }\Define\EdgeFrom(4){
+ \Table\:EdgePath{#1&#4}
+ \:C=-1; \:EdgePath(0,99){\:Count}
+ \MoveToNode(#1,#2,#3) \MarkLoc(EdgeBack)
+ \IF \EqDec(\:C,1) \THEN
+ \MoveToNodeDir(#4,EdgeBack)
+ \ELSE \Define\:Temp(1){\def\:Temp{##1}}
+\:EdgePath(1,1){\:Temp}
+\:EdgePath(\Val\:C,\Val\:C){\:LocByAddr\MoveToLoc}
+\MarkLoc(EdgeFront) \MoveToNodeDir(\:Temp,EdgeFront) \FI
+ \Table\:EdgePath{#4} \:InsertEdge(#4) }\Define\:InsertEdge(1){
+ \MarkLoc(EdgeFront) \:C=-1; \:EdgePath(0,2){\:Count}
+ \IF \EqInt(\:C,0) \THEN
+ \:OneSegmentEdge
+ \ELSE
+ \Define\:Temp(1){
+ \:LocByAddr\MoveToLoc(##1)\MarkLoc(temp:)}
+\:EdgePath(1,1){\:Temp}
+\MoveToLoc(EdgeBack) \MarkLoc(bk:)
+\MoveToLoc(temp:) \MarkLoc(fr:) \:BkArrowHead
+ \IF \GtInt(\:C,1) \THEN
+ \def\:temp##1&##2(&){\Table\:EdgePath{##2}}
+ \:temp#1(&) \:EdgePath(1,99){\:InterEdge}
+ \FI
+ \MoveToLoc(EdgeFront) \MarkLoc(nxt:)
+\:EdgeCorner \:EdgeSegment
+\MoveToLoc(nxt':) \MarkLoc(bk:)
+\MoveToLoc(nxt:) \MarkLoc(fr:)
+\:FrArrowHead \:EdgeSegment
+ \FI \def\EdgeLabel{\:PutLabel\:LineLbl} }\Define\:OneSegmentEdge{
+ \MoveToLoc(EdgeBack) \MarkLoc(bk:)
+ \MoveToLoc(EdgeFront) \MarkLoc(fr:)
+ \:BkArrowHead \:FrArrowHead \:EdgeSegment }\Define\:InterEdge(1){
+ \:LocByAddr\MoveToLoc(#1) \MarkLoc(nxt:)
+ \:EdgeCorner \:EdgeSegment
+ \MoveToLoc(nxt':) \MarkLoc(bk:)
+ \MoveToLoc(nxt:) \MarkLoc(fr:)}
+
+\Define\:EdgeSegment{\MoveToLoc(bk:) \CSeg\:EdgeLine(bk:,fr:)}
+\Define\:SetEndCorner(2){ \MoveToLoc(fr':)
+ \CSeg[0.5]\Move(fr':,#2) \MarkLoc(#1) \LSeg\Va(fr':,#1)
+ \IF \GtDec(\Val\Va,10) \THEN
+ \MoveToLoc(fr':) \DSeg\RotateTo(fr':,#2)
+ \MoveF(10) \MarkLoc(#1)
+ \FI
+ \MoveToLoc(fr':) \CSeg[0.5]\Move(fr':,#1) \MarkLoc(#1 1)}
+\Define\CurvedEdgeAt(6){
+ \MoveToNode(#1,#2,#3) \MarkLoc(1:) \MarkLoc(EdgeBack)
+ \MoveToNode(#4,#5,#6) \MarkLoc(2:) \MarkLoc(EdgeFront)
+ \:CurvedEdgeAtDir}
+
+\Define\:CurvedEdgeAtDir(4){
+ \RotateTo(#3) \LSeg[#4]\MoveF(1:,2:)
+ \MarkLoc(2':) \MoveToLoc(1:)
+ \RotateTo(#1) \LSeg[#2]\MoveF(1:,2:)
+ \MarkLoc(1':) \:InCrvEd }
+
+\Define\CurvedEdge(2){
+ \DSeg\RotateTo(#1,#2) \Rotate(\:StartEdgeDir)
+ \MoveToLoc(#1) \MoveF(50) \MarkLoc(1:)
+ \MoveToNodeDir(#1,1:) \MarkLoc(EdgeBack)
+ \MarkLoc(1:) \LSeg[\:StartEdgeTension]\MoveF(#2,#1)
+ \MarkLoc(1':)
+ \DSeg\RotateTo(#2,#1) \Rotate(\:EndEdgeDir)
+ \MoveToLoc(#2) \MoveF(50) \MarkLoc(2:)
+ \MoveToNodeDir(#2,2:) \MarkLoc(EdgeFront)
+ \MarkLoc(2:) \LSeg[\:EndEdgeTension]\MoveF(#2,#1)
+ \MarkLoc(2':) \:InCrvEd }\Define\:InCrvEd{
+ \:BkCrvArrowHead\:FrCrvArrowHead
+ \MoveToLoc(1:) \MarkLoc(EdgeBack')
+ \MoveToLoc(1':) \MarkLoc(EdgeBack'')
+ \MoveToLoc(2':) \MarkLoc(EdgeFront'')
+ \MoveToLoc(2:) \MarkLoc(EdgeFront')
+ \:EdgeCurve(1:,1':,2':,2:) \def\EdgeLabel{\:PutLabel\:CurveLbl} }
+
+\Define\CurvedEdgeSpec(4){
+ \:edef\:StartEdgeDir{#1} \:edef\:StartEdgeTension{#2}
+ \:edef\:EndEdgeDir{#3} \:edef\:EndEdgeTension{#4} }
+
+\CurvedEdgeSpec(10,0.2,-10,0.2)\Define\HVEdge(2){ \:XYEdge(#1,#2,1,) }
+\Define\VHEdge(2){ \:XYEdge(#1,#2,,1) } \Define\:XYEdge(4){
+ \MoveToNode(#1,0,0) \MarkLoc(1:) \Move(#30,#40) \MarkLoc(1':)
+\MoveToNode(#2,0,0) \MarkLoc(2:) \Move(#40,#30) \MarkLoc(2':)
+\MoveToLL(1:,1':)(2:,2':)
+ \MarkLoc(x:) \MarkLoc(bk:)
+ \CSeg\:GetExit(1:,x:) \MoveToNode(#1,\Val\Va,\Val\Vb)
+ \MarkLoc(EdgeBack)
+ \CSeg\:GetExit(2:,x:) \MoveToNode(#2,\Val\Va,\Val\Vb)
+ \MarkLoc(EdgeFront)
+ \LSeg\Va(#1,EdgeBack) \LSeg\Vb(#1,x:)
+\IF \GtDec(\Vb,\Va) \THEN
+ \LSeg\Va(#2,EdgeFront) \LSeg\Vb(#2,x:)
+ \IF \GtDec(\Vb,\Va) \THEN \:Vc=1; \ELSE \:Vc=-1; \FI
+\ELSE \:Vc=-1; \FI
+ \IF \GtDec(\:Vc,0) \THEN
+ \MarkLoc(fr:) \:FrArrowHead
+ \CSeg\:EdgeLine(fr:,bk:) \MarkLoc(fr:)
+ \MoveToLoc(EdgeBack) \MarkLoc(bk:) \:BkArrowHead
+ \CSeg\:EdgeLine(bk:,fr:)
+ \def\EdgeLabel{\:PutLabel\:XYLbl}
+ \ELSE \CSeg\:GetExit(#1,#2)
+\IF \LtDec(\Va,0) \THEN
+ \Va=-\Va; \:Vc=-1; \ELSE \:Vc=1;
+\FI
+\IF \LtDec(\Vb,0) \THEN
+ \Vb=-\Vb; \:Vd=-1; \ELSE \:Vd=1;
+\FI
+\IF \GtDec(\Va,\Vb) \THEN
+ \:Vd=0; \:MarkMid(#1,#2) \HHEdge(#1,#2,A:)
+\ELSE \:Vc=0; \:MarkMid(#1,#2) \VVEdge(#1,#2,A:) \FI
+ \FI }\Define\:MarkMid(2){
+ \MoveToNode(#1,\Val\:Vc,\Val\:Vd) \MarkLoc(1:)
+ \MoveToNode(#2,-\Val\:Vc,-\Val\:Vd) \MarkLoc(2:)
+ \CSeg[0.5]\Move(2:,1:) \MarkLoc(A:)}
+\Define\VVEdge(3){ \:XXedge(#1,#2,#3,,1) }
+\Define\HHEdge(3){ \:XXedge(#1,#2,#3,1,) }\Define\:XXedge(5){
+ \MoveToNode(#1,0,0) \MarkLoc(1:) \Move(#40,#50) \MarkLoc(1':)
+ \MoveToNode(#2,0,0) \MarkLoc(2:) \Move(#40,#50) \MarkLoc(2':)
+ \MoveToLoc(#3) \MarkLoc(3:) \Move(#50,#40) \MarkLoc(3':)
+ \DSeg\Va(1:,3:) \IF \GtDec(\Va,179) \THEN \Va-180; \FI
+\DSeg\Vb(2:,3:) \IF \GtDec(\Vb,179) \THEN \Vb-180; \FI
+\IF \EqText(,#4) \THEN
+ \IF \EqDec(\Va,0) \THEN \HVEdge(#1,#2)
+ \ELSE \IF \EqDec(\Vb,0) \THEN \VHEdge(#1,#2)
+ \ELSE \::XXEdge(#1,#2) \FI\FI
+\ELSE
+ \IF \EqDec(\Va,90) \THEN \VHEdge(#1,#2)
+ \ELSE \IF \EqDec(\Vb,90) \THEN \HVEdge(#1,#2)
+ \ELSE \::XXEdge(#1,#2) \FI\FI
+\FI}
+
+\Define\::XXEdge(2){
+ \MoveToLL(2:,2':)(3:,3':) \MarkLoc(y:)
+ \MoveToLL(1:,1':)(3:,3':) \MarkLoc(x:) \MarkLoc(fr:)
+ \CSeg\:GetExit(1:,x:) \MoveToNode(#1,\Val\Va,\Val\Vb)
+ \MarkLoc(EdgeBack) \MarkLoc(bk:) \:BkArrowHead
+ \CSeg\:EdgeLine(bk:,fr:)
+ \CSeg\:EdgeLine(x:,y:) \MarkLoc(bk:)
+ \CSeg\:GetExit(2:,y:) \MoveToNode(#2,\Val\Va,\Val\Vb)
+ \MarkLoc(EdgeFront) \MarkLoc(fr:) \:FrArrowHead
+ \CSeg\:EdgeLine(fr:,bk:)
+ \def\EdgeLabel{\:PutLabel\:XXLbl} } \Define\CycleEdge(1){
+ \MoveToNode(#1,0,0) \MarkLoc(o:) \MoveF(10)
+ \MarkLoc(oo:) \Rotate(\:CrvEdgeDir) \MoveF(10)
+ \MarkLoc(1':) \CSeg\:GetExit(oo:,1':)
+ \MoveToNode(#1,\Val\Va,\Val\Vb) \MarkLoc(EdgeBack)
+ \MarkLoc(1:) \MoveF(\:CrvEdgeTension)
+ \MarkLoc(1':) \DSeg\RotateTo(o:,oo:)
+ \MoveToLoc(o:) \Rotate(-\:CrvEdgeDir) \MoveF(10)
+ \MarkLoc(2':) \CSeg\:GetExit(o:,2':)
+ \MoveToNode(#1,\Val\Va,\Val\Vb) \MarkLoc(EdgeFront)
+ \MarkLoc(2:) \MoveF(\:CrvEdgeTension)
+ \MarkLoc(2':) \:InCrvEd \:EdgeCurve(1:,1':,2':,2:) }
+
+\Define\CycleEdgeSpec(2){
+ \:edef\:CrvEdgeDir{#1} \:edef\:CrvEdgeTension{#2}}
+
+\CycleEdgeSpec(30,20)\EdgeSpec(LTS) \Define\TransEdge(4){
+ \IF \EqText(,#3) \THEN
+ \IF \EqText(,#4) \THEN
+ \Edge(#1,#2)
+ \ELSE \Edge(#2,#1)
+ \EdgeLabel(--#4--) \relax \FI
+ \ELSE \IF \EqText(,#4) \THEN
+ \Edge(#1,#2) \EdgeLabel(--#3--)\relax
+ \ELSE \IF \EqText(#1,#2) \THEN
+ \RotateTo(#3) \CycleEdge(#1)
+ \EdgeLabel(--#4--)\relax
+ \ELSE \CurvedEdge(#1,#2)
+ \EdgeLabel(--#3--) \relax \CurvedEdge(#2,#1)
+ \EdgeLabel(--#4--) \relax \FI \FI \FI }
+\:DefineExt\:DiagEg(1){\endgroup
+ \IF \EqText(,#1) \THEN \ELSE
+ \Define\:DiagramEdge{#1}
+ \FI }\Define\GridEdge(2){
+ \LSeg\Va(#1,#2)
+ \IF \EqDec(\Va,0) \THEN \:aldwarn2{#2} \FI
+ \MoveToNode(#1,0,1) \MarkLoc(1:)
+\MoveToNode(#2,0,-1) \MarkLoc(2:) \CSeg\:GetXY(1:,2:)
+\IF \GtDec(\Vb,-0.1) \THEN
+ \MoveToNode(#1,1,0) \MarkLoc(1:)
+ \MoveToNode(#2,-1,0) \MarkLoc(2:) \CSeg\:GetXY(1:,2:)
+ \IF \GtDec(\Va,-0.1) \THEN \EdgeAt(#1,1,1,#2,-1,-1)
+ \ELSE
+ \MoveToNode(#1,-1,0) \MarkLoc(1:)
+ \MoveToNode(#2,1,0) \MarkLoc(2:) \CSeg\:GetXY(1:,2:)
+ \IF \LtDec(\Va,0.1) \THEN \EdgeAt(#1,-1,1,#2,1,-1)
+ \ELSE \EdgeAt(#1,0,1,#2,0,-1)
+ \FI \FI
+ \ELSE \MoveToNode(#1,0,-1) \MarkLoc(1:)
+\MoveToNode(#2,0,1) \MarkLoc(2:) \CSeg\:GetXY(1:,2:)
+\IF \LtDec(\Vb,0.1) \THEN
+ \MoveToNode(#1,1,0) \MarkLoc(1:)
+ \MoveToNode(#2,-1,0) \MarkLoc(2:) \CSeg\:GetXY(1:,2:)
+ \IF \GtDec(\Va,-0.1) \THEN \EdgeAt(#1,1,-1,#2,-1,1)
+ \ELSE
+ \MoveToNode(#1,-1,0) \MarkLoc(1:)
+ \MoveToNode(#2,1,0) \MarkLoc(2:) \CSeg\:GetXY(1:,2:)
+ \IF \LtDec(\Va,0.1) \THEN \EdgeAt(#1,-1,-1,#2,1,1)
+ \ELSE \EdgeAt(#1,0,-1,#2,0,1)
+ \FI\FI
+ \ELSE \IF \GtDec(\Va,0) \THEN \EdgeAt(#1,1,0,#2,-1,0)
+\ELSE \EdgeAt(#1,-1,0,#2,1,0) \FI
+ \FI\FI} \Define\EdgeToNode(1){{\:EdgeNode(#1)}}
+
+\Define\::EdgeNode(1){ \let&=\relax
+ \xdef\:ednd{\:ednd&\Val\:C..\Val\:Ca,#1} }
+
+\Define\::CurrEdge(2){ \:C+1;
+ \IF \EqInt(\:C,2) \THEN
+ \:CurrEdge(#1,#2) \:C=0;
+ \FI }
+
+ \fi
+ \:CheckOption{diagram}\if:option
+ \Define\:Temp{
+\def\:PutLabel##1{
+ \Define\:Lbl{\def\:Temp{\noexpand##1}
+ \begingroup \:DraCatCodes \:GetLbl}
+ \edef\:Temp{\noexpand\:Opt[]
+ \noexpand\:Lbl\noexpand{\:LblAdj\noexpand}}
+ \:Temp}
+
+\def\:GetLbl[##1]{\endgroup
+ \IF \EqText(+,##1) \THEN
+ \edef\:Temp{\:Temp[+\:LblAdj]}
+ \ELSE \edef\:Temp{\:Temp[##1]} \FI
+ \:Temp }
+ }\:Temp\Define\:PutLbl(1){
+ \MarkLoc(1:) \XSaveUnits \Units(1pt,1pt)
+ \MoveF(\:LblDis) \XRecallUnits
+ \IF \EqText(,#1) \THEN \ELSE \:AdjLbl(#1)
+ \FI \MarkLoc(2:) \CSeg\:GetExit(1:,2:)
+ \EntryExit(-\Val\Va,-\Val\Vb,0,0) \:EdgeLabel }
+
+\def\:AdjLbl(#1;#2){\Move(#1,#2)}\Define\LabelPos(2){
+ \def\:LblAdj{#1} \def\:LblDis{#2} }
+\LabelPos(0.5;,3) \Define\:Temp{
+\def\:LineLbl[##1##2;##3]{
+ \MoveToLoc(EdgeBack) \MarkLoc(a:)
+ \MoveToLoc(EdgeFront) \MarkLoc(b:)
+ \DSeg\RotateTo(a:,b:)
+ \:C=-1; \:EdgePath(0,99){\:Count}
+\IF \EqInt(\:C,1) \THEN
+ \:EdgePath(1,1){\:LocByAddr\MoveToLoc}
+ \MarkLoc(a:) \MarkLoc(b:)
+\ELSE \IF \GtInt(\:C,1) \THEN
+ \:C/2; \:EdgePath(\Val\:C,\Val\:C){\:LocByAddr\MoveToLoc}
+ \MarkLoc(a:)
+ \:C+1; \:EdgePath(\Val\:C,\Val\:C){\:LocByAddr\MoveToLoc}
+ \MarkLoc(b:)
+ \DSeg\RotateTo(a:,b:)
+\FI \FI
+ \MoveToLoc(a:)
+ \IF \EqText(+,##1) \THEN \Rotate(-90)
+ \CSeg[##2]\Move(a:,b:)
+ \ELSE \Rotate(90)
+ \CSeg[##1##2]\Move(a:,b:)
+ \FI
+ \:PutLbl(##3) }
+ }\:Temp \Define\:Temp{
+\def\:CurveLbl[##1##2;##3]{
+ \MoveToLoc(EdgeBack') \MarkLoc(a:)
+ \MoveToLoc(EdgeBack'') \MarkLoc(A:)
+ \MoveToLoc(EdgeFront'') \MarkLoc(B:)
+ \MoveToLoc(EdgeFront') \MarkLoc(b:)
+ \DSeg\RotateTo(a:,b:)
+ \IF \EqText(+,##1) \THEN
+ \Rotate(-90)
+ \ELSE
+ \Rotate(90)
+ \FI
+ \MoveToCurve[##2](a:,A:,B:,b:) \:PutLbl(##3) } }\:Temp
+ \Define\:Temp{
+\def\:XYLbl[##1##2;##3]{
+ \IF \EqText(+,##1) \THEN \Vb=-1; \Va=##2;
+ \ELSE \Vb= 1; \Va=##1##2;
+ \FI
+ \MoveToLoc(x:)
+ \IF \LtDec(\Va,0.5) \THEN
+ \MarkLoc(b:) \MoveToLoc(EdgeBack) \MarkLoc(a:)
+ \DSeg[\Val\Vb]\RotateTo(EdgeFront,x:)
+ \ELSE
+ \MarkLoc(a:) \Va-0.5;
+ \MoveToLoc(EdgeFront) \MarkLoc(b:)
+ \DSeg[\Val\Vb]\RotateTo(EdgeBack,x:)
+ \FI
+ \Va*2;
+ \MoveToLoc(a:) \CSeg[\Val\Va]\Move(a:,b:)
+ \:PutLbl(##3) }
+ }\:Temp \Define\:Temp{
+\def\:XXLbl[##1##2;##3]{
+ \LSeg\Va(x:,y:)
+\IF \LtDec(\Va,0.01) \THEN
+ \MoveToLoc(x:)
+ \DSeg\RotateTo(EdgeBack,EdgeFront)
+ \MoveF(0.1pt\du) \MarkLoc(y:)
+\FI
+ \IF \EqText(+,##1) \THEN
+ \Vb=-90; \Va=##2;
+ \ELSE
+ \Vb=90; \Va=##1##2;
+ \FI
+ \IF \LtDec(\Va,0.333) \THEN
+ \MoveToLoc(x:) \MarkLoc(b:)
+ \MoveToLoc(EdgeBack) \MarkLoc(a:)
+ \ELSE \IF \LtDec(\Va,0.666) \THEN
+ \MoveToLoc(x:) \MarkLoc(a:)
+ \MoveToLoc(y:) \MarkLoc(b:) \Va-0.3333;
+ \ELSE
+ \MoveToLoc(y:) \MarkLoc(a:)
+ \MoveToLoc(EdgeFront) \MarkLoc(b:) \Va-0.666;
+ \FI \FI
+ \Va*3;
+ \DSeg\RotateTo(a:,b:) \Rotate(\Val\Vb)
+ \MoveToLoc(a:) \CSeg[\Val\Va]\Move(a:,b:)
+ \:PutLbl(##3) }
+ }\:Temp \Define\LabelSpec{
+ \TextPar\Define\:EdgeLabel }
+\def\PictLabel#1{\Object\:Temp{#1}\:Temp}
+\LabelSpec(1){\Text(--#1--)}
+\fi
+\:CheckOption{spread}\if:option
+ \:DefineExt\DiagramSpec(1){\endgroup
+ \:C=0; \let\:Next=\:DiagNodes \:Next#1&&
+ \Indirect\let<DiagNod:\Val\:C>=\relax }
+
+ \Define\:Temp{
+\def\:DiagNodes##1&{
+ \def\:Temp{##1}
+ \ifx \:Temp\empty \let\:Next=\relax
+ \else
+ \:tk={##1} \:Ca=\:C; \:C+1;
+ \edef\:Temp{\noexpand\:AddDiagNodes
+ (\Val\:C,\Val\:Ca,\the\:tk)} \:Temp
+ \fi \:Next }
+ }\:Temp
+
+\Define\:AddDiagNodes(3){
+ \Indirect\def<DiagNod:#2>{\begingroup\:Spaces
+ \:DiagNds(#1,#3)}}
+
+ \Define\:Temp{
+\def\:DiagNds(##1,##2)(##3){\endgroup
+ \Table\:Temp{##3} \:SetDiaNodes##2
+ \Indirect<DiagNod:##1>}
+ }\:Temp \Define\Diagram{ \Indirect<DiagNod:0> }
+
+\def\:SetDiaNodes#1{\:Temp(0,999){#1}}
+\DiagramSpec(\DiagramNode&\Edge)
+\Define\DiagramNode(4){ \MoveTo(#2,#3) \Node(#1)(--#4--) }
+\fi
+\:CheckOption{grid}\if:option
+ \:DefineExt\GridDiagramSpec(1){\endgroup
+ \IF \EqText(,#1) \THEN \ELSE
+ \:CheckSpecTyp(#1,&)
+ \IF \:Temp \THEN \Table\:PolyShapes{u,\noexpand#1}
+\Define\:ShapeTyp{u,}
+ \ELSE \Define\:ShapeTyp{}
+\:SetPolyNodes#1&,& \let\:Temp=\:PolyShapes
+\Table\:PolyShapes{\:Temp} \FI
+ \FI
+ \:DiagEg }\Define\:CheckSpecTyp(2){
+ \IF \EqText(#2,&) \THEN \def\:Temp{\EqInt(1,1)}
+ \ELSE \def\:Temp{\EqInt(1,2)}
+ \FI }\GridDiagramSpec(\Node)(\GridEdge)
+ \Define\:Temp{
+\def\:SetPolyNodes##1,##2&{
+ \Define\:PolyShapes{##1,\noexpand##2}
+ \:MorePolyNodes } }\:Temp
+
+\Define\:MorePolyNodes{
+ \def\:Temp{\Define\:PolyShapes}
+ \Define\:Next{\:GetPolyNodes} \:Next }
+
+ \Define\:Temp{
+\def\:GetPolyNodes##1,##2&{
+ \IF \EqText(,##1) \THEN \Define\:Next{}
+ \ELSE
+ \expandafter\expandafter\expandafter\:Temp\expandafter{
+ \:PolyShapes & ##1,\noexpand##2 }
+ \FI \:Next}} \:Temp
+\Define\GridSpace(2){
+ \:edef\:VGridSp{#2} \:edef\:HGridSp{#1}}
+\GridSpace(20,20)\Define\AlignGrid(2){
+ \def\:XGridEntry{#1} \def\:YGridEntry{#2}}
+\AlignGrid(0,0)
+
+\Define\GridDiagram(2){ \MarkLoc(GridOrg)
+ \IF \LtInt(#1,2) \:aldwarn{11}{#1,#2} \THEN \FI
+ \IF \LtInt(#2,2) \:aldwarn{11}{#1,#2} \THEN \FI
+ \EntryExit(\:XGridEntry,\:YGridEntry,0,0)
+ \Do(0,#1){ \:C=\DoReg; \Indirect\DecVar<y.\Val\:C> }
+ \Do(0,#2){ \:C=\DoReg; \Indirect\DecVar<x.\Val\:C> }
+ \Define\:Nrows{#1} \Define\:Ncols{#2}
+ \:VGridSpace }
+ \Define\:VGridSpace(1){
+ \IF \EqText(,#1) \THEN
+ \Define\:Temp{\:VGridSp,0,1000}
+ \ELSE \Define\:Temp{#1} \FI
+ \Table\:VerAdj{\:Temp}
+ \:C=0; \:VerAdj(0,99){\:Count}
+ \IF \LtInt(\:C,\:Nrows) \THEN
+ \:C=-\:C; \:C+\:Nrows; \:C-1;
+\IF \LtInt(\Val\:C,\:Nrows) \THEN
+ \def\:tempA{\def\:Temp}
+ \IF \GtInt(\Val\:C,0) \THEN
+ \Do(1,\Val\:C){ \expandafter\expandafter
+ \expandafter\:tempA\expandafter{
+ \:Temp & \:VGridSp,0,1000}}
+ \FI
+ \Table\:VerAdj{\:Temp}
+\FI
+ \ELSE \IF \GtInt(\:Nrows,1) \THEN
+ { \def&{\string&}\:aldwarn4{#1} }
+ \FI \FI
+ \:HGridSpace}
+ \Define\:HGridSpace(1){
+ \IF \EqText(,#1) \THEN
+ \Define\:Temp{\:HGridSp,0,1000}
+ \ELSE \Define\:Temp{#1} \FI
+ \Table\:HorAdj{\:Temp}
+ \:C=0; \:HorAdj(0,99){\:Count}
+ \IF \LtInt(\:C,\:Ncols) \THEN
+ \:C=-\:C; \:C+\:Ncols; \:C-1;
+\IF \LtInt(\:C,\:Ncols) \THEN
+ \def\:tempA{\def\:Temp}
+ \IF \GtInt(\:C,0) \THEN
+ \Do(1,\Val\:C){ \expandafter\expandafter
+ \expandafter\:tempA\expandafter{
+ \:Temp & \:HGridSp,0,1000}}
+ \FI
+ \Table\:HorAdj{\:Temp}
+\FI
+ \ELSE \IF \GtInt(\:Ncols,1) \THEN
+ { \def&{\string&}\:aldwarn4{#1} }
+ \FI \FI
+ \:GridEntries}
+
+ \Define\:GridEntries{\begingroup\:Spaces\::GridEntries}
+
+\Define\::GridEntries(1){\endgroup
+ \:bgDiTags
+ \:C=0; \Define\:Next{\:C+1;\:GetGridRows} \:Next#1//
+ \Do(1,\:Nrows){\:C=\DoReg; \:Ca=0;
+ \Indirect<row.\Val\:C>(0,99){\:Ca+1;
+ \IF \GtInt(\Val\:C,\:Nrows) \THEN \:aldwarn5{} \FI
+ \IF \GtInt(\Val\:Ca,\:Ncols) \THEN \:aldwarn6{} \FI
+ \:GetEntrySize}}
+ \IF \GtInt(\:Nrows,1) \THEN
+ \Do(2,\:Nrows){ \:C=\DoReg;
+ \Indirect{\Va=-}<y.\Val\:C>; \:C-1;
+ \Indirect{\Va+}<y.\Val\:C>;
+ \Va*\:YGridEntry; \:C+1;
+ \Indirect{\Va+}<y.\Val\:C>; \:C-1;
+ \Indirect<y.\Val\:C>+\Va; }
+\:C=0; \:VerAdj(0,99){\:C+1; \:AdjGridHeight}
+\Do(2,\:Nrows){ \:C=\DoReg; \:C-1;
+ \Indirect{\Va=}<y.\Val\:C>; \:C+1;
+ \Indirect<y.\Val\:C>+\Va; } \FI
+\IF \GtInt(\:Ncols,1) \THEN
+ \Do(2,\:Ncols){ \:C=\DoReg;
+ \Indirect{\Va=+}<x.\Val\:C>; \:C-1;
+ \Indirect{\Va-}<x.\Val\:C>;
+ \Va*\:XGridEntry; \:C+1;
+ \Indirect{\Va+}<x.\Val\:C>; \:C-1;
+ \Indirect<x.\Val\:C>+\Va; }
+\:C=0; \:HorAdj(0,99){\:C+1; \:AdjGridWidth}
+\Do(2,\:Ncols){ \:C=\DoReg; \:C-1;
+ \Indirect{\Va=}<x.\Val\:C>; \:C+1;
+ \Indirect<x.\Val\:C>+\Va; } \FI
+\Do(1,\:Nrows){ \:C=\DoReg;
+ \Indirect{\Indirect<y.\Val\:C>=-}<y.\Val\:C>; }
+ \let\:TagNode=\::TagNode
+\let\:EdgeNode=\::EdgeNode
+
+\Do(1,\:Nrows){ \:C=\DoReg;
+ \Do(1,\:Ncols){ \:Ca=\DoReg;
+ \Indirect<\Val\:C..\Val\:Ca>}}
+ \Do(1,\:Nrows){ \:C=\DoReg;
+ \Do(1,\:Ncols){ \:Ca=\DoReg;
+ \Indirect\let<\Val\:C..\Val\:Ca>=\:undefined}}
+ \Table\:PolyBaseEdges{\:BaseEdges}
+\:C=-1; \:PolyBaseEdges(0,1){\:Count}
+\IF \EqInt(\:C,1) \THEN
+ \:PolyBaseEdges(1,999){\:InsertBaseEdge}
+\FI
+ \let\:CurrEdge=\:DiagramEdge
+\:endDiTags }
+ \Define\:Temp{
+\def\:GetGridRows##1//{
+ \IF \EqText(,##1) \THEN \let\:Next=\relax
+ \ELSE {\:C-1; \:TrcDiag{\immediate\write16{...read\space
+ row\space \Val\:C}}}
+ \def\Defend{\noexpand\noexpand\noexpand}
+\def\:Comma{,} \let\:CsCom=\,
+\def\,{\noexpand\:Comma}
+\let\:Temp=& \def&{\:Temp\:ShapeTyp}
+
+ \Indirect\Table<row.\Val\:C>{\:ShapeTyp##1}
+ \let\Defend=\noexpand\let&=\:Temp
+ \FI \:Next } }\:Temp\Define\:GetEntrySize(1){
+ \IF \EqText(,#1) \THEN \ELSE
+ \:TrcDiag{{ \:C-1; \:Ca-1; \:tk={#1}
+ \immediate\write16{\Val\:C..\Val\:Ca\space\space\the\:tk}}}
+ \:GetEntrySizeA(#1,) \FI }\Define\:GetEntrySizeA(3){
+ \def\:Temp{\:tk=} \:AddBaseEdges(#3)
+ \:PolyShapes(0,99){\:GetEntrySizeB(#1,#2)}}
+ \Define\:Temp{
+\def\:GetEntrySizeB(##1,##2)(##3,##4){
+ \IF \EqText(,##2) \THEN \ELSE
+ \IF \EqText(##1,##3) \THEN
+ \Indirect\Define<\Val\:C..\Val\:Ca>{
+ \:AddGridNode(##4,##2)}
+ \let\:SvWg=~ \let~=\relax
+ \edef\:Temp{\noexpand##4(.;)(--##2--)}
+ \let~=\:SvWg
+ \FigSize\Va\Vb{\:Temp} \Va/2; \Vb/2;
+ \Indirect{\:Ve=}<x.\Val\:Ca>;
+ \IF \GtDec(\Va,\:Ve) \THEN
+ \Indirect<x.\Val\:Ca>=\Va; \FI
+ \Indirect{\:Ve=}<y.\Val\:C>;
+ \IF \GtDec(\Vb,\:Ve) \THEN
+ \Indirect<y.\Val\:C>=\Vb;
+ \FI \FI \FI }} \:Temp \Define\:AddGridNode(2){
+ \:C-1; \:Ca-1; \MoveToGrid(\Val\:C,\Val\:Ca)
+ \let\:SvWg=~\let~=\relax
+ \edef\:Temp{ \noexpand #1(\Val\:C..\Val\:Ca)(--#2--) }
+ \let~=\:SvWg
+ \:Temp \:C+1; }\Define\MoveToGrid(2){
+ \IF \LtInt(#1,0) \THEN \:aldwarn3{(#1,#2)} \FI
+ \IF \LtInt(#2,0) \THEN \:aldwarn3{(#1,#2)} \FI
+ \IF \GtInt(#1,\:Nrows) \THEN \:aldwarn3{(#1,#2)} \FI
+ \IF \GtInt(#2,\:Ncols) \THEN \:aldwarn3{(#1,#2)} \FI
+ \Indirect{\Va=}<x.#2>;
+ \Indirect{\Vb=}<y.#1>;
+ \MoveToLoc(GridOrg)
+ \Move(\Val\Va pt\du,\Val\Vb pt\du) }
+\Define\:AddBaseEdges(1){
+ \IF \EqText(,#1) \THEN \def\:Next{}
+ \ELSE
+ \:AddBaseEdgesB(#1)
+ \FI \:Next}
+
+\Define\:AddBaseEdgesB(2){
+ \expandafter\expandafter\expandafter\:Temp
+ \expandafter{\:BaseEdges &}
+ \edef\:BaseEdges{ \the\:tk \Val\:C,\Val\:Ca,#1 }
+ \def\:Next{\:AddBaseEdges(#2)}}
+
+\Define\:BaseEdges{0,0,0,0}\Define\:AdjGridWidth(3){
+ \Indirect{\Va=}<x.\Val\:C>; \Va+#1;
+ \IF \LtDec(\Va,#2) \THEN \Va=#2; \ELSE
+ \IF \GtDec(\Va,#3) \THEN \Va=#3; \FI \FI
+ \Indirect<x.\Val\:C>=\Va; }\Define\:AdjGridHeight(3){
+ \Indirect{\Va=}<y.\Val\:C>; \Va+#1;
+ \IF \LtDec(\Va,#2) \THEN \Va=#2; \ELSE
+ \IF \GtDec(\Va,#3) \THEN \Va=#3; \FI \FI
+ \Indirect<y.\Val\:C>=\Va; }\Define\:InsertBaseEdge(3){
+ \:C=#1; \:Ca=#2; \:TargetNode(#3,)
+\IF \EqInt(\:C,1) \THEN \:GetGridLbl(#3) \FI
+\:C=#1; \:Ca=#2;
+\expandafter\:GetTarget\:Temp..
+ \:C=#1; \:C-1; \:Ca=#2; \:Ca-1;
+ \edef\:Temp{\noexpand\:DiagramEdge(\Val\:C..\Val\:Ca,\:Temp\the\:tk)}
+ \:Temp} \Define\:TargetNode(2){
+ \def\:Temp{#1}
+ \IF \EqText(,#2) \THEN \:C=0; \:tk={}
+ \ELSE \:C=1; \FI }
+
+\Define\:GetGridLbl(2){ \:tk={,#2} } \Define\:Temp{
+\def\:GetTarget##1##2..##3##4..{
+ \:C-1; \:Ca-1; \edef\:tempa{\Val\:C..\Val\:Ca}
+ \IF \EqText(+,##1) \THEN
+ \:C+##2; \:Ca##3##4; \edef\:Temp{\Val\:C..\Val\:Ca}
+ \ELSE\IF \EqText(-,##1) \THEN
+ \:C-##2; \:Ca##3##4; \edef\:Temp{\Val\:C..\Val\:Ca}
+ \ELSE \def\:Temp{##1##2..##3##4} \FI\FI
+ \:TrcDiag{\immediate\write16{\:tempa-->\:Temp}} }
+ }\:Temp
+\fi
+\:CheckOption{tree}\if:option
+ \Define\:MoveH(2){
+ \ifx H\:TreeDir \Move(0,-#2)
+ \else \Move(#1,0) \fi }
+
+\Define\:MoveV(2){
+ \ifx H\:TreeDir \Move(#1,0)
+ \else \Move(0,#2) \fi }
+
+\Define\:MoveHV(2){
+ \ifx H\:TreeDir \Move(0,#2)
+ \else \Move(#1,0) \fi }
+
+\Define\:DistH(2){
+ \ifx H\:TreeDir \Va=#2; \else \Va=#1; \fi}
+\def\:oochild{0} \Define\:MoveLFr(2){
+ \ifx H\:TreeDir \MoveToNode(#2,0,-1) \else \MoveToNode(#2,1,0) \fi}
+\Define\:FrDs(2){ \MoveToLoc(:a) \MarkLoc(:a')
+ \if H\:TreeDir\relax \MoveToNode(#2,0,-1)
+ \else \MoveToNode(#2,1,0) \fi
+ \MarkLoc(:a)
+ \:tempb(\DoReg,\DoReg){\:MoveRFr}
+ \CSeg\:AddX(:a,:a') \CSeg\:AddX(:b',:b)
+ \ifx H\:TreeDir
+ \IF \GtDec(\:va,0) \THEN \:vb-\:va; \:va=0; \FI
+\else
+ \IF \LtDec(\:vb,0) \THEN \:va-\:vb; \:vb=0; \FI
+\fi
+ }
+
+\Define\:MoveRFr(2){
+ \MoveToLoc(:b) \MarkLoc(:b')
+ \ifx H\:TreeDir \MoveToNode(#1,0,1) \else \MoveToNode(#1,-1,0) \fi
+ \MarkLoc(:b) }
+\Define\:AddX(2){ \ifx H\:TreeDir \:va+#2; \else \:vb+#1; \fi }
+\Define\:Temp{ \let\:aprsnd=& }
+\:Temp \Define\:left(2){ \def\:frL{#1}}
+\Define\:right(2){ \let&=\relax
+ \edef\:frL{\:frL,#2} \let&=\:aprsnd }
+\Define\:copy(1){ \let&=\relax
+ \edef\:frL{\:frL & #1} \let&=\:aprsnd }
+
+\Define\:addleft(2){ \let&=\relax
+ \edef\:frL{\:frL&#1} \let&=\:aprsnd}
+
+\Define\:both(1){
+ \IF \GtInt(#1,0) \THEN
+ \Do(1,#1){
+ \:tempa(\DoReg,\DoReg){\:addleft}
+ \:tempb(\DoReg,\DoReg){\:right} }
+ \FI }
+ \:DefineExt\TreeSpec(1){\endgroup
+ \IF \EqText(,#1) \THEN \ELSE
+ \:TrNodes#1&&\let \:LeafNode=\:TreeNode
+ \FI \:DecideLeafNode }
+
+\def\:Temp{\catcode`\ =10 \catcode`\^^M=5 \catcode`\&=4 }
+\catcode`\ =9 \catcode`\^^M=9 \catcode`\&=13
+\def\:TrNodes#1&#2&{
+ \IF \EqText(,#2) \THEN
+ \Define\:TreeNode(2){#1(##1)(--##2--)}
+ \let\:Next=\relax
+ \ELSE
+ \Define\:TreeNode{
+ \expandafter\:CondTreeNode\:pars(#1)
+ \expandafter\:CondTreeNode\:pars(#2) }
+ \def\:tempa{ \Define\:TreeNode }
+ \let\:Next=\:DecideTreeNodes
+ \FI \:Next}
+
+\def\:DecideTreeNodes#1&{
+ \IF \EqText(,#1) \THEN \let\:Next=\relax
+ \def\:tempa{\Define\:TrNd}
+ \expandafter\expandafter\expandafter
+ \:tempa\expandafter{ \:TreeNode \:Temp }
+ \def\:TreeNode(##1,##2){
+ \def\:pars{(##1)(##2)} \:TrNd}
+ \ELSE
+ \expandafter\expandafter\expandafter
+ \:tempa\expandafter{ \:TreeNode
+ \expandafter\:CondTreeNode\:pars(#1)}
+ \FI \:Next}
+ \:Temp
+
+ \Define\:Temp{
+\def\:CondTreeNode(##1)(##2,##3)(##4,##5){
+ \IF \EqText(##2,##4) \THEN
+ \def\:Temp{##5(##1)(--##3--)}
+ \FI}
+ }\:Temp\:DefineExt\:DecideLeafNode(1){\endgroup
+ \IF \EqText(,#1) \THEN \ELSE
+ \Define\:LeafNode(2){#1(##1)(--##2--)}
+ \FI
+ \:DecideTreeEdge}\:DefineExt\:DecideTreeEdge(1){\endgroup
+ \IF \EqText(,#1) \THEN \ELSE
+ \Define\:TreeEdge(2){
+ \Indirect{\let\:Temp=} <##2.mvto>
+ \ifx \:Temp\:ChkInv \else
+ \:TrcDiag{\immediate\write16{##1,##2}}
+ \ifx H\:TreeDir \MoveToNode(##1,\:EntryX,0)
+ \else \MoveToNode(##1,0,\:EntryY) \fi
+ \:MvToDivider##1.. \MarkLoc(EdgeGuide)
+ #1(##1,##2)
+ \fi }
+ \FI} \Define\Tree(1){
+ \Define\:PolyVerTreeSp{#1}
+ \Define\:BareTr(1){,##1}
+ \begingroup \:Spaces \:Tree }
+
+\Define\LTree(1){
+ \Define\:PolyVerTreeSp{#1} \:LTree }
+
+\catcode`\#=13
+\Define\:LTree{\def#{\Defend&} \let\-=# \let\:BareTr=\relax
+ \begingroup \catcode`\#=13 \:Spaces \:Tree }
+\catcode`\#=6
+
+\Define\:Tree(1){\endgroup
+ \:bgDiTags
+ \let\:MergTree=\relax
+\ifx \:Cspace\:InInx \let\:MergTree=\::MergTree \fi
+\:TrSp(0,99){\:copt}
+ \ifx H\:TreeDir \let\:tempc=\Va
+ \def\:TreeEnEx{\EntryExit(\:EntryX,\:EntryY,0,0)}
+\else \let\:tempc=\Vb
+ \def\:TreeEnEx{\EntryExit(\:EntryX,\:EntryY,0,0)} \fi
+\:C=-1;
+ \let\:Next=\:GetTreeRows \:Next#1//
+ \Do(1,\Val\:C){ \:Ca=\DoReg;
+ \Indirect{\Va=-}<y.\Val\:Ca>; \:Ca-1;
+ \Indirect\DecVar<x.\Val\:Ca>
+\ifx H\:TreeDir \Indirect<x.\Val\:Ca>=-\:EntryX;
+\else \Indirect<x.\Val\:Ca>=\:EntryY; \fi
+\Indirect<x.\Val\:Ca>+1;
+\Indirect{\Indirect<x.\Val\:Ca>*}<y.\Val\:Ca>;
+\Indirect<x.\Val\:Ca>/2;
+ \Indirect{\Va+}<y.\Val\:Ca>;
+ \ifx H\:TreeDir \Va*-\:EntryX;
+ \else \Va*\:EntryY; \fi
+ \:Ca+1; \Indirect{\Va+}<y.\Val\:Ca>; \:Ca-1;
+ \Indirect<y.\Val\:Ca>+\Va;
+ \Indirect<y.\Val\:Ca>/2;}\:Ca=-1;
+\ifx \:PolyVerTreeSp\empty \else
+ \let\:tempa=\:PolyVerTreeSp
+ \Table\:PolyVerTreeSp{\:tempa}
+ \:PolyVerTreeSp(0,99){\:AddVerTreeSp}
+\fi
+\:Cb=\:Ca; \:Cb+1;
+\IF \GtInt(\:C,\:Cb) \THEN
+ \:Cb+1;
+ \Do(\Val\:Cb,\Val\:C){\:AddVerTreeSp(\:VerTreeSp)}
+\ELSE \IF \GtInt(\:Cb,\:C) \THEN
+ \:aldwarn1{}\FI\FI
+
+ \Indirect{\let\:va=}<x.0>
+\Indirect{\let\:vb=}<y.0>
+ \let\:TagNode=\::TagNode
+\let\:EdgeNode=\::EdgeNode
+
+\Do(0,\Val\:C){ \:Ca=-1; \:Cb=-1;
+ \Indirect<row.\DoReg>(0,99){
+ \:Ca+1; \:DefSubTree} }
+\gdef\:GetNodesAddr{} \:AddrCount=1;
+\Indirect<0..0> \global\let\:GetNodesAddr=\:undefined
+ \ifx \:BareTr\relax \let\:EnterTreeEdge=\:::EnterTreeEdge
+\else \let\:EnterTreeEdge=\::EnterTreeEdge \fi
+\:C-1;
+\Do(0,\Val\:C){ \:C=\DoReg; \:Ca=-1; \:Cb=\DoReg; \:Cb+1; \:Cc=-1;
+ \Indirect<row.\DoReg>(0,99){
+ \:Ca+1; \:EnterTreeEdge} }
+ \let\:CurrEdge=\:TreeEdge
+\let\:tempa=\:MvToDivider
+\def\:MvToDivider##1..##2..{\Move(0.001pt\du,0.001pt\du)}
+\:endDiTags \let\:MvToDivider=\:tempa
+ \let\-=\:svneg }
+
+\let\:svneg=\- \Define\:Temp{
+\def\:GetTreeRows##1//{
+ \def\:Temp{##1}
+ \ifx \:Temp\empty \let\:Next=\relax \else
+ \:C+1;
+ \ifx \:BareTr\relax \else
+ \TableData\:Temp\:BareTr{##1}
+ \fi
+ \Indirect\Table<row.\Val\:C>{\:Temp}
+ \def\:tempa{} \:Vc=0;
+\def\:tempb{\:tk=} \:Ca=-1;
+\Indirect<row.\Val\:C>(0,99){\:Ca+1; \:MeasureRow}
+\Indirect\DecVar<y.\Val\:C>
+\Indirect<y.\Val\:C>=\:Vc;
+ \fi \:Next}
+ }\:Temp\Define\::EnterTreeEdge(3){
+ \IF \GtInt(#2,0) \THEN
+ \Do(1,#2){ \:Cc+1;
+ \edef\:temp{\noexpand\:TreeEdge
+ (\Val\:C..\Val\:Ca,\Val\:Cb..\Val\:Cc)
+ \noexpand\:C=\Val\:C; \noexpand\:Ca=\Val\:Ca;}
+ \:temp }
+ \FI }\Define\:::EnterTreeEdge(3){
+ \edef\:temp{\:tk={\noexpand\:C=\Val\:C;
+ \noexpand\:Ca=\Val\:Ca;}} \:temp
+ \IF \GtInt(#2,0) \THEN
+ \Table\:BareTr{#1}
+ \:BareTr(0,99){ \:Cc+1; \the\:tk
+ \edef\:temp{\noexpand\:TreeEdgePos
+ (\Val\:C..\Val\:Ca,\Val\:Cb..\Val\:Cc) }
+ \:temp \:TreeLabel }
+ \FI \the\:tk }
+
+\Define\:TreeEdgePos(2){ \:TreeEdge(#1,#2) \LTreePos(#1,#2) }
+
+\Define\:TreeLabel(1){ \EdgeLabel(--#1--) }
+\Define\LTreePos(2){ \DSeg\Va(#1,#2)
+ \IF \LtDec(\Va,270) \THEN \LabelPos(0.65;-3;3,)
+ \ELSE \LabelPos(+0.65;3;3,) \FI }\Define\:DefSubTree(3){ \:tk={#3}
+ \edef\:Temp{
+ \noexpand\::DefSubTree(#2,\the\DoReg,\Val\:Ca,\Val\:Cb,\the\:tk)}
+ \:Cb+#2; \:Temp}\Define\::DefSubTree(5){
+ \Indirect\Object<#2..#3>{
+ \let\:ochild=\:oochild \let\:currFrL=\:frL \let\:currDpL=\:dpL
+\def\:dpL{-1} \def\:frL{}
+ \:Ca=#3; \:Cc=#2;
+ \:TrSp(0,99){\:unl}
+ \:Cc+1; \:Cb=#4; \:Cb+1;
+ \IF \GtInt(#1,0) \THEN
+ \edef\:parmA{#1} \edef\:parmB{#2}
+ \:tk={#5} \def\:parmC{\the\:tk}
+ \def\:Temp{\:Cind }
+ \ELSE \:tk={#5}
+ \edef\:Temp{\noexpand \:Clnd (#2,\noexpand\the\:tk) }
+ \FI
+ \edef\:Temp{\expandafter\noexpand\:Temp
+ \noexpand\:endSubTr (#1,#2,#3)}
+ \:Temp }}\Define\:endSubTr(3){
+ \Indirect{\Indirect
+ { \global\let}<#2..\Val\:Ca.mvto>= }<#2..\Val\:Ca.mvto>
+\MoveToLoc(#2..\Val\:Ca) \MarkXLoc(#2..\Val\:Ca)
+\MoveToLoc(#2..\Val\:Ca;:11) \MarkXLoc(#2..\Val\:Ca;:11)
+\edef\:temp{\noexpand\:AddNodesAddr(#2..\Val\:Ca) } \:temp
+ \:Ca=\:dpL; \:Ca+1; \xdef\:dpR{\Val\:Ca} \let&=\relax
+\xdef\:frR{ #2..#3,#2..#3 & \:frL }
+\ifx \:Cspace\:InInx
+ \let&=\:aprsnd
+ \:Ca=#2; \:Ca*#1; \:Ca*\:ochild; \:Ca*\:lchild;
+\IF \GtInt(\:Ca,0) \THEN
+ \IF \GtInt(\:currDpL,\:dpR) \THEN \def\:tempc{\:dpR}
+\ELSE \def\:tempc{\:currDpL} \FI
+\Table\:tempa{\:currFrL}
+\Table\:tempb{\:frR} \if H\:TreeDir \MoveToNode(#2..#3,0,1)
+\else \MoveToNode(#2..#3,-1,0) \fi \MarkLoc(:b)
+\:tempa(0,0){\:MoveLFr} \MarkLoc(:a)
+\:va=0; \:vb=0; \IF \GtInt(\:tempc,0) \THEN
+ \let\:MoveToInv=\::MoveToInv
+ \DoReg=0\relax \:tempa(1,\:tempc){\advance\DoReg by 1 \:FrDs}
+\FI
+ \MoveToLoc(a:) \:MoveH(-\Val\:va,\Val\:vb)
+ \MarkXLoc(INc:)
+\FI \fi } \Define\:Cind{
+ \edef\:lchild{\Val\:Cb}
+\def\:oochild{0}
+\:trcTree
+\Indirect<\Val\:Cc..\Val\:Cb>[\:InInx] \:SubTreeAddrs
+\let\:dpL=\:dpR \let\:frL=\:frR
+\MoveToLoc(INx:) \MarkLoc(-12:)
+\MoveToLoc(IN:) \MarkLoc(-11:)
+\MoveToLoc(OUTx:) \MarkLoc(12:)
+\MoveToLoc(OUT:) \MarkLoc(11:)
+\IF \GtInt(\:parmA,1) \THEN
+ \def\:oochild{1}
+ \Do(2,\:parmA){
+ \MoveToLoc(\:OutOutx)
+ \:MoveH(\:HorTreeSp,\:HorTreeSp)
+ \:TrSp(0,99){\:spbn} \:Cb+1;
+ \:trcTree
+ \Indirect<\Val\:Cc..\Val\:Cb>[\:InInx] \:SubTreeAddrs
+ \MarkLoc(o:)
+\MoveToLoc(INx:) \MarkLoc(-\DoReg2:)
+\MoveToLoc(IN:) \MarkLoc(-\DoReg1:)
+\MoveToLoc(OUTx:) \MarkLoc(\DoReg2:)
+\MoveToLoc(OUT:) \MarkLoc(\DoReg1:)
+\MoveToLoc(o:)
+ \:MergTree }
+\FI \:C=\:parmB; \:TrSp(0,99){\:lcalg}
+\:ChildLoc(\:AlignA,-12:,-11:,11:,12:) \MarkLoc(a:)
+\:ChildLoc(\:AlignB,INx:,IN:,OUT:,OUTx:) \MarkLoc(b:)
+\:C=\:parmB;
+\IF \LtDec(\:AlignC,-1) \THEN
+ \MoveToLoc(a:) \:MoveH(\:AlignC,\:AlignC)
+\ELSE \IF \GtDec(\:AlignC,1) \THEN
+ \MoveToLoc(b:) \:MoveH(\:AlignC,\:AlignC)
+\ELSE
+ \CSeg[0.5]\Move(b:,a:) \MarkLoc(o:)
+ \CSeg[\:AlignC]\Move(o:,b:)
+\FI \FI
+\:TrSp(0,99){\:mvpr}
+\ifx H\:TreeDir \Indirect{\Move(-\Val}<y.\Val\:C>,0)
+\else \Indirect{\Move(0,\Val}<y.\Val\:C>) \fi
+ \MarkLoc(o:) \:TreeEnEx
+\edef\:Temp{\noexpand\:TreeNode(\:parmB..\Val\:Ca,\:parmC)}\:Temp
+\ifx H\:TreeDir
+ \MoveToNode(\:parmB..\Val\:Ca,0,1) \MarkLoc(a:)
+ \MoveToNode(\:parmB..\Val\:Ca,0,-1) \MarkLoc(b:)
+\else
+ \MoveToNode(\:parmB..\Val\:Ca,-1,0) \MarkLoc(a:)
+ \MoveToNode(\:parmB..\Val\:Ca,1,0) \MarkLoc(b:)
+\fi
+\MoveToLoc(o:) \CSeg\:MoveHV(o:,a:)
+\MarkLoc(a:) \MarkXLoc(IN:)
+\MarkXLoc(INc:)
+\MoveToLoc(o:) \CSeg\:MoveHV(o:,b:)
+\MarkXLoc(OUT:) \MarkLoc(b:)
+\MoveToLoc(o:) \CSeg\:MoveHV(o:,-12:) \MarkLoc(-12:)
+\MoveToLoc(a:) \CSeg\:DistH(a:,-12:)
+\IF \LtDec(\Va,0) \THEN
+ \ifx H\:TreeDir
+ \else \Move(\Val\Va,0) \fi
+\ELSE
+ \ifx H\:TreeDir \Move(0,\Val\Va)
+ \else \fi
+ \FI
+\MarkXLoc(INx:)
+\MoveToLoc(o:) \CSeg\:MoveHV(o:,OUTx:) \MarkLoc(OUTx:)
+\MoveToLoc(b:) \CSeg\:DistH(b:,OUTx:)
+\IF \GtDec(\Va,0) \THEN
+ \ifx H\:TreeDir
+ \else \Move(\Val\Va,0) \fi
+\ELSE
+ \ifx H\:TreeDir \Move(0,\Val\Va)
+ \else \fi
+ \FI
+\MarkXLoc(OUTx:) }
+\Define\:Clnd(2){
+ \MarkLoc(o:) \:TreeEnEx \:C=#1; \:LeafNode(#1..\Val\:Ca,#2)
+\ifx H\:TreeDir
+ \MoveToNode(#1..\Val\:Ca,0,1) \MarkLoc(IN:)
+ \MoveToNode(#1..\Val\:Ca,0,-1)
+\else
+ \MoveToNode(#1..\Val\:Ca,-1,0) \MarkLoc(IN:)
+ \MoveToNode(#1..\Val\:Ca,1,0) \fi
+\MarkLoc(OUT:) \MoveToLoc(o:) \CSeg\:MoveHV(o:,IN:)
+\MarkXLoc(IN:) \MarkXLoc(INc:) \MarkXLoc(INx:)
+\MoveToLoc(o:) \CSeg\:MoveHV(o:,OUT:)
+\MarkXLoc(OUT:) \MarkXLoc(OUTx:) }
+\Define\TreeAlign(3){ \let\:TreeDir=#1
+ \def\:EntryX{#2} \def\:EntryY{#3} \:AlignTree}
+
+\Define\:AlignTree(3){
+ \def\:AlignA{#1} \def\:AlignB{#2} \def\:AlignC{#3}}
+
+\TreeAlign(V,0,0)(0,0,0)
+\Define\:trcTree{\:TrcDiag{\immediate\write16{\space
+ \:parmB..\Val\:Ca,\Val\:Cc..\Val\:Cb}}}
+\Define\:ChildLoc(2){
+\IF \LtDec(#1,0) \THEN \Va=-#1;
+ \ELSE \Va= #1; \FI
+\IF \LtDec(\Va,100) \THEN
+ \::ChildLoc(#1,#2)
+\ELSE \Va/100; \:C[\Va]; \Vb=#1;
+ \IF \GtDec(#1,0) \THEN \Vb-\:C 00;
+ \ELSE \Vb+\:C 00; \FI
+ \edef\:Temp{\noexpand\::ChildLoc
+ (\Val\Vb,-\Val\:C2:,-\Val\:C1:,\Val\:C1:,\Val\:C2:)}\:Temp
+\FI } \Define\::ChildLoc(5){
+ \IF \LtDec(#1,-2) \THEN
+ \MoveToLoc(#2) \:MoveH(#1,#1)
+ \ELSE \IF \GtDec(#1,2) \THEN
+ \MoveToLoc(#4) \:MoveH(#1,#1)
+ \ELSE \IF \LtDec(#1,-1) \THEN
+ \MoveToLoc(#3) \Va=#1; \Va+1;
+ \CSeg[\Val\Va]\Move(#2,#3)
+ \ELSE \IF \GtDec(#1,1) \THEN
+ \MoveToLoc(#4) \Va=#1; \Va-1;
+ \CSeg[\Val\Va]\Move(#4,#5)
+ \ELSE \MoveToLoc(#3)
+ \CSeg[0.5]\Move(#3,#4) \:MoveH(#1,#1)
+ \FI \FI \FI \FI}\def\:GetIx#1..#2//{\:Ca=#1;\:Cb=#2;}
+
+\Define\::MoveToInv(3){
+ \Indirect{\let\:temp=}<#1.mvto>
+ \expandafter\ifx\:temp\MoveToInv
+ \:GetIx#1// \ifx H\:TreeDir \:Cb-#3; \else \:Cb-#2; \fi
+ \edef\:Temp{\noexpand\MoveToInv(\Val\:Ca..\Val\:Cb,
+ \ifx H\:TreeDir 0,#3 \else -#2,0 \fi)}
+ \expandafter\:Temp
+ \ELSE
+ \ifx H\:TreeDir \Indirect<#1.mvto>(#1,0,#3)
+ \else \Indirect<#1.mvto>(#1,-#2,0) \fi
+ \FI }
+
+\def\MoveToInv{\:MoveToInv}
+\let\:MoveToInv=\MoveToRect \Define\::MergTree{
+ \edef\:Temp{\DoReg=\the\DoReg\relax}
+ \Table\:tempa{\:frL}
+\Table\:tempb{\:frR}
+\:tempa(0,0){\:left}
+\:tempb(0,0){\:right}
+\IF \GtInt(\:dpR,\:dpL) \THEN
+ \:both(\:dpL) \:DoReg=\:dpL \advance\:DoReg by 1\relax
+\:tempb(\:DoReg,\:dpR){\:copy}
+ \let\:dpL=\:dpR
+\ELSE
+ \:both(\:dpR)
+\IF \GtInt(\:dpL,\:dpR) \THEN
+ \:DoReg=\:dpR \advance\:DoReg by 1\relax
+ \:tempa(\:DoReg,\:dpL){\:copy}
+\FI
+\FI \:Temp } \Define\:copt(3){\::copt(#3,)}
+\Define\::copt(2){
+ \IF \EqText(#1,C) \THEN
+ \let\:MergTree=\::MergTree \FI }
+\Define\:MeasureRow(3){
+ \:TrcDiag{{ \:tk={#1,#2,#3}
+ \immediate\write16{\Val\:C..\Val\:Ca\space\space\the\:tk}}}
+ \IF \EqInt(#2,0) \THEN
+ \FigSize\Va\Vb{\:LeafNode(x,#3)}
+ \ELSE \FigSize\Va\Vb{\:TreeNode(x,#3)} \FI
+ \expandafter\expandafter\expandafter\:tempb
+ \expandafter{\:tempa &}
+ \edef\:tempa{\the\:tk #2,\Val\Va,\Val\Vb}
+ \IF \LtDec(\:Vc,\:tempc) \THEN \:Vc=\:tempc; \FI }
+\Define\:AddVerTreeSp(1){
+ \:Ca+1; \Indirect<y.\Val\:Ca>+#1;
+ \Va=#1; \Va*\:TreeEdgeSpec; \Indirect<x.\Val\:Ca>+\Va; }
+
+\:DefineExt\TreeSpace(3){\endgroup
+ \IF \EqText(D,#1) \THEN
+ \def\:OutOutx{OUT:} \def\:InInx{IN:} \FI
+ \IF \EqText(C,#1) \THEN
+ \def\:OutOutx{OUT:} \def\:InInx{INc:}
+ \let\:Cspace=\:InInx \FI
+ \IF \EqText(S,#1) \THEN
+ \def\:OutOutx{OUTx:} \def\:InInx{INx:} \FI
+ \:edef\:HorTreeSp{#2}
+ \:edef\:VerTreeSp{#3} }
+
+\TreeSpace(S,10,20)\:DefineExt\AdjTree(1){\endgroup
+ \IF \EqText(#1,) \THEN \Table\:TrSp{,,}
+ \ELSE \Table\:TrSp{#1} \FI }
+
+\AdjTree()\Define\:unl(3){
+ \IF \EqText(#1,L) \THEN
+ \IF \EqInt(\:Cc,#2) \THEN \TreeSpace(#3,0) \FI
+ \ELSE \IF \EqText(#1,N) \THEN
+ \:edef\:Temp{\noexpand\EqText(\Val\:Cc..\Val\:Ca,#2)}
+ \IF \:Temp \THEN \TreeSpace(#3,0) \FI
+ \FI \FI}\Define\:spbn(3){
+ \IF \EqText(#1,B) \THEN
+ \:edef\:Temp{\noexpand\EqText(\Val\:Cc..\Val\:Cb,#2)}
+ \IF \:Temp \THEN \:MoveH(#3,#3)
+ \FI\FI}\Define\:lcalg(3){
+ \IF \EqText(#1,A) \THEN
+ \:edef\:Temp{\noexpand\EqText(\Val\:C..\Val\:Ca,#2)}
+ \IF \:Temp \THEN
+ \:xalg(#3)
+ \FI\FI}
+\Define\:xalg(2){ \def\:EntryX{#1} \:AlignTree(#2) }
+\Define\:mvpr(3){
+ \IF \EqText(#1,M) \THEN
+ \:edef\:Temp{\noexpand\EqText(\Val\:C..\Val\:Ca,#2)}
+ \IF \:Temp \THEN \:MoveH(#3,-#3)
+ \FI\FI}\Define\TreeEdgeSpec(1){\:edef\:TreeEdgeSpec{#1}}
+\TreeEdgeSpec(0.5) \def\:ChkInv{\MoveToInv}
+
+ \Define\:Temp{
+\def\:MvToDivider##1..##2..{
+ \ifx H\:TreeDir \Indirect{\Move(\Val}<x.##1>,0)
+ \else \Indirect{\Move(0,-\Val}<x.##1>) \fi }
+ }\:Temp \Define\TreeEdge(2){
+ \ifx H\:TreeDir \HHEdge(#1,#2,EdgeGuide)
+ \else \VVEdge(#1,#2,EdgeGuide) \fi }
+\Define\:AddNodesAddr(1){
+ \Define\:temp{\gdef\:GetNodesAddr}
+ \expandafter\expandafter\expandafter
+ \:temp\expandafter{\:GetNodesAddr & #1 }}
+
+\Define\:SubTreeAddrs{
+ \Table\:AddrPoly{ \:GetNodesAddr}
+ \:AddrPoly(\Val\:AddrCount,999){\:AddrCount+1;\:RecordAddr} }
+
+\Define\:RecordAddr(1){\MoveToLoc(#1) \MarkXLoc(#1)
+ \MoveToLoc(#1;:11) \MarkXLoc(#1;:11)}
+
+\IntVar\:AddrCount\TreeSpec(\Node)()(\TreeEdge)
+\fi
+\let\if:option=\:undefined
+\let\:CheckOption=\:undefined
+\let\:GetOptions=\:undefined
+\let\AlDraTex=\:undefined
+\def\:aldwarn#1#2{\immediate
+ \write16{---AlDraTeX warning--- \ifcase #1
+ insufficient space for arrow head %0
+ \or \string\Tree(too many values)(...) %1
+ \or edge from node #2 to itself %2
+ \or #2 not a grid point %3
+ \or too many entries in (#2) %4
+ \or too many rows: \Val\:C %5
+ \or row \Val\:C\space has too many columns: \Val\:Ca %6
+ \or \Val\:C\space(>5) entries in \string\BarChartSpec %7
+ \or more than one bar in \string\BarChartSpec(\the\:tk) %8
+ \or no font for \string\NewCIRCNode, trying `\string
+ \font\string\CIRC=lcircle10 scaled\string\magstep5' %9
+ \or \string\PutNode(#2)? %10
+ \or \string\GridDiagram(#2)? less than 2 rows/columns %11
+ \fi}}
+
+\:RestoreCatcodes \endinput
+
diff --git a/graphics/dratex/DraTex.sty b/graphics/dratex/DraTex.sty
new file mode 100644
index 0000000000..2a3f3e1e58
--- /dev/null
+++ b/graphics/dratex/DraTex.sty
@@ -0,0 +1,1636 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% v 1.6
+% DraTex %
+% Copyright (C) 1992 by Eitan M. Gurari %
+% %
+% This program can redistributed and/or modified under %
+% the terms of the LaTeX Project Public License %
+% Distributed from CTAN archives in directory %
+% macros/latex/base/lppl.txt; either version 1 of the %
+% License, or (at your option) any later version. %
+% %
+% However, you are allowed to modify this program %
+% without changing its name, if you modify its %
+% signature. Changes to the signature can be introduced %
+% with a directive of the form %
+% \message{signature} %
+% %
+% gurari@cse.ohio-state.edu %
+% http://www.cse.ohio-state.edu/~gurari %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\expandafter\edef\csname :RestoreCatcodes\endcsname{%
+ \catcode`\noexpand\noexpand\noexpand \^=\the\catcode`\^%
+}
+\catcode`\^=7
+\expandafter\edef\csname :RestoreCatcodes\endcsname{%
+ \csname :RestoreCatcodes\endcsname
+ \catcode`\noexpand \_=\the\catcode`\_%
+ \catcode`\noexpand :=\the\catcode`:%
+ \catcode`\noexpand @=\the\catcode`@%
+ \catcode`\noexpand /=\the\catcode`/%
+ \catcode`\noexpand &=\the\catcode`&%
+ \catcode`\noexpand \^^M=\the\catcode`\^^M%
+ \catcode`\noexpand \^^I=\the\catcode`\^^I%
+ \let\expandafter\noexpand
+ \csname:RestoreCatcodes\endcsname=\noexpand\undefined}
+\catcode`\:11 \catcode`\@11
+ \let\:wlog\wlog \def\wlog#1{}
+ \def\:wrn#1#2{\immediate\write\sixt@@n{--DraTeX warning--
+ \ifcase #1
+ DraTex.sty already loaded
+\or \string\Draw\space within \string\Draw
+\or Changing definition of \string#2
+\or No intersection points: #2
+\or Improper rotation of axes: #2
+\or (#2) in \string\DSeg\space is a point
+\fi}}
+\def\:err#1#2{\errmessage{--DraTeX error-- \ifcase #1
+ \string#2\space meaningless in three dimensions
+\or \string#2\space meaningless in two dimensions
+\or No \string\MarkLoc(#2)
+\or \string#2 in three dimensions
+\or Too many parameters in definition
+\or \string\MoveFToOval(#2)?
+\fi}}
+ \ifx\:Xunits\:undefined \else \:wrn0{} \fi
+ \catcode`\ 9 \catcode`\^^M9 \catcode`\^^I9
+ \def\:UBorder{0}
+\newdimen\:LBorder \newdimen\:RBorder\chardef\:eight=8
+\mathchardef\:cccvx=360
+\newdimen\:mp \:mp 0.1\p@
+\newdimen\:mmp \:mmp 0.01\p@
+\newdimen\:mmmp \:mmmp 0.001\p@
+\newdimen\:XC \:XC 90\p@
+\newdimen\:CVXXX \:CVXXX180\p@
+\newdimen\:CCCVX \:CCCVX\:cccvx\p@ \newdimen\:TeXLoc
+\newbox\:box\newif\if:IIID \newdimen\:Z \newdimen\:Zunits
+\newdimen\:Ex \newdimen\:Ey \newdimen\:Ez
+
+\def\:AbsVal#1{ \ifdim#1<\z@-\fi #1 }
+\def\:abs#1{\ifdim #1<\z@ #1-#1 \fi}
+\def\:AbsDif#1#2#3{ #1#2 \advance#1 -#3
+ \ifdim #1<\z@ #1-#1 \fi}
+\def\:diff#1#2#3{ #1#2 \advance#1 -#3 }
+\def\:average#1#2#3{
+ #1#2 \advance#1 #3 \divide#1 \tw@}\def\:Opt#1#2#3#4{
+ \def\:temp{
+ \ifx \:next\ifnum \def\:next{#3#1#4#2}
+ \else\ifx \:next#1 \def\:next{#3}
+ \else \def\:next{#3#1#4#2}\fi\fi \:next}
+ \futurelet\:next\:temp}\def\Define#1{\:multid#1
+ \:Opt(){\:Define#1}0}
+
+\def\:DraCatCodes{\catcode`\ 9 \catcode`\^^M9
+ \expandafter\ifx \csname ;catcode\endcsname\relax %
+ \expandafter\edef \csname ;catcode\endcsname{%
+ \catcode`;\the\catcode`\;}%
+\fi %
+\catcode`;12 %
+%
+ \catcode`\^^I9 \catcode`\&13 \catcode`\~13 }
+
+\def\:Define#1(#2){\begingroup \:DraCatCodes \::Define#1(#2)}
+
+\def\::Define#1(#2)#3{\endgroup
+ \let\:NextDefine\NextDefine
+ \let\NextDefine\relax
+ \ifcase#2\relax
+ \def#1{#3}\or
+ \:TxtPar\def#1(##1){#3}\or
+ \:TxtPar\def#1(##1,##2){#3}\or
+ \:TxtPar\def#1(##1,##2,##3){#3}\or
+ \:TxtPar\def#1(##1,##2,##3,##4){#3}\or
+ \:TxtPar\def#1(##1,##2,##3,##4,##5){#3}\or
+ \:TxtPar\def#1(##1,##2,##3,##4,##5,##6){#3}\or
+ \:TxtPar\def#1(##1,##2,##3,##4,##5,##6,##7){#3}\or
+ \:TxtPar\def#1(##1,##2,##3,##4,##5,##6,##7,##8){#3}\or
+ \:TxtPar\def#1(##1,##2,##3,##4,##5,##6,##7,##8,##9){#3}\or
+ \:err4{}\fi \let\:TxtPar\relax \:NextDefine}
+
+\let\NextDefine\relax\let\:TxtPar\relax
+\def\WarningOn{\def\:multid##1{
+ \ifx ##1\:undefined \else \:wrn2##1\fi}}
+\def\:gobble#1{}
+\def\WarningOff{\let\:multid\:gobble} \WarningOff
+\Define\Indirect{\futurelet\:next\:Indirect}
+
+\Define\:Indirect{\:theDoReg
+ \ifx \:next<
+ \def\:temp{\let\DoReg\:DoReg}
+ \def\:next<##1>{\expandafter\:temp\csname :<##1>\endcsname}
+ \else
+ \def\:next##1<##2>{
+ \expandafter\ifx \csname :<##2> \endcsname \relax
+ \def\:next{##1} \fi
+\:indrwrn\Define \:indrwrn\Object
+\:indrwrn\Table \:indrwrn\IntVar \:indrwrn\DecVar
+ \def\:temp{\let\DoReg\:DoReg##1}
+ \expandafter\:temp \csname :<##2> \endcsname}
+ \fi \:next} \def\:indrwrn#1{ \def\:temp{#1}
+ \ifx \:next\:temp \def\:wrn##1##2{\let\:wrn\::wrn} \fi}
+\let\::wrn\:wrn
+\Define\:Hline{
+ \setbox\:box\hbox{\vrule height0.5\:thickness
+ depth 0.5\:thickness width\:x}
+ {\:d\:X \advance\:d \wd\:box
+ \advance\:X -\:TeXLoc \global\:TeXLoc\:d
+ \vrule width\:X depth\z@ height\z@
+ \raise \:Y \box\:box} }\Define\:Vline{
+ \setbox\:box\hbox{\vrule width\:thickness
+ \ifdim \:y>\z@ height\:y depth\z@
+ \else height\z@ depth-\:y \fi}
+ \advance\:X -0.5\:thickness
+ {\:d\:X \advance\:d \wd\:box
+ \advance\:X -\:TeXLoc \global\:TeXLoc\:d
+ \vrule width\:X depth\z@ height\z@
+ \raise \:Y \box\:box} }\Define\:MvTo(2){\:X#1\:Xunits \:Y#2\:Yunits}
+\Define\:Mv(2){\advance\:X #1\:Xunits
+ \advance\:Y #2\:Yunits}
+\def\:DLn(#1,#2,{\:MvTo(#1,#2) \:LnTo(}\Define\:LnTo(2){
+ \:x#1\:Xunits \advance\:x -\:X
+ \:y#2\:Yunits \advance\:y -\:Y
+ \:Ln(\:x\du,\:y\du) }\Define\:Ln(2){
+ \:x#1\:Xunits \:y#2\:Yunits
+ { \ifdim \:x<\z@
+ \advance\:X \:x \:x-\:x
+ \advance\:Y \:y \:y-\:y
+ \fi
+ \:yy\:AbsVal\:y
+ \:dd\:yy \advance\:dd \:x
+ \ifdim \:dd>\:mmmp
+ \ifdim \:x>\:yy
+ { \ifdim\:X<\:LBorder \global\:LBorder\:X\fi
+\advance \:X \:x
+\ifdim \:X>\:RBorder \global\:RBorder\:X\fi\advance \:Y 0.5\:thickness
+\ifdim \:Y>\:UBorder \xdef\:UBorder{\the\:Y} \fi
+\advance \:Y \:y
+\ifdim \:Y>\:UBorder \xdef\:UBorder{\the\:Y} \fi }
+ \let\:Yunitsy\:x \let\:Xunitsx\:y \let\:temp\:Hline
+ \:dd0.6\:yy \:divide\:dd\:x
+ \else
+ { \advance \:X -0.5\:thickness
+\ifdim \:X<\:LBorder \global\:LBorder\:X \fi
+\advance \:X \:thickness
+\advance \:X \:x
+\ifdim \:X>\:RBorder \global\:RBorder\:X\fi
+\ifdim \:Y>\:UBorder \xdef\:UBorder{\the\:Y} \fi
+\advance \:Y \:y
+\ifdim \:Y>\:UBorder \xdef\:UBorder{\the\:Y} \fi }
+ \let\:Yunitsy\:y \let\:Xunitsx\:x \let\:temp\:Vline
+ \:dd0.6\:x
+\ifdim \:x>\:mmp \:divide\:dd\:yy \fi
+ \fi
+ \advance\:dd 0.4\p@
+\:ragged\:Cons\:dd\:ragged
+ \:HVLn
+ \fi }
+ \advance\:X \:x \advance\:Y \:y}\Define\:HVLn{
+ \:xx\:AbsVal\:Xunitsx \:divide\:xx\:ragged
+ \advance\:xx 0.99\p@ \:K\:InCons\:xx \relax
+ \ifnum \:K>\z@
+ \divide\:Xunitsx \:K \advance\:K \@ne
+ \divide\:Yunitsy \:K
+ \else \:K\@ne \fi \:NextLn}
+
+
+\Define\:NextLn{
+ \ifnum\:K=\z@ \let\:NextLn\relax
+ \else { \:temp } \advance\:K \m@ne
+ \advance\:X \:x \advance\:Y \:y
+ \fi \:NextLn}\newdimen\:ragged
+
+\Define\Ragged(1){ \:ragged#1\p@ \:ragged0.1\:ragged }
+\Ragged(7.5)
+\Define\PaintUnderCurve(4){{
+ \:Z\:Y \def\:next{\Curve(#1,#2,#3,#4)}
+ \MoveToLoc(#1) \:d\:X \MoveToLoc(#4)
+ \advance\:d -\:X
+ \ifdim \:AbsVal\:d<\:mmp \def\:next{}
+ \else
+ \def\:CrvLnTo(##1,##2){
+ \:x \:X \:y \:Y \:X\:DJ \:Y\:yyyy
+ \:xx\:X \:dddd \:Y \:X\:x \:Y\:y
+ { \advance\:Y \:dddd \divide\:Y \tw@
+ \advance\:Z -\:Y
+ \advance\:Y 0.5\:Z
+ \:dddd \:AbsVal \:Z \:d\z@
+ \def\:CrvLnTo{\:LnTo}
+ \:yy\:Y \:dd\:dddd \:ddd\:dddd
+ \::paint }}
+ \fi \:next }}
+\Define\DoCurve(1){ \let\:StopCurve\:SlowCurve
+ \def\:CMv(##1){ \:x\:X \:y\:Y \:MvTo(##1)
+ \advance\:x -\:X \advance\:y -\:Y
+ \:xxx \:x \:yyy\:y}
+ \:DoCurve{\Curve(#1)}
+ \let\:StopCurve\:FastCurve}
+
+\def\:DoCurve#1(#2)#3{{\XSaveUnits
+ \def\:next{#1} \:MvTo(#2,#2)
+ \:x\:AbsVal\:X \:y\:Y \:ddd\z@ \:length
+ \:Z\:d \:divide\:Z{1.41421\p@}
+ \edef\:tempa{\the\:DoDist} \global\:DoDist\z@
+ \def\:CrvLnTo(##1){ \MarkLoc(1^) \:CMv(##1)
+ { \MarkLoc(2^) \:ddd\z@ \:length
+\:dd \:DoDist \global\advance\:DoDist \:d
+\:ddd \:DoDist \:divide\:ddd\:Z
+\DoReg\:InCons\:ddd \:Z\DoReg\:Z
+
+ \ifdim \:Z>\:dd
+ \advance\:Z -\:DoDist
+\advance\:dd -\:DoDist
+\:divide\:Z\:dd
+\advance\:X \:Cons\:Z\:xxx
+\advance\:Y \:Cons\:Z\:yyy \:DoRot
+ \def\:CrvLnTo{\:LnTo}
+ \def\:OvalLn{\:Ln} \XRecallUnits #3 \fi}}
+ \:next \xdef\:DoDim{\:Cons\:DoDist}
+ \global\:DoDist\:tempa }
+ \let\DoDim\:DoDim}
+
+\newdimen\:DoDist\def\:DoRot{ \DSeg\RotateTo(1^,2^) }
+\def\DoLine(#1,#2)(#3)#4{
+ \MarkLoc($1) \Move(#1,#2)
+ \def\:next{ { \MarkLoc($2)
+ \DSeg\RotateTo($1,$2) \let\:DoRot\relax
+ \edef\:RecallRagged{\the\:ragged} \MoveTo(#3,#3)
+ \:x\:AbsVal\:X \:y\:Y \:ddd\z@ \:length
+ \:ragged\:d \divide\:ragged \tw@
+ \DoCurve($1,$1,$2,$2)(#3)
+ {\:ragged\:RecallRagged #4} }
+ \let\DoDim\:DoDim} \:next }
+\def\Table#1{\begingroup \:DraCatCodes \:multid#1
+ \:DefineData#1}
+
+
+\def\:DefineData#1#2{\endgroup
+ \let\:temp~ \def~{\noexpand~}
+ \edef#1{\noexpand\:DoPoly\expandafter\noexpand\csname
+ :\string#1\endcsname}
+ \expandafter\edef \csname :\string#1\endcsname
+ ##1{\noexpand\ifcase##1(#2)\noexpand\fi}
+ \let~\:temp \:DoNextPoly \:DoNextPoly}
+
+\def\:OR{\let\:or\or} \:OR \catcode`\&13 \def&{)\noexpand\:or(}
+
+\def\TableData{\begingroup \:DraCatCodes \:TableData}
+
+\def\:TableData#1#2#3{\endgroup \Table\:temp{#3}
+ \:K\z@ \:J\z@ \def\:tempa(##1){\advance\:J \@ne }
+ \:temp(0,999){\:tempa} \let\:tempa& \def\:temp{\def#1}
+ \def&##1&{
+ \ifnum \:K<\:J
+ \advance\:K \@ne
+ \ifnum \:K=\@ne \def#1{#2(##1)}
+ \else
+ \:IIIexpandafter\:temp\expandafter{
+ #1 & #2(##1) }
+ \fi
+ \else \let\:next\relax \fi
+ \:next}
+ \let\:next& &#3&& \let&\:tempa }
+
+\catcode`\&4 \def\:DoPoly#1(#2,#3)#4{
+ \expandafter\let \csname :Back\the\:level\endcsname\:or
+\expandafter\edef\csname :DoVars\the\:level\endcsname{
+ \:DoB\the\:DoB}
+\advance\:level \@ne
+ \:DoB#3 \advance\:DoB -#2
+ \def\:PolyOr(##1){
+ \ifnum \:DoB=\z@ \:OR
+ \else #4(##1) \advance\:DoB \m@ne \fi}
+ \:OR
+ \def\:temp{\let\:or\:PolyOr #4}
+ \:IIIexpandafter\:temp#1{#2}
+ \advance\:level \m@ne
+\csname :DoVars\the\:level\endcsname
+\def\:temp{\let\:or}
+\expandafter\:temp\csname :Back\the\:level\endcsname }
+\Define\PaintRect(2){\def\:next{{ \MarkLoc(^)
+ \MoveToLoc(^) \Move( #1,0) \MarkLoc(^1) \Move(0,#2)
+ \MarkLoc(^2) \Move(-#1,0) \MarkLoc(^3)
+ \PaintQuad(^,^1,^2,^3) }}\:next}
+\Define\PaintRectAt(4){\def\:next{{ \MoveTo(#1,#2)
+ \:Ex#3\p@ \advance\:Ex -#1\p@
+ \:Ey#4\p@ \advance\:Ey -#2\p@
+ \PaintRect(\:Cons\:Ex,\:Cons\:Ey)}}
+ \:next}\def\::paint{
+ \ifdim \:d<\:ragged \advance\:xx -\:X
+ \:yyy\:Y \:xxx\:dddd
+ \advance\:Y \:yy \divide\:Y \tw@
+ \:average\:dddd\:dd\:ddd
+ \def\:next{\:brush(\:xx,\z@)\:Y\:yyy\:dddd\:xxx}
+ \else \divide\:d \tw@
+ \:average\:x\:X\:xx
+ \:average\:y\:Y\:yy
+ \:average\:dddd\:dd\:ddd
+ \fi \:next}\Define\:paint{{ \:AbsDif\:d\:xx\:x
+ \ifdim \:d<\:mmp \let\::paint\relax
+ \else
+ \ifdim \:y >\:yyy \:dd\:y \:y \:yyy \:yyy \:dd \fi
+ \ifdim \:yy>\:yyyy \:dd\:yy \:yy\:yyyy \:yyyy\:dd \fi
+ \:AbsDif\:dd\:yyyy\:yyy \:AbsDif\:ddd\:yy\:y
+ \ifdim \:dd<\:ddd \:dd\:ddd \fi
+ \ifdim \:d >\:dd \:d\:dd \fi
+ \advance\:d \:d \:diff\:dd\:y\:yyy
+ \:diff\:ddd\:yy\:yyyy
+ \advance\:y -0.5\:dd \:abs\:dd
+ \advance\:yy -0.5\:ddd \:abs\:ddd
+ \:X\:x \:Y\:y
+ \:average\:dddd\:dd\:ddd
+ \def\:next{ \:lpaint \:rpaint }
+ \fi
+ \::paint }}
+
+\Define\:lpaint{ { \:xx\:x \:yy \:y \:ddd\:dddd \::paint} }
+\Define\:rpaint{ { \:X \:x \:Y \:y \:dd \:dddd \::paint} }
+\Define\PaintQuad(4){\def\:next{{\Units(1pt,1pt)
+ \MoveToLoc(#1) \:x \:X \:y \:Y
+ \MoveToLoc(#2) \:xx \:X \:yy \:Y
+ \MoveToLoc(#3) \:xxx\:X \:yyy\:Y
+ \MoveToLoc(#4) \:xxxx \:X \:yyyy \:Y
+
+ \:paintQuad }}\:next}
+
+\def\:paintQuad{{
+ \:SetVal\:a\:x\:y\:xx\:yy\:xxxx\:yyyy
+\:SetVal\:b\:xx\:yy\:xxx\:yyy\:x\:y
+\:SetVal\:c\:xxx\:yyy\:xx\:yy\:xxxx\:yyyy
+\:SetVal\:cc\:xxxx\:yyyy\:xxx\:yyy\:x\:y
+\def\:A{\:a} \def\:B{\:b} \def\:C{\:c} \def\:D{\:cc}
+\:sort\:B\:A
+\:sort\:C\:B \:sort\:B\:A
+\:sort\:D\:C \:sort\:C\:B \:sort\:B\:A
+\let\:temp\relax
+\:IsTriang\:A\:B
+\:IsTriang\:B\:C
+\:IsTriang\:C\:D
+\:temp
+ \:Quad\:A\:temp> \:xxxx\:xx \:yyyy\:yy \:Z\:d
+\:Quad\:D\:next<
+ \:PrePaint(\:xx,\:yy,\:d,\:xxxx,\:yyyy,\:Z)
+ \:temp \:next }}
+\Define\:PrePaint(6){
+ \:x#1 \:y#2 \:yyy#3 \:xx#4 \:yy#5 \:yyyy#6
+ \:paint }\def\:Quad#1#2#3{
+ \:GetVal#1\:x\:y0
+ \:GetVal#1\:xx\:yy1
+ \:GetVal#1\:xxx\:yyy2
+ \ifdim \:xx#3\:xxx
+ \:ddd\:xx \:xx\:xxx \:xxx\:ddd
+ \:ddd\:yy \:yy\:yyy \:yyy\:ddd
+ \fi
+ \def#2{}
+ \:diff\:dd\:xxx\:xx
+ \ifdim \ifdim\:AbsVal\:dd<\:mp \:yy=\:yyy \else \z@>\z@ \fi
+
+ \:d\:yy
+ \else
+ \ifdim \:AbsVal\:dd>\:mp
+ \:diff\:dd\:xxx\:x \:diff\:ddd\:yyy\:y
+ \:divide\:ddd\:dd \:diff\:dd\:xx\:xxx
+ \:ddd\:Cons\:ddd\:dd \advance\:ddd \:yyy
+ \:d\:ddd
+ \else \:d\:yyy \fi
+ \edef#2{ \noexpand\:PrePaint
+ (\the\:x ,\the\:y ,\the\:y,
+ \the\:xx,\the\:yy,\the\:d) }
+ \fi}\def\:SetVal#1#2#3#4#5#6#7{
+ \edef#1{(\the#2,\the#3,\the#4,\the#5,\the#6,\the#7)}}
+
+\def\:sort#1#2{
+ \ifdim \:IIIexpandafter\:field#1 <
+ \:IIIexpandafter\:field#2
+ \let\:temp#1 \let#1#2 \let#2\:temp
+ \fi }
+
+\Define\:field(6){#1}
+
+\def\:GetVal#1#2#3{
+ \:IIIexpandafter\::GetVal #1#2#3}
+
+\def\::GetVal(#1,#2,#3,#4,#5,#6)#7#8#9{
+ \ifcase #9 #7#1 #8#2\or #7#3 #8#4\or #7#5 #8#6 \fi}
+\def\:IsTriang#1#2{
+ \ifdim \:IIIexpandafter\:field#1 =
+ \:IIIexpandafter\:field#2
+ \ifdim \:IIIexpandafter\:fieldB#1 =
+ \:IIIexpandafter\:fieldB#2
+ \def\:temp{ \:FixTria }
+ \fi \fi }
+
+
+\def\:FixTria{
+ \edef\:temp{\:IIIexpandafter\:FrsII\:B}
+ \ifdim \:IIIexpandafter\:field\:A =
+ \:IIIexpandafter\:field\:B
+ \ifdim \:IIIexpandafter\:fieldB\:A =
+ \:IIIexpandafter\:fieldB\:B
+ \edef\:temp{\:IIIexpandafter\:FrsII\:C}
+ \fi\fi
+ \edef\:A{\:IIIexpandafter\:FrsII\:A}
+ \edef\:D{\:IIIexpandafter\:FrsII\:D}
+ \edef\:temp{
+ \def\noexpand\:a{(\:A,\:temp,\:D)}
+ \def\noexpand\:b{(\:temp,\:A,\:D)}
+ \def\noexpand\:c{\noexpand\:b}
+ \def\noexpand\:cc{(\:D,\:A,\:temp)}}
+ \:temp
+ \def\:A{\:a} \def\:B{\:b} \def\:C{\:c} \def\:D{\:cc} }
+
+\Define\:fieldB(6){#2}
+\Define\:FrsII(6){#1,#2}
+\def\:IIIexpandafter{\expandafter\expandafter\expandafter}
+
+\Define\DrawRect(2){ \Line( #1,0) \Line(0, #2)
+ \Line(-#1,0) \Line(0,-#2)}
+
+\Define\DrawRectAt(4){{
+ \MoveTo(#1,#2) \LineTo(#3,#2) \LineTo(#3,#4)
+ \LineTo(#1,#4) \LineTo(#1,#2)}}
+\def\du#1{ \ifx#1\:Xunits \else\ifx#1\:Yunits
+ \else\ifx#1\:Zunits \else #1
+ \fi \fi \fi}
+\let\:svdu=\du
+\Define\XSaveUnits{
+ \expandafter\edef\csname XRecallUnits\the\:level\endcsname{
+ \:StoreUnits}
+ \advance\:level \@ne}
+
+\Define\XRecallUnits{
+ \advance\:level \m@ne
+ \csname XRecallUnits\the\:level \endcsname}
+
+\Define\SaveUnits{
+ \edef\RecallUnits{ \:StoreUnits } }
+
+\Define\:StoreUnits{ \:Xunits \the\:Xunits
+ \:Yunits \the\:Yunits \:Zunits \the\:Zunits
+ \:Xunitsx\the\:Xunitsx \:Xunitsy\the\:Xunitsy
+\:Yunitsx\the\:Yunitsx \:Yunitsy\the\:Yunitsy }
+\Define\:SearchDir{
+ \ifdim \:x<\z@ \:x-\:x \:y-\:y
+ \edef\:tempA{\advance\:ddd \ifdim \:y<\z@ - \fi\:CVXXX}
+\else \def\:tempA{} \fi
+\ifdim \:y<\z@
+ \edef\:tempA{\:ddd-\:ddd \advance\:ddd \:CCCVX \:tempA}
+ \:y-\:y
+\fi
+\ifdim \:y>\:x
+ \:ddd\:y \:y\:x \:x\:ddd
+ \edef\:tempA{\advance\:ddd -\:XC \:ddd-\:ddd \:tempA}
+\fi
+ \:divide\:y\:x \:d57.29578\:y
+ \:ddd\:d \:sqr\:y \:K \@ne
+ \Do(1,30){\advance\:K \tw@
+ \:d-\:Cons\:y\:d \:dd\:d \divide\:dd \:K
+ \advance\:ddd \:dd }
+ \advance\:ddd -0.49182\:dd
+ \:tempA }\Define\Curve(4){\def\:next{{ \XSaveUnits \Units(1pt,1pt)
+ \MoveToLoc(#1) \:DI \:X \:DK \:Y
+ \MoveToLoc(#2) \:ddd \:X \:Ez \:Y
+ \MoveToLoc(#3) \:dd\:X \:Ey\:Y
+ \MoveToLoc(#4) \:DJ\:X \:yyyy\:Y \:Curve }}\:next}
+\Define\:FastCurve{ \:AbsDif\:d\:DI\:ddd \:AbsDif\:dddd\:DK\:Ez
+ \advance\:d \:dddd
+ \ifnum \:d<\:ragged
+ \:AbsDif\:d\:DJ\:dd \:AbsDif\:dddd\:yyyy\:Ey
+ \advance\:d \:dddd \fi}
+\let\:StopCurve\:FastCurve
+\Define\:SlowCurve{
+ \:AbsDif\:d\:DI\:DJ \:AbsDif\:dddd\:DK\:yyyy
+ \advance\:d \:dddd }
+\Define\:Curve{ \:StopCurve
+ \ifnum \:d<\:ragged \:X\:DI \:Y\:DK
+ \:CrvLnTo(\:Cons\:DJ,\:Cons\:yyyy)
+ \def\:SubCurves{} \fi
+ \:SubCurves}
+
+\def\:CrvLnTo{\:LnTo}\Define\:SubCurves{
+ \:average\:yy\:DI\:ddd \:average\:Ex\:DK\:Ez
+ \:average\:ddd\:ddd\:dd \:average\:Ez\:Ez\:Ey
+ \:average\:dd\:dd\:DJ \:average\:Ey\:Ey\:yyyy
+ \:average\:Zunits\:yy\:ddd \:average\:Vdirection\:Ex\:Ez
+ \:average\:ddd\:ddd\:dd \:average\:Ez\:Ez\:Ey
+ \:average\:DL\:Zunits\:ddd \:average\:xxxx\:Vdirection\:Ez
+ { \:ddd \:yy \:Ez \:Ex \:dd\:Zunits
+ \:Ey\:Vdirection \:DJ\:DL \:yyyy\:xxxx \:Curve }
+ \:DI \:DL \:DK \:xxxx \:Curve }
+\def\MoveToCurve[#1]{
+ \Define\:BiSect(3){\MoveToLoc(##1)
+ \CSeg[#1]\Move(##1,##2)
+ \MarkLoc(##3) }\:MvToCrv}
+
+\Define\:MvToCrv(4){ \:BiSect(#1,#2,:a) \:BiSect(#2,#3,:b)
+ \:BiSect(#3,#4,:c) \:BiSect(:a,:b,:A) \:BiSect(:b,:c,:B)
+ \:BiSect(:A,:B,:Q)}
+\Define\:OvalDir(3){ \:CosSin{#3\p@}
+ \:Zunits\p@ \:d#2\:Zunits \:x\:Cons\:d\:x
+ \:Zunits\p@ \:d#1\:Zunits \:y\:Cons\:d\:y
+ \:SearchDir }\Define\DrawOval (2){ \DrawOvalArc(#1,#2)(0,\:cccvx) }
+\Define\PaintOval (2){ \PaintOvalArc(#1,#2)(0,\:cccvx) }
+\Define\DrawCircle (1){ \DrawOval(#1,#1) }
+\Define\PaintCircle(1){ \PaintOval(#1,#1) }
+\def\DrawOvalArc(#1,#2)(#3,#4){{
+ \:xxxx#4\p@ \advance\:xxxx -#3\p@
+ \ifdim \:xxxx=\z@ \else
+ \let\:SinOne\:SinB \:OvalDir(#1,#2,#3) \:DJ\:ddd
+\:OvalDir(#1,#2,#4) \:diff\:DI\:ddd\:DJ
+\ifdim\:DI<\z@ \advance\:DI \:CCCVX \fi
+\ifdim \:xxxx<\:CCCVX \else \:DI\:CCCVX \fi
+\:InitOval(#1,#2) \:CosSin\:DJ
+ \:xxxx\:x \:yyyy\:y \:xx\:X \:yy\:Y
+ \advance\:X \:Xx\:x \advance\:X \:Yx\:y
+ \advance\:Y \:Xy\:x \advance\:Y \:Yy\:y
+ \let\:Xunits\empty \let\:Yunits\empty
+ \Do(1,\:InCons\:DI){
+ \:dd\:X \:ddd\:Y \:X\:xx \:Y\:yy
+ \:AdvOv\:xxx\:yyy\:xxxx\:yyyy
+ \:X\:dd \:Y\:ddd
+ \advance\:xxx -\:X \advance\:yyy -\:Y
+ \:d\:AbsVal\:xxx
+ \advance\:d \:AbsVal\:yyy
+ \ifdim \:d>\:ragged
+ \:OvalLn(\:xxx,\:yyy) \fi }
+ \:OvalDir(#1,#2,#4) \:CosSin\:ddd
+ \advance\:xx \:Xx\:x \advance\:xx \:Yx\:y
+ \advance\:yy \:Xy\:x \advance\:yy \:Yy\:y
+ \advance\:xx -\:X \advance\:yy -\:Y
+ \:OvalLn(\:xx,\:yy) \fi }}
+
+\def\:OvalLn{\:Ln}\def\DoOvalArc(#1)(#2){ \:xx\:X \:yy\:Y
+ \def\:CMv(##1){ \:Mv(\:xxx,\:yyy)
+ \:x\:xxx \:y\:yyy}
+ \:DoCurve{ \:X\:xx \:Y\:yy
+ \def\:DoRot{ \let\:Xunits\:XunitsReg
+ \let\:Yunits\:YunitsReg
+ \DSeg\RotateTo(1^,2^) }
+ \let\::OvalLn\:CrvLnTo
+\Define\:OvalLn(2){ \:dd\:AbsVal####1
+ \advance\:dd \:AbsVal####2 \:divide\:dd\:ragged
+ \:J\:InCons\:dd \advance\:J \@ne
+ \divide####1 \:J \divide####2 \:J
+ \Do(1,\:J){\::OvalLn(####1,####2)}}
+ \DrawOvalArc(#1)(#2)}}
+\def\NextTable{\begingroup \:DraCatCodes \:NextTable}
+
+\def\:NextTable#1{\endgroup
+ \def\:DoNextPoly{#1\NextTable{}}}
+\NextTable{}\def\:AdvOv#1#2#3#4{
+ \:d\:CosOne#3 \advance\:d -\:SinOne#4
+ #4\:CosOne#4 \advance#4 \:SinOne#3 #3\:d
+ \divide#3 \:eight \divide#4 \:eight
+ #1\:X #2\:Y
+ \:d\:Xx#3 \advance\:d \:Yx#4 \advance#1 \:d
+ \:d\:Xy#3 \advance\:d \:Yy#4 \advance#2 \:d }
+
+\def\:CosOne{7.99878} \def\:SinB{0.13962}
+\def\PaintOvalArc(#1,#2)(#3,#4){{ \ifdim #3\p@=#4\p@
+ \let\:next\relax \else
+ \:d\:AbsVal{#1\:Xunits} \advance\:d \:AbsVal{#2\:Yunits}
+ \ifdim \:d<3\:ragged \divide \:d \tw@ \PenSize(\:d)
+\:Mv(-0.5\:d\du,0) \:Ln(\:d\du,0)
+ \else \:InitOval(#1,#2)
+ \MarkLoc(o$) \RotateTo(#3) \MoveFToOval(#1,#2)
+ \:Ex\:X \:Ey\:Y \edef\:FirstOvDir{\:Cons\:ddd\p@}
+ \MoveToLoc(o$) \RotateTo(#4) \MoveFToOval(#1,#2)
+ \:Ez \:X \:Vdirection \:Y \edef\:LastOvDir{\:Cons\:ddd\p@}
+ \MoveToLoc(o$)
+ \if:rotated
+ \:Zunits\p@ \:Zunits#1\:Zunits
+ \:xx\:Cons\:Zunits\:Xunitsx
+ \:Zunits\p@ \:Zunits#2\:Zunits
+ \:yy\:Cons\:Zunits\:Yunitsx
+ \:x\:xx \:y\:yy \:ddd\z@ \:length
+ \:ddd\:d \:divide\:xx\:ddd \:divide\:yy\:ddd
+\else \:xx\p@ \:yy\z@ \fi
+ \:AbsDif\:d{#3\p@}{#4\p@}
+ \ifdim \:d>359\p@ \:Ez-\:Xx\:xx \advance\:Ez -\:Yx\:yy
+\:Vdirection-\:Xy\:xx \advance\:Vdirection -\:Yy\:yy
+\advance\:Ez \:X \advance\:Vdirection \:Y
+\:setpaint\:PaintOvOv<>
+ \else
+ \:x\:xx \:y\:yy \:SearchDir
+\:xxx\:FirstOvDir \advance\:xxx -\:ddd
+\ifdim \:xxx<\z@ \advance\:xxx \:CCCVX \fi
+\:yyy\:LastOvDir \advance\:yyy -\:ddd
+\ifdim \:yyy<\z@ \advance\:yyy \:CCCVX \fi
+\:J\z@
+\ifdim \:xxx<\:yyy \ifdim \:yyy<\:CVXXX
+ \:Pntovln\:FirstOvDir\:FirstOvDir\:LastOvDir
+\else \ifdim \:xxx>\:CVXXX
+ \:Pntovln\:FirstOvDir\:FirstOvDir\:LastOvDir
+\else \:yyy-\:yyy \advance\:yyy \:CCCVX
+ \ifdim \:xxx<\:yyy
+ \:setpaint\:PntLeftOvOv>< \:PntMovln\:FirstOvDir\:xx
+ \else \:FxLx \:setpaint\:PntLeftOvOv>< \:Pntmovln\:LastOvDir
+\fi \fi \fi
+\else \ifdim \:xxx<\:CVXXX
+ { \:setpaint\:PaintOvOv<> } \:FxLx \:setpaint\:PntLeftOvOv><
+\:Usrch \:PaintMidOvLn\:LastOvDir\:FirstOvDir
+\else \ifdim \:yyy>\:CVXXX
+ { \:FxLx \:setpaint\:PaintOvOv<> } \:setpaint\:PntLeftOvOv><
+ \:Dsrch \:PaintMidOvLn\:LastOvDir\:FirstOvDir
+\else \:xxx-\:xxx \advance\:xxx \:CCCVX
+ \ifdim \:yyy<\:xxx
+ \:setpaint\:PaintOvOv<> \:PntMovln\:FirstOvDir\:xx
+ \else
+ \:FxLx \:setpaint\:PaintOvOv<> \:Pntmovln\:LastOvDir
+\fi \fi \fi \fi
+ \fi \fi \fi}}\def\:setpaint#1#2#3{{\aftergroup#1
+\:d\:Xx\:xx \advance\:d \:Yx\:yy
+\ifdim \:d<\z@ \aftergroup#3
+\else \aftergroup#2 \fi}}
+\def\:FxLx{\:d\:Ex \:Ex\:Ez \:Ez\:d}
+
+\def\:Pntovln#1{
+ \let\:SinOne\:SinB \:CosSin#1
+ \:xxxx\:Ex \:yyyy\:Ey \:Z\z@
+ \:PaintOvLn}
+
+\def\:PntMovln{
+ \:Dsrch \:FxLx \:xx\:ddd \:PaintOvLn}
+
+\def\:Pntmovln{
+ \:Usrch \:FxLx \:xx\:ddd \:PaintOvLn\:xx}
+\def\:PaintMidOvLn#1#2{
+ \:FxLx \:xx\:ddd \:PaintOvLn#1#2
+ \:xxx\:Ez \:yyy\:Vdirection
+ \:ddd\:Xy\:x \advance\:ddd \:Yy\:y \advance\:ddd \:Y
+ \:PaintSlice}
+
+\def\:PntLeftOvOv{
+ \:xx-\:xx \:yy-\:yy \:PaintOvOv}
+
+\def\:Dsrch{ \def\:SinOne{-\:SinB}
+ \:xx\:x \:yy\:y \:SearchDir
+ \:x\:xx \:y\:yy
+ \:d\:Ey \:Ey\:Vdirection \:Vdirection\:d }
+
+\def\:Usrch{
+ \let\:SinOne\:SinB
+ \:x\:xx \:y\:yy \:SearchDir
+ \:x\:xx \:y\:yy}\def\:PaintOvLn#1#2{
+ \:diff\:dd\:Ey\:Vdirection \:diff\:ddd\:Ex\:Ez
+ \ifdim \:AbsVal\:ddd>\:mp
+ \:divide\:dd\:ddd \:d#2
+ \advance\:d -#1
+ \ifnum \:d<\z@ \advance\:d \:CCCVX \fi
+ \:DoB\:InCons\:d \let\:next\:PntDo \:next
+ \fi}
+
+\def\:PntDo{
+ \ifnum\:DoB=\z@ \let\:next\relax
+ \else
+ \::AdvOv\:x\:y
+ \ifdim \:d>\:ragged
+ \:ddd\:xxx \advance\:ddd -\:Ez
+ \:ddd\:Cons\:dd\:ddd
+ \advance\:ddd \:Vdirection \:PaintSlice
+ \fi
+ \advance\:DoB \m@ne
+ \fi \:next}\Define\:PaintSlice{ \:AbsDif\:dddd\:yyy\:ddd
+ \advance\:yyy \:ddd \divide\:yyy \tw@
+ { \advance\:dddd \:Z \divide\:dddd \tw@
+ \:X\:xxxx \:Y\:yyy
+ \:xx\:xxx \advance\:xxx -\:xxxx
+ \:d\z@
+ \:yy\:Y \:dd\:dddd \:ddd\:dddd
+ \::paint }
+ \:xxxx\:xxx \:yyyy\:yyy \:Z\:dddd \:J\z@}
+\def\::AdvOv#1#2{ \:AdvOv\:xxx\:yyy#1#2
+ \:AbsDif\:d\:xxxx\:xxx \advance\:J \@ne
+ \ifnum \:J=\sixt@@n \multiply\:d \@cclvi
+ \fi }\def\:PaintOvOv#1{ \def\:hdir{#1}
+ \:xxx\:Xx\:xx \advance\:xxx \:Yx\:yy
+ \:yyy\:Xy\:xx \advance\:yyy \:Yy\:yy
+ \advance\:xxx \:X \advance\:yyy \:Y
+ \:Z\z@ \:xxxx\:xxx \:yyyy\:yyy
+ \:x\:xx \:y\:yy \:DoB\z@ \:J\z@
+ \let\:next\:scanOvOv \:next }
+\Define\:scanOvOv{ \advance\:DoB \@ne
+ \advance\:J \@ne
+ \:AbsDif\:d\:xxx\:Ez
+ \ifdim \ifdim \:xxx\:hdir\:Ez -
+ \else\ifdim \thr@@\:d<\:ragged -
+ \else\ifnum \:DoB>358 -
+ \fi \fi \fi \p@<\z@
+ \:ddd\:yyyy \advance\:ddd -0.5\:dddd
+ \:yyy\:yyyy \advance\:yyy 0.5\:dddd
+ \:xxx\:Ez \:PaintSlice
+ \let\:next\relax
+ \else
+ \:d\:xx \advance\:d -\:x
+ \:xxx\:yy \advance\:xxx -\:y
+ \ifdim -\:Xx\:d\:hdir\:Yx\:xxx
+ \let\:SinOne\:SinB
+ \::AdvOv\:xx\:yy
+ \ifdim \ifdim \:d >\:ragged -
+ \else \ifnum \:J>\sixt@@n -
+ \fi\fi \p@<\z@
+ \:J\z@ \def\:SinOne{-\:SinB}
+ \:AdvOv\:dd\:ddd\:x\:y \:PaintSlice \fi
+ \else
+ \def\:SinOne{-\:SinB}
+ \::AdvOv\:x\:y
+ \ifdim \ifdim \:d >\:ragged -
+ \else \ifnum \:J>\sixt@@n -
+ \fi\fi \p@<\z@
+ \:J\z@ \let\:SinOne\:SinB
+ \:AdvOv\:dd\:ddd\:xx\:yy \:PaintSlice \fi
+ \fi \fi
+ \:next}\Define\SetBrush{\:Opt[]\:SetBrush{}}
+
+\def\:SetBrush[#1](#2,#3)#4{ \def\:temp{#4}
+ \ifx \:temp\empty
+ \def\:brush{ \let\:Xunits\empty \let\:Yunits\empty
+ \:thickness\:dddd \:Ln }
+ \else \def\:BruShape{#4}
+ \:dd#2\:Xunits \:ddd#3\:Yunits
+ \edef\:Grd{ \:dd\the\:dd \:ddd\the\:ddd }
+ \MarkLoc($$) \def\:temp{#1}
+\ifx \:temp\empty \:X\z@ \:Y\z@
+\else \MoveTo(#1) \fi
+\edef\:BrOrg{ \:x\the\:X \:y\the\:Y }
+\MoveToLoc($$)
+ \def\:brush(##1,##2){ \::brush } \fi }
+
+\SetBrush(,){}\def\::brush{{ \SetBrush(,){}
+\let\:Xunits\:XunitsReg \let\:Yunits\:YunitsReg
+\advance\:Y -0.5\:dddd \:yy\:Y
+\advance\:yy \:dddd
+\:BrOrg \:Grd \advance\:xx \:X
+\ifdim \:xx<\:X \:d\:X \:X\:xx \:xx\:d \fi
+ \:GridPt\:X\:x\:dd
+ \:GridPt\:Y\:y\:ddd \:x\:X
+ \:DoBrush }}\Define\:DoBrush{
+ \ifdim \:Y>\:yy \let\:DoBrush\relax
+ \else \ifdim \:X>\:xx \advance\:Y \:ddd \:X\:x
+ \else { \:BruShape } \advance\:X \:dd
+ \fi \fi \:DoBrush }\def\:GridPt#1#2#3{ \:xxxx#1
+ \advance#1 -#2 \:divide#1#3
+ #1\:InCons#1#3 \advance#1 #2
+ \ifdim #1=\:xxxx
+ \else \ifdim \:xxxx>#2 \advance#1 #3 \fi \fi }
+\newcount\:IntId \edef\:IntCount{0\space}
+\newcount\:DecId \edef\:DecCount{0\space}
+
+\Define\:NewCount{\alloc@ 0\count \countdef \insc@unt }
+\Define\:NewDimen{\alloc@ 1\dimen \dimendef \insc@unt }
+
+\def\:NewVar#1#2#3#4#5{ \:multid#1
+ \def\:temp{ \csname \string#4\the#4\endcsname\z@
+ \edef#1{\noexpand#3 \csname \string#4\the#4\endcsname}}
+ \def\:next{ \xdef#5{\the#4\space} #2#1 \def\:next{\global\let}
+ \expandafter\:next \csname \string#4\the#4\endcsname#1 \:temp }
+ \advance#4 \@ne
+ \ifnum #4 > #5 \expandafter\:next \else \expandafter\:temp \fi }
+
+\def\IntVar#1{\:NewVar#1\:NewCount\:IntOp\:IntId\:IntCount}
+\def\DecVar#1{\:NewVar#1\:NewDimen\:DecOp\:DecId\:DecCount}
+
+
+\DecVar\Q \DecVar\R \DecVar\T
+\IntVar\I \IntVar\J \IntVar\K
+\def\WriteVal#1{\immediate\write\sixt@@n{...\string#1=#1;}}
+
+\newdimen\:X \newdimen\:Y
+\newdimen\:x \newdimen\:y \newdimen\:d
+\newdimen\:xx \newdimen\:yy \newdimen\:dd
+\newdimen\:xxx \newdimen\:yyy \newdimen\:ddd
+\newdimen\:xxxx\newdimen\:yyyy\newdimen\:dddd
+\newcount\:J \newcount\:K
+\newdimen\:DI \newdimen\:DJ
+\newdimen\:DK \newdimen\:DL \newtoks\:t
+\def\:IntFromPt#1#2{
+ \:d#2\relax
+ \advance\:d \ifdim\:d<-0.5\p@-\fi 0.5\p@
+ #1\:d \divide#1 65536\relax}
+\def\:temp{\catcode`\p12 \catcode`\t12}
+\def\:Cons{\catcode`\p11 \catcode`\t11}
+\:temp \def\:Frac#1pt{#1}
+ \def\:rnd#1.#2pt{#1} \:Cons
+
+\def\:Cons#1{\expandafter\:Frac\the#1}
+\def\:sqr#1{#1\expandafter\:Frac\the#1#1}
+\def\:InCons#1{\expandafter\:rnd\the#1}\def\:Val#1{#1;}
+\let\Val\:Val\def\:IntOp#1#2{\csname :Op#2\endcsname#1}
+\let\:SvIntOp\:IntOp
+\def\:PreIntOp{\let\:IntOp\empty
+ \let\Val\empty}
+\def\:PostIntOp{\let\:IntOp\:SvIntOp
+ \let\Val\:Val}
+
+\expandafter\def\csname :Op;\endcsname#1{ \the#1}
+\expandafter\def\csname :Op=\endcsname#1#2;{
+ \:PreIntOp#1#2\:PostIntOp}
+\expandafter\def\csname :Op+\endcsname#1#2;{
+ \:PreIntOp\advance #1 #2\:PostIntOp}
+\expandafter\def\csname :Op-\endcsname#1#2;{
+ \:PreIntOp\advance #1 -#2\:PostIntOp}
+\expandafter\def\csname :Op/\endcsname#1#2;{
+ \:PreIntOp\divide#1 #2\:PostIntOp}
+\expandafter\def\csname :Op*\endcsname#1#2;{
+ \:PreIntOp\multiply#1 #2\:PostIntOp}
+\def\:DecOp#1#2{ \csname :xOp#2\endcsname#1}
+\let\:SvDecOp\:DecOp
+\def\:PreDecOp{\let\:IntOp\the \def\:DecOp{\:Cons}
+ \let\Val\empty \let\:du\empty}
+\def\:PostDecOp{\let\:IntOp\:SvIntOp \let\Val\:Val
+ \let\:DecOp\:SvDecOp \let\:du\::du }
+
+\def\::du#1{\p@
+ \ifx#1\p@ \let\:temp\relax
+ \else \def\:temp{\du{#1}}
+ \fi\:temp} \:PostDecOp
+
+\expandafter\def\csname :xOp;\endcsname#1{ \:Cons#1}
+\expandafter\def\csname :Op[\endcsname#1#2];{
+ \:PreDecOp \:dd#2\p@ \:IntFromPt#1\:dd
+ \:PostDecOp }
+\expandafter\def\csname :xOp=\endcsname#1#2;{
+ \:PreDecOp#1#2\p@\:PostDecOp }
+\expandafter\def\csname :xOp(\endcsname#1#2){
+ \:PreDecOp#1#2\p@\:PostDecOp }
+\expandafter\def\csname :xOp+\endcsname#1#2;{
+ \:PreDecOp\advance #1 #2\p@\:PostDecOp }
+\expandafter\def\csname :xOp-\endcsname#1#2;{
+ \:PreDecOp\advance #1 -#2\p@\:PostDecOp }
+\expandafter\def\csname :xOp*\endcsname#1#2;{
+ \:PreDecOp#1 #2#1\:PostDecOp }
+\expandafter\def\csname :xOp/\endcsname#1#2;{
+ \:PreDecOp \:divide#1{#2\p@} \:PostDecOp }
+\let\IF\ifnum \let\THEN\relax
+\let\ELSE\else \let\FI\fi
+
+\def\EqText(#1,#2){
+ \z@=\z@ \fi \def\:temp{#1}
+ \def\:next{#2} \ifx \:temp\:next }
+
+\def\:IfInt#1(#2,#3){ \z@=\z@ \fi
+ \:IntOp\:K=#2; \:IntOp\:J=#3; \ifnum \:K#1\:J }
+
+\def\:IfDim#1(#2,#3){ \z@=\z@ \fi
+ \:DecOp\:d=#2; \:DecOp\:dd=#3; \ifdim \:d#1\:dd }
+
+\def\EqInt{ \:IfInt= } \def\LtInt{ \:IfInt< }
+\def\GtInt{ \:IfInt> }
+
+\def\EqDec{ \:IfDim= } \def\LtDec{ \:IfDim< }
+\def\GtDec{ \:IfDim> } \def\Do(#1,#2)#3{
+ \expandafter\let
+ \csname :Back\the\:level\endcsname\:Do
+\expandafter\edef\csname :DoVars\the\:level\endcsname{
+ \DoReg\the\DoReg \:DoB\the\:DoB}
+\advance\:level \@ne
+ \DoReg#1 \:DoB#2 \relax
+ \ifnum \DoReg<\:DoB
+ \def\:Do{\ifnum \DoReg>\:DoB
+ \let\:Do\relax
+ \else #3\advance\DoReg \@ne \fi
+ \:Do}
+ \else
+ \def\:Do{\ifnum \DoReg<\:DoB
+ \let\:Do\relax
+ \else #3\advance\DoReg \m@ne \fi
+ \:Do}
+ \fi \def\:nextdo{ \:Do \advance\:level \m@ne
+\csname :DoVars\the\:level\endcsname
+\def\:temp{\let\:Do}
+\expandafter\:temp\csname
+ :Back\the\:level\endcsname } \:nextdo}
+
+\let\:Do\relax
+
+\newcount\DoReg \let\:DoReg\DoReg \newcount\:DoB
+ \newcount\:level\def\::divide#1{ \:DI\:DK \:dddd\:DL
+ \advance\:DI -\:Cons\:dddd#1
+ \:IntFromPt\:J\:dddd \advance\:dddd -\:J\p@
+ \multiply\:J \@M \:IntFromPt\:K{\@M\:dddd}
+ \advance\:J \:K \:dddd\@M\p@
+ \divide\:dddd \:J \advance#1 \:Cons\:DI\:dddd }
+
+\def\:divide#1#2{ \:DK#1 \:DL#2 #1\z@
+ \::divide#1 \::divide#1 \::divide#1
+ \::divide#1 \::divide#1 }
+\def\:Sqrt#1{ \ifdim #1<\:mmp #1\z@ \else
+ \:dd#1 \divide\:dd \tw@
+ \def\::Sqrt{ \:ddd#1
+ \:divide\:ddd\:dd \:AbsDif\:d\:dd\:ddd
+ \advance\:dd \:ddd \divide\:dd \tw@
+ \ifdim \:d < \:mmmp
+ \let\::Sqrt\relax \fi
+ \::Sqrt}
+ \::Sqrt #1\:dd \fi }\Define\:length{
+ \:dd \:AbsVal \:ddd
+ \:abs\:x \:abs\:y
+ \ifdim \:dd<\:x \:dd\:x \fi
+ \ifdim \:dd<\:y \:dd\:y \fi
+ \ifdim \:dd>\:mp
+ \:divide\:x\:dd \:sqr\:x
+ \:divide\:y\:dd \:sqr\:y
+ \:divide\:ddd\:dd \:sqr\:ddd
+ \advance\:x \:y \advance\:x \:ddd
+ \:y\:dd \:Sqrt\:x \:d\:Cons\:x\:y
+ \else \:d\:dd \fi}\Define\:distance(2){\MarkLoc(@^)
+ \MoveToLoc(#1) \:x \:X \:y \:Y \:ddd\:Z
+ \MoveToLoc(#2)
+ \advance\:x -\:X \advance\:y -\:Y
+ \advance\:ddd -\if:IIID \:Z \else \:ddd \fi
+ \:length \MoveToLoc(@^)}\def\:NormalizeDeg#1{
+ \:DL#1 \:K\:InCons\:DL
+ \divide\:K \:cccvx \multiply\:K \:cccvx
+ \advance #1 -\:K\p@
+ \ifdim #1<\z@ \advance #1 \:CCCVX \fi
+ \ifdim #1=\z@
+ \ifdim\:DL=\z@ \else
+ \advance #1 \:CCCVX \fi \fi }\def\:CosSin#1{ \:DK#1
+ \:NormalizeDeg\:DK \def\:tempA{}
+\ifdim \:CVXXX<\:DK
+ \def\:tempA{\:y-\:y}
+ \advance\:DK -\:CCCVX \:DK-\:DK \fi
+\ifdim \:XC<\:DK
+ \edef\:tempA{\:x-\:x \:tempA}
+ \advance\:DK -\:CVXXX \:DK-\:DK \fi
+\ifdim 45\p@<\:DK
+ \edef\:tempA{\:d\:x \:x\:y \:y\:d \:tempA}
+ \advance\:DK -\:XC \:DK-\:DK \fi
+ \:x\p@ \:y0.01745\:DK \:d\:y \:K\@ne
+ \edef\:next{\advance\:K \@ne
+ \:sqr\:d \divide\:d \:K \advance}
+ \:next \:x -\:d \:next \:y -\:d
+ \:next \:x \:d \:next \:y \:d
+ \:next \:x -\:d \:next \:y -\:d
+ \:next \:x \:d \:next \:y \:d
+ \:tempA } \Define\:rInitOval(2){
+ \XSaveUnits \let\du=\:rdu
+ \:Zunits\p@ \:dd#1\:Zunits
+ \:d\:Cons\:dd\:Xunitsx \edef\:Xx{\:Cons\:d}
+ \:d\:Cons\:dd\:Xunitsy \edef\:Xy{\:Cons\:d}
+ \:dd#2\:Zunits
+ \:d\:Cons\:dd\:Yunitsx \edef\:Yx{\:Cons\:d}
+ \:d\:Cons\:dd\:Yunitsy \edef\:Yy{\:Cons\:d}
+ \XRecallUnits \let\du=\:svdu
+}
+\Define\:xyInitOval(2){
+ \:d#1\:Xunits \edef\:Xx{\:Cons\:d} \def\:Xy{0}
+ \:d#2\:Yunits \edef\:Yy{\:Cons\:d} \def\:Yx{0} }
+ \def\:FigSize#1#2#3{
+ \:x\:LBorder \:y\:RBorder \:d\:TeXLoc
+ {\Object\:temp{#3}
+ \setbox\:box\hbox{ \:temp
+ \multiply\:x by \tw@ \multiply\:y by \tw@
+ \xdef\:FSize{ \noexpand#1=\:Cons\:x;
+ \noexpand#2=\:Cons\:y;}}}
+ \global\:LBorder\:x \global\:RBorder\:y
+ \global\:TeXLoc \:d
+ \:FSize}
+\expandafter\let \csname 0:Ln \endcsname\:Ln
+\expandafter\def\csname 1:Ln \endcsname{
+ \advance\:x -\:X \advance\:y -\:Y
+ \csname 0:Ln \endcsname(\:x,\:y) }
+
+\newcount\:ClipLevel \:ClipLevel\@ne
+
+\Define\Clip{\futurelet\:next\:Clip}
+
+\Define\:Clip{
+ \ifx \:next[ \expandafter\:DefClipOut
+ \else \expandafter\:DefClip \fi }
+
+\def\:DefClipOut[#1]{ \:DefClip(#1) }
+\Define\:DefClip(1){ \def\:temp{#1}
+ \ifx \:temp\empty
+ \:ClipLevel\@ne \def\:next{\let\:Ln}
+ \expandafter\:next\csname 0:Ln \endcsname
+ \else \def\:temp{\::DefClip(#1)} \fi \:temp }
+\Define\::DefClip(1){ \MarkLoc(^)
+ \:x\:X \:y \:Y \Move(#1)
+ \ifdim\:x>\:X \:dd\:X \:X\:x \:x\:dd \fi
+ \ifdim\:y>\:Y \:dd\:Y \:Y\:y \:y\:dd \fi
+ \advance\:ClipLevel \@ne
+ \expandafter\edef\csname \the
+ \:ClipLevel :Ln \endcsname{
+ \:xxx \the\:x \:yyy \the\:y
+ \:xxxx\the\:X \:yyyy\the\:Y
+ \ifx \:next[ \noexpand\:ClipOut
+ \else \noexpand\:ClipIn \fi }
+ \let\:Ln\:ClipLn \MoveToLoc(^) }\def\:ClipLn(#1,#2){
+ \:x#1\:Xunits \:y#2\:Yunits
+ { \let\:Xunits\empty \let\:Yunits\empty
+ \advance\:x \:X \advance\:y \:Y
+ \ifdim \:x<\:X \:dd\:X \:X\:x \:x\:dd
+ \:dd\:Y \:Y\:y \:y\:dd \fi
+ \:diff\:dd\:X\:x \:diff\:ddd\:Y\:y
+\:Z \:AbsVal \:dd
+\advance\:Z \:AbsVal\:ddd
+\ifdim \:Z>\sixt@@n\p@
+ \divide\:dd 128
+ \divide\:ddd 128 \fi
+\:Z\:Cons\:y\:dd
+\advance\:Z -\:Cons\:x\:ddd
+\ifdim \:dd<\z@
+ \:dd-\:dd \:ddd-\:ddd \:Z-\:Z
+\fi
+ \csname \the \:ClipLevel :Ln \endcsname }
+ \advance\:X \:x \advance\:Y \:y }\Define\:ClipIn{
+ \def\:next{\let\:next}
+ \expandafter\:next\csname \the
+ \:ClipLevel :Ln \endcsname
+ \advance\:ClipLevel \m@ne
+ { \:ClipLeft\:xxxx \:ClipDown\:yyy \:ClipUp\:yyyy \:next }
+ { \:ClipRight\:xxx \:ClipDown\:yyy \:ClipUp\:yyyy \:next }
+ { \:ClipDown\:yyyy \:next }
+ \:ClipUp\:yyy \:next }
+
+\Define\:ClipOut{
+ \:ClipLeft\:xxx \:ClipRight\:xxxx
+ \:ClipUp \:yyyy \:ClipDown \:yyy
+ \def\:next{\let\:next}
+ \expandafter\:next
+ \csname \the\:ClipLevel :Ln \endcsname
+ \advance\:ClipLevel \m@ne \:next }\def\:ClipLeft#1{
+ \ifdim \:x<#1 \:KilledLine
+ \else \ifdim \:X<#1 \:X#1
+ \ifdim \:dd>\:mmmp
+ \:Y\:Cons\:ddd\:X \advance\:Y \:Z
+ \:divide\:Y\:dd
+ \fi \fi \fi \:CondKilLn }
+
+\def\:ClipRight#1{
+ \ifdim \:X>#1 \:KilledLine
+ \else \ifdim \:x>#1 \:x#1
+ \ifdim \:dd>\:mmmp
+ \:y\:Cons\:ddd\:x \advance\:y \:Z
+ \:divide\:y\:dd
+ \fi \fi \fi \:CondKilLn }
+
+\Define\:CondKilLn{
+ \:d\:x \advance\:d -\:X
+ \ifdim \:d<\z@ \:d-\:d \fi
+ \ifdim \:y<\:Y \advance\:d \:Y \advance\:d -\:y
+ \else \advance\:d \:y \advance\:d -\:Y \fi
+ \ifdim \:d<\:mmp \:KilledLine \fi
+ \ifdim \:thickness=\z@ \:KilledLine \fi}
+
+\Define\:KilledLine{
+ \let\:ClipLeft\:gobble \let\:ClipRight\:gobble
+ \let\:ClipUp \:gobble \let\:ClipDown \:gobble
+ \let\:next\relax
+ \expandafter\def\csname 1:Ln \endcsname{}}\def\:ClipUp#1{
+ \:AbsDif\:d\:y\:Y
+ \ifdim \:d<\:ragged
+ \advance\:y 0.5\:thickness
+\advance\:Y -0.5\:thickness
+\ifdim \:Y>#1 \:KilledLine
+\else \ifdim \:y>#1
+ \:thickness#1 \advance\:thickness -\:Y
+ \advance\:Y 0.5\:thickness \:y\:Y
+\else
+ \advance\:Y 0.5\:thickness
+ \advance\:y -0.5\:thickness
+\fi \fi
+\:dd\p@ \:ddd\z@
+\def\:temp{ \:Z\:Y } \:temp
+ \else \let\:temp\relax
+ \ifdim \ifdim\:Y<\:y\:Y\else\:y\fi >#1 \:KilledLine
+ \else \ifdim \::ClipUp#1\:X\:Y
+ \else \ifdim \::ClipUp#1\:x\:y
+ \fi \fi \fi \fi \:CondKilLn }
+
+\def\::ClipUp#1#2#3{
+#3>#1 #3#1
+\ifdim \:AbsVal\:ddd>\:mmmp
+ #2\:Cons\:dd#3 \advance#2 -\:Z
+ \:divide#2\:ddd
+\fi }\def\:ClipDown#1{ \:Ex2#1
+ \:Flip\:y \:Flip\:Y \:ClipUp#1
+ \:Flip\:y \:Flip\:Y \:temp }
+
+\def\:Flip#1{ #1-#1 \advance#1 \:Ex }
+\Define\:SetDrawWidth{
+ \hsize\:RBorder \advance\hsize -\:LBorder
+ \leftskip -\:LBorder \rightskip\z@}
+\newdimen\:thickness \:thickness0.75\p@
+
+\Define\PenSize(1){\:thickness#1\relax}
+\Define\:Draw{ \ifvmode \noindent\hfil\fi
+ \global\:TeXLoc\z@
+ \vbox\bgroup
+ \begingroup
+ \def\EndDraw{
+ \endgroup \:SetDrawWidth
+ \egroup}
+ \:DraCatCodes \parindent\z@ \everypar{}
+\leftskip\z@ \rightskip\z@ \boxmaxdepth\maxdimen
+\linepenalty10 \let\FigSize\:FigSize
+\def\Draw{\:wrn1{}} \:CommonIID \:InDraw }
+\Define\:CommonIID{\def\RotateTo{\:RotateTo}
+\def\Rotate{\:Rotate}
+\def\MoveF{\:MvF}\def\LineToLoc{\:LnToLoc}}\newdimen\:Xunits \:Xunits\p@
+\newdimen\:Yunits \:Yunits\p@
+\Define\:InDraw{\:Opt()\::InDraw{\:Xunits,\:Yunits}}
+\Define\::InDraw(2){ \:X\z@ \:Y\z@
+ \:Xunits#1 \relax \:Yunits#2 \:AdjRunits
+ \global\:LBorder\z@ \global\:RBorder\z@ \gdef\:UBorder{0pt}
+ \:loadIID \leavevmode }
+
+\Define\:Resize(2){
+ \:Xunits#1\:Xunits \relax
+ \:Yunits#2\:Yunits \:AdjRunits }
+\Define\:Units(2){
+ \:Xunits#1 \relax \:Yunits#2 \:AdjRunits }
+\Define\:loadIID{
+ \def\LineAt{\:DLn}
+ \def\LineTo{\:LnTo}
+ \def\MoveTo{\:MvTo}
+ \def\Line{\:Ln}
+ \def\Move{\:Mv}
+ \def\MoveF{\:MvF}
+ \:rotatedfalse\def\:InitOval{\:xyInitOval}
+ \def\Scale{\:Resize}
+ \def\Units{\:Units}}\let\SaveAll\begingroup
+\let\RecallAll\endgroup
+\def\DrawOn{\def\Draw{\:Draw}} \DrawOn
+\def\DrawOff{\def\Draw{\begingroup \:J\@cclv
+ \:NoDrawSpecials \:NoDraw}}
+\catcode`\/0 \catcode`\\11
+/def/:NoDraw#1\EndDraw{/endgroup}
+/catcode`/\0 /catcode`//12
+
+\def\:NoDrawSpecials{\catcode\:J11
+ \ifnum \:J=\z@
+ \let \:NoDrawSpecials\relax \fi
+ \advance\:J \m@ne \:NoDrawSpecials}
+\let\:XunitsReg\:Xunits \let\:YunitsReg\:Yunits \Define\EntryExit(4){
+ \edef\:InOut##1{
+ \noexpand\ifcase ##1\space
+ #1\noexpand\or #2\noexpand\or
+ #3\noexpand\or #4\noexpand\fi}}
+
+\EntryExit(0,0,0,0)\Define\:DrawBox{ \:x0.5\wd\:box
+ \:y\ht\:box \advance\:y \dp\:box
+ \divide\:y \tw@
+ \advance \:X -\:InOut0\:x
+ \advance \:Y -\:InOut1\:y
+ { \advance \:X -\:x
+ { \advance \:Y \:y
+\ifdim\:Y>\:UBorder \xdef\:UBorder{\the\:Y}\fi
+\ifdim\:X<\:LBorder \global\:LBorder\:X\fi
+\advance\:X \wd\:box
+\ifdim\:X>\:RBorder \global\:RBorder\:X\fi }
+ \advance \:Y -\:y \advance \:Y \dp\:box
+ {\:d\:X \advance\:d \wd\:box
+ \advance\:X -\:TeXLoc \global\:TeXLoc\:d
+ \vrule width\:X depth\z@ height\z@
+ \raise \:Y \box\:box} }
+ \edef\MoveToExit(##1,##2){
+ \:X\the\:X \:Y\the\:Y
+ \:x\the\:x \:y\the\:y
+ \advance\:X ##1\:x
+ \advance\:Y ##2\:y}
+ \advance \:X \:InOut2\:x
+ \advance \:Y \:InOut3\:y }
+ \Define\ThreeDim{\:Opt[]\:ThreeDim{\p@}}
+
+\def\:ThreeDim[#1](#2){\::ThreeDim[#1](#2,,)}
+
+\def\::ThreeDim[#1](#2,#3,#4,#5){ \bgroup\begingroup
+ \def\EndThreeDim{ \endgroup\egroup}
+ \:IIIDtrue \:Zunits#1 \:Z\z@
+ \def\:temp{#4}
+ \ifx \:temp\empty \:CosSin{#3\p@} \:divide\:x\:y \:Ey\:x
+\:CosSin{#2\p@} \:Ex\:Cons\:Ey\:x \:Ey\:Cons\:Ey\:y
+\let\:project\:projectPar
+
+ \else \:Ex#2\:Xunits \:Ey#3\:Yunits \:Ez#4\:Zunits
+\let\:project\:projectPer
+ \fi
+ \def\LineAt{\:tDLn}
+\def\LineTo{\:tLnTo}
+\def\MoveTo{\:tMvTo}
+\def\Line{\:tLn}
+\def\Move{\:tMv}
+\def\Scale{\:tResize}
+\def\Units{\:tUnits}\def\RotateTo{\:tRotateTo}
+\def\Rotate{\:tRotate}
+\def\MoveF{\:tMvF}
+\:Vdirection\z@ \def\LineToLoc{\:tLnToLoc} } \Define\:projectPer{
+ \:diff\:x\:X\:Ex \:diff\:y\:Y\:Ey
+ \:diff\:xxxx\:Z\:Ez
+ \:divide\:x\:xxxx \:divide\:y\:xxxx
+ \:x-\:Cons\:Ez\:x \:y-\:Cons\:Ez\:y
+ \advance\:x \:Ex \advance\:y \:Ey}
+\Define\:projectPar{
+ \:x\:Cons\:Ex\:Z \advance\:x \:X
+ \:y\:Cons\:Ey\:Z \advance\:y \:Y}
+\def\:tDLn(#1,#2,#3,{\:tMvTo(#1,#2,#3)
+ \:tLnTo(}
+\Define\:tMvTo(3){ \:X#1\:Xunits
+ \:Y#2\:Yunits \:Z#3\:Zunits}
+\Define\:tMv(3){ \advance\:X #1\:Xunits
+ \advance\:Y #2\:Yunits
+ \advance\:Z #3\:Zunits}
+\Define\:tResize(3){ \:Xunits#1\:Xunits
+ \:Yunits#2\:Yunits \:Zunits#3\:Zunits
+ \:AdjRunits}
+\Define\:tUnits(3){ \:Xunits#1 \relax
+ \:Yunits#2 \relax \:Zunits#3
+ \:AdjRunits}\Define\:tLnTo(3){
+ \:project \edef\:temp{\:x\the\:x \:y\the\:y}
+ \:X#1\:Xunits \:Y#2\:Yunits \:Z#3\:Zunits
+ \:DLN}
+
+\Define\:tLn(3){
+ \:project \edef\:temp{\:x\the\:x \:y\the\:y}
+ \advance\:X #1\:Xunits
+ \advance\:Y #2\:Yunits
+ \advance\:Z #3\:Zunits \:DLN}
+
+\Define\:DLN{
+ \TwoDim \:temp \LineTo(\:x\du,\:y\du)
+ \EndTwoDim }\Define\TwoDim{\bgroup\begingroup
+ \def\EndTwoDim{\endgroup\egroup}
+ \:loadIID
+ \if:IIID \:IIIDfalse \:project \:X\:x \:Y\:y
+ \:CommonIID \fi
+ \Units(\:Xunits,\:Yunits)}
+\newif\if:rotated
+\Define\RotatedAxes(2){\begingroup
+ \def\EndRotatedAxes{\endgroup}
+ \if:IIID \:IIIDfalse
+ \:project \:X\:x \:Y\:y
+ \:CommonIID \fi
+ \:DK#2\p@ \advance\:DK -#1\p@
+\advance\:DK -\:CVXXX \:NormalizeDeg\:DK
+\ifdim \:DK<\:mmp \:wrn4{(#1,#2)}
+\else
+ \:DK#1\p@ \:NormalizeDeg\:DK \:CosSin\:DK
+ \:Xunitsx\:x \:Xunitsy\:y
+ \:DK#2\p@ \advance\:DK -\:XC \:NormalizeDeg\:DK \:CosSin\:DK
+ \edef\Units(##1,##2){\noexpand\:Units(##1,##2)
+ \:Xunitsx \:Cons\:Xunitsx\:Xunits
+ \:Xunitsy \:Cons\:Xunitsy\:Xunits
+ \:Yunitsx-\:Cons\:y\:Yunits
+ \:Yunitsy \:Cons\:x\:Yunits } \fi
+\def\Scale{\:rResize} \def\MoveTo{\:rMvTo}
+\def\Move{\:rMv}
+\def\LineTo{\:rLnTo}
+\def\Line{\:rLn}
+\def\LineAt{\:rDLn}
+\def\MoveF{\:rMvF}\def\:InitOval{\:rInitOval}
+
+ \MarkLoc(:org) \Units(\:Xunits,\:Yunits) \:rotatedtrue }
+\newdimen\:Xunitsx \newdimen\:Xunitsy
+\newdimen\:Yunitsx \newdimen\:Yunitsy
+\Define\:rResize(2){
+ \:Xunits #1\:Xunits \:Yunits #2\:Yunits
+ \:Xunitsx#1\:Xunitsx \:Xunitsy#1\:Xunitsy
+ \:Yunitsx#2\:Yunitsx \:Yunitsy#2\:Yunitsy }
+\def\:rdu#1{%
+ \ifx #1\:Xunits \units:i\else
+ \ifx #1\:Yunits \units:i\else
+ \ifx #1\:Zunits \units:i\else #1\fi \fi \fi }
+\def\units:i{\Units(\p@,\p@)}
+\Define\:rMvTo{\MoveToLoc(:org) \:rMv}
+\Define\:rMv(1){ \:rxy(#1)
+ \advance\:X \:x \advance\:Y \:y}
+\Define\:rLnTo(1){ \MarkLoc(:a) \:rMvTo(#1) {\LineToLoc(:a)} }
+\Define\:rLn(1){ \:rxy(#1) \:Ln(\:x\du,\:y\du) }
+\def\:rDLn(#1,#2,{\:rMvTo(#1,#2)\:rLnTo(}
+\Define\:rxy(2){ \XSaveUnits \let\du=\:rdu
+ \:Zunits\p@ \:Zunits#1\:Zunits
+ \:x\:Cons\:Zunits\:Xunitsx
+ \:y\:Cons\:Zunits\:Xunitsy \XRecallUnits \XSaveUnits
+ \:Zunits\p@ \:Zunits#2\:Zunits
+ \advance\:x \:Cons\:Zunits\:Yunitsx
+ \advance\:y \:Cons\:Zunits\:Yunitsy \XRecallUnits \let\du=\:svdu}
+\Define\:rMvF(1){ \:CosSin\:direction \XSaveUnits \let\du=\:rdu
+ \:Zunits\p@ \:Zunits#1\:Zunits
+ \:x\:Cons\:Zunits\:x \:y\:Cons\:Zunits\:y
+ \edef\:temp{(\:Cons\:x,\:Cons\:y)} \expandafter\Move\:temp
+ \XRecallUnits \let\du=\:svdu}
+\Define\:AdjRunits{
+ \:Xunitsx\:Xunits \:Xunitsy\z@
+ \:Yunitsx\z@ \:Yunitsy\:Yunits}
+\Define\Text{ \setbox\:box
+ \vtop\bgroup \edef\DoReg{\the\DoReg}
+ \hyphenpenalty\@M \exhyphenpenalty\@M
+ \catcode`\ 10 \catcode`\^^M13 \catcode`\^^I10
+ \catcode`\&4 \let~\space \csname ;catcode\endcsname %
+%
+ \:Text} \catcode`\^^M13 %
+\def\:Text(--#1--){%
+ \:SetLines#1\hbox{}^^M--)^^M %
+ \egroup %
+ \if:IIID \TwoDim \:DrawBox \EndTwoDim %
+ \else \:DrawBox \fi} %
+\def\:SetLines#1^^M{ %
+ \def\:TextLine{#1} %
+ \ifx \:TextLine\:LastLine \let\:temp\relax %
+ \else \def\:temp{ %
+ \:IndirectLines#1\relax~~--)~~\:SetLines}%
+ \fi \:temp } \catcode`\^^M9
+\def\:IndirectLines#1~~{ \def\:TextLine{#1}
+ \ifx \:TextLine\:LastLine \let\:temp\relax
+ \else \def\:temp{\:AddLine{#1}\:IndirectLines}
+ \fi \:temp }
+
+\Define\:LastLine{--)}
+
+\def\:AddLine#1{
+ \ifvmode \noindent \hsize\z@ \else
+ \hfil \penalty-500 \hbox{} \fi
+ \hfil#1
+ \setbox\:box\hbox{#1}
+ \ifdim \wd\:box>\hsize \hsize\wd\:box \fi}\def\TextPar#1#2{
+ \def\:TxtPar##1(##2){##1(--##2--)}
+ \edef\:temp{\expandafter\noexpand\csname :\string#2\endcsname}
+ \edef#2{\noexpand\:TextPar\expandafter\noexpand\:temp}
+ \expandafter\let\:temp\:undefined
+ \expandafter#1\:temp}
+ \catcode`\^^M13
+\def\:TextPar#1{\begingroup \catcode`\&4 %
+ \csname ;catcode\endcsname %
+%
+ \catcode`\ 10 \catcode`\^^M13 \catcode`\^^I10 %
+ \:TPar{#1}} \catcode`\^^M9 %
+
+\def\:TPar#1(--#2--){\endgroup
+ #1(--#2--) }
+ \newdimen\:direction \newdimen\:Vdirection
+\Define\:Rotate(1){ \advance \:direction #1\p@
+ \:NormalizeDeg\:direction }
+\Define\:RotateTo(1){ \:direction #1\p@
+ \:NormalizeDeg\:direction }
+
+\Define\:tRotate(2){
+ \advance\:Vdirection #2\p@
+ \:NormalizeDeg\:Vdirection \:Rotate(#1)}
+\Define\:tRotateTo(2){
+ \:Vdirection #2\p@
+ \:NormalizeDeg\:Vdirection \:RotateTo(#1)}
+\Define\LineF(1){\MarkLoc(,)\MoveF(#1) {\LineToLoc(,)}}
+\Define\:MvF(1){ \:CosSin\:direction
+ \:d#1\:Xunits \advance\:X \:Cons\:d\:x
+ \:d#1\:Yunits \advance\:Y \:Cons\:d\:y }
+\Define\MoveFToOval(2){
+ \:NormalizeDeg\:direction \:CosSin\:direction \:Zunits\p@
+ \:d#2\:Zunits \:x\:Cons\:d\:x
+ \ifdim \:d=\z@ \:err5{...,\:Cons\:d} \fi
+ \:d#1\:Zunits \:y\:Cons\:d\:y
+ \ifdim \:d=\z@ \:err5{\:Cons\:d,...} \fi \:SearchDir
+ \XSaveUnits
+ \if:rotated
+ \:Zunits\p@ \:Zunits#1\:Zunits
+ \:x\:Cons\:Zunits\:Xunits
+ \:Zunits\p@ \:Zunits#2\:Zunits
+ \:y\:Cons\:Zunits\:Yunits
+ \else
+ \:x#1\:Xunits \:y#2\:Yunits \fi \relax
+ \Units(\:x,\:y)
+ \:Vdirection\:direction \:direction\:ddd
+ \MoveF(\@ne) \:direction\:Vdirection \XRecallUnits }
+\Define\:tMvF(1){ \:CosSin\:Vdirection
+ \:d #1\:Zunits \advance\:Z \:Cons\:y\:d
+ \:xx#1\:Xunits \:yy#1\:Yunits
+ \:xx\:Cons\:x\:xx \:yy\:Cons\:x\:yy
+ \:CosSin\:direction
+ \:x\:Cons\:xx\:x \:y\:Cons\:yy\:y
+ \advance\:X \:x \advance\:Y \:y } \Define\CSeg{\:Opt[]\:CSeg1}
+\def\:CSeg[#1]#2(#3,#4){ \MarkLoc($^)
+ \MoveToLoc(#4) \:x\:X \:y\:Y
+ \if:IIID \:d\:Z \fi \MoveToLoc(#3)
+ \advance\:x -\:X \:x#1\:x
+ \advance\:y -\:Y \:y#1\:y
+ \if:IIID \advance\:d -\:Z \:d#1\:d \fi
+ \:t{#2}
+ \edef\:temp{\the\:t(
+ \expandafter\:Frac\the\:x\noexpand\:du,
+ \expandafter\:Frac\the\:y\noexpand\:du \if:IIID ,
+ \expandafter\:Frac\the\:d\noexpand\:du \fi)}
+ \MoveToLoc($^) \:temp}\Define\LSeg{\:Opt[]\:LSeg1}
+\def\:LSeg[#1]#2(#3,#4){ \:distance(#3,#4)
+ \:d#1\:d \:t{#2}
+ \edef\:temp{\the\:t(\expandafter\:Frac\the\:d\noexpand\:du)}
+ \:temp}\Define\DSeg{\:Opt[]\:DSeg1}
+
+\def\:DSeg[#1]#2(#3,#4){ \MarkLoc(^)
+ \MoveToLoc(#4) \:xxx\:X \:yyy\:Y \:xxxx\:Z
+ \MoveToLoc(#3)
+ \advance\:xxx -\:X \advance\:yyy -\:Y
+ \ifdim \:AbsVal\:xxx<\:mmmp
+ \ifdim \:AbsVal\:yyy<\:mmmp \:wrn5{#3,#4}
+ \fi\fi
+ \if:IIID
+ \advance \:xxxx -\:Z
+ \:divide\:xxx\:Xunitsx
+ \:divide\:yyy\:Yunitsy
+ \:divide\:xxxx\:Zunits
+ \:x\:xxx \:y\:yyy \:ddd\z@ \:length
+ \:x\:d \:y\:xxxx \:SearchDir
+ \:yyyy\:ddd
+ \:x\:xxx \:y\:yyy
+ \else
+ \:x \:AbsVal\:Yunitsy
+\:y \:AbsVal\:Xunitsy \ifdim \:y>\:x \:x\:y \fi
+\:y \:AbsVal\:Yunitsx \ifdim \:y>\:x \:x\:y \fi
+\:y \:AbsVal\:Xunitsx \ifdim \:y>\:x \:x\:y \fi
+\:K \:InCons\:x \relax
+ \ifnum \:K<\thr@@ \:K\@ne
+\else \ifnum \:K<\sixt@@n \:K4
+\else \ifnum \:K<\:XC \:K\sixt@@n
+\else \ifnum \:K<\@m \:K\@cclvi
+\fi \fi \fi \fi
+\divide\:xxx \:K
+\divide\:yyy \:K
+ \:x \:Cons\:Yunitsy\:xxx
+\advance\:x -\:Cons\:Yunitsx\:yyy
+ \:y-\:Cons\:Xunitsy\:xxx
+\advance\:y \:Cons\:Xunitsx\:yyy
+ \fi
+ \:SearchDir \:ddd#1\:ddd \:t{#2}
+ \edef\:temp{\the\:t(
+ \:Cons\:ddd \if:IIID ,\:Cons\:yyyy \fi)}
+ \MoveToLoc(^) \:temp} \def\:theDoReg{\def\DoReg{\the\:DoReg}}
+
+\Define\MarkLoc{ \:theDoReg
+ \expandafter\edef \csname \:MarkLoc}
+
+\Define\MarkGLoc{ \:theDoReg
+ \expandafter\xdef \csname \:MarkLoc}
+
+\Define\:MarkLoc(1){ Loc\space#1:\endcsname{
+ \:X\the\:X \:Y\the\:Y
+ \if:IIID \:Z\the\:Z \fi } \let\DoReg\:DoReg }
+
+\Define\MoveToLoc(1){ \:theDoReg \expandafter\ifx
+ \csname Loc\space#1:\endcsname\relax \:err2{#1}\fi
+ \csname Loc\space#1:\endcsname \let\DoReg\:DoReg }
+
+\Define\MarkPLoc(1){ \:theDoReg
+ \if:IIID \:project
+ \expandafter\edef \csname Loc\space#1:\endcsname{
+ \:X\the\:x \:Y\the\:y \:Z\z@}
+ \else \:err1\MarkPLoc \fi \let\DoReg\:DoReg}
+
+\Define\WriteLoc(1){{ \:theDoReg \edef\:temp{#1}
+ \ifx \:temp\empty \else \MoveToLoc(#1) \fi
+ \immediate\write\sixt@@n{...
+ \:temp=(\the\:X,\the\:Y\if:IIID,\the\:Z\fi)}}}
+
+\Define\:LnToLoc(1){
+ \:x\:X \:y\:Y \MoveToLoc(#1)
+ { \:LnTo(\:x\du,\:y\du) }}
+
+\Define\:tLnToLoc(1){
+ \:xx\:X \:yy\:Y \:dd\:Z \MoveToLoc(#1)
+ { \:tLnTo(\:xx\du,\:yy\du,\:dd\du) }}\def\:GetLine#1#2#3#4#5{
+ \MoveToLoc(#1) \divide\:X \:eight \divide\:Y \:eight
+ #3\:X #4\:Y
+ \MoveToLoc(#2) \divide\:X \:eight \divide\:Y \:eight
+ \advance #3 -\:X \advance #4 -\:Y
+ #5\:Cons#3\:Y \advance #5 -\:Cons#4\:X
+ \divide #3 \:eight \divide #4 \:eight \relax }
+\def\MoveToLL(#1,#2)(#3,#4){
+ \:GetLine{#1}{#2}\:x \:y \:xxx
+ \:GetLine{#3}{#4}\:xx\:yy\:xxxx
+ \:ddd \:Cons\:x \:yy \advance\:ddd -\:Cons\:xx\:y
+ \ifdim \:AbsVal\:ddd < \:mmmp
+ \:X\@cclv\p@ \:Y\:X
+ \:wrn3{(\string#1,\string#2)(\string#3,\string#4)}
+ \else
+ \:divide\:xxx\:ddd \:divide\:xxxx\:ddd
+ \:X\:Cons\:xxx\:xx \advance\:X -\:Cons\:xxxx\:x
+ \:Y\:Cons\:xxx\:yy \advance\:Y -\:Cons\:xxxx\:y
+ \fi }\Define\MoveToCC{\:Opt[]\:MoveToCC{}}
+
+\def\:MoveToCC[#1](#2,#3)(#4,#5){
+ \:UserUnits(#2,#3)(#4,#5)
+ \:distance($#2,$#4)
+\ifnum \:d<\:mp \MoveToLoc(#3)
+ \:wrn3{(#1,#2)(#3,#4)}
+\else \:xx \:d
+ \:distance($#2,$#3) \:xxx\:d
+ \:distance($#5,$#4)
+ \:yy \:xxx \advance\:yy -\:d
+\:yyy\:xxx \advance\:yyy \:d
+\:divide\:yy\:xx \:yy\:Cons\:yy\:yyy
+\advance\:yy \:xx \divide\:yy \tw@
+ \:yyy \ifdim \:AbsVal\:xxx>\:AbsVal\:yy \:xxx \else \:yy \fi
+\ifdim \:AbsVal\:yyy<\:mp \:yyy\z@ \else
+ \:divide\:xxx\:yyy \:sqr\:xxx
+ \:yyyy\:yy \:divide\:yyyy\:yyy \:sqr\:yyyy
+ \advance\:xxx -\:yyyy \:Sqrt\:xxx
+ \:yyy\:Cons\:yyy\:xxx
+\fi
+ \MoveToLoc($#4) \:x\:X \:y\:Y \:divide\:yy\:xx
+\MoveToLoc($#2)
+\advance\:x -\:X \advance\:y -\:Y
+\advance\:X \:Cons\:yy\:x
+\advance\:Y \:Cons\:yy\:y
+ \:divide\:yyy\:xx
+\advance\:X #1\:Cons\:yyy\:y
+\advance\:Y -#1\:Cons\:yyy\:x
+
+ \fi \:SysUnits }\def\:UserUnits(#1,#2)(#3,#4){
+ \:xx\:Xunitsx \:xxx\:Xunitsy
+ \:yy\:Yunitsx \:yyy\:Yunitsy
+ \:xxxx\:Cons\:yy\:xxx \advance\:xxxx \:Cons\:yyy\:xx
+ \ifdim \:AbsVal\:xxxx>\:mmmp
+ \:divide\:xx\:xxxx \:divide\:xxx{-\:xxxx}
+ \:divide\:yy{\:xxxx} \:divide\:yyy\:xxxx
+ \fi
+ \:UnLoc(#1) \:UnLoc(#2)
+ \:UnLoc(#3) \:UnLoc(#4)}\Define\:SysUnits{
+ \MoveTo(\:Cons\:X,\:Cons\:Y)}\Define\:UnLoc(1){
+ \MoveToLoc(#1) \:d\:Cons\:yyy\:X
+ \advance\:d \:Cons\:yy\:Y
+ \:Y\:Cons\:xx\:Y
+ \advance\:Y \:Cons\:xxx\:X \:X\:d
+ \MarkLoc($#1)}\def\MoveToLC{\:Opt[]\:MoveToLC{}}
+
+\def\:MoveToLC[#1](#2,#3)(#4,#5){
+ \:UserUnits(#2,#3)(#4,#5)
+ \MoveToLoc($#2) \:x\:X \:y\:Y
+\MoveToLoc($#3) \advance\:x -\:X
+ \advance\:y -\:Y
+ \edef\:temp{ \:xxx\the\:x \:yyy\the\:y }
+\MoveToLoc($#4)
+\advance\:X \:y \advance\:Y -\:x
+\MarkLoc(^$) \MoveToLL($#4,^$)($#2,$#3)
+\MarkLoc(^$)
+ \:distance($#4,$#5) \:xx\:d \:distance($#4,^$)
+\ifdim \:d>\:xx \:wrn3{(#2,#3)(#4,#5)}
+\else \ifdim \:d<\:mmp \:yy\:xx \else \:yy\:d
+ \:divide\:yy\:xx \:sqr\:yy
+ \:yy-\:yy \advance\:yy \p@
+ \:Sqrt\:yy \:yy\:Cons\:xx\:yy
+\fi \fi
+ \:temp \:x\:xxx \:y\:yyy \:length \:xx\:d
+\:divide\:xxx\:xx
+\:divide\:yyy\:xx
+\advance\:X #1\:Cons\:yy\:xxx
+\advance\:Y #1\:Cons\:yy\:yyy
+ \:SysUnits } \def\Object#1{\:Opt(){\:DefineSD#1}0}
+
+\def\:DefineSD#1(#2){\begingroup \:multid#1
+ \:DraCatCodes \:DefSD#1(#2)}
+
+\def\:DefSD#1(#2)#3{
+ \expandafter\::Define\csname\string#1.\endcsname(#2){
+ \:t{\:SubD{#3}}
+ \if:IIID \edef\:temp{\noexpand\TwoDim \the\:t
+ \noexpand\EndTwoDim}
+ \else \def\:temp{\the\:t} \fi \:temp}
+ \def#1{\def\:SDname{\csname\string#1.\endcsname}
+ \:Opt[]\:CallSD{}}}
+
+\def\:CallSD[#1]{ \edef\:Entry{#1} \:SDname }\def\:SubD#1{
+ \let\::RecallXLoc\:AddXLoc \gdef\:AddXLoc{}
+ \edef\:RecallBor{ \global\:LBorder \the\:LBorder
+ \global\:RBorder \the\:RBorder
+ \xdef\noexpand\:UBorder{\:UBorder}
+ \global\:TeXLoc\the\:TeXLoc }
+\global\:TeXLoc\z@
+\setbox\:box\vbox{\EntryExit(0,0,0,0)
+\begingroup
+ \def\MarkXLoc{\:MarkXLoc}
+ \:InDraw #1
+\endgroup
+\:SetDrawWidth \let\:XLoc\relax
+\xdef\:AddXLoc{\:dd\the\:LBorder \:AddXLoc}}
+\:RecallBor
+ \:ddd\dp\:box
+ \ifx \:Entry\empty
+ \:DrawBox
+\else
+ \let\:RecallIn\:InOut
+ \:x\:X \:y\:Y
+ \def\:XLoc(##1,##2,##3){
+ \def\:temp{##1}
+ \ifx \:temp\:Entry \:X\:x \advance\:X -##2
+ \:Y\:y \advance\:Y -##3
+ \fi}
+ \:AddXLoc
+ \advance\:X \:dd \advance\:Y -\:ddd
+ \EntryExit(-1,-1,\:InOut2,\:InOut3) \:DrawBox
+ \let\:InOut\:RecallIn
+\fi
+ \MarkLoc(^)
+ \MoveToExit(-1,-1)
+ \:xxx\:X \:yyy\:Y \advance\:yyy \:ddd
+ \def\:XLoc(##1,##2,##3){
+ \:X\:xxx \advance\:X ##2 \advance\:X -\:dd
+ \:Y\:yyy \advance\:Y ##3
+ \MarkLoc(##1)}
+ \:AddXLoc
+ \MoveToLoc(^)
+ \ifx \:Entry\empty \else \MoveToLoc(\:Entry) \fi
+ \global\let\:AddXLoc\::RecallXLoc }
+\Define\:MarkXLoc(1){ \:theDoReg
+ \let\:XLoc\relax
+ \xdef\:AddXLoc{\:AddXLoc \:XLoc(#1,\the\:X,\the\:Y)}
+ \let\DoReg\:DoReg}
+ \catcode`\ 10 \catcode`\^^M5 \catcode`\^^I10
+ \let\wlog\:wlog \let\:wlog\:undefined
+\:RestoreCatcodes \tracingstats1 \endinput
diff --git a/graphics/dratex/Examples.tex b/graphics/dratex/Examples.tex
new file mode 100644
index 0000000000..4603a22b63
--- /dev/null
+++ b/graphics/dratex/Examples.tex
@@ -0,0 +1,2058 @@
+%\def\TexFiles{}
+\def\ext{Changeable}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Compile this file with TeX and review the document. %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\hfill 15 Apr. 94
+\bigskip
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Code of examples and exercises from %
+% %
+% TeX and LaTeX: Drawing and Literate Programming %
+% %
+% gurari@cse.ohio-state.edu %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\immediate\write16{<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}
+\immediate\write16{<<< tex Examples.tex <<<<<<<<<<<}
+\immediate\write16{<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %%
+ %%
+\input ProTex.sty %%%%%%%%%%%%%%%%%%%%
+
+
+\expandafter\def\csname :warn\endcsname#1{}
+\Code\top{}{\immediate\write16{<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}
+\immediate\write16{<<<<< \op \name.\ext}
+\immediate\write16{<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}
+
+% \com
+}
+
+ \ifx \TexFiles\empty %%%%%%%%%%%%%%%%%%%%%%%%
+\def\tex{tex}
+
+\def\DEFEND{\% LaTeX requires a {\tt\string\Defend} here \%}
+
+\Code\Open{}{\files
+\startInput
+}
+
+\Code\Close{}{
+\endInput
+\\bye}
+ \else %%%%%%%%%%%%%%%%%%%%%%%%
+\def\tex{latex}
+
+\Code\DEFEND{{\it LaTeX requires a {\tt\string\Defend}
+ here}}{\% LaTeX requires a \string\Defend here \%\string\Defend}
+
+\Code\Open{}{\\documentstyle{book}
+\files
+\\begin{document}
+\startInput}
+
+\Code\Close{}{
+\endInput
+\\end{document}}
+ \fi %%%%%%%%%%%%%%%%%%%%%%%%
+
+\Code\fileD{}{
+\\input DraTex.sty }
+
+\Code\fileAD{}{
+\\input DraTex.sty
+\\input AlDraTex.sty }
+
+\Code\fileP{}{
+\\input ProTex.sty }
+
+\Code\startInput{}{\\Draw}
+\Code\endInput{}{\\EndDraw}
+
+\AlProTex{\ext,<<<>>>,[],list,|,ShowFile,NoShow} %%%%%%%%%%%%%%%%%%%%
+
+\let\SC=\ShowCode
+\Code\execute{}<<<
+>>>
+
+\newcount\exron
+\def\nop#1{\ifnum \exron>0 #1 \fi}
+
+\catcode`\^^M=13 \catcode`\#=12 %
+\def\<<<{%
+ \edef\temp{%
+ \noexpand\AppendCode\noexpand\execute<<<
+ \nop#\op\space\space \name.\ext\space\space\space # \com
+ \nop#xdvi\space\space \name.dvi
+ >>>}\ShowOff\temp\ShowOn%
+ \def\ShowCode{%
+ \expandafter\OutputCode\csname\name\endcsname \def\top
+ {} \global\let\ShowCode=\SC \ShowCode}%
+ \expandafter\Code\csname\name\endcsname{}<<<
+ \top}%
+\catcode`\^^M=5 \catcode`\#=6
+
+\def\newpage{\def\newpage{\par\vfill\break}}
+\newcount\1 \newcount\2 \newcount\3
+
+\def\ForTex{tex}
+
+\def\Ex#1#2#3{\global\advance\exron by -1
+ \edef\op{#1}
+ \edef\For{for \ifx \op\ForTex \else La\fi TeX}
+ \def\com{#2}
+ \def\name{#3} \hrule
+ \medskip\noindent$\underline{\hbox{#1\quad\name.\ext}}$
+ \qquad{\it #2\/} {\rm(\For)}\medskip}
+
+\def\Exr#1#2#3{\global\exron=2
+ \setbox0=\hbox{\global\1#1 \global\2#2 \global\3#3}
+ \Ex{\tex}{Exercise \the\1.\the\2.\the\3}{exr#1#2#3}}
+
+\def\Lib#1{\newpage\hrule
+ \noindent\hfil{\bf \strut#1}\hrule}
+
+\hbadness=10000 \vbadness=10000 \hfuzz=99in \vfuzz=99in
+ %%
+ %%
+ %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\noindent NOTES
+
+(a) If you want to get TeX files instead of LaTeX files, remove `\%'
+from the first line of file `{\tt Examples.tex}'.%%% first line of this file
+
+
+(b) If you want different extensions in the files' names,
+change the definition of {\tt\string\ext} in the second line
+of file `{\tt Examples.tex}'.%%% second line of this file
+
+(c) Files carrying names that start with `exr' have been retrieved
+from exercises. Many of these files are incomplete, and they expect
+that the reader will provide the missing code. (La)TeX will prompt you
+with `?' on incomplete files. In such cases, type `x' followed by
+RETURN.
+
+\bigskip \Lib{DraTeX} \def\files{\fileD}
+
+\Ex{tex}{First example in section 6.2}{sec62a}
+
+\<<<
+\input DraTex.sty
+\Draw
+ \LineAt(0.1, 0,-18,-10)
+ \LineAt(-18,-10,- 6, 26)
+ \LineAt(- 6, 26, 18,- 4)
+ \LineAt( 18,- 4, 12,-40)
+ \LineAt( 18,- 4, 24,-40)
+ \LineAt( 18,- 4, 58,- 4)
+ \LineAt( 58,- 4, 52,-40)
+ \LineAt(58,-4,64,-40) \LineAt(58,-4,66,4)
+\EndDraw
+\bye >>>
+
+\Ex{latex}{First example in section 6.2}{sec62b}
+
+\<<<
+\documentstyle{report}
+ \input DraTex.sty
+\begin{document}
+\Draw
+ \LineAt(0.1, 0,-18,-10)
+ \LineAt(-18,-10,- 6, 26)
+ \LineAt(- 6, 26, 18,- 4)
+ \LineAt( 18,- 4, 12,-40)
+ \LineAt( 18,- 4, 24,-40)
+ \LineAt( 18,- 4, 58,- 4)
+ \LineAt( 58,- 4, 52,-40)
+ \LineAt(58,-4,64,-40) \LineAt( 58,-4,66,4)
+\EndDraw
+\end{document}>>>
+
+
+\Ex{latex}{First example in section 6.2---second version}{sec62c}
+
+\<<<
+\documentstyle[DraTex]{report}
+\begin{document}
+\Draw
+ \LineAt(0.1, 0,-18,-10)
+ \LineAt(-18,-10,- 6, 26)
+ \LineAt(- 6, 26, 18,- 4)
+ \LineAt( 18,- 4, 12,-40)
+ \LineAt( 18,- 4, 24,-40)
+ \LineAt( 18,- 4, 58,- 4)
+ \LineAt( 58,- 4, 52,-40)
+ \LineAt(58,-4,64,-40) \LineAt(58,-4,66,4)
+\EndDraw
+\end{document}>>>
+
+
+
+\Exr672
+
+\<<<
+|Open
+ \MarkLoc(a) \Move(50,0)
+ \MarkLoc(A) \Move(50,0)
+ \MarkLoc(b) \Move(-30,30)
+ \MarkLoc(B) \Move(-30,30)
+ \MarkLoc(c) \Move(-20,-30)
+ \MarkLoc(C)
+ \Curve(A,b,b,B)
+ \Curve(B,c,c,C)
+ \Curve(C,a,a,A)
+|Close>>>
+
+
+ \Ex{tex}{First example in section 6.1}{sec61}
+
+\<<<
+\input DraTex.sty
+
+We can draw clocks of
+different styles and sizes.
+
+\Draw
+ \Move(0,20) \Line(0,-50) \Line(50,0)
+ \PenSize(1.5pt) \Line(0,50) \Line(-50,0)
+ \Move(5,-25) \Text(--9--)
+ \Move(20,-18) \Text(--6--)
+ \Move(20,18) \Text(--3--)
+ \Move(-20,18) \Text(--12--)
+ \Move(0,-18) {\RotateTo(60) \LineF(19)}
+ \RotateTo(210) \LineF(14)
+\EndDraw
+
+We can draw people of
+different shapes and looks.
+
+\Draw(0.6pt,0.6pt)
+ \DrawOvalArc(30,45)(0,180)
+ \DrawOvalArc(30,12)(180,360)
+ \DrawOvalArc(60,25)(140,400)
+ \Move(0,5)
+ \DrawOvalArc(30,60)(225,315)
+ \DrawOvalArc(20,52)(260,280)
+ \Move(-10,-37) {\Text(--$\cdotp$--)} \Text(--o--)
+ \Move(20,0) {\Text(--$\cdotp$--)} \Text(--o--)
+\EndDraw
+
+And we can produce many other
+types of drawings. \bye>>>
+
+
+
+\Ex{latex}{First example in section 6.1}{sec61a}
+
+\<<<
+\documentstyle{report}
+\input DraTex.sty
+\begin{document}
+
+We can draw clocks of
+different styles and sizes.
+
+\Draw
+ \Move(0,20) \Line(0,-50) \Line(50,0)
+ \PenSize(1.5pt) \Line(0,50) \Line(-50,0)
+ \Move(5,-25) \Text(--9--)
+ \Move(20,-18) \Text(--6--)
+ \Move(20,18) \Text(--3--)
+ \Move(-20,18) \Text(--12--)
+ \Move(0,-18) {\RotateTo(60) \LineF(19)}
+ \RotateTo(210) \LineF(14)
+\EndDraw
+
+We can draw people of
+different shapes and looks.
+
+\Draw(0.6pt,0.6pt)
+ \DrawOvalArc(30,45)(0,180)
+ \DrawOvalArc(30,12)(180,360)
+ \DrawOvalArc(60,25)(140,400)
+ \Move(0,5)
+ \DrawOvalArc(30,60)(225,315)
+ \DrawOvalArc(20,52)(260,280)
+ \Move(-10,-37) {\Text(--$\cdotp$--)} \Text(--o--)
+ \Move(20,0) {\Text(--$\cdotp$--)} \Text(--o--)
+\EndDraw
+
+And we can produce many other
+types of drawings. \end{document}>>>
+
+\Ex{latex}{First example in section 6.1---second version}{sec61b}
+
+\<<<
+\documentstyle[DraTex]{report}
+\begin{document}
+
+We can draw clocks of
+different styles and sizes.
+
+\Draw
+ \Move(0,20) \Line(0,-50) \Line(50,0)
+ \PenSize(1.5pt) \Line(0,50) \Line(-50,0)
+ \Move(5,-25) \Text(--9--)
+ \Move(20,-18) \Text(--6--)
+ \Move(20,18) \Text(--3--)
+ \Move(-20,18) \Text(--12--)
+ \Move(0,-18) {\RotateTo(60) \LineF(19)}
+ \RotateTo(210) \LineF(14)
+\EndDraw
+
+We can draw people of
+different shapes and looks.
+
+\Draw(0.6pt,0.6pt)
+ \DrawOvalArc(30,45)(0,180)
+ \DrawOvalArc(30,12)(180,360)
+ \DrawOvalArc(60,25)(140,400)
+ \Move(0,5)
+ \DrawOvalArc(30,60)(225,315)
+ \DrawOvalArc(20,52)(260,280)
+ \Move(-10,-37) {\Text(--$\cdotp$--)} \Text(--o--)
+ \Move(20,0) {\Text(--$\cdotp$--)} \Text(--o--)
+\EndDraw
+
+And we can produce many other
+types of drawings. \end{document}>>>
+
+
+\Exr732
+
+\<<<
+|Open
+\font\ARROWS=line10\space scaled\magstep5
+\font\CIRCLES=lcircle10\space scaled\magstep5
+% \newfont{\ARROWS}{line10\space scaled\magstep5}
+% \newfont{\CIRCLES}{lcircle10\space scaled\magstep5}
+
+ \Text(--\CIRCLES \char 10--)
+\Text(--\CIRCLES \char 11--) \Text(--\ARROWS \char 55--)
+\Text(--\CIRCLES \char 110--)\EntryExit(-1,0,-1,0)
+\Text(--\CIRCLES \char 114--)|Close>>>
+
+\Exr741
+
+\<<<
+|Open
+\Ragged(8)
+\Line(10,-10) \Line(10,20)
+\LineTo(0,0)
+|Close>>>
+
+
+\Ex{\tex}{First example in section 8.1}{sec81}
+
+\<<<
+|Open
+\ThreeDim(-150,-60,-600)
+ \Line(60,0,0) \Line(0,0,60)
+ \Line(-60,0,0) \Line(0,0,-60)
+ \LineTo(0,60,0) \Line(60,0,0)
+ \Line(0,-60,0)
+ \LineAt(0,60,0,0,60,60)
+ \Line(0,-60,0)
+\EndThreeDim |Close>>>
+
+
+\Ex{\tex}{Example of USA map in section 9.3}{usa}
+
+\<<<
+|Open(0.9pt,0.9pt)
+\Table\USA{ % California
+ -60,-35 & -77,-30 & -80,
+ -20 & -90,-15 & -100,40 &
+ % Oregon
+ -100,50 & -90,80 &
+ % Wash
+ -90,95 & -78,90 & -75,95 &
+ % Minn
+ 100,70 & 85,60 &
+ % Wisc-Mich
+ 95,60 & 105,65 & 102,63 & 110,60 & 125,60 & 110,55 & 110,30 &
+ 115,25 & 120,30 & 115,40 & 115,50 & 120,55 & 130,55 & 140,40 &
+ 135,25 &
+ % Ohio-NY-Vt
+ 145,25 & 155,30 & 160,45 & 175,45 & 175,55 & 180,60 & 195,65 &
+ % Maine
+ 200,75 & 200,85 & 205,90 & 210,90 & 215,80 & 220,75 & 205,60 & 205,50 &
+ % Mass--NY
+ 210,43 & 208,47 & 215,43 & 190,30 & 202,35 &
+ % NJ--Va
+ 197,25 & 190,18 & 185,20 & 190,15 & 190,5 & 182,18 & 182,0 & 185,0 &
+ % NC
+ 190,-8 & 185,-4 & 183,-6 & 186,-6 & 182,-15 &
+ 190,-18 & 190,-10 & 192,-10 &
+ 195,-18 &
+ % Ga-Fl
+ 165,-40 & 160,-50 & 175,-80 & 175,-90 & 170,-100 & 165,-100 &
+ 155,-80 & 155,-65 & 145,-60 & 140,-62 & 136,-62 & 120,-60 &
+ % Alaba--La
+ 102,-63 & 107,-67 & 107,-72 & 110,-75 & 90,-65 &
+ 78,-65 &
+ % Texas
+ 62,-78 & 57,-78 & 50,-82 & 53,-92 & 48,-90 & 25,-65 & 15,-65 &
+ 15,-68 & -10,-50 &
+ % New Mexico
+ -40,-50 &
+ % Back to California
+ -60,-35 }
+{ \USA(0,0){\MoveTo} \USA(1,99){\LineTo} } \Text(--USA--)
+\Scale(0.5,0.5) \USA(46,46){\MoveTo} \USA(47,92){\LineTo}
+\MoveTo(-30,0) \MarkLoc(a) \USA(0,0){\Move} \MarkLoc(b)
+\USA(0,46){{\LineToLoc(b)} \MarkLoc(b) \MoveToLoc(a) \Move}
+|Close>>>
+
+
+\Exr{10}1{1a}
+\<<<
+|Open
+\Text(--Government~%
+ Bonds (\%)--)
+\Table\B{Britain,9.59 &
+ Canada,7.98 & Japan,5.46 &
+ U.S., 6.84 & Mexico,14.9}
+\B(0,4){\PutBar}
+|Close >>>
+
+\Exr{10}1{1b}
+\<<<
+|Open
+\chick(0,75) \Scale(-1,1)
+\chick(0,140)
+|Close >>>
+
+\Exr{10}1{1c}
+\<<<
+|Open
+\Table\x{ 30,40
+ & 15,60 & 27,15 & 35,35
+ & 50,45 & 25,70 & 20,20
+ & 25,75 } \x(0,99){\Tr}
+|Close >>>
+
+\Exr{10}1{1d}
+\<<<
+|Open
+\sqr(-24,0)
+\sqr(0,32)
+\sqr(24,-32)
+|Close >>>
+
+\Exr{10}1{1e}
+\<<<
+|Open
+\engine(90) \MoveTo(50,0)
+\engine(180) \MoveTo(100,0)
+\engine(-30)
+|Close >>>
+
+\Exr{10}1{1f}
+\<<<
+|Open
+\MarkLoc(A)
+\spring(110) \Rotate(70)
+\spring(60) \MarkLoc(B)
+\DSeg\RotateTo(B,A)
+\LSeg\spring(B,A)
+|Close >>>
+
+\Exr{10}21
+\<<<
+|Open
+\new(BODY) \<BODY>(20)
+\LineF(20) \Rotate(55) \LineF(16)
+\new(hand) \<BODY>(140) \LineF(35)
+\new(hand) \<BODY>(90) \LineF(7)
+\new(head) \<BODY>(-60) \LineF(19)
+\new(left-leg) \<BODY>(210) \LineF(12)
+\Rotate(30) \LineF(14) \new(right-leg)
+\Do(1,11){\I+15; \<head>(\Val\I)
+\LineF(11)}
+|Close >>>
+
+
+\Exr{10}22
+
+\<<<
+|Open
+\def\DefineSymbol#1{%
+ \Indirect\Define<#1>}
+
+\def\DrawText(--#1--){%
+ \let\xNextSym=\xDrawSym \xNextSym#1{}}
+
+\def\xDrawSym#1{\def\temp{#1}%
+ \ifx \temp\empty \let \xNextSym=\relax
+ \else \Indirect<#1>\fi \xNextSym }
+
+\DefineSymbol A{{ \Line(21,60)
+ \Line(21,-60) \Move(-7,20)
+ \Line(-28,0) } \Move(52,0) }
+\DefineSymbol B{{ \DrawText(--P--)
+ \Move(-25,18)
+ \DrawOvalArc(15,18)(-90,90)
+ \Move(0,-18) \Line(-25,0)}
+ \Move(50,0) } \DefineSymbol P
+{{ \Line(0,60) \Line(25,0)
+ \Move(0,-12) \DrawOvalArc(15,12)(-90,90)
+ \Move(0,-12) \Line(-25,0) } \Move(50,0) }
+ \DefineSymbol C{{ \Move(20,30)
+ \DrawOvalArc(20,30)(45,315) } \Move(46.6,0) }
+ \DefineSymbol D{{ \Line(0,60) \Line(20,0)
+ \Move(0 ,-30) \DrawOvalArc(20,30)(-90,90) \Move(0,-30)
+ \Line(-20,0) } \Move(50,0) }
+ \DefineSymbol E{{ \DrawText(--F--) \Move(-50,0)
+ \Line(40,0) } \Move(50,0) }
+ \DefineSymbol F{{ \Line(0,60) \Line(40,0)
+ \Move(-40,-30) \Line(30,0) } \Move(50,0) }
+ \DefineSymbol G{{ \DrawText(--C--)
+ \Move(-10,30) {\Line(-20,0)} \Line(0,-30) }
+ \Move(46.6,0) }
+ \DefineSymbol H{{ \Line(0,60) \Move(40,0)
+ \Line(0,-60) \Move(0,30) \Line(-40,0) } \Move(50,0) }
+ \DefineSymbol I{{ \Line(0,60) } \Move(10,0) }
+ \DefineSymbol J{{ \Move(20,17) \DrawOvalArc(20,17)(180,360)
+ \Move(20,0) \Line(0,43) } \Move(50,0) }
+ \DefineSymbol K{{ \Line(0,60) \Move(0,-35)
+ \Line(40,35) \Move(-32,-28) \Line(32,-32) } \Move(50,0) }
+ \DefineSymbol L{{ { \Line(0,60) } \Line(40,0) } \Move(50,0) }
+ \DefineSymbol M{{ \Line(0,60) \Line(25,-60)
+ \Line(25,60) \Line(0,-60) } \Move(60,0) }
+ \DefineSymbol N{{ \Line(0,60) \Line(40,-60)
+ \Line(0,60) } \Move(50,0) }
+ \DefineSymbol O{{ \Move(22,30) \DrawOval(22,30) } \Move(54,0) }
+ \DefineSymbol P{{ \Line(0,60) \Line(25,0)
+ \Move(0,-12) \DrawOvalArc(15,12)(-90,90)
+ \Move(0,-12) \Line(-25,0) } \Move(50,0) }
+ \DefineSymbol Q{{ \DrawText(--O--) \Move(-10,-5)
+ \Line(-15,15) } \Move(55,0) }
+ \DefineSymbol R{{ \DrawText(--P--) \Move(-10,0)
+ \Line(-15,36) } \Move(50,0) }
+ \DefineSymbol S{{ \Move(20,18) \DrawOvalArc(20,18)(-140,90)
+ \Move(0,30) \DrawOvalArc(20,12)(40,270) } \Move(50,0) }
+ \DefineSymbol T{{ \Move(22,0) \Line(0,60) \Move(-22,0)
+ \Line(44,0) } \Move(54,0) }
+ \DefineSymbol U{{ \Move(20,15) \DrawOvalArc(20,15)(180,360)
+ \Move(-20,0) \Line(0,45) \Move(40,0) \Line(0,-45) }
+ \Move(50,0) }
+ \DefineSymbol V{{ \Move(0,60) \Line(22,-60)
+ \Line(22,60) } \Move(54,0) }
+ \DefineSymbol W{{ \Move(0,60) \Line(15,-60)
+ \Line(15,60) \Line(15,-60) \Line(15,60) } \Move(70,0) }
+ \DefineSymbol X{{ \Line(40,60) \Move(-40,0)
+ \Line(40,-60) } \Move(50,0) }
+ \DefineSymbol Y{{ \Move(20,0) \Line(0,34) { \Line(-20,26)}
+ \Line(20,26) } \Move(50,0) }
+ \DefineSymbol Z{{ \Move(0,60) \Line(40,0) \Line(-40,-60)
+ \Line(40,0) } \Move(50,0) }
+ \DefineSymbol 0{{ \Move(25,30) \DrawOval(25,30) } \Move(60,0) }
+ \DefineSymbol 1{{ \Line(0,60) } \Move(10,0) }
+ \DefineSymbol 2{{ \MarkLoc(a) \Move(0,10)
+ \MarkLoc(a') \Move(40,30) \MarkLoc(b)
+ \Move(0,-10) \MarkLoc(b') \Curve(a,a',b',b)
+ \Move(-20,10) \DrawOvalArc(20,20)(0,180)
+ \Move(-20,-40) \Line(40,0) } \Move(50,0) }
+ \DefineSymbol 3{{ \MarkLoc(a') \Move(0,10) \MarkLoc(a)
+ \Move(20,-10) \MarkLoc(b) \Move(-10,0) \MarkLoc(b')
+ \Curve(a,a',b',b) \Move(22,0) \MarkLoc(b')
+ \Move(8,8) \MarkLoc(a') \Move(0,10) \MarkLoc(a)
+ \Curve(a,a',b',b) \Move(0,10) \MarkLoc(a')
+ \Move(-8,8) \MarkLoc(b') \Move(-10,0)
+ \MarkLoc(b) \Curve(a,a',b',b) \Move(-5,0)
+ \MarkLoc(b') \Move(-5,-3) \MarkLoc(a')
+ \Move(0,-2) \MarkLoc(a) \Curve(a,a',b',b)
+ \Line(30,29) \Line(-40,0) } \Move(50,0) }
+\DefineSymbol 4{{ \Move(35,0) \Line(0,60)
+ \Line(-35,-35) \Line(45,0)} \Move(55,0) }
+ \DefineSymbol 5{{ \Move(15,20) \DrawOvalArc(19,20)(-140,140)
+ \Move(-15,10) \Line(0,30) \Line(30,0) } \Move(44,0) }
+ \DefineSymbol 6{{ \Move(22,30) \DrawOvalArc(22,30)(70,270)
+ \Move(0,-10) \DrawOvalArc(22,15)(0,174)
+ \DrawOvalArc(22,20)(270,360) } \Move(54,0) }
+ \DefineSymbol 7{{ \Move(0,60) \Line(40,0)
+ \MarkLoc(a) \Move(-20,-60) \MarkLoc(b)
+ \DSeg\RotateTo(b,a) \Rotate(20) \MoveF(10) \MarkLoc(b')
+ \MoveToLoc(a)
+ \DSeg\RotateTo(a,b) \Rotate(-20) \MoveF(10) \MarkLoc(a')
+ \Curve(a,a',b',b) } \Move(50,0) }
+ \DefineSymbol 8{{ \Move(20,17) \DrawOval(20,17)
+ \Move(0,30) \DrawOval(20,13) } \Move(50,0) }
+ \DefineSymbol 9{{\Move(50,60) \Scale(-1,-1) \DrawText(--6--) } \Move(54,0)
+}
+
+\Scale(0.1,0.1) \Ragged(1)
+\DrawText(--BOLD--)
+\PenSize(0.2pt) \MoveTo(0,-100)
+{ \Scale(-1,1)
+ \DrawText(--BACKWARD--) }
+\MoveTo(0,-200) \RotatedAxes(0,75) \DrawText(--SLANTED--)
+\EndRotatedAxes \MoveTo(0,-300) \RotatedAxes(-45,45)
+\DrawText(--ROTATED--) \EndRotatedAxes
+|Close>>>
+
+\Ex{\tex}{Last example in section 11.2}{boxes}
+
+\<<<
+|Open
+\Object\ch(1){\Text(--#1--)
+ \MoveToExit(-1,-1)
+ \FigSize\Q\R{\Text(--#1--)}
+ \DrawRect(\Val\Q,\Val\R) }
+\Define\chrs(1){\font\f=#1\space scaled\magstep4 \f
+ \Table\chrs{A & l & l & ~ & i & n & ~ &
+ b & o & x & e & s & .} \chrs(0,99){\ch} }
+\PenSize(0.2pt) \EntryExit(-1,-1,1,-1)
+{\chrs(cmtt10)} \Move(0,-20) \chrs(cmsl10)
+|Close>>>
+
+\Exr{11}21
+\<<<
+|Open
+\Define\side(3){
+ \ProjectedAxes(#1,#2)(#1,#3)
+ \DrawRect(1,1) \Move(0.5,0.5)
+ \DrawCircle(0.5)
+ \EndProjectedAxes }
+\ThreeDim(80,70,-40) \MarkPLoc(a)
+ \Move(0,-50,0) \MarkPLoc(b)
+ \Move(0,50,25) \MarkPLoc(c)
+ \Move(-25,0,-25) \MarkPLoc(d)
+ \side(a,b,d) \side(a,b,c) \side(a,c,d)
+\EndThreeDim
+|Close >>>
+
+
+\Exr{11}24
+
+\<<<
+|Open
+\Define\Spline(1){
+ \MarkLoc(0) \MoveTo(0,0) \MarkLoc(00)
+ \Table\P{#1} \Define\Count(1){\K+1;} \K=-4;
+ \P(0,999){\Count}
+ \Do(0,\Val\K){
+ \GetCoefficients
+ \MoveTo(\Val\Ao,\Val\Bo) \CSeg\Move(00,0)
+ \MarkLoc(o) \f \MarkLoc(x)
+ \Do(1,30){
+ \T=\DoReg; \T/30;
+ \X=\Aiii; \X*\T; \X+\Aii; \X*\T; \X+\Ai; \X*\T;
+ \Y=\Biii; \Y*\T; \Y+\Bii; \Y*\T; \Y+\Bi; \Y*\T;
+ \MoveToLoc(o) \Move(\Val\X,\Val\Y) \f
+ {\LineToLoc(x)} \MarkLoc(x) }}
+ \MoveToLoc(0)}
+
+\Define\f{}
+\DecVar\Ao \DecVar\Ai \DecVar\Aii \DecVar\Aiii \DecVar\X
+\DecVar\Bo \DecVar\Bi \DecVar\Bii \DecVar\Biii \DecVar\Y
+
+\Define\GetCoefficients{
+ \I=\DoReg; \P(\Val\I,\Val\I){\First}
+ \I+1; \P(\Val\I,\Val\I){\Second}
+ \I+1; \P(\Val\I,\Val\I){\Third}
+ \I+1; \P(\Val\I,\Val\I){\Fourth} }
+\Define\First(2){\Ao=#1; \Ai=-#1; \Aii=#1; \Aiii=-#1;
+ \Bo=#2; \Bi=-#2; \Bii=#2; \Biii=-#2;}
+\Define\Second(2){
+ \T=#1; \T* 4; \Ao +\T; \T=#2; \T* 4; \Bo +\T;
+ \T=#1; \T*-2; \Aii+\T; \T=#2; \T*-2; \Bii+\T;
+ \T=#1; \T* 3; \Aiii +\T; \T=#2; \T* 3; \Biii +\T;}
+\Define\Third(2){ \Ao +#1; \Ao /6; \Bo +#2; \Bo /6;
+ \Ai +#1; \Ai /2; \Bi +#2; \Bi /2;
+ \Aii+#1; \Aii/2; \Bii+#2; \Bii/2;
+ \T=#1; \T*-3; \Aiii+\T; \T=#2; \T*-3; \Biii+\T;}
+\Define\Fourth(2){
+ \Aiii+#1; \Aiii/6; \Biii+#2; \Biii/6;}
+
+\Spline(0,15 & 30,-70
+ & 40,-50 & 10,0 & 15,30
+ & 50,5 &60,10 & 8,45 &
+ 8,55 & 30,70 & 0,80 &
+ -30,70 &-8,55 & -8,45 &
+ -60,10 &-50,5 & -15,30 &
+ -10,0 &-40,-50 &-30,-70 &
+ 0,15 & 30,-70 & 40,-50 )
+\Define\ShowPoint(2){
+ \MoveToLoc(0) \Move(#1,#2)
+ \Text(--$\circ$--)}
+\P(0,99){\ShowPoint}
+
+\Define\TEX{
+ \Spline(0,-15 & 0,-15 &
+ 0,-15 & 0, 15 &
+ 0, 15 & 0, 15 )
+ \Spline(-10,15 &
+ -10,15 & -10,15 & 10,15 &
+ 10,15 & 10,15)
+ \Move(12,0)
+ \Spline(0,0 & 0,0 & 0,0 & 14,0 & 14,0 & 14,0)
+ \Spline( 20,15 &20,15 &20,15 & 0,15 & 0,15
+ & 0,-15 & 0,-15 & 20,-15 &20,-15&20,-15)
+ \Move(32,0) \Spline( -10,-15 & -10,-15 &
+ -10,-15 & 10,15 & 10,15 & 10,15)
+ \Spline( -10,15 &
+ -10,15 & -10,15 & 10,-15 & 10,-15 & 10,-15) }
+\TEX \MoveTo(0,0) \F
+\TEX \MoveTo(0,-35) \G
+\TEX
+|Close >>>
+
+
+\Exr{11}31
+\<<<
+|Open
+\Define\put(2){
+ \IF \EqText(,#1) \THEN
+ \top \Define\put(1){}
+ \ELSE \push(#1) \FI \put(#2)}
+\Define\stack(1){
+ {\put(#1,,)} \Move(0,-13)}
+\Table\x{ & 1& 1, 2&
+1, 2, 3& 1, 2, 3, 4&
+1, 2, 3, 4, *& 1, 2, 12&
+1, 2, 12,+& 1, 14& 1, 14,+& 15}
+\x(0,100){\stack}
+|Close >>>
+
+
+\Exr{11}32
+\<<<
+|Open
+\Table\g{
+ 16 & 8 & 4 & 2 & 1 &
+ 20 & 16 & 8 & 4 & 2 &
+ 17 & 12 & 16 & 8 & 4 &
+ 23 & 20 & 12 & 13 & 17 }
+\ThreeDim(160,75,-70)
+ \Scale(20,5,20)
+ \g(0,140){\surface}
+\EndThreeDim
+|Close >>>
+
+
+
+
+
+
+\Ex{\tex}{NEW OPTION FOR {\tt\char92}ThreeDim}{NewThreeDim}
+
+
+
+{\tt\string\ThreeDim($x_e$,$y_e$,$z_e$)} perspective projections (old option)
+
+{\tt\string\ThreeDim($\alpha_{xy}$,$\alpha_z$)} parallel projections (new additional option):
+$\alpha_{xy}$ --- direction within xy plane,
+$\alpha_z$ --- direction with respect to xy plane.
+
+ e.g., {\tt\string\ThreeDim(30,60)} or
+{\tt\string \ThreeDim(45,60)}
+
+
+\<<<
+|Open
+\Define\cube{
+ \Line(50,0,0){\Line(0,0,50)}
+ \Line(0,50,0){\Line(0,0,50)}
+ \Line(-50,0,0){\Line(0,0,50)}
+ \Line(0,-50,0) \Move(0,0,50)
+ \Move(50,0,0) \Line(0,50,0)
+ \Line(-50,0,0) }
+\ThreeDim(80,80,-100) \cube \EndThreeDim
+\MoveTo(0,-130)
+\ThreeDim(45,60) \cube \EndThreeDim
+\MoveTo(0,-260)
+\ThreeDim(30,60) \cube \EndThreeDim
+|Close>>>
+
+\Lib{AlDraTeX} \def\files{\fileAD}
+
+
+\Ex{tex}{Example in section 13.2}{sec132}
+
+\<<<
+\input DraTex.sty
+\input AlDraTex.sty
+\Draw
+ \Scale(1,0.5)
+ \PieChartSpec(1,50,20)()
+ \PieChart(15 & 10 & 30)
+ \Move(0,-6)
+ \DrawOvalArc(50,50)(180,360)
+\EndDraw
+\bye>>>
+
+\Ex{tex}{Example in section 13.2---second version}{sec132a}
+
+\<<<
+\input DraTex.sty
+ \def\AlDraTex{pie}
+\input AlDraTex.sty
+\Draw
+ \Scale(1,0.5)
+ \PieChartSpec(1,50,20)()
+ \PieChart(15 & 10 & 30)
+ \Move(0,-6)
+ \DrawOvalArc(50,50)(180,360)
+\EndDraw
+\bye>>>
+
+
+\Ex{latex}{Example in section 13.2}{sec132b}
+
+\<<<
+\documentstyle{report}
+ \input DraTex.sty
+ \input AlDraTex.sty
+\begin{document}
+\Draw
+ \Scale(1,0.5)
+ \PieChartSpec(1,50,20)()
+ \PieChart(15 & 10 & 30)
+ \Move(0,-6)
+ \DrawOvalArc(50,50)(180,360)
+\EndDraw
+\end{document}>>>
+
+\Ex{latex}{Example in section 13.2---second version}{sec132c}
+
+\<<<
+\documentstyle[DraTex,AlDraTex]{report}
+\begin{document}
+\Draw
+ \Scale(1,0.5)
+ \PieChartSpec(1,50,20)()
+ \PieChart(15 & 10 & 30)
+ \Move(0,-6)
+ \DrawOvalArc(50,50)(180,360)
+\EndDraw
+\end{document}>>>
+
+\Ex{latex}{Example in section 13.2---third version}{sec132d}
+
+\<<<
+\documentstyle{report}
+ \input DraTex.sty
+ \def\AlDraTex{pie}
+ \input AlDraTex.sty
+\begin{document}
+\Draw
+ \Scale(1,0.5)
+ \PieChartSpec(1,50,20)()
+ \PieChart(15 & 10 & 30)
+ \Move(0,-6)
+ \DrawOvalArc(50,50)(180,360)
+\EndDraw
+\end{document}>>>
+
+\Ex{latex}{Example in section 13.2---forth version}{sec132e}
+
+\<<<
+\def\AlDraTex{pie}
+\documentstyle[DraTex,AlDraTex]{report}
+\begin{document}
+\Draw
+ \Scale(1,0.5)
+ \PieChartSpec(1,50,20)()
+ \PieChart(15 & 10 & 30)
+ \Move(0,-6)
+ \DrawOvalArc(50,50)(180,360)
+\EndDraw
+\end{document}>>>
+
+\Ex{\tex}{Chemical diagram in section 16.1}{sec161}
+
+\<<<
+|Open
+\Define\ChemEdge(3){{
+ \MoveToNodeDir(#2,#1)
+ \MarkLoc(b) \MoveToNodeDir(#1,#2)
+ \MarkLoc(a) \DSeg\RotateTo(a,b)
+ \Rotate(-90)\Q=#3; \Q/2; \Q-0.5;
+ \Q*2.2; \MoveF(\Val\Q)
+ \Do(1,#3){ {\CSeg\Line(a,b)}
+ \MoveF(-2.2) } }}
+\Do(1,6){ \MoveF(30)
+ \Node(\DoReg)(--C--) \MoveF(20) \Node(x)(--H--)
+ \ChemEdge(\DoReg,x,1) \MoveTo(0,0) \Rotate(60) }
+\ChemEdge(1,2,2) \ChemEdge(2,3,1) \ChemEdge(3,4,2)
+\ChemEdge(4,5,1) \ChemEdge(5,6,2) \ChemEdge(6,1,1)
+|Close >>>
+
+
+\Ex{\tex}{Finite automaton in last example of chapter 17}{FA}
+
+\<<<
+|Open
+\NewCIRCNode(\StateNode,106,)
+\NewCIRCNode(\AStateNode,106,103)
+\Define\StateAt(3){ \MoveTo(#2,#3)
+ \StateNode(#1)(--$q_{#1}$--)}
+\Define\AStateAt(3){
+ \MoveTo(#2,#3)
+ \AStateNode(#1)(--$q_{#1}$--)}
+\DiagramSpec(\StateAt&
+ \AStateAt&\TransEdge)
+\ArrowHeads(1) \Diagram
+ ( 0,0,0 & 1,50,50 &
+ 3,90,-50 & 4,20,-50 )(2,75,0)
+ (0,1,a,b & 1,2,a, & 0,2, ,b & 2,2,0,b & 0,4,a, & 4,3,a,b )
+\CurvedEdgeAt(3,1,0,1,1,0)(20,0.3,0,0.5) \EdgeLabel[+](--a--)
+|Close>>>
+
+
+\noindent\dotfill\
+
+New commands in AlDraTeX for setting spread diagrams (add to end of ch
+17)
+
+\noindent\dotfill\
+
+\begingroup
+\leftskip= 1.5em
+\parindent = -\leftskip
+
+\def\item{\medskip\leavevmode\hbox to \leftskip{$\circ$\hss}}
+
+\item
+ `{\tt\string\DefNode}'. A prefix to a node-generating command. The
+prefix asks that the command will produce an invisble node. The
+invisible node is assigned addresses but is not drawn into the
+figure.
+
+
+\item
+ `{\tt\string\PutNode(N)}'. This command realizes, according to the current
+conditions, a specified invisible node that has been defined earlier
+by `{\tt\string\DefNode}'.
+
+\item
+ `{\tt\string\ZeroNodesDim}'. Sets the pseudovariables `{\tt\string\WidthX}',
+`{\tt\string\WidthY}', `{\tt\string\MaxX}', and `{\tt\string\MaxY}' to 0.
+
+\item
+ `{\tt\string\AddNodeDim(N)}'. Inserts the horizontal and vertical
+dimensions of node N to the pseudovariables `{\tt\string\Widthx}' and
+`{\tt\string\Widthy}', respectively. Adds these values to the
+pseudovariables `{\tt\string\WidthX}' and `{\tt\string\WidthY}',
+respectively. In addition, half the horizontal dimension of node N is
+stored in `{\tt\string\MaxX}' if the pseudovariable contains a smaller
+value, and a similar outcome holds for the vertical dimension with
+respect to the pseudovariable `{\tt\string\MaxY}'.
+\par\endgroup
+
+\Ex{\tex}{}{newA}
+
+\<<<
+|Open
+\DefNode\CircleNode(a)(--Two--)
+\MoveToNode(a,0,0) \MarkLoc(A)
+\MoveToNode(a,1,0) \MarkLoc(B)
+\LSeg\R(A,B) \MoveTo(0,0)
+\OvalNode(b)(--Touching Nodes--)
+\RotateTo(19.5) \MoveF(5) \MarkLoc(A)
+\MoveToNodeDir(b,A) \MarkLoc(A)
+\MoveToNode(b,0,0)
+\RotateTo(20.5) \MoveF(5) \MarkLoc(B)
+\MoveToNodeDir(b,B) \MarkLoc(B)
+\RotateTo(20) \MoveF(5) \MarkLoc(C)
+\MoveToNode(b,0,0) \MoveToNodeDir(b,C)
+\DSeg\RotateTo(A,B) \Rotate(-90)
+\MoveF(\Val\R) \PutNode(a)
+|Close>>>
+
+
+\Ex{\tex}{}{newB}
+
+\<<<
+|Open
+
+\def\Dist#1(#2,#3,#4){\MarkLoc(a*)%
+ \MoveToNode(#2,0,0)\MarkLoc(b*)%
+ \MoveToNode(#2,#3,#4)\MarkLoc(c*)%
+ \LSeg#1(b*,c*)\MoveToLoc(a*)}
+
+\EntryExit(1,1,1,-1.5)
+\Object\G(3){
+ \RectNode(a)(--#1--)
+ \DefNode\RectNode(b)(--#2--)
+ \DefNode\RectNode(c)(--#3--)
+ \Dist\T(a,1,0) \Dist\R(b,1,0) \Dist\Q(c,1,0)
+ \R+\Q; \T-\R; \T*2;
+ \ZeroNodesDim \AddNodeDim(b)
+ \AddNodeDim(c) \Q=\MaxY;
+ \Dist\R(a,0,1) \Q+\R;
+ \Q+20; \EntryExit(-1,0,1,0)
+ \IF \GtDec(\T,40) \THEN
+ \T+40; \T/3;
+ \SetNodes(20,\Val\T)
+ \ELSE \T=-\T; \T+60; \T/2;
+ \SetNodes(\Val\T,20) \FI
+ \Edge(b,c) \ArrowHeads(1)
+ \VHEdge(A,c) \VHEdge(B,b) }
+\Define\SetNodes(2){
+ \MoveToNode(a, 1,0) \Line( #1,0) \FcNode(A)
+ \MoveToNode(a,-1,0) \Line(-#1,0) \FcNode(B)
+ \Move(#2,-\Val\Q) \PutNode(b)
+ \Move(#2, 0) \PutNode(c) }
+\G(short~~and~~deep,d~~e~~e~~p,shallow)
+\G(very~very~long~node,shallow,d~~e~~e~~p)
+|Close>>>
+
+
+\Ex{\tex}{}{newC}
+
+
+
+
+\<<<
+|Open
+\Define\Vertex(2){
+ \IF \EqText(r,#1) \THEN \Define\NodeType{\RectNode}
+ \ELSE \IF \EqText(d,#1) \THEN \Define\NodeType{\DiamondNode}
+ \ELSE \IF \EqText(o,#1) \THEN \Define\NodeType{\OvalNode}
+ \ELSE \Define\NodeType{\Node}
+ \FI\FI\FI
+ \DefNode\NodeType(\Val\I..\Val\J)(--#2--)
+ \AddNodeDim(\Val\I..\Val\J) }
+\Define\DefRow(1){
+ \IF \EqText({},{#1}) \THEN \Define\g{\MoveToLoc(start)}
+ \ELSE \ZeroNodesDim \J=-1;
+ \Table\x{#1} \x(0,99){\J+1; \Vertex}
+ \Move( 0,-\MaxY) \MarkLoc(\Val\I) \Move(5,0) \MarkLoc(\Val\I')
+ \Move(-5,-\MaxY) \Move(0,-\Sy) \I+1;
+ \FI \g }
+
+\Define\ProjectToRow(1){
+ \MarkLoc(x) \Move(0,5) \MarkLoc(x')
+ \MoveToLL(#1,#1')(x,x') }
+
+\Define\VSpace(1){ \Define\Sy{#1} }
+\VSpace(15)
+
+\Define\DefRowDiagram{
+ \MarkLoc(start) \I=0; \Define\g{\DefRow} \g}
+
+\DefRowDiagram
+ ( o, An~ approach~~ for~ setting~~ flow~ diagrams
+ & r, Use~~ {\tt\char92DefineRowDiagram}~~
+ to~ define~~ the~ rows~~ of~ nodes
+ )( r, Derive~~ x~ coordinate~~ for~ N~ then~
+ call~~ {\tt\char92ProjectToRow}
+ & r, Choose~~ nonrealized~~ node~ N
+ & d, More~ nodes~~ to~ realize?
+ )( r, Realize~ N~~ with~ {\tt\char92PutNode}
+ & o, Done
+ )()
+\ProjectToRow(0) \EntryExit(0,0,-1,0) \PutNode(0..0)
+\ProjectToRow(2) \MarkLoc(A)
+\ProjectToRow(1) \EntryExit(-1,0,1,0) \PutNode(1..0)
+\Move(20,0) \PutNode(1..1) \Move(20,0)
+\EntryExit(-1,0,0,0) \PutNode(1..2)
+\ProjectToRow(0) \EntryExit(0,0, 0,0) \PutNode(0..1)
+\ProjectToRow(2) \EntryExit(0,0,-1,0) \PutNode(2..1)
+\MarkLoc(B) \CSeg[0.5]\Move(B,A) \PutNode(2..0)
+\ArrowHeads(1) \Edge(0..0,0..1) \Edge(0..1,1..2)
+ \Edge(1..2,1..1) \EdgeLabel(--Yes--)
+ \Edge(1..2,2..1) \EdgeLabel(--No--)
+\Edge(1..1,1..0) \VHEdge(1..0,2..0)
+\EdgeFrom(2..0,1,0,1..2)
+|Close>>>
+
+\begingroup
+ \def\startInput{}
+ \def\endInput{}
+
+\Ex{\tex}{}{newD}
+
+\<<<
+|Open
+\Define\DefNd(1){
+ \DefNode\RectNode(\Val\I)(--#1--)
+ \AddNodeDim(\Val\I) \I+1; }
+\Define\D(1){
+ \IF \EqText({},{#1}) \THEN \Define\g{}
+ \ELSE \ZeroNodesDim \J=-1;
+ \Table\x{#1} \x(0,99){\J+1; \DefNd}
+ \T=\J; \T*15; \T+\WidthX; \T/\F;
+ \Move(0,-\MaxY) \MarkLoc(a) \Move(\Val\T,0)
+ \K=\I;
+ \Do(0,\Val\J){ \K-1; \PutNode(\Val\K) \Move(-15,0) }
+ \MoveToLoc(a) \Move(0,-\MaxY) \Move(0,-15)
+ \FI \g }
+\Define\G(1){\I=0; \EntryExit(1,0,-1,0)
+ \Define\g{\D} \Define\F{#1} \g}
+
+\Draw
+\G(2)(first & diagram)
+ (centers & of~~rows~~on & vertical~~line )
+ (distance~=~15 & between~~rows)
+ ()
+\Table\x{0,2 & 0,3 & 1,3 & 1,4 & 2,5 & 3,5 & 3,6 & 4,6}
+\x(0,99){\Edge}
+\EndDraw
+
+\Draw\Move(0,-15)
+\G(1)(new~diagram)
+ (left~~margins & for~rows) ()
+\Edge(0,1) \Edge(1,2) \Edge(2,0)
+\EndDraw
+
+\Draw
+\Move(0,-15)
+\G(10000)(new~diagram)
+ (right~margins & for~~rows) ()
+\Edge(0,1) \Edge(1,2) \Edge(2,0)
+\EndDraw
+|Close>>>
+
+
+\Ex{\tex}{}{newE}
+
+\<<<
+|Open
+\Define\DefNd(1){
+ \DefNode\RectNode(\Val\I..\Val\J)(--#1--)
+ \AddNodeDim(\Val\I..\Val\J) }
+\Define\DefG(1){
+ \IF \EqText({},{#1}) \THEN \Define\g{\PutG}
+ \ELSE \ZeroNodesDim \J=-1;
+ \Table\x{#1} \x(0,99){\J+1; \DefNd}
+ \Indirect\let<\Val\I.width>=\WidthX
+ \Indirect\edef<\Val\I.size>{\Val\J}
+ \T=\J; \T*\Sx; \T+\WidthX;
+ \IF \GtDec(\T,\Q) \THEN \Q=\T; \FI
+ \Move(0,-\MaxY) \MarkLoc(\Val\I)
+ \Move(0,-\MaxY) \Move(0,-\Sy) \I+1;
+ \FI \g }
+\Define\PutG(1){ \I-1; \EntryExit(-1,0,1,0)
+ \Do(0,\Val\I){ \MoveToLoc(\DoReg)
+ \R=\Q; \Indirect{\R-}<\DoReg.width>;
+ \Indirect{\J=}<\DoReg.size>; \K=\J;
+ \DiagType
+ \IF \GtDec(\Q,\T) \THEN
+ \K+2; \R/\K; \Move(\Val\R,0)
+ \ELSE
+ \IF \GtInt(\J,0) \THEN \R/\K; \FI
+ \FI
+ \I=\DoReg;
+ \Do(0,\Val\J){ \J=\DoReg;
+ \PutNode(\Val\I..\Val\J) \Move(\Val\R,0) }
+ }
+ \Table\x{#1} \x(0,99){\Edge} }
+\Define\G{ \I=0; \Q=0;
+ \Define\g{\DefG} \g}
+
+\Define\FillDiagram{
+ \Define\DiagType{\T=\Q;}
+ \G}
+\Define\MarginsDiagram{
+ \Define\DiagType{\T=\J; \T*\Sx; \Indirect{\T+}<\DoReg.width>;}
+ \G}
+\Define\HVSpaces(2){ \Define\Sx{#1} \Define\Sy{#2} }
+\HVSpaces(15,15)
+
+\Draw
+\FillDiagram(Fill & Diagram)
+ (fixed & distances & between~~rows)
+ (uniform & spaces &within~~each &row)
+ ()
+ ( 0..0,1..0 & 0..0,1..1 & 0..1,1..1 & 0..1,1..2
+ & 1..0,2..0 & 1..0,2..1 & 1..1,2..1 & 1..1,2..2
+ & 1..2,2..2 & 1..2,2..3)
+\EndDraw
+
+\Draw \HVSpaces(25,15)
+\MarginsDiagram(Margins & Diagram)
+ (fixed & distances &between~~rows)
+ (uniform~~spaces&between~nodes&within~~each~row)
+ ()
+ ( 0..0,1..0 & 0..0,1..1 & 0..1,1..1 & 0..1,1..2
+ & 1..0,2..0 & 1..0,2..1 & 1..1,2..1 & 1..1,2..2
+ & 1..2,2..2 )
+
+\EndDraw
+|Close>>>
+
+\endgroup
+\noindent\dotfill\
+
+End new commands for setting spread diagrams (end of ch 17)
+
+\noindent\dotfill\
+
+
+
+\Ex{\tex}{Commutative diagram in last example of section 18.3}{CM}
+
+\<<<
+|Open
+\GridDiagramSpec()(\MyEdge)
+\Define\L(4){,+#1..+#2\,L\,#3\,#4}
+\Define\D(4){,+#1..+#2\,D\,#3\,#4}
+\Define\MyEdge(5){
+ \IF \EqText(#3,D) \THEN\EdgeSpec(D)
+ \ELSE \EdgeSpec(L) \FI
+ \IF \EqText(#1,#2) \THEN
+ \RotateTo(#4) \CycleEdge(#1)
+ \EdgeLabel(--$#5$--)
+ \ELSE\Edge(#1,#2)
+ \IF \EqText(,#4) \THEN \EdgeLabel(--$#5$--)
+ \ELSE \EdgeLabel[#4](--$#5$--) \FI
+ \FI}
+\ArrowHeads(1)
+\GridDiagram(3,3)()()({
+& T \D(0,1,,f) \D(2,0,,h) & N \L(2,0,,\sigma)//
+S \L(0,0,180,t) \L(-1,1,,f) \L(1,1,+,g\circ f)//
+& W \L(0,1,,f) & X \D(0,0,-45,r)//})
+|Close >>>
+
+
+\Ex{\tex}{Second example in section 20.2}{sec202}
+
+\<<<
+|Open
+\NewNode(\MyNode,\MoveToRect){
+ \Move(-24,-8) \DrawRect(48,16)
+ \Move(16,0) {\Line(0,16)}
+ \Move(16,0) \Line(0,16) }
+\Define\MyEdge(2){
+ \CSeg\FindSign(#1,#2)
+ \EdgeAt(#1,\sign 0.66,0,#2,0,1)}
+\Define\FindSign(2){
+ \IF \GtDec(#1,0) \THEN
+ \Define\sign{}
+ \ELSE \Define\sign{-} \FI}
+\TextNode(2){ \Text(--$#2$--)
+ \IF \EqInt(#1,0) \THEN {
+ \Move(-16,0) \Text(--$\Lambda$--)
+ \Move(32,0) \Text(--$\Lambda$--)
+ }\FI }
+\ArrowHeads(1)
+\TreeSpace(D,10,20)
+\TreeSpec(\MyNode)()(\MyEdge)
+\Tree()(2,2,A// 0,0,B&2,2,C// 2,2,D&0,0,E// 0,0,F&0,0,G//)
+|Close >>>
+
+
+\Ex{\tex}{Last example in section 20.2}{LR}
+
+\<<<
+|Open
+\GridDiagramSpec(\RNode)(\MyEdge)
+\GridSpace(10,10) \ArrowSpec(F,5,3,3)
+\ArrowHeads(1) \CycleEdgeSpec(-30,20)
+\NewNode(\RNode,\MoveToOval){
+ \GetNodeSize \Va+4; \Vb+4;
+ \SetMinNodeSize \Move(0,3)
+ \DrawOval(\Val\Va,\Val\Vb) }
+\Define\MyEdge(3){
+ \IF \EqText(#1,#2) \THEN
+ \RotateTo(45) \LabelPos(+0.5;,3)
+ \CycleEdge(#1)
+ \ELSE \DSeg\Q(#1,#2)
+ \IF \GtDec(\Q,180) \THEN
+ \LabelPos(+0.4;,3) \ELSE \LabelPos(0.5;,3)
+ \FI \Edge(#1,#2) \FI \EdgeLabel(--$#3$--) }
+\baselineskip=9pt \Define\NEXT(3){,#1..#2\,#3}
+\def\/#1/#2.#3;{\hbox{$\scriptstyle#1\rightarrow #2\cdotp#3$}~~}
+\GridDiagram(3,3)()()({
+& \/S'/ S. ; \/A / S.a; $I_1$ \NEXT(+0,+1,a)
+& \/A / Sa.; $I_2$
+// \/S'/ .S ; \/S / .AS; \/ / .b ;
+ \/A / .Sa; \/ / .a ; $I_0$ \NEXT(-1,+1,S) \NEXT(+0,+1,A)
+ \NEXT(+1,+1,b) \NEXT(+1,+0,a)
+& \/S /A.S ; \/S /.AS ; \/ /.b ;
+ \/A /.Sa ; \/ /.a ; $I_3$ \NEXT(+0,+1,S) \NEXT(+0,+0,A)
+& \/A/ S.a ; $I_4$ \NEXT(+1,+0,a)
+//
+ \/A/a.; $I_5$
+& \/S/ b. ; $I_6$
+& \/A/ Sa. ; $I_7$
+//
+})
+|Close >>>
+
+
+
+\Ex{\tex}{Last example in chapter 20}{TM}
+
+
+\<<<
+|Open
+\NewCIRCNode(\StateNode,104,)
+\NewCIRCNode(\AStateNode,104,102)
+\Define\StateAt(3){ \MoveTo(#2,#3)
+ \StateNode(#1)(--$q_{#1}$--)}
+\Define\AStateAt(3){\MoveTo(#2,#3)
+ \AStateNode(#1)(--$q_{#1}$--)}
+\LabelSpec(4){\PictLabel{
+ { \Move(1,-5) \Line(8,20) }
+ { \Move(4,10) { \EntryExit(1,0,0,0)
+ \Text(--\strut$#1$--) } \Move(6,0)
+ \EntryExit(-1,0,0,0) \Text(--\strut$#3$--) }
+ { \EntryExit( 1,0,0,0) \Text(--\strut$#2$--) }
+ \Move(6,0) \EntryExit(-1,0,0,0) \Text(--\strut$#4$--) }}
+\DiagramSpec(\StateAt&\AStateAt&\TransEdge) \ArrowHeads(1)
+\Diagram( 0,0,0 & 1,80,0 )(2,80,-60)(
+ 0,0,90,{a,B,+1,a{,+}1} &
+ 0,1, {a,B,+1,a{,+}1}, {b,B,0,B{,-}1} &
+ 1,2, {|DEFEND\$,B,0,B{, }0}, )
+|Close >>>
+
+
+
+
+
+\Lib{ProTeX and AlProTex} \def\files{\fileP} \def\LLL{>>>}
+
+\let\startInput=\empty
+
+\let\endInput=\empty
+
+NOTE. The La\TeX{} files of this part put the
+{\tt\string\AlProTex....} command after the
+{\tt\string\begin\string{document\string}} command. This is not a nice
+style for files.
+
+\Exr{22}2{2a}
+\<<<
+|Open
+\AlProTex{awk,<<<|LLL,@,%
+ list,title,[]}
+\catcode`\@=0
+
+An Awk program for deriving
+the distribution of words.
+
+@<dist@><<<
+BEGIN {print"words\t lines"}
+@<count the words@>
+END { i=0
+ while (i<=m)
+ {if (c[i]>0)
+ {print i "\t " c[i]}
+ i=i+1 }}
+|LLL
+
+NF is a built-in variable
+that holds the number of
+words in the current input
+line.
+
+@<count the words@><<<
+{ c[NF]=c[NF]+1
+ {if (NF>m) m=NF} }
+|LLL \OutputCode@<dist@>
+|Close >>>
+
+
+\Exr{22}2{2b}
+\<<<
+|Open
+\AlProTex{awk,<<<|LLL,@,%
+ list,title,[]}
+
+An Awk program for deriving
+the distribution of words.
+
+\<dist\><<<
+BEGIN {print"words\t lines"}
+@<count the words@>
+END { i=0
+ while (i<=m)
+ {if (c[i]>0)
+ {print i "\t " c[i]}
+ i=i+1 }}
+|LLL
+
+NF is a built-in variable
+that holds the number of
+words in the current input
+line.
+
+\<count the words\><<<
+{ c[NF]=c[NF]+1
+ {if (NF>m) m=NF} }
+|LLL \OutputCode\<dist\>
+|Close >>>
+
+
+\Exr{22}2{3}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,%
+ title,list,[]}
+
+\<prog\><<<
+PROGRAM prog;|LLL
+
+\<body\><<<
+{ comment } |LLL
+
+\<prog\><<<
+BEGIN
+ \<body\>
+END.|LLL
+
+\OutputCode\<prog\>
+|Close >>>
+
+\Exr{22}2{4a}
+
+\<<<
+|Open
+\AlProTex{p,list,%
+ <<<|LLL,title,[]}
+
+\<\><<<
+PROGRAM prog;|LLL
+
+\<body\><<<
+{ comment } |LLL
+
+\<\><<<
+BEGIN
+ \<body\>
+END.|LLL
+
+\OutputCode\<\>
+|Close >>>
+
+\Exr{22}2{4b}
+
+\<<<
+|Open
+\AlProTex{p,%
+ <<<|LLL,title,[]}
+
+\<\><<<
+PROGRAM prog;|LLL
+\ShowCode-\<\>
+
+\<body\><<<
+{ comment } |LLL
+\ShowCode\<body\>
+
+\<\><<<
+BEGIN
+ \<body\>
+END.|LLL
+\ShowCode\<\>
+\OutputCode\<\>
+|Close >>>
+
+\Exr{22}2{4c}
+
+\<<<
+|Open
+\AlProTex{p,%
+ <<<|LLL,title,[]}
+
+\<\><<<
+PROGRAM prog;|LLL
+
+\<body\><<<
+{ comment } |LLL
+
+\<\><<<
+BEGIN
+ \<body\>
+END.|LLL
+
+\OutputCode\<\>
+|Close >>>
+
+
+
+\Exr{22}2{5a}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,%
+ title,list,[]}
+
+\<myprog\><<<
+PROGRAM prog;|LLL
+
+\<body\><<<
+{ comment } |LLL
+
+\<myprog\><<<
+BEGIN
+ \<body\>
+END.|LLL
+\OutputCode\<myprog\>
+
+|Close >>>
+
+\Exr{22}2{5b}
+
+\<<<
+|Open
+\AlProTex{p,title,list,[]}
+
+\<myprog\>{PROGRAM prog;}
+
+\<body\>{ \{ comment \} }
+
+\<myprog\>{BEGIN
+ \<body\>
+END.}
+\OutputCode\<myprog\>
+
+|Close >>>
+
+
+
+
+\Exr{22}2{6a}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,[],%
+ title,list}
+\<myprog\><<<
+PROGRAM prog;
+BEGIN
+ \<body\>
+END.|LLL
+
+\<body\><<<
+{ comment: \\@||` } |LLL
+|Close >>>
+
+\Exr{22}2{6b}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,[],%
+ title,list,@}
+\<myprog\><<<
+PROGRAM prog;
+BEGIN
+ @<body@>
+END.|LLL
+
+\<body\><<<
+{ comment: \@@||` } |LLL
+|Close >>>
+
+\Exr{22}2{6c}
+
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,[],%
+ title,list,||}
+\<myprog\><<<
+PROGRAM prog;
+BEGIN
+ ||<body||>
+END.|LLL
+
+\<body\><<<
+{ comment: \@||||` } |LLL
+|Close >>>
+
+
+\Exr{22}2{6d}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,[],%
+ title,list,`}
+\<myprog\><<<
+PROGRAM prog;
+BEGIN
+ `<body`>
+END.|LLL
+
+\<body\><<<
+{ comment: \@||`` } |LLL
+|Close >>>
+
+\Exr{22}2{7}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,[],%
+ title,list,||}
+
+\<temp\><<<
+\<prog\><<<
+PROGRAM prog;
+BEGIN
+ ||||<body||||>
+END.>||empty>>
+
+\<body\><<<
+{comment: \@||||||||} >||empty>>
+
+\OutputCode\<prog\> |LLL
+
+\OutputCode[prg]\<temp\>
+\input temp.prg
+|Close >>>
+
+
+\Exr{22}2{8a}
+
+\<<<
+|Open
+\Code\myprog{my
+ program}{PROGRAM prog;}
+\ShowCode-\myprog
+
+\AppendCode\myprog{BEGIN
+ \body
+END.}
+\Code\body{body}{}
+\ShowCode-\myprog
+
+\AppendCode\body{\{comment\}}
+\ShowCode\body
+
+Code of title \myprog{}
+linearized within
+the paragraph:
+`\ShowCode-\myprog'.
+
+\OutputCode\myprog
+|Close >>>
+
+\Exr{22}2{8b}
+
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,list,@}
+
+\Code\myprog{my program}<<<
+PROGRAM prog;|LLL
+
+\Code\body{body}<<<
+|LLL
+\AppendCode\myprog<<<
+BEGIN
+ @body
+END.|LLL
+
+\AppendCode\body<<<
+ {comment} |LLL
+
+Code of title \myprog{}
+linearized within the
+paragraph:
+`\ShowCode-\myprog'.
+
+\OutputCode\myprog
+|Close >>>
+
+
+\Exr{22}2{9}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,%
+ title,list,[]}
+
+\<myprog\><<<
+PROGRAM prog;|LLL
+
+\<body\><<<
+{ comment } |LLL
+
+\<myprog\><<<
+BEGIN
+ \<body\>
+END.|LLL
+
+\OutputCode\<myprog\>
+|Close >>>
+
+\Exr{22}2{10a}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,title,%
+ list,[],enumerate}
+
+See lines \RefLine[*].
+
+\<myprog\><<<
+PROGRAM prog;\TagLine[*] |LLL
+
+\<body\><<<
+{comment: see \RefLine[*]}|LLL
+
+\<myprog\><<<
+BEGIN
+ \<body\> \TagLine[*] |LLL
+
+\ResetLineCount
+\<myprog\><<<
+END.|LLL \OutputCode\<myprog\>
+|Close >>>
+
+\Exr{22}2{10b}
+
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,title,%
+ list,[]}
+\def\CodeRef[#1]{\Ref{#1}}
+\def\CodeTag[#1][#2]{%
+ \Tag{#1}{#2}}
+
+See lines \Ref{*}.
+
+\<myprog\><<<
+PROGRAM prog;\CodeTag[*][1]|LLL
+
+\<body\><<<
+{comment: see \CodeRef[*]}|LLL
+
+\<myprog\><<<
+BEGIN
+ \<body\> \CodeTag[*][2]|LLL
+
+\ResetLineCount \Tag{*}{3}
+\<myprog\><<<
+END.|LLL \OutputCode\<myprog\>
+|Close >>>
+
+
+
+
+\Exr{22}2{11}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,title,%
+ list,[],ShowIndex}
+
+\<myprog\><<<
+PROGRAM prog;|LLL
+
+\<body\><<<
+{ comment } |LLL
+\TextIndex{Tracing}
+\SecIndex{***}
+
+\<myprog\><<<
+BEGIN
+ \<body\>
+END.|LLL
+
+\def\BeforeIndex{Index}
+\ShowIndex
+|Close >>>
+
+
+ \Exr{22}2{12}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,%
+ title,[],ShowTop}
+
+\<my prog\><<<
+PROGRAM prog;
+BEGIN \<body\>
+END.|LLL
+\<body\><<<
+{ comment 1}
+|LLL
+\<body\><<<
+\<subbody\>
+|LLL
+\<subbody\><<<
+{ comment 2 } |LLL
+\ShowTop\<body\>
+
+\def\ShowSep{(* ***** *)\par}
+\ShowTop\<body\>
+|Close >>>
+
+ \Exr{22}2{13}
+
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,title,%
+ list,[],NoShow}
+
+First piece of text.
+
+\<myprog\><<<
+PROGRAM prog; |LLL
+
+\ShowOff Second piece of text.
+
+\<body\><<<
+{ comment } |LLL
+
+\Note Third piece of
+text. \EndNote\ShowOn
+
+\<myprog\><<<
+BEGIN
+ \<body\>
+END.|LLL
+
+Last piece of text.
+|Close >>>
+
+ \Exr{22}2{14}
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,title,%
+ list,ShowIndex,ClearCode}
+
+Chapter 1
+
+\<progA\><<<
+PROGRAM prog;
+|LLL
+\<progA\><<<
+BEGIN
+ { comment 1 }
+END.|LLL \ShowIndex
+ \ClearCode
+\vfil\break Chapter 2
+
+\<progB\><<<
+PROGRAM prog;
+|LLL
+\<progB\><<<
+BEGIN
+ { comment 2 }
+END.|LLL \ShowIndex
+|Close >>>
+
+\begingroup
+\def\tex{tex}\let\op=\ForTex \Exr{22}2{15}\par\nobreak
+
+\<<<
+\hsize=2.5in \noindent{\bf
+LITERATE PROGRAM IN WEB}
+\medskip We compute a
+two-dimensional view of a
+three-dimensional point.
+
+@* The mapping. The view
+ {\tt (x,y)} is on the
+ {\tt Z=0} plane.
+@<map(x,y) := mapping of
+ (X,Y,Z)@>=
+ x := X * D DIV (D + Z);
+
+@ The viewer is located
+ at {\tt (0,0,-D)}.
+@<CONST + VAR @>=
+ CONST D=100;
+ VAR X {x}, Z: INTEGER;
+
+@
+@<map...@>=
+ y := Y * D DIV (D + Z);
+
+@
+@<CON...@>=Y {y}: INTEGER;
+
+@* Main program.
+@p PROGRAM D2view;
+ @<CON...@>
+ BEGIN read(X,Y,Z);
+ @<map...@>
+ write(x,y)
+ END.
+\bye>>>
+\endgroup
+
+
+\Ex{\tex}{NEW OPTION `[[]]' FOR {\tt\char92}AlProTex}{NewAlPrOptionA}
+
+An extension of `[]' which frame also the code fragments.
+
+\<<<
+|Open
+\AlProTex{p,<<<|LLL,%
+ title,list,[[]]}
+
+Foooo...
+
+\<myprog\><<<
+PROGRAM prog;|LLL
+
+Foooo...
+
+\<body\><<<
+{ comment } |LLL
+
+Foooo...
+
+\<myprog\><<<
+BEGIN
+ \<body\>
+END.|LLL
+
+Foooo...
+
+\OutputCode\<myprog\>
+|Close >>>
+
+\begingroup
+\def\tex{latex}\let\op=\ForTex
+
+
+\Ex{\tex}{NEW OPTION `basic' FOR {\tt\char92}AlProTex}{NewAlPrOptionB}
+
+
+An option that requires compilation by latex. The following
+are the only available commands.
+
+
+A. References to code segments: \hfill {\tt\string\<code title\string\>}
+
+B. Definitions of code fragments: \hfill {\tt\string\<code title\string\><<<
+
+\hfill code fragment>>>}
+
+B. Output file of code (`[{\it extension}]' is optional):
+ \hfill{\tt\string\o[{\it extention}]\string\<code title\string\>}
+
+
+C. The character `{\tt\char92}' \hfill{\tt\string\\}
+
+D. End of source program \hfill{\tt\string\e}
+
+E. Logical partitioning of prose (chapters, sections, subsections, and verbatim):
+\hfill\hbox{\tt\string\c, \string\s, \string\u, \string\v{$\cdots$}{\char92}}
+
+\noindent\phantom{E.} A title
+must be delimited by an empty line.
+
+F. Reference to {\tt\string\ClearCode} \hfill {\tt\string\c}
+
+
+
+
+\<<<
+\input ProTex.sty
+\AlProTex{foo,basic}
+
+\cFirst Chapter
+
+Foooo...
+
+\sSsssss...
+
+Foooo.
+
+\uUuuuuuu.....
+
+\vVerbatim
+verbatim\
+\<myprog\><<<
+PROGRAM prog;|LLL
+\cCccc...
+
+Foooo...
+
+\<body\><<<
+{ comment } |LLL
+
+Foooo...
+
+\<myprog\><<<
+BEGIN
+ \<body\>
+END.|LLL
+
+Foooo...
+
+\o\<myprog\>
+
+\e
+ >>>
+
+\Ex{\tex}{variant of `basic'}{NewAlPrOptionC}
+
+The options `{\tt @}', `{\tt|}', and `{\tt`}' ask that the listed
+characters will be used instead of `{\tt\char92}', respectively,
+within the commands of option `{\tt basic}'.
+
+\<<<
+\input ProTex.sty
+\AlProTex{foo,@,basic}
+
+@cFirst Chapter
+
+Foooo...
+
+@sSsssss...
+
+Foooo.
+
+@uUuuuuuu.....
+
+@vVerbatim
+verbatim@
+
+@<myprog@><<<
+PROGRAM prog;|LLL
+@cCccc...
+
+Foooo...
+
+@<body@><<<
+{ comment } |LLL
+
+Foooo...
+
+@<myprog@><<<
+BEGIN
+ @<body@>
+END.|LLL
+
+Foooo...
+
+@o@<myprog@>
+
+@e
+>>>
+
+\endgroup
+
+\newpage \OutputCode[me]\execute
+
+
+ On a Unix system containing the xdvi application, the instructions of
+ the following file can be executed with the compound command
+ `chmod 777 execute.me ; execute.me'.
+
+ \bigskip
+ \ShowFile{execute.me}
+
+\write16{<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}
+\write16{<< Please review the document <<}
+\write16{<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}
+
+\bye
diff --git a/graphics/dratex/README b/graphics/dratex/README
new file mode 100644
index 0000000000..865e121ca3
--- /dev/null
+++ b/graphics/dratex/README
@@ -0,0 +1,2 @@
+Documentation can be found at
+ http://www.cse.ohio-state.edu/~gurari/systems.html
diff --git a/graphics/dratex/TeXProject.sty b/graphics/dratex/TeXProject.sty
new file mode 100644
index 0000000000..79bcbb789f
--- /dev/null
+++ b/graphics/dratex/TeXProject.sty
@@ -0,0 +1,2678 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2001-02-14-12:58
+% TeXProject.sty %
+% Copyright (C) 1995 Stephane Bressan & Eitan M. Gurari %
+% %
+% This program can redistributed and/or modified under %
+% the terms of the LaTeX Project Public License %
+% Distributed from CTAN archives in directory %
+% macros/latex/base/lppl.txt; either version 1 of the %
+% License, or (at your option) any later version. %
+% %
+% However, you are allowed to modify this program %
+% without changing its name, if you modify its %
+% signature. Changes to the signature can be introduced %
+% with a directive of the form %
+% \message{signature} %
+% %
+% Stephane.Bressan@ecrc.de gurari@cse.ohio-state.edu %
+% http://www.cse.ohio-state.edu/~gurari/ %
+% Needs: %
+% DraTex.sty and AlDraTex.sty %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\immediate\write-1{version 2001-02-14-12:58}
+\ifx\Draw\UnDefined
+ \def\DrawRect{\input DraTex.sty }
+ \expandafter\DrawRect
+\fi
+\ifx\Tree\UnDefined
+ \def\Tree{\input AlDraTex.sty }
+ \expandafter\Tree
+\fi
+\expandafter\edef\csname :RestoreCatcodes\endcsname{%
+ \catcode`\noexpand\noexpand\noexpand \^=\the\catcode`\^%
+}
+\catcode`\^=7
+\expandafter\edef\csname :RestoreCatcodes\endcsname{%
+ \csname :RestoreCatcodes\endcsname
+ \catcode`\noexpand \_=\the\catcode`\_%
+ \catcode`\noexpand \ =\the\catcode`\ %
+ \catcode`\noexpand \&=\the\catcode`\&%
+ \catcode`\noexpand :=\the\catcode`:%
+ \catcode`\noexpand \^^M=\the\catcode`\^^M%
+ \let\expandafter\noexpand
+ \csname:RestoreCatcodes\endcsname=\noexpand\undefined}
+\catcode`\^^M=9 \catcode`\ =9 \catcode`\&=13 \relax
+ \expandafter
+ \def\csname reseffB:\endcsname#1{\csname reseffC:\endcsname#1:}
+\expandafter
+ \def\csname reseffC:\endcsname#1:#2:{
+ \csname reseff:\endcsname{#1}{#2}}
+ \catcode`\:=11 \relax
+ \newif\ifpwarnn:
+\def\warningsoff{\pwarnn:false}
+\def\warningson{\pwarnn:true}
+\warningson
+\def\pwarn:#1{\ifpwarnn: \immediate\write16{l.\the\inputlineno
+ \space--- warning ---\space #1}\fi}
+\def\whitedef:#1{
+ \expandafter\def\csname #1\endcsname{\bgroup
+ \ignorewhite: \csname #1:X\endcsname}
+
+ \expandafter\def\csname #1:X\endcsname##1{\egroup
+ \expandafter\ifx\csname##1 :type\endcsname\relax \else
+ \pwarn:{Redefining\space##1?}
+ \fi
+ \edef\items:{\item:{##1}\items:}
+ \expandafter\let\csname##1 :bool\endcsname=\empty
+ \expandafter\edef\csname##1 :prjid\endcsname{
+ \expandafter\noexpand\csname\projectid: :minmax\endcsname}
+ \csname #1:Y\endcsname{##1}}
+ \expandafter\def\csname #1:Y\endcsname}
+
+\def\ignorewhite:{ \ifnum \the\catcode`\ =9 \else
+ \catcode`\ =9 \catcode`\^^M=9 \catcode`\^^I=9 \relax \fi }
+\def\forbiencomm:{\pwarn:{\string\newproject\space missing}}
+\def\defcom#1{
+ \expandafter\def\csname#1\endcsname{
+ \bgroup \ignorewhite: \csname#1:A\endcsname}
+ \expandafter\def\csname#1:A\endcsname##1{\egroup
+ \csname#1:B\endcsname{##1}}
+ \expandafter\def\csname#1:B\endcsname}
+\def\verify:::#1{
+ \expandafter\ifx\csname#1 :title\endcsname\relax \pwarn:{#1?} \fi
+ \csname#1 :prjid\endcsname
+%
+}
+\IntVar\I:I \IntVar\J:J \IntVar\K:K
+\DecVar\Q:Q \DecVar\R:R \DecVar\T:T
+
+ \def\tasknode:{0}
+\def\milestonenode:{1}
+\def\projectnode:{2}
+\whitedef:{DEFTASK:}#1#2{
+ \expandafter\edef\csname#1 :type\endcsname{\tasknode:}
+ \expandafter\def\csname#1 :title\endcsname{#2}
+ \bgroup \ignorewhite: \deftaskA:{#1}}
+
+\def\deftaskA:#1#2#3#4#5{\egroup
+ \expandafter\edef\csname#1 :date1\endcsname{#2}
+ \expandafter\edef\csname#1 :date2\endcsname{#3}
+ \def\temp:{#4}
+\ifx\temp:\empty
+ \pwarn:{`#1'\space has\space no\space contributions}
+\else
+ \getlist:{#1 :eff}{#4}\reseffA:
+ \let\reseff:=\relax
+ \let\reseffA:=\reseffB:
+ \expandafter\edef\csname#1 :eff\endcsname{\csname#1 :eff\endcsname}
+\fi
+
+ \setprev:{#1}{#5}
+ \deftaskB:{#1}}
+
+\def\deftaskB:#1#2{
+ \expandafter\def\csname#1 :desc\endcsname{#2}
+ \trace:{#1} }
+\whitedef:{DEFMILESTONE:}#1#2#3{
+ \expandafter\edef\csname#1 :type\endcsname{\milestonenode:}
+ \expandafter\def\csname#1 :title\endcsname{#2}
+ \expandafter\edef\csname#1 :date\endcsname{#3}
+ \bgroup \ignorewhite: \defmilestoneA:{#1}}
+
+\def\defmilestoneA:#1#2{\egroup
+ \setprev:{#1}{#2}
+ \defmilestoneB:{#1}}
+
+\def\defmilestoneB:#1#2{
+ \expandafter\def\csname#1 :desc\endcsname{#2}
+ \trace:{#1}}
+\whitedef:{DEFPROJECT:}#1#2{
+ \expandafter\edef\csname#1 :type\endcsname{\projectnode:}
+ \edef\projects:{{#1}{\projects:}}
+ \expandafter\def\csname#1 :title\endcsname{#2}
+ \bgroup \ignorewhite: \defprojectA:{#1}}
+
+\def\defprojectA:#1#2#3{\egroup
+ \getlist:{#1 :under}{#2}\utask:
+\def\utask:##1{%
+ \sapply{:temp,merge,
+ {\expandafter \ifx \csname ##1:ancs\endcsname\relax\else
+ \csname ##1:ancs\endcsname\fi},{#1}}
+ \expandafter \let \csname ##1: ancs\endcsname= \:temp:mkls
+ \let\:temp:mkls =\:UnDef
+ }
+\csname#1: under\endcsname
+
+
+ \setprev:{#1}{#3}
+ \defprojectB:{#1}}
+
+\def\defprojectB:#1#2{
+ \expandafter\def\csname#1 :desc\endcsname{#2}
+ \trace:{#1}}
+\def\setproject:data#1{
+ \expandafter\ifx\csname#1 :type\endcsname\relax
+ \pwarn:{Missing\space `#1'}
+ \fi
+ \ifnum\csname#1 :type\endcsname=\projectnode:\relax
+ \expandafter\ifx\csname#1 :date1\endcsname\relax
+ \def\minY:{10000} \def\minM:{10000} \def\minD:{10000}
+\def\maxY:{0} \def\maxM:{0} \def\maxD:{0}
+
+ \let\utask:=\utask:I
+\csname#1 :under\endcsname
+
+ \expandafter\edef\csname#1 :date1\endcsname{\minD:/\minM:/\minY:}
+\expandafter\edef\csname#1 :date2\endcsname{\maxD:/\maxM:/\maxY:}
+
+ \fi \fi
+}
+
+ \def\newproject{
+ \let\item:=\relax
+\def\items:{}
+\tcount:=0\relax
+\let\deftask=\DEFTASK:
+\let\defmilestone=\DEFMILESTONE:
+\let\defproject=\DEFPROJECT:
+\let\restoregal::=~
+\def\restoregal:{\let~=\restoregal::}
+\def\projects:{}
+\def\verify:##1{}
+\def\verify::##1{}
+\let\minmaxdates=\MINMAXDATES:
+\MINMAXDATES:{1/1/0//31/12/99}
+
+}
+\def\endprojectdefA:{ \let\deftask=\forbiencomm:
+\let\defmilestone=\deftask
+\let\defproject=\deftask
+\let\minmaxdates=\forbiencomm:
+
+}
+\endprojectdefA:
+
+\def\endnewproject{
+ \endprojectdefA: \def\item:##1{
+ \let\prev:=\checkmemb: \csname##1 :prev\endcsname
+ \let\utask:=\checkmemb: \csname##1 :under\endcsname
+}
+\items:
+
+\ifx \projects:\empty\else
+ \expandafter\setproject:\projects:
+ \expandafter\verify:dates:\projects:
+\fi
+
+ \def\item:##1{ \expandafter\let\csname##1 :bool\endcsname=\UnDef: }
+\items:
+\let\item:=\UnDef:
+\let\items:=\UnDef:
+\restoregal:
+\let\projects:=\UnDef:
+\let\verify:=\verify:::
+\let\verify::=\verify:::
+
+ \I:I=\projectid:; \I:I+1; \edef\projectid:{\Val\I:I}
+}
+
+ \def\filtercommand{
+ \def\filtercommand:##1{
+ \def\putcommand{##1}
+ \let\filtercommand:=\empty
+} }
+\let\filtercommand:=\empty
+\defcom{name}#1{ \verify:{#1}
+ \expandafter\expandafter\expandafter\filtercommand:
+ \expandafter\expandafter\expandafter{\csname#1 :title\endcsname }}
+\defcom{annotation}#1{ \verify:{#1}
+ \expandafter\expandafter\expandafter\filtercommand:
+ \expandafter\expandafter\expandafter{\csname#1 :desc\endcsname}}
+\defcom{resource}#1{{ \verify:{#1}
+\ifnum\csname#1 :type\endcsname=\milestonenode:\space
+ \pwarn:{`#1'\space has\space no\space resources} ???
+\fi
+\def\sepitems:{\def\sepitems:{\append:Def\all:des{,\space}}}
+\let\reseff:=\reseffI: \let\all:des=\empty
+\traversedo:{#1}\listrsrc:
+\expandafter\def\expandafter\all:des
+ \expandafter{\expandafter\filtercommand:\expandafter{\all:des}}
+ \expandafter}\all:des}
+\defcom{effort}#1{{ \def\temp:##1,##2,##3//{
+ \def\first:{##1} \def\second:{##2}
+}
+\temp:#1,,// \verify:{\first:}
+\ifnum\csname\first: :type\endcsname=\milestonenode:\space
+ \pwarn:{`#1'\space has\space no\space resources} ???
+ \let\:temp=\empty
+\else
+ \findeffort:\first:\second:
+ \edef\:temp{\noexpand\filtercommand:{\temp:}}
+\fi
+ \expandafter}\:temp}
+\defcom{contributions}#1{{ \verify:{#1}
+\ifnum\csname#1 :type\endcsname=\milestonenode:\space
+ \pwarn:{`#1'\space has\space no\space contributions} ???
+\else \findthecontri:{#1} \fi
+ }}
+\defcom{start}#1{ \verify:{#1} \startfinish:{#1}1 }
+
+\defcom{finish}#1{\verify:{#1} \startfinish:{#1}2 }
+
+\def\startfinish:#1#2{
+ \ifnum\csname#1 :type\endcsname=\milestonenode:\relax
+ \expandafter\expandafter\expandafter
+ \filtercommand: \expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter
+ \showdate:\csname#1 :date\endcsname/0/0/0//}
+ \else
+ \expandafter\expandafter\expandafter
+ \filtercommand: \expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter
+ \showdate:\csname#1 :date#2\endcsname/0/0/0//}
+ \fi }
+\defcom{apply}#1{ \apply:#1,,,,// }
+\defcom{rapply}#1{ \rapply:#1,,,,// }
+\defcom{sapply}#1{
+ \edef\:temp{\Val\I:I}
+\push:macro\:temp
+
+ \def\temp:##1,##2,##3,##4/+/-]/[{
+ \def\result:lst{##1} \let\list:op=\empty
+ \IF \EqText(##2,merge)\THEN
+ \def\list:op{\two:args#1,/+/-]/[
+\expandafter\edef\csname \result:lst :mkls\endcsname{\arg:one,\arg:two}
+\cln:res
+
+}\FI
+ \IF \EqText(##2,intersect)\THEN
+ \def\list:op{\two:args#1,/+/-]/[
+\get:result\in:both
+\cln:res
+
+} \FI
+ \IF \EqText(##2,subtract)\THEN
+ \def\list:op{\two:args#1,/+/-]/[
+\get:result\first:only
+\cln:res
+
+} \FI
+ \IF \EqText(##2,milestones)\THEN
+ \def\list:op{\one:args#1,/+/-]/[
+\let\arg:one=\arg:two
+\get:result\scr:mi
+\cln:res
+
+} \FI
+ \IF \EqText(##2,tasks)\THEN
+ \def\list:op{\one:args#1,/+/-]/[
+\let\arg:one=\arg:two
+\get:result\scr:ta
+\cln:res
+
+} \FI
+ \IF \EqText(##2,projects)\THEN
+ \def\list:op{\one:args#1,/+/-]/[
+\let\arg:one=\arg:two
+\get:result\scr:pr
+\cln:res
+
+} \FI
+ \IF \EqText(##2,after)\THEN
+ \def\list:op{\one:args#1,/+/-]/[
+\let\arg:one=\arg:two
+\get:result\scr:af
+\cln:res
+
+}\FI
+ \IF \EqText(##2,before)\THEN
+ \def\list:op{\one:args#1,/+/-]/[
+\let\arg:one=\arg:two \def\prev:########1{,########1}
+\get:result\scr:be
+\cln:res
+
+}\FI
+ \IF \EqText(##2,up)\THEN
+ \def\list:op{\one:args#1,/+/-]/[
+\let\arg:one=\arg:two
+\get:result\scr:up
+\cln:res
+
+} \FI
+ \IF \EqText(##2,down)\THEN
+ \def\list:op{\one:args#1,/+/-]/[
+\let\arg:one=\arg:two \def\utask: ########1{,########1}
+\get:result\scr:dw
+\cln:res
+
+} \FI
+ \IF \EqText(##2,sort)\THEN
+ \def\list:op{\one:args#1,/+/-]/[
+\let\arg:one=\arg:two
+\let\:temp\empty
+\get:result\scr:srt \sapply{##1,\gob:I}
+
+} \FI
+ \IF \EqText(##2,defproject)\THEN
+ \def\list:op{\one:args#1,/+/-]/[
+\df:spr#1/+/-]/[
+\ifx \arg:two\empty
+ \pwarn:{defproject\space ##1\space without\space members?}
+\else
+ \let\arg:one=\arg:two
+ \get:result\scr:df
+ \edef\:temp{{##1}{\AA:k}{\:temp}{}{\BB:k}}
+ \expandafter\let\csname##1 :date1\endcsname\relax
+ \expandafter\let\csname##1 :date2\endcsname\relax
+ \push:macro\checkmemb: \def\checkmemb:########1{}
+ \newproject \expandafter\defproject\:temp \endnewproject
+ \pop:macro\checkmemb:
+\fi
+} \FI
+ \IF \EqText(##1,traceon)\THEN
+ \def\list:op{\let\rs:trc=\empty
+} \FI
+ \IF \EqText(##1,traceoff)\THEN
+ \def\list:op{\def\rs:trc########1{}
+} \FI
+ \ifx \list:op\empty
+ \def\list:op{\futurelet
+ \:temp\sapply:apply #1,,,,/+/-]/[
+}
+ \fi
+ \list:op }
+\temp:#1,,,,/+/-]/[
+
+ \pop:macro\:temp
+\I:I=\:temp;
+
+}
+\IntVar\s:appN
+\def\sapply:apply#1,#2,#3/+/-]/[{
+ \ifx \:temp\bgroup \else
+ \expandafter\ifx\csname #1:mkls\endcsname\relax
+ \pwarn:{\string\sapply{#1,\string#2,...}?}
+\fi\fi
+
+ \expandafter\edef\csname \result:lst :mkls\endcsname{\ifx
+ \:temp\bgroup #1\else
+ \expandafter\ifx\csname #1:mkls\endcsname\relax #1
+ \else \csname #1:mkls\endcsname
+ \fi \fi}
+ \cln:res
+
+ \def\breadth{0}
+ \def\app:mi{#2}
+ \expandafter\expandafter\expandafter\r:app
+ \expandafter\expandafter\expandafter\s:app
+ \csname \result:lst :mkls\endcsname,/+/-]/[
+}
+\def\s:app#1{\I:I=\breadth; \I:I+1; \edef\breadth{\Val\I:I}
+ \push:macro\breadth
+\push:macro\app:mi
+\push:macro\app:pr
+\push:macro\app:ta
+
+ \app:mi{#1}
+ \pop:macro\app:ta
+\pop:macro\app:pr
+\pop:macro\app:mi
+\pop:macro\breadth
+
+}
+\def\s:appA#1{\I:I=\breadth; \I:I+1; \edef\breadth{\Val\I:I}
+ \push:macro\breadth
+\push:macro\app:mi
+\push:macro\app:pr
+\push:macro\app:ta
+
+ \apply{#1,\app:mi,\app:pr,\app:ta}
+ \pop:macro\app:ta
+\pop:macro\app:pr
+\pop:macro\app:mi
+\pop:macro\breadth
+
+}
+\def\scr:ta#1{\ifnum\csname#1:type\endcsname=\tasknode:\space
+ \edef\:temp{\:temp,#1}\fi }
+\def\scr:mi#1{\ifnum\csname#1:type\endcsname=\milestonenode:\space
+ \edef\:temp{\:temp,#1}\fi }
+\def\scr:pr#1{\ifnum\csname#1:type\endcsname=\projectnode:\space
+ \edef\:temp{\:temp,#1}\fi }
+\def\df:spr#1,#2,#3,#4,#5/+/-]/[{%
+ \def\AA:k{#4}
+ \def\BB:k{#5}
+}
+\def\scr:df#1{\edef\:temp{\ifx\:temp\empty \else \:temp,\fi #1}}
+\def\first:only#1{
+ \def\a:temp{#1}
+ \expandafter\r:app\expandafter\also:second\arg:two,,/+/-]/[
+ \ifx \a:temp\empty\else \edef\:temp{\:temp,#1}\fi
+}
+\def\also:second#1{\def\b:temp{#1}\ifx \a:temp\b:temp
+ \let\a:temp\empty\fi}
+\def\in:both#1{
+ \def\a:temp{#1}
+ \expandafter\r:app\expandafter\found:both\arg:two,,/+/-]/[
+}
+\def\found:both#1{\def\b:temp{#1}\ifx \a:temp\b:temp
+ \edef\:temp{\:temp,#1}\fi}
+\def\two:args#1,#2,{\futurelet\:temp\first:arg}
+\def\first:arg#1,{\verify:arg{#1}
+ \edef\arg:one{\ifx \:temp\bgroup
+ #1\else \csname #1:mkls\endcsname \fi}
+ \futurelet\:temp\second:arg}
+\def\second:arg#1,#2/+/-]/[{\verify:arg{#1}
+ \edef\arg:two{\ifx \:temp\bgroup
+ #1\else \csname #1:mkls\endcsname \fi}}
+\def\one:args#1,#2,{\futurelet\:temp\second:arg}
+\def\verify:arg#1{
+ \ifx \:temp\bgroup\else
+ \expandafter\ifx \csname #1:mkls\endcsname\relax
+ \pwarn:{`#1'\space in\space \string\sapply?}
+ \fi \fi}
+\def\cln:res{
+ \let\:temp=\empty \car:dinality=0;
+ \expandafter\expandafter\expandafter\r:app
+ \expandafter\expandafter\expandafter\pre:dup
+ \csname \result:lst :mkls\endcsname,,/+/-]/[%
+ \expandafter\let\csname \result:lst :mkls\endcsname=\:temp
+ \edef\breadth{\Val\car:dinality}
+ \rs:trc{\immediate\write16{...[\result:lst]........\:temp}}
+}
+\IntVar\car:dinality
+\def\scr:srt#1{
+\expandafter\let\expandafter\:temp\expandafter\empty
+ \expandafter\next:compare\:temp,,,/+/-]/[#1/+/-]/[
+}
+\def\next:compare#1,#2/+/-]/[#3/+/-]/[{
+ \if :#1:
+ \edef\:temp{\ifx\:temp\empty\else \:temp,\fi#3}
+ \def\next:##1/+/-]/[##2/+/-]/[{}
+ \else \comp:r{#1}{#3}
+ \ifnum \com:p>0
+ \edef\:temp{\ifx\:temp\empty\else \:temp,\fi#3,#1}
+ \def\next:##1,,##2/+/-]/[##3/+/-]/[{\edef
+ \:temp{\ifx\:temp\empty\else \:temp,\fi##1}}
+ \else \edef\:temp{\ifx\:temp\empty\else \:temp,\fi#1}
+ \if :#2:
+ \edef\:temp{\ifx\:temp\empty\else \:temp,\fi#3}
+ \def\next:##1/+/-]/[##2/+/-]/[{}
+ \else
+ \let\next:=\next:compare
+ \fi\fi \fi
+ \next: #2/+/-]/[#3/+/-]/[
+}
+\def\comp:r#1#2{
+ \def\com:p{0}%
+ \comp:re#1/+/-]/[#2/+/-]/[%
+}
+\def\comp:re#1#2/+/-]/[#3#4/+/-]/[{%
+ \ifnum `#1<`#3\def\com:p{-1}\let\next:=\relax
+ \else \ifnum `#1>`#3\def\com:p{1}\let\next:=\relax
+ \else \def\next:{\comp:re#2/+/-]/[#4/+/-]/[}%
+ \if !#2!\let\next:=\relax \fi
+ \if !#4!\let\next:=\relax \fi
+ \def\:tempa{#2}\def\:tempb{#4}%
+ \ifx \:tempa\space
+ \ifx \:tempb\:tempa \else \def\com:p{-1}\fi
+ \let\next:=\relax
+ \else\ifx \:tempb\space \def\com:p{1}\let\next:=\relax
+ \fi\fi
+ \fi\fi
+ \next:
+}
+\def\rs:trc#1{}
+\def\get:result#1{
+ \let\:temp=\empty
+ \expandafter\r:app\expandafter#1\arg:one,,/+/-]/[%
+ \expandafter\let\csname \result:lst :mkls\endcsname=\:temp}
+\def\scr:af#1{%
+\expandafter\ifx \csname#1:succe\endcsname\relax\else
+ \expandafter\expandafter\expandafter\r:app
+ \expandafter\expandafter\expandafter\scr:aff
+ \csname #1:succe\endcsname,/+/-]/[
+\fi}
+\def\scr:aff#1{\edef\:temp{\:temp,#1}}
+\def\scr:up#1{%
+\expandafter\ifx \csname#1:ancs\endcsname\relax\else
+ \expandafter\expandafter\expandafter\r:app
+ \expandafter\expandafter\expandafter\scr:aff
+ \csname #1:ancs\endcsname,/+/-]/[
+\fi}
+\def\scr:dw#1{\expandafter\ifx \csname #1:under\endcsname\relax\else
+ \edef\:temp{\:temp,\csname #1:under\endcsname}\fi}
+\def\scr:be#1{\expandafter\ifx \csname #1:prev\endcsname\relax\else
+ \edef\:temp{\:temp,\csname #1:prev\endcsname}\fi}
+\def\pre:dup#1{%
+ \def\a:temp{#1}\let\c:temp=\empty
+ \expandafter\r:app\expandafter\is:dup\:temp,/+/-]/[%
+ \ifx \c:temp\empty
+ \car:dinality+1;
+ \edef\:temp{\:temp\ifx \:temp\empty\else ,\fi#1}\fi}
+\def\is:dup#1{\def\b:temp{#1}\ifx \a:temp\b:temp \let\c:temp=\b:temp\fi}
+\def\r:app#1#2,#3/+/-]/[{%
+ \if !#2!\else #1{#2}\fi
+ \if !#3!\expandafter\r:gobble\else \expandafter\r:app\fi
+ #1#3/+/-]/[}
+\def\r:gobble#1/+/-]/[{}
+
+
+ \def\prjc:VII#1#2#3#4#5#6#7{
+ \gdef\all:prjc{}
+ { \contributionsstyle{
+ \expandafter \gdef \expandafter\all:prjc
+ \expandafter{\all:prjc\add:contrib{##1}{#1}}
+ }{}{}
+ \contributions{#1}
+ }
+ \all:prjc
+}
+\def\gob:V#1#2#3#4#5{}
+\def\f:cntr#1{\apply{#1,\gob:V,\findcontribution,\gob:V}}
+
+\IntVar\cntr:N
+
+\def\add:contrib#1#2{
+ \let\N:EXT=\empty
+ \def\findcontribution##1##2##3##4##5{
+ \IF \EqText(##2,#1) \THEN
+ \gdef\N:EXT{##1}
+ \FI
+ }
+ \sapply{con.TRIB,\f:cntr}
+ \ifx \N:EXT\empty
+ \cntr:N+1;
+ \sapply{\pc:id.\Val\cntr:N,defproject,{#2},#1,}
+ \sapply{con.TRIB,merge,con.TRIB,{\pc:id.\Val\cntr:N}}
+ \else
+ \sapply{ts.k,down,{\N:EXT}}
+ \sapply{ts.k,merge,ts.k,{#2}}
+ \expandafter\let\csname\N:EXT :type\endcsname\relax
+ \sapply{\N:EXT,defproject,ts.k,#1,}
+ \fi
+}
+\def\contributorsproject#1#2#3#4{
+ \push:macro\checkmemb: \def\checkmemb:##1{}
+ \cntr:N=0; \def\pc:id{#1}
+ \sapply{con.TRIB,merge,{},{}}
+ \sapply{#1,defproject,{#3},,}
+ \rapply{#1,\gob:V,\gob:V,\prjc:VII}
+ \expandafter\let\csname#1 :type\endcsname\relax
+ \sapply{#1,defproject,con.TRIB,#2,#4}
+ \pop:macro\checkmemb:
+ \sapply{#1,down,{#1}}
+\sapply{#1,\connect:up{#1}}
+\sapply{#1,merge,{},{}}
+
+ \sapply{con.TRIB,merge,{},{}}
+}
+
+ \def\setnumericdate#1#2{{
+ \expandafter \ifx \csname maxMM:\endcsname\relax
+ \getminmaxdates:1/1/0//31/12/99//
+ \fi
+ \def\yrS:{0} \def\moS:{0} \def\dateS:{0}
+ \if /\actual:date #2///+/-]/[/
+ \date:Coordinate#1#2,,/+/-]/[
+ \else
+ \def\real::date##1,##2/+/-]/[{##1}
+ \edef\real::date{\real::date #2,/+/-]/[}
+ \axisdate:#1{real:}\empty
+ \fi
+ \edef#1{\def\noexpand#1{#1}}
+ \expandafter}#1}
+
+\def\actual:date#1/#2/#3/+/-]/[{#2}
+\def\date:Coordinate#1#2,#3,#4/+/-]/[{
+ \expandafter \ifx \csname#2 :type\endcsname\relax
+ \def#1{0}
+ \pwarn:{\noexpand\setnumericdate for\space `#2'?}
+ \else\ifnum\csname#2 :type\endcsname=\milestonenode:\relax
+ \axisdate:#1{#2}\empty
+ \else
+ \IF \EqText(start,#3) \THEN
+ \axisdate:#1{#2}1
+ \ELSE \IF \EqText(finish,#3) \THEN
+ \axisdate:#1{#2}2
+ \ELSE
+ \def#1{0}
+ \pwarn:{\noexpand\setnumericdate for\space `#3'?}
+ \FI \FI
+ \fi \fi
+}
+\def\datesproject#1#2#3#4{
+ \push:macro\checkmemb: \def\checkmemb:##1{} \def\pc:id{#1}
+ \let\all:prjc=\empty
+ \sapply{#1,defproject,{#3},,}
+ \cntr:N=1000;
+\bck:N=2;
+\rapply{#1,\cnt:V,\cnt:V,\cnt:VII}
+\bck:N*2; \bck:N+1000;
+
+ \rapply{#1,\prjd:V,\prjd:V,\prjd:VII}
+ \edef\:temp{\noexpand \sapply{#1,sort,{\all:prjc}}}\:temp
+ \let\all:prjc=\empty
+ \sapply{#1.m,merge,{},{}}
+ \let\prv:=\empty \cntr:N=0;
+ \push:macro\pwarn: \def\pwarn:##1{}
+ \sapply{#1,\set:dateprj}
+ \sapply{#1,defproject,#1.m,#2,#4}
+ \pop:macro\pwarn:
+ \pop:macro\checkmemb:
+ \sapply{#1,\cp:dt}
+
+ \sapply{#1,down,{#1}}
+\sapply{#1,\connect:up{#1}}
+\sapply{#1,merge,{},{}}
+
+ \sapply{#1.m,merge,{},{}}
+}
+\def\connect:up#1#2{\expandafter \edef \csname #2: ancs\endcsname{#1}}
+\def\prjd:VII#1#2#3#4#5#6#7{\prjd:{#1}}
+\def\prjd:V#1#2#3#4#5{\prjd:{#1}}
+\def\prjd:#1{
+ \cntr:N+1; \bck:N-1;
+ {\datestyle{
+ \setnumericdate\:dateA{#1,start}
+\setnumericdate\:dateB{#1,finish}
+\I:I=\:dateA; \I:I+1000000000; \edef\:dateA{\Val\I:I}
+\I:I=\:dateB; \I:I+1000000000; \edef\:dateB{\Val\I:I}
+\def\xx{#1}\ifx \xx\pc:id \else
+ \xdef\all:prjc{\ifx \all:prjc\empty \else \all:prjc,\fi}
+ \ifnum\csname#1 :type\endcsname=\milestonenode:\relax
+ \xdef\all:prjc{\all:prjc \:dateA.\Val\cntr:N.0.#1}
+ \else
+ \xdef\all:prjc{\all:prjc \:dateA.\Val\cntr:N.1.#1,
+ \:dateB.
+ \ifnum\csname#1 :type\endcsname=\projectnode:\space
+ \Val\bck:N\else \Val\cntr:N\fi
+ .2.#1}
+\fi \fi
+
+ }{}{}
+ \def\pwarn:##1{} \start{#1}
+ }
+}
+\def\cp:dt#1{
+ \def\:temp##1##2{##2}
+ \edef\:tmp{\expandafter\expandafter\expandafter
+ \:temp\csname#1 :under\endcsname}
+ \ifnum\csname\:tmp :type\endcsname=\milestonenode:\relax
+ \edef\:temp{\csname\:tmp :date\endcsname}
+ \else
+ \edef\:tempa{\noexpand\IF\noexpand\EqText(\csname#1
+ :desc\endcsname,start)}
+ \:tempa
+ \edef\:temp{\csname\:tmp :date1\endcsname}
+ \ELSE
+ \edef\:temp{\csname\:tmp :date2\endcsname}
+ \FI
+ \fi
+ \expandafter\let\csname#1 :date1\endcsname=\:temp
+ \expandafter\let\csname#1 :date2\endcsname=\:temp
+}
+\IntVar\bck:N
+\def\cnt:V#1#2#3#4#5{\bck:N+1;}
+\def\cnt:VII#1#2#3#4#5#6#7{\bck:N+1;}
+
+ \newif\iftrace: \trace:false
+\def\traceon{\trace:true }
+\def\traceoff{\trace:false }
+
+\def\trace:#1{%
+ \iftrace:
+ \apply{#1,\traceM:,\traceP:,\traceT:}%
+ \fi
+}
+\def\traceM:#1#2#3#4#5{%
+ \immediate\write16{\string\defmilestone{#1}{#2}{#3}{#4}{#5}}}
+\def\traceP:#1#2#3#4#5{%
+ \immediate\write16{\string\defproject{#1}{#2}{#3}{#4}{#5}}}
+\def\traceT:#1#2#3#4#5#6#7{%
+ \immediate\write16{\string\deftask{#1}{#2}{#3}{#4}{#5}{#6}{#7}}}
+\def\getlist:#1#2#3{
+ \def\op:{#3} \let#3=\relax
+ \let~=\space \let\temp:=\empty \getlist::#2,,,/+/-]/[ \restoregal:
+ \expandafter\let\csname#1\endcsname=\temp:
+}
+\def\getlist::#1,#2,#3/+/-]/[{
+ \def\next:{#1}
+ \ifx\next:\empty
+ \def\temp::{#3} \ifx\temp::\empty\else \missingiem:#3// \fi
+ \else
+ \edef\temp:{\temp: \op:{#1}}
+ \def\next:{\getlist::#2,#3/+/-]/[} \expandafter\next:
+ \fi
+}
+\def\missingiem:#1,,,//{
+ \pwarn:{missing\space item\space in\space,,#1}
+}
+\def\setprev:#1#2{
+ \def\temp:{#2}
+ \ifx\temp:\empty \expandafter\def\csname#1 :prev\endcsname{}
+ \else
+ \getlist:{#1 :prev}{#2}\prev:
+ \def\prev:##1{\expandafter \edef \csname ##1: succe\endcsname
+ {\expandafter \ifx \csname ##1: succe\endcsname\relax\else
+ \csname ##1: succe\endcsname ,\fi#1}}
+\csname#1: prev\endcsname
+
+ \fi
+}
+\def\projectid:{0}
+\def\setproject:#1#2{
+ \traversedo:{#1}\setproject:data
+
+ \def\temp:{#2}
+ \ifx\temp:\empty\else \def\temp:{\setproject:#2} \fi
+ \temp:
+}
+\def\verify:dates:#1#2{
+ \traversedo:{#1}\checknodedates:
+
+ \def\temp:{#2}
+ \ifx\temp:\empty\else \def\temp:{\verify:dates:#2} \fi
+ \temp:
+}
+\def\traversedo:#1#2{
+ \def\utask:##1{
+ \expandafter\let\csname##1 :sve\endcsname =\utask:
+ \csname##1 :under\endcsname
+ #2{##1}
+ \def\utask:{\let\utask: =}
+ \expandafter\utask:\csname##1 :sve\endcsname
+ }
+ \csname#1 :under\endcsname #2{#1}
+}
+\def\checkmemb:#1{
+ \expandafter\ifx\csname#1 :bool\endcsname\relax
+ \pwarn:{definition\space for\space '#1'?}
+ \fi
+}
+\def\utask:I#1{
+ \ifnum\csname#1 :type\endcsname=\milestonenode:\relax
+ \edef\temp:{\csname#1 :date\endcsname}
+ \expandafter\maxDate:\temp:/
+\else
+ \edef\temp:{\csname#1 :date2\endcsname}
+ \expandafter\maxDate:\temp:/
+ \edef\temp:{\csname#1 :date1\endcsname}
+\fi
+\expandafter\minDate:\temp:/
+
+}
+\def\minDate:#1/#2/#3/{
+ \ifnum #3<\minY:\relax \def\minD:{#1} \def\minM:{#2} \def\minY:{#3}
+ \else \ifnum #3=\minY:\relax
+ \ifnum #2<\minM: \def\minD:{#1} \def\minM:{#2}
+ \else \ifnum #2=\minM:
+ \ifnum #1<\minD:\relax\def\minD:{#1} \fi
+ \fi\fi
+ \fi\fi }
+
+\def\maxDate:#1/#2/#3/{
+ \ifnum #3>\maxY:\relax \def\maxD:{#1} \def\maxM:{#2} \def\maxY:{#3}
+ \else \ifnum #3=\maxY:\relax
+ \ifnum #2>\maxM: \def\maxD:{#1} \def\maxM:{#2}
+ \else \ifnum #2=\maxM:
+ \ifnum #1>\maxD:\relax\def\maxD:{#1} \fi
+ \fi\fi
+ \fi\fi }
+\def\getitems:#1#2{
+ \def\items:{} \let\item:=\relax
+ \tcount:=#2 \relax \advance\tcount: by -1\relax
+ \let\utask:=\getchi:
+ \csname#1 :under\endcsname
+ \def\item:##1{ \expandafter\let\csname##1 :bool\endcsname=\UnDef: }
+ \items:
+}
+\def\getchi:#1{
+ \expandafter\ifx\csname#1 :bool\endcsname\relax
+ \def\next:{ \edef\items:{ \item:{#1} \items: } }
+ \ifnum\csname#1 :type\endcsname=\projectnode:\space
+ \ifnum 0<\tcount:
+ \def\next:{
+ \advance\tcount: by -1 \relax
+ \csname#1 :under\endcsname \relax
+ \advance\tcount: by 1 \relax
+ }
+\fi
+
+ \fi
+ \expandafter\next:
+ \fi
+ }
+\newcount\tcount:
+\def\checknodedates:#1{
+ \def\prev:##1{ \checkafter:{#1}{##1} }
+ \csname#1 :prev\endcsname
+}
+\def\checkafter:#1#2{
+ \getdate:\temp:A{#1}1
+ \getdate:\temp:B{#2}2
+ \edef\temp:{\temp:A/\temp:B/{`#1'\space starts\space
+ before\space `#2'\space ends}}
+ \expandafter\checkdates:\temp:
+}
+
+\def\getdate:#1#2#3{
+ \ifnum\csname#2 :type\endcsname=\milestonenode:\space
+ \edef#1{\csname#2 :date\endcsname}
+ \else \edef#1{\csname#2 :date#3\endcsname}
+ \fi
+}
+
+\def\checkdates:#1/#2/#3/#4/#5/#6/#7{
+ \ifnum #6>#3\space \pwarn:{#7}
+ \else \ifnum #6=#3\space
+ \ifnum #5>#2\space \pwarn:{#7}
+ \else \ifnum #5=#2\space
+ \ifnum #4>#1\space \pwarn:{#7} \fi
+ \fi\fi
+ \fi\fi }
+\def\listrsrc:#1{
+ \ifnum\csname#1 :type\endcsname=\tasknode:\space
+ \csname#1 :eff\endcsname
+ \else
+ \expandafter\expandafter \csname#1 :under\endcsname
+ \fi
+}
+\long\def\append:Def#1#2{%
+ \def\:temp{\def#1}%
+ \expandafter\expandafter\expandafter\:temp\expandafter{#1#2}}
+\def\reseffI:#1#2{
+ \expandafter\ifx\csname#1 :bool\endcsname\relax
+ \sepitems: \append:Def\all:des{#1}
+ \expandafter\let\csname#1 :bool\endcsname=\empty
+ \fi
+}
+\def\effortout:{
+ \I:I[\Q:Q];
+ \IF \EqDec(\I:I,\Q:Q) \THEN \edef\temp:{\Val\I:I}
+ \ELSE \edef\temp:{\Val\Q:Q} \FI
+}
+\long\def\contr::#1#2#3{
+ \def\contr:##1##2{ \ifnum 0<\tcount:\relax#3\fi #1#2 }
+}
+\def\contributionsstyle{ \contr::
+}
+\contributionsstyle{#1}{\space (#2)}{,\space}
+
+\def\findeffort:#1#2{ \ifx#2\empty
+ \def\reseff:##1##2{ \Q:Q + ##2; }
+\else
+ \def\reseff:##1##2{
+ \def\temp:{##1}
+ \ifx\temp:#2 \Q:Q + ##2; \fi
+ }
+\fi
+\Q:Q=0;
+\ifnum\csname#1 :type\endcsname=\tasknode:\space
+ \csname#1 :eff\endcsname
+\else
+ \getitems:{#1}{999}
+ \def\item:##1{ \csname##1 :eff\endcsname }
+ \items:
+\fi
+\effortout:
+ }
+\def\findthecontri:#1{\def\reseff:##1##2{
+ \expandafter\ifx\csname##1 :bool\endcsname\relax
+ \expandafter\def\csname##1 :bool\endcsname{##2}
+ \edef\alls:{\alls: \all:{##1}}
+ \else
+ \Q:Q=\csname##1 :bool\endcsname;
+ \Q:Q+##2;
+ \expandafter\edef\csname##1 :bool\endcsname{\Val\Q:Q}
+ \fi
+}
+\let\alls:=\empty \let\all:=\relax
+\ifnum\csname#1 :type\endcsname=\tasknode:\space
+ \csname#1 :eff\endcsname
+\else
+ \getitems:{#1}{999}
+ \def\item:##1{ \ifx \yrS: \:UnDef \csname##1 :eff\endcsname
+\else
+ \edef\svK:K{\Val\K:K}
+ \axisdate:\temp:{##1}1 \ifnum \temp:<\dateA:\else
+ \axisdate:\temp:{##1}2 \ifnum \temp:>\dateB:\else
+ \csname##1 :eff\endcsname
+ \fi\fi
+ \K:K=\svK:K;
+\fi
+ }
+ \items:
+\fi
+\tcount:=0
+\def\all:##1{
+ \Q:Q=\csname##1 :bool\endcsname;
+ \contr:{##1}{{\effortout:\temp:}}
+ \tcount:=1
+}
+\alls:
+}
+\def\datestyle{\def\showdate:##1/##2/##3/##4//}
+\datestyle{#1/#2/#3}
+\def\apply:#1,#2,#3,#4,#5//{
+ \verify:{#1} \def\verify:##1{}
+ \extract:
+ \def\mop:{#2} \def\pop:{#3} \def\top:{#4}
+ \apply::{#1}
+ \let\verify:=\verify::
+}
+\def\rapply:#1,#2,#3,#4,#5//{
+ \verify:{#1} \def\verify:##1{}
+ \def\utask:##1{
+ \def\mop:{#2} \def\pop:{#3} \def\top:{#4}
+ \apply::{##1}
+ \I:I=\depth; \I:I+1; \edef\depth{\Val\I:I}
+ \ifnum\csname#1 :type\endcsname=\projectnode:\space
+ \csname##1 :under\endcsname
+ \fi
+ \I:I=\depth; \I:I-1; \edef\depth{\Val\I:I}
+ }
+ \utask:{#1} \let\verify:=\verify::
+}
+
+\def\depth{0}\def\apply::#1{
+ \push:macro\utask:
+\push:macro\contr:
+
+ \extract:
+ \let\temp:=\empty
+ \ifnum \csname#1 :type\endcsname=\milestonenode:\space
+ \ifx \mop:\empty \else
+ \edef\temp:{\expandafter\noexpand\mop:{#1}{\csname#1 :title\endcsname}{\csname#1 :date\endcsname}
+{\expandafter\ifx\csname#1 :prev\endcsname\empty\else
+ \pp:\csname#1 :prev\endcsname
+ \fi}
+{\expandafter\noexpand\csname#1 :desc\endcsname}
+}
+\fi
+
+ \else
+ \ifnum \csname#1 :type\endcsname=\projectnode:\space
+ \ifx \pop:\empty \else
+ \edef\temp:{\expandafter\noexpand\pop:{#1}{\csname#1 :title\endcsname}{
+\expandafter\ifx\csname#1 :under\endcsname\relax\else
+ \pp:\csname#1 :under\endcsname
+\fi}
+{\expandafter\ifx\csname#1 :prev\endcsname\empty\else
+ \pp:\csname#1 :prev\endcsname
+\fi}{\expandafter\noexpand\csname#1 :desc\endcsname}
+}
+\fi
+
+ \else
+ \ifx \top:\empty \else
+ \edef\temp:{\expandafter\noexpand
+ \top:{#1}{\csname#1 :title\endcsname}
+{\csname#1 :date1\endcsname}
+{\csname#1 :date2\endcsname}
+{\expandafter\ifx\csname#1 :eff\endcsname\relax\else
+ \pp:\csname#1 :eff\endcsname
+\fi}
+{\expandafter\ifx\csname#1 :prev\endcsname\empty\else
+ \pp:\csname#1 :prev\endcsname
+\fi}{\expandafter\noexpand\csname#1 :desc\endcsname}
+}
+\fi
+
+ \fi
+ \fi
+ \temp:
+ \pop:macro\contr:
+\pop:macro\utask:
+
+}
+\def\extract:{
+ \def\pp:{\expandafter\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\ppp:}
+ \def\ppp:##1,{}
+ \def\prev:##1{,##1}
+ \def\utask:##1{,##1}
+ \edef\reseff:##1##2{,##1\string :##2}
+}
+\def\push:macro#1{
+ \expandafter\let\csname appl:\Val\s:appN\endcsname#1
+ \s:appN+1;
+}
+\def\pop:macro#1{
+ \s:appN-1;
+ \expandafter\let\expandafter#1\csname appl:\Val\s:appN\endcsname
+}
+\def\set:dateprj#1{\set:dtpr#1,}
+\def\set:dtpr#1.#2.#3.#4,{
+ \I:I=#1; \I:I-1000000000;
+ \edef\:temp{\noexpand \sapply{\pc:id.#4\ifcase#3\space\else .#3\fi
+ ,defproject,{#4},\Val\I:I,
+ \ifcase#3\space \or start\or finish\else \fi}} \:temp
+ \ifx \prv:\empty \else
+ \expandafter\edef\csname \pc:id.#4\ifcase#3\space\else .#3\fi
+ :prev\endcsname {\noexpand \prev:{\pc:id.\prv:}}
+ \expandafter\edef\csname \pc:id.\prv: :succe\endcsname
+ {\pc:id.#4\ifcase#3\space\else .#3\fi}
+ \fi
+ \edef\prv:{#4\ifcase#3\space\else .#3\fi}
+ \edef\all:prjc{\ifx \all:prjc\empty\else \all:prjc,\fi
+ \pc:id.#4\ifcase#3\space\else .#3\fi}
+ \edef\:temp{\noexpand \sapply{\pc:id.m,merge,
+ \pc:id.m,{\pc:id.#4\ifcase#3\space\else .#3\fi}}} \:temp
+}
+\def\gettree:{
+ \let\nextrow:=\empty \J:J=0; \row: \edef\tree:{ \tree: // }
+ \ifx\nextrow:\empty \else
+ \let\row:=\nextrow: \K:K-1;
+ \expandafter\gettree:
+ \fi
+}
+\def\getnode:#1{
+ \I:I=0; \J:J+1;
+ \ifnum\csname#1 :type\endcsname=\projectnode:\space
+ \expandafter\expandafter \csname#1 :under\endcsname
+ \fi
+ \expandafter\ifx\csname#1 :bool\endcsname\relax
+ \expandafter\let\csname#1 :bool\endcsname=\empty
+\else
+ \advance\tcount: by 1\space
+ \expandafter\edef\csname##1 :id\endcsname{\the\tcount:}
+\fi
+
+ \edef\tree:{ \tree:
+ \ifnum\Val\J:J>1\empty~ \fi
+ \Val\I:I, \csname#1 :type\endcsname, {\treetext:{#1}}
+ \nodeid:{#1}
+ }
+}
+\:DefineExt\treestyle(5){\endgroup
+ \def\temp:{#1} \ifx\temp:\empty\else \let\project:node=#1 \fi
+ \def\temp:{#2} \ifx\temp:\empty\else \let\milestone:node=#2 \fi
+ \def\temp:{#3} \ifx\temp:\empty\else \let\task:node=#3 \fi
+ \def\temp:{#4} \ifx\temp:\empty\else \let\project:edge=#4 \fi
+ \def\temp:{#5} \ifx\temp:\empty\else \def\treenodewidth:{#5pt} \fi
+}
+\treestyle(\VRectNode, \RectNode, \SRectNode,\TreeEdge,70)
+\def\getparms:#1,#2,#3,#4,#5,#6,#7,#8,#9//{
+ \def\first:{#1} \def\second:{#2} \def\third:{#3}
+ \def\fourth:{#4} \def\fifth:{#5} \def\sixth:{#6}
+ \def\seventh:{#7} \def\eighth:{#8} }
+\def\axisdate:#1#2#3{
+ \breakdate:\DD:\MM:\YY:{#2}#3
+ \K:K=\YY:; \IF \LtInt(\K:K,\yrS:) \THEN \K:K+\maxYY:; \FI
+ \K:K*\maxMM:; \K:K+\MM:;
+ \IF \EqInt(\maxYY:,0) \THEN
+ \IF \LtInt(\K:K,\moS:) \THEN \K:K+\maxMM:; \FI
+ \FI
+ \K:K*\maxDD:; \K:K+\DD:;
+ \K:K-\dateS:; \edef#1{\Val\K:K}
+}
+\def\breakdate:#1#2#3#4#5{
+ \expandafter\ifx \csname#4 :date#5\endcsname\relax
+ \pwarn:{Dates\space not\space available\space for\space #4}
+ \else
+ \def\temp:##1/##2/##3/{\def#1{##1}\def#2{##2}\def#3{##3}}
+ \expandafter\expandafter
+ \expandafter\temp:\csname#4 :date#5\endcsname/
+ \fi
+}
+
+\def\titletext:#1{
+ \Text(--\titletextA:{#1}--)
+}
+
+\def\titletextA:#1{\ifdim\nodewidth:>0in
+ \vbox\bgroup \hsize=\nodewidth:
+ \leftskip 0pt plus 0.5\hsize
+ \rightskip 0pt plus 0.5\hsize
+ \parfillskip 0pt \fi
+ #1 \ifdim\nodewidth:>0in
+ \egroup \fi}
+\def\treenodestyle{\def\treetext:##1}
+\treenodestyle{\csname#1 :title\endcsname}
+\def\last:segdraw#1{
+ \ifnum \effort:n>1
+ \I:I=\effort:n; \I:I-1; \edef\effort:n{\Val\I:I}
+ \I:I=\effort:from; \I:I+\effort:step; \edef\effort:from{\Val\I:I}
+ \I:I=\effort:to; \I:I+\effort:step; \edef\effort:to{\Val\I:I}
+ \ifnum \effort:max < \effort:to \let\effort:to=\effort:max \fi
+ \expandafter\expandafter\expandafter#1
+ \fi
+}
+\def\doelements:#1{%
+ \ifx\fifth:\empty \def\fifth:{1}\fi
+ \IF \EqInt(\fifth:,0)\THEN \chartelement:{#1}%
+ \ELSE \rapply{#1,\milestonechild:,\projectchild:,\taskchild:}\FI}
+
+\def\milestonechild:#1#2#3#4#5{\child:{#1}}
+\def\taskchild:#1#2#3#4#5#6#7{\child:{#1}}
+\def\projectchild:#1#2#3#4#5{\IF \EqInt(\depth,\fifth:)\THEN
+ \chartelement:{#1}\FI}
+
+\def\child:#1{\IF \GtInt(\depth,\fifth:)\ELSE
+ \chartelement:{#1}\FI }
+\def\getscale:#1{
+ \def\scale:{1}
+ \K:K=#1;
+ \Do(0,4){ \IF \GtInt(\K:K,1000) \K:K/10; \edef\scale:{\scale:0} \FI }
+ \R:R=200; \R:R/\K:K; \R:R*\:Cons\:Xunits; \Scale(\Val\R:R,4)
+}
+\defcom{MINMAXDATES:}#1{
+ \expandafter\edef\csname\projectid: :minmax\endcsname{
+ \noexpand \getminmaxdates:#1//}
+ }
+\def\getminmaxdates:#1/#2/#3//#4/#5/#6//{
+ \I:I=#4; \I:I-#1; \I:I+1; \edef\maxDD:{\Val\I:I}
+ \I:I=#5; \I:I-#2; \I:I+1; \edef\maxMM:{\Val\I:I}
+ \I:I=#6; \I:I-#3; \I:I+1; \edef\maxYY:{\Val\I:I}
+}
+\newif\ifpflag:
+\def\cutprojectstasksA:#1{
+ \axisdate:\dateA:{#1}1
+ \axisdate:\dateB:{#1}2
+ \ifnum \dateB:<0\space \pflag:false \fi
+ \ifnum \dateA:>\dateF:\space \pflag:false \fi
+ \ifnum \dateA:<0\space \def\dateA:{0} \fi
+ \ifnum \dateB:>\dateF:\space \let\dateB:=\dateF: \fi
+ \ifnum \optt:=\csname#1 :type\endcsname\space \pflag:false \fi
+ \ifnum \optp:=\csname#1 :type\endcsname\space \pflag:false \fi
+}
+\Define\ignoredepth:{
+ \let\sv:AddBarDepth=\:AddBarDepth
+ \Define\:AddBarDepth(2){\let\:AddBarDepth=\sv:AddBarDepth }
+}
+\def\movemilestonesym:#1,#2//{\Q:Q=#1;\Q:Q-#2; \Q:Q/2;
+ \Move(0,\Val\Q:Q) }
+\def\putbartext:{
+ \if E\bareff: \efforts:(\Val\K:K,\Val\K:K){ \geteff: }
+ \else \if T\bartext:
+ \K:K+1; \names:Tbl:(\Val\K:K,\Val\K:K){ \getname: }
+ \else \let\bareff:=X
+ \fi\fi
+ \if X\bareff: \else
+ \K:K+1;
+ \let\nodewidth:=\scnodewidth: \titletext:{\temp:}
+ \MoveToExit(-1.1,1.1) \MarkLoc(1-:)
+ \MoveToExit(1.1,-1.1) \MarkLoc(2-:) \CSeg\Clip(2-:,1-:)
+ \fi
+}
+\Define\getname:(1){ \def\temp:{#1} }
+\Define\geteff:(1){\findeffort:{#1}\empty}
+\def\datesaxis(#1)(#2){ \scheaxis:{#1}{#2}\dates:}
+\def\nonamesaxis(#1)(#2){ \scheaxis:{#1}{#2}\nonames:}
+\def\namesaxis(#1)(#2){{\let\TicText=\TicName::
+ \scheaxis:{#1}{#2}\names: }}
+\def\scheaxis:#1#2#3{ \def~{\noexpand&}
+ \edef\temp:{\noexpand\Axis(#1)(#2,#3) } \temp: }
+\TextPar\Define\TicName::(1){\IF \EqText(,#1) \THEN
+ \ELSE \let\nodewidth:=\scnodewidth:
+ \titletext:{#1} \FI}
+\:DefineExt\schedulestyle(7){\endgroup
+ \def\baropt:##1##2##3##4//{
+ \let\baropt:=\empty \let\txtopt:=\UndDef:
+ \baroptA:##1 \baroptA:##2 \baroptA:##3
+ }
+ \let\baropts:=\empty \let\bartext:=x \let\barIIID:=x
+ \let\baraxis:=x \let\bareff:=x
+ \def\temp:{#1} \ifx\temp:\empty\else \baropt:#1......// \fi
+ \def\temp:{#2#3} \ifx\temp:\empty\else \def\barloc:{#2,#3} \fi
+ \def\temp:{#4} \ifx\temp:\empty\else \def\projectcolor:{#4} \fi
+ \def\temp:{#5} \ifx\temp:\empty\else \def\taskcolor:{#5} \fi
+ \def\temp:{#6} \ifx\temp:\empty\else \def\milestonesym:{#6} \fi
+ \def\temp:{#7} \ifx\temp:\empty\else \def\scnodewidth:{#7pt} \fi
+}
+\:DefineExt\schedulelimits(1){\endgroup
+ \schedulelimits:#1,,,//
+}
+\expandafter\long\expandafter\def\csname
+ .:\string \schedulelimits\endcsname(#1){\endgroup
+ \schedulelimits:#1,,,//
+}
+\long\def\schedulelimits:#1,#2,#3//{
+ \def\temp:{#1} \ifx\temp:\empty\else \def\schedulelimit:{#1} \fi
+ \def\temp:{#2} \ifx\temp:\empty\else \def\schedulecode:{#2} \fi
+}
+\schedulelimits(10000,\par)
+\def\baroptA:#1{
+ \if#1T \let\bartext:=T \fi
+ \if#1A \let\baraxis:=A \fi
+ \if#1E \let\bareff:=E \let\baraxis:=A \fi
+ \if3#1 \let\barIID:=3 \edef\baropts:{\baropts: 3} \fi
+}
+
+\schedulestyle(A,2.5,7.5,3,0,$\otimes$,70)
+\def\cutoffdates:{
+ \def\yrS:{0} \def\moS:{0} \def\dateS:{0}
+\ifx\second:\empty
+ \axisdate:\dateS:{\first:}1
+\else
+ \let\:date:=\second:
+ \axisdate:\dateS:{}:
+\fi
+\let\dyS:=\DD: \let\moS:=\MM: \let\yrS:=\YY:
+\ifx\third:\empty
+ \axisdate:\dateF:{\first:}2
+\else
+ \let\:date:=\third:
+ \axisdate:\dateF:{}:
+\fi
+\let\dyF:=\DD: \let\moF:=\MM: \let\yrF:=\YY:
+
+}
+\def\cutofftypes:{
+ \def\optm:{-1} \def\optt:{-1} \def\optp:{-1}
+ \expandafter\cutofftypesA:\fourth:....//
+}
+\def\cutofftypesA:#1#2#3#4//{
+ \chkop:#1 \chkop:#2 \chkop:#3
+}
+\def\chkop:#1{
+ \if M#1 \let\optm:=\milestonenode: \fi
+ \if T#1 \let\optt:=\tasknode: \fi
+ \if P#1 \let\optp:=\projectnode: \fi
+}
+\def\getint:#1.#2.#3//{ \K:K=#1; \def\frac:{0.#2} }
+\def\utaskII:#1{
+ \ifnum \csname#1 :type\endcsname=\milestonenode:\space \else
+ \pflag:true
+ \edef\svK:K{\Val\K:K} \cutprojectstasks:{#1} \K:K=\svK:K;
+ \ifpflag: \ifnum \csname#1 :type\endcsname=\projectnode:\space
+ \J:J=0; \contributionsstyle{}{}{} \findthecontri:{#1}
+\def\all:##1{ \reseffII:{##1}{\csname##1 :bool\endcsname}
+ \expandafter\let\csname##1 :bool\endcsname=\:UnDef
+ }
+\alls:
+
+\else \J:J=0;
+\let\reseff:=\reseffII:
+\csname#1 :eff\endcsname
+ \fi
+\R:R=\J:J; \R:R/2; \R:R+\K:K; \K:K+\J:J;
+\edef\names:{ \names: \ifx\names: \empty\else ~ \fi
+ \Val\R:R,\csname#1 :title\endcsname }
+\edef\nonames:{ \nonames: \ifx\nonames:\empty\else ~ \fi
+ \Val\K:K,\relax
+ }
+\edef\lastnames:{ \Val\K:K }
+
+ \fi
+ \fi
+}
+\def\reseffII:#1#2{ \J:J+1;
+\IF \GtDec(#2,\maxeffort:) \edef\maxeffort:{#2} \fi
+\edef\bars:{ #2,#1 \ifx\bars:\empty\else ~ \fi \bars: }
+ }
+\def\dec:dim#1{%
+ \def~{\noexpand&} \edef\tmp:i{\bars:}
+ \expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i}
+ \Define\tmp:ii(1){} \I:I=0; \tmp:i(0,999){\I:I+1; \tmp:ii}
+ \edef\effort:max{\Val\I:I} \I:I+#1; \I:I-1;
+ \I:I / #1;
+ \edef\effort:n{\Val\I:I} \J:J=\effort:max; \J:J/\effort:n;
+ \I:I=\J:J; \I:I*\effort:n; \IF \LtInt(\I:I,\effort:max) \J:J+1;\FI
+ \def\effort:from{1} \edef\effort:to{\Val\J:J}
+ \let\effort:step=\effort:to
+}
+\def\cnd:starts#1{
+ \aft:edraw
+
+ \df:bfs
+
+ \snd:bxo #1
+ \global \expandafter\setbox
+ \csname dra:bx\effort:n\endcsname=\hbox
+}
+\def\aft:edraw{
+ \ifx \effort:boxes\:Undef
+ \gdef\effort:boxes{\global\let\effort:boxes=\:Undef}
+ \global\let\ef:EndDraw=\EndDraw
+ \gdef\EndDraw{\ef:EndDraw \global\let\EndDraw=\:UnDef \effort:boxes }
+ \fi
+}
+\def\df:bfs{
+ \expandafter\ifx \csname dra:bx\effort:n\endcsname\relax
+ \global\csname newbox\expandafter
+ \endcsname \csname dra:bx\effort:n\endcsname \fi
+}
+\def\snd:bxo#1{
+ \expandafter\ifx \csname right:mrk\endcsname\relax
+ \tmp:dim=\:RBorder
+ \advance\tmp:dim by -\:LBorder
+\else
+ \tmp:dim=\right:mrk pt \advance\tmp:dim by - \left:mrk pt
+ \global\let\right:mrk\:UnDef
+\fi
+
+ \expandafter\tmp:toks\expandafter{\effort:boxes}
+ \expandafter\expandafter\expandafter\tmp:toks
+ \expandafter\expandafter\expandafter{\expandafter
+ \the\expandafter\tmp:toks #1}
+ \xdef\effort:boxes{\the\tmp:toks \noexpand\Draw
+ \noexpand\Text(--\noexpand \hbox to\the\tmp:dim{
+\hss
+
+ \box \csname dra:bx\effort:n\endcsname
+ }
+
+ --)\noexpand\EndDraw }
+}
+\ifx \tmp:toks\:UnDef \csname newtoks\endcsname \tmp:toks \fi
+\def\sv:forchart{
+ \let\sv:bars=\bars:
+ \let\sv:names=\names:
+ \let\sv:nonames=\nonames:
+ \let\gall:=~
+}
+\def\recall:forchart{
+ \let\bars:=\sv:bars
+ \let\names:=\sv:names
+ \let\nonames:=\sv:nonames
+ \let~=\gall:
+}
+\TextPar\Define\EffortBarText:(1){
+ \MoveToLoc(BarBot) \Move(5pt\du,0)
+ \EntryExit(-1,0,0,0) \Text(--#1--)
+ \MoveToExit(-1.1,1.1) \MarkLoc(1-:)
+ \MoveToExit(1.1,-1.1) \MarkLoc(2-:) \CSeg\Clip(2-:,1-:)
+}
+\:DefineExt\effortstyle(1){\endgroup\effortstyle:(#1,,,)}
+\Define\effortstyle:(6){
+ \def\baropt:##1##2##3##4//{
+ \effortbaroptA:##1 \effortbaroptA:##2 \effortbaroptA:##3
+ }
+ \let\effortbaropts:=\empty \let\effortbaraxis:=x
+ \let\effortbartext:=x \let\effortbarIIID:=x
+ \def\temp:{#1} \ifx\temp:\empty\else \baropt:#1......// \fi
+ \def\temp:{#2#3} \ifx\temp:\empty\else \def\effortbarloc:{#2,#3} \fi
+ \def\temp:{#4} \ifx\temp:\empty\else \def\effortcolor:{#4} \fi
+ \def\temp:{#5} \ifx\temp:\empty\else \def\efftextwidth:{#5pt} \fi
+}
+\:DefineExt\effortlimits(1){\endgroup
+ \effortlimits:#1,,,//
+}
+\expandafter\long\expandafter\def\csname
+ .:\string \effortlimits\endcsname(#1){\endgroup
+ \effortlimits:#1,,,//
+}
+\long\def\effortlimits:#1,#2,#3//{
+ \def\temp:{#1} \ifx\temp:\empty\else \def\effortlimit:{#1} \fi
+ \def\temp:{#2} \ifx\temp:\empty\else \def\effortcode:{#2} \fi
+}
+\effortlimits(10000,\par)
+\def\effortbaroptA:#1{
+ \if#1A \let\effortbaraxis:=A \fi
+ \if#1T \let\effortbartext:=T \fi
+ \if3#1 \let\effortbarIIID:=3
+ \edef\effortbaropts:{\effortbaropts: 3} \fi
+}
+
+\effortstyle(A,2.5,7.5,1,70)
+\let\effortaxis=\datesaxis
+\TextPar\Define\TicName:(1){ \IF \EqText(,#1) \THEN
+ \ELSE \let\nodewidth:=\efftextwidth:
+ \titletext:{#1} \FI}
+\def\sort:{
+ \let\sorted:=\empty
+ \pflag:false
+ \expandafter\sortA:\dates:{}
+ \let\dates:=\sorted:
+ \ifpflag: \expandafter\sort: \fi}
+\def\sortA:#1#2{
+ \def\temp:{#2}
+ \ifx\temp:\empty \edef\sorted:{\sorted: {#1}} \let\next:=\relax
+ \else
+ \ifnum #1>#2\space
+ \pflag:true
+ \edef\sorted:{\sorted: {#2}} \def\next:{\sortA:{#1}}
+ \else
+ \edef\sorted:{\sorted: {#1}} \def\next:{\sortA:{#2}}
+ \fi
+ \fi
+ \next:
+}
+\def\indexIII:#1{
+ \Q:Q = 0; \I:I = 0;
+ \csname#1 :prev\endcsname
+ \IF \GtInt(\I:I,0) \THEN \Q:Q / \I:I; \FI
+ \def\entry:{#1} \let\next:=\empty
+ \expandafter\addtocurrow:\currow:{}{}
+}
+\def\prevI:#1{
+ \expandafter\ifx\csname#1 : in/cl: \endcsname\relax \else
+ \Q:Q + \csname#1 : in/cl: \endcsname;
+ \I:I + 1;
+ \fi
+}
+\def\addtocurrow:#1#2{
+ \def\temp:{#1}
+ \ifx\temp:\empty
+ \edef\next:{\next:{\Val\Q:Q}{\entry:}} \let\currow:=\next:
+ \else
+ \IF \GtDec(#1,\Q:Q) \THEN
+ \edef\next:{\next:{\Val\Q:Q}{\entry:}}
+ \Q=#1; \def\entry:{#2}
+ \ELSE
+ \edef\next:{\next:{#1}{#2}}
+ \FI
+ \expandafter\addtocurrow:
+ \fi }
+\def\inserttocol:#1#2{
+ \def\temp:{#1} \ifx\temp:\empty \else
+ \expandafter\edef\csname \the\tcount: :nodes\endcsname{
+ \csname\the\tcount: :nodes\endcsname
+ \node:{#2} }
+ \expandafter\edef\csname#2 : in/cl: \endcsname{\the\tcount:}
+ \advance\tcount: by 1\relax
+ \expandafter\inserttocol:
+ \fi
+}
+\def\pertnodestyle{\def\perttext:##1}
+\pertnodestyle{\csname#1 :title\endcsname}
+\def\subsort:{
+ \pflag:false
+ \expandafter\subsortA:\elms:{}
+ \ifpflag: \expandafter\subsort: \fi
+}
+
+\def\subsortA:#1{
+ \def\cur:{#1}
+ \ifx\cur:\empty \else
+ \csname#1 :prev\endcsname
+ \expandafter\subsortA:
+ \fi
+}
+
+\def\compr:#1{
+ \def\temp:{#1}
+ \ifx\temp:\bef:
+ \I:I=\csname#1 :boolA\endcsname; \I:I+1;
+ \IF \GtInt(\I:I,\csname\cur: :boolA\endcsname) \THEN
+ \pflag:true
+ \expandafter\edef\csname\cur: :boolA\endcsname{\Val\I:I}
+ \IF \GtInt(\I:I,\maxsub:) \THEN \edef\maxsub:{\Val\I:I} \FI
+ \FI
+ \fi
+ \ifx\temp:\empty\else \expandafter\compr:\fi
+}
+\def\indexII:#1{
+ \ifnum\csname#1 :boolA\endcsname=\DoReg
+ \I:I=\csname#1 : in/cl:\endcsname;
+ \CSeg\:GetXY(origin:,col.\Val\I:I)
+ \def\adjprt:{0}
+\ifx\prtadjtbl:\empty\else
+ \Define\searchadj:(2){ \IF \EqText(##1,#1) \THEN \def\adjprt:{##2}\FI}
+ \prtadjtbl:(0,999){\searchadj:}
+\fi
+
+ \if H\hpert:
+ \IF \LtDec(\Va,\T:T) \THEN \Va=\T:T; \FI
+ \IF \LtDec(\R:R,\Va) \THEN \R:R=\Va; \FI
+ \Vb+\adjprt:;
+
+ \else
+ \IF \GtDec(\Vb,\T:T) \THEN \Vb=\T:T; \FI
+ \IF \GtDec(\R:R,\Vb) \THEN \R:R=\Vb; \FI
+ \Va+\adjprt:;
+
+ \fi
+ \MoveTo(\Val\Va,\Val\Vb)
+\seg:prt
+
+\ifx \:tmp\def
+ \if H\hpert:
+ \IF \LtInt(\I:I,\u:pert) \THEN
+ \sapply{up,merge,up,{#1}}
+
+ \ELSE \IF \GtInt(\I:I,\d:pert) \THEN
+ \sapply{down,merge,down,{#1}}
+
+ \ELSE \IF \LtInt(\DoReg,\l:pert) \THEN
+ \sapply{temp,intersect,done,{#1}}
+\sapply{temp,\Va=1;\gob:I}
+\sapply{left,merge,left,{#1}}
+
+ \ELSE \IF \GtInt(\DoReg,\r:pert) \THEN
+ \MarkLoc(here) \CSeg\:GetY(col.maxY,here)
+\IF \LtDec(\Vb,0) \THEN \MarkLoc(col.maxY) \FI
+\CSeg\:GetX(col.maxX,here)
+\IF \LtDec(\Va,0) \THEN
+ \CSeg\:GetX(origin:,here)
+ \Va/\node:wh; \Va+\l:pert; \Va-1;
+ \IF \LtDec(\Va,\r:pert) \Va=-1; \FI
+\FI
+\sapply{temp,intersect,done,{#1}}
+\sapply{temp,\Va=1;\gob:I}
+\IF \LtDec(\Va,0) \THEN
+ \Va=-1;
+\sapply{temp,intersect,done,{#1}}
+\sapply{temp,\Va=1;\gob:I}
+\IF \LtDec(\Va,0) \THEN
+ \IF \GtInt(\DoReg,\r:pert) \THEN \ELSE
+ \MarkLoc(.) \CSeg\:GetX(origin:,.)
+ \Va/\node:wh; \Va/\step:right;
+% \immediate\write16{..(\the\DoReg,\Val\I:I).......\Val\Vb....\step:down}
+ \IF \GtDec(\Va,1.3) \THEN
+ \gdef\overflow:col{Y}
+ \ELSE
+ \Va=-1;
+ \FI
+\FI
+
+\FI
+\IF \LtDec(\Va,0) \THEN
+ \MarkLoc(before) \PutNode(#1) \MarkLoc(here)
+\CSeg\:GetX(before,here)
+\IF \LtDec(\Va,\node:wh) \THEN
+ \edef\node:wh{\Val\Va}
+\FI
+\sapply{in,merge,in,{#1}}
+
+ \Move(\openpertH:,-\adjprt:)
+\ELSE
+ \sapply{temp,intersect,done,{#1}}
+\sapply{temp,\Va=1;\gob:I}
+\sapply{left,merge,left,{#1}}
+
+\FI
+
+\ELSE
+ \sapply{right,merge,right,{#1}}
+\FI
+
+ \ELSE \Va=-1;
+\sapply{temp,intersect,done,{#1}}
+\sapply{temp,\Va=1;\gob:I}
+\IF \LtDec(\Va,0) \THEN
+ \IF \GtInt(\DoReg,\r:pert) \THEN \ELSE
+ \MarkLoc(.) \CSeg\:GetX(origin:,.)
+ \Va/\node:wh; \Va/\step:right;
+% \immediate\write16{..(\the\DoReg,\Val\I:I).......\Val\Vb....\step:down}
+ \IF \GtDec(\Va,1.3) \THEN
+ \gdef\overflow:col{Y}
+ \ELSE
+ \Va=-1;
+ \FI
+\FI
+
+\FI
+\IF \LtDec(\Va,0) \THEN
+ \MarkLoc(before) \PutNode(#1) \MarkLoc(here)
+\CSeg\:GetX(before,here)
+\IF \LtDec(\Va,\node:wh) \THEN
+ \edef\node:wh{\Val\Va}
+\FI
+\sapply{in,merge,in,{#1}}
+
+ \Move(\openpertH:,-\adjprt:)
+\ELSE
+ \sapply{temp,intersect,done,{#1}}
+\sapply{temp,\Va=1;\gob:I}
+\sapply{left,merge,left,{#1}}
+
+\FI
+
+ \FI \FI \FI \FI
+\else
+ \IF \LtInt(\I:I,\l:pert) \THEN
+ \sapply{left,merge,left,{#1}}
+
+ \ELSE \IF \GtInt(\I:I,\r:pert) \THEN
+ \sapply{right,merge,right,{#1}}
+
+ \ELSE \IF \LtInt(\DoReg,\u:pert) \THEN
+ \sapply{temp,intersect,done,{#1}}
+\sapply{temp,\Va=1;\gob:I}
+\sapply{up,merge,up,{#1}}
+
+ \ELSE \IF \GtInt(\DoReg,\d:pert) \THEN
+ \MarkLoc(here) \CSeg\:GetY(here,col.maxY)
+\IF \LtDec(\Vb,0) \THEN
+ \CSeg\:GetY(here,origin:)
+ \Vb/\node:wh; \Vb+\u:pert; \Vb-1;
+ \IF \LtDec(\Vb,\d:pert) \Vb=-1; \FI
+\FI
+\sapply{temp,intersect,done,{#1}}
+\sapply{temp,\Vb=1;\gob:I}
+\IF \LtDec(\Vb,0) \THEN
+ \Va=-1;
+\sapply{temp,intersect,done,{#1}}
+\sapply{temp,\Va=1;\gob:I}
+\IF \LtDec(\Va,0) \THEN
+ \IF \GtInt(\DoReg,\d:pert) \THEN \ELSE
+ \MarkLoc(.) \CSeg\:GetY(.,origin:)
+ \Vb/\node:wh; \Vb/\step:down;
+% \immediate\write16{..(\the\DoReg,\Val\I:I).......\Val\Vb....\step:down}
+ \IF \GtDec(\Vb,1.2) \THEN
+ \gdef\overflow:col{Y} \Va=1;
+ \FI
+\FI
+
+\FI
+\IF \LtDec(\Va,0) \THEN
+ \MarkLoc(before) \PutNode(#1)
+\MarkLoc(here)
+\CSeg\:GetY(here,before)
+\IF \LtDec(\Vb,\node:wh) \THEN
+ \edef\node:wh{\Val\Vb}
+\FI
+\CSeg\:GetY(here,col.maxY)
+\IF \GtDec(\Vb,0) \THEN \MarkLoc(col.maxY) \FI
+\sapply{in,merge,in,{#1}}
+
+ \Move(-\adjprt:,-\openpertV:)
+\ELSE
+ \sapply{down,merge,down,{#1}}
+\FI
+
+\ELSE
+ \sapply{down,merge,down,{#1}}
+
+\FI
+
+ \ELSE \Va=-1;
+\sapply{temp,intersect,done,{#1}}
+\sapply{temp,\Va=1;\gob:I}
+\IF \LtDec(\Va,0) \THEN
+ \IF \GtInt(\DoReg,\d:pert) \THEN \ELSE
+ \MarkLoc(.) \CSeg\:GetY(.,origin:)
+ \Vb/\node:wh; \Vb/\step:down;
+% \immediate\write16{..(\the\DoReg,\Val\I:I).......\Val\Vb....\step:down}
+ \IF \GtDec(\Vb,1.2) \THEN
+ \gdef\overflow:col{Y} \Va=1;
+ \FI
+\FI
+
+\FI
+\IF \LtDec(\Va,0) \THEN
+ \MarkLoc(before) \PutNode(#1)
+\MarkLoc(here)
+\CSeg\:GetY(here,before)
+\IF \LtDec(\Vb,\node:wh) \THEN
+ \edef\node:wh{\Val\Vb}
+\FI
+\CSeg\:GetY(here,col.maxY)
+\IF \GtDec(\Vb,0) \THEN \MarkLoc(col.maxY) \FI
+\sapply{in,merge,in,{#1}}
+
+ \Move(-\adjprt:,-\openpertV:)
+\ELSE
+ \sapply{down,merge,down,{#1}}
+\FI
+
+ \FI \FI \FI \FI
+\fi
+
+\else
+ \PutNode(#1)
+ \if H\hpert: \Move(\openpertH:,-\adjprt:)
+ \else \Move(-\adjprt:,-\openpertV:) \fi
+
+\fi
+\MarkLoc(col.\Val\I:I)
+\MoveToNode(#1,1,1) \MarkLoc(.)
+\CSeg\:GetX(col.maxX,.)
+\IF \GtDec(\Va,0) \THEN \MarkLoc(col.maxX) \FI
+
+
+ \fi
+}
+\Define\adjustpert(1){
+ \def\prtadjtbl:{#1}
+ \ifx\prtadjtbl:\empty \else \Table\prtadjtbl:{#1} \fi
+}
+\adjustpert()
+\def\utaskIV:#1{ \def\cur:{#1} \csname#1 :prev\endcsname }
+\def\clipper:#1{
+ \pflag:true
+ \seg:prt
+
+\ifx \:tmp\def \pflag:false \fi
+\sapply{temp,merge,in,left}
+\sapply{temp,merge,right,temp}
+\sapply{temp,merge,up,temp}
+\sapply{temp,merge,down,temp}
+\sapply{temp,intersect,temp,{#1}}
+\sapply{temp,\pflag:true \gob:I}
+
+ \ifpflag:
+ \def\temp::{#1}
+\ifx \temp::\cur: \pflag:false
+\else\ifx\temp::\from: \pflag:false
+ \else \MoveToLoc(\cur:) \CSeg[0.5]\Move(\cur:,\from:) \MarkLoc(:=center=:)
+\CSeg\:GetXY(\cur:,:=center=:)
+\IF \LtDec(\Va,0) \THEN \Va=-\Va; \FI \edef\HH:{\Val\Va}
+\IF \LtDec(\Vb,0) \THEN \Vb=-\Vb; \FI \edef\VV:{\Val\Vb}
+
+ \MoveToNode(#1,0,-1) \MarkLoc(:=loc=:)
+\CSeg\:GetY(:=center=:,:=loc=:)
+\IF \GtDec(\Vb,\VV:) \THEN \pflag:false \ELSE
+ \MoveToNode(#1,0,1) \MarkLoc(:=loc=:)
+ \CSeg\:GetY(:=loc=:,:=center=:)
+ \IF \GtDec(\Vb,\VV:) \THEN \pflag:false \ELSE
+ \MoveToNode(#1,1,0) \MarkLoc(:=loc=:)
+ \CSeg\:GetX(:=loc=:,:=center=:)
+ \IF \GtDec(\Va,\HH:) \THEN \pflag:false \ELSE
+ \MoveToNode(#1,-1,0) \MarkLoc(:=loc=:)
+ \CSeg\:GetX(:=center=:,:=loc=:)
+ \IF \GtDec(\Va,\HH:) \THEN \pflag:false \FI
+ \FI
+ \FI
+\FI
+
+\fi \fi
+
+ \fi
+ \ifpflag:
+ \MoveToNode(#1,1,1) \MarkLoc(b:)
+ \MoveToNode(#1,-1,-1) \MarkLoc(a:) \CSeg\Clip(a:,b:)
+ \fi
+}
+\:DefineExt\pertstyle(7){\endgroup
+ \def\baropt:##1##2//{
+ \pertoptA:##1
+ }
+ \let\hpert:=x
+ \def\temp:{#1} \ifx\temp:\empty\else \baropt:#1......// \fi
+ \def\temp:{#2} \ifx\temp:\empty\else \def\openpertH:{#2} \fi
+ \def\temp:{#3} \ifx\temp:\empty\else \def\openpertV:{#3} \fi
+ \def\temp:{#4} \ifx\temp:\empty\else \let\MilestoneNode:=#4\fi
+ \def\temp:{#5} \ifx\temp:\empty\else \let\ProjectNode:=#5 \fi
+ \def\temp:{#6} \ifx\temp:\empty\else \let\TaskNode:=#6 \fi
+ \def\temp:{#7} \ifx\temp:\empty\else \def\pertw:{#7pt} \fi
+}
+\def\pertoptA:#1{
+ \if#1H \let\hpert:=H \fi
+}
+
+\pertstyle(,30,20,\RectNode,\VRectNode,\SRectNode,70)
+
+ \def\treediagram(#1){{ \getparms:#1,,,,,,,,,//
+ \verify:{\first:} \def\verify:##1{}
+ \ifx\EndDraw\UnDef:
+ \pwarn:{\string\treediagram\space not\space within\space
+ \string\Draw...\string\EndDraw}
+ \fi
+ \ifx\second:\empty \def\second:{999} \fi \K:K=\second:;
+ \ifnum\csname\first: :type\endcsname=\projectnode:\space
+ \else \K:K=0; \fi
+ \IF \EqInt(\K:K,0) \THEN
+ \ifnum\csname\first: type\endcsname=\projectnode:\space
+ \let\temp:=\projectnode
+\else
+ \ifnum\csname\first: type\endcsname=\tasknode:\space
+ \let\temp:=\tasknode
+ \else \let\temp:=\milestonenode
+ \fi
+\fi
+\temp:()(--{\treetext:{\first:}}--)
+
+ \ELSE
+ \tcount: = 0 \let\nodeid: = \relax
+
+\let\node:=\getnode:
+\def\row:{ \node:{\first:} }
+\let~=\relax
+\let\tree:=\empty
+\def\utask:##1{
+ \IF \GtInt(\K:K,0) \THEN
+ \I:I+1;
+ \let\node:=\relax
+ \edef\nextrow:{ \nextrow: \node:{##1} }
+ \let\node:=\getnode:
+ \FI
+ }
+
+ \TextNode(1){ \titletext:{##1} }
+\let\nodewidth:=\treenodewidth:
+\def\temp:{\noexpand&}
+\edef\temp:{
+ \noexpand\TreeSpec
+ (\projectnode: ,\noexpand\project:node \temp:
+ \tasknode: ,\noexpand\task:node \temp:
+ \milestonenode:,\noexpand
+ \milestone:node)()(\noexpand\project:edge)
+} \temp:
+
+ \gettree: \def~{\noexpand&}
+ \def\nodeid:##1{
+ \expandafter\ifx\csname##1 :id\endcsname\relax \else
+ ${}^{\csname##1 :id\endcsname}$
+ \fi }
+
+ \edef~{\noexpand\Tree()(\tree:)} ~
+ \FI
+}}
+
+\def\schedulechart(#1){ \getparms:#1,,,,,,,,,//
+ \verify:{\first:} \def\verify:##1{}
+ \def\efforts:##1{}
+
+ \let\gal:=~
+ \let~=\relax
+ \let\cutprojectstasks:=\cutprojectstasksA:
+ \cutoffdates: \getscale:\dateF:
+ \I:I=\K:K;
+\IF \LtInt(\I:I,3) \THEN \I:I=3;
+\ELSE
+ \I:I=\yrF:; \I:I-\yrS:; \IF \LtInt(\I:I,0) \I:I+\maxYY:; \FI
+ \IF \LtInt(\I:I,2) \THEN
+ \I:I*\maxMM:; \I:I+\moF:; \I:I-\moS:;
+ \FI
+\FI
+\let\nodates:=\empty
+\Do(1,\Val\I:I){ \edef\nodates:{\nodates: ~} }
+
+\edef\dates:{\showdate:\dyS:/\moS:/\yrS:/0// \nodates:
+ \showdate:\dyF:/\moF:/\yrF:/0//}
+
+ \cutofftypes:
+ \let\bars:=\empty \let\names:=\empty \let\nonames:=\empty
+\def\chartelement:##1{ \pflag:true
+\ifnum \csname##1 :type\endcsname=\milestonenode:\space
+ \axisdate:\dateA:{##1}\empty
+\I:I=\dateA:; \def\temp:{-1} \J:J=0; \K:K=0;
+\ifnum \dateA:<0\space \pflag:false \fi
+\ifnum \dateA:>\dateF:\space \pflag:false \fi
+\ifnum \optm:=\csname##1 :type\endcsname\space \pflag:false \fi
+
+\else
+ \cutprojectstasks:{##1}
+\def\temp:{0}
+\ifnum \csname##1 :type\endcsname=\projectnode:\space
+ \I:I=\dateA:; \J:J=\dateB:; \K:K=0; \J:J-\I:I;
+\else \I:I=\dateA:; \J:J=0; \K:K=\dateB:; \K:K-\I:I;
+\fi
+
+\fi
+\I:I/\scale:; \J:J/\scale:; \K:K/\scale:;
+\ifpflag:
+ \edef\bars:{ \bars: \ifx\bars:\empty\else ~ \fi
+ \Val\I:I,\temp:,\Val\J:J,\Val\K:K }
+ \edef\names:{ ~ \csname##1 :title\endcsname ~ \names:}
+\edef\nonames:{\nonames:~}
+\edef\efforts:{\efforts: ~ ##1 }
+
+\fi
+ }
+\doelements:{\first:}
+
+ \Define\DrawBar(2){
+\IF \GtInt(\J:J,0) \THEN
+ \IF \EqInt(\J:J,1) \THEN
+ \IF \EqInt(##1,-1) \THEN
+ \EntryExit(0,0,0,0) \expandafter\movemilestonesym:\barloc://
+ \Text(--\milestonesym:--)
+ \MoveToExit(0,1) \Move(0,5pt\du) \EntryExit(0,-1,0,0) \putbartext:
+
+ \ignoredepth:
+ \FI
+ \ELSE
+ \IF \GtDec(##1,0) \THEN
+ \MarkLoc(o) \R:R=##1; \R:R/2; \Q:Q=##2; \Q:Q/2;
+\Move(\Val\R:R,\Val\Q:Q)
+\EntryExit(0,0,0,0) \putbartext: \MoveToLoc(o)
+
+ \DrawRect(##1,##2)
+ \FI
+ \FI
+\ELSE \ignoredepth: \FI
+\J:J+1; \IF \EqInt(\J:J,4) \THEN \J:J=0; \FI
+}
+\edef\temp:{\noexpand\BarChartSpec(HS\baropts:,\barloc: \noexpand &
+ \barloc: \noexpand & \barloc: \noexpand & \barloc:)
+ (0 \noexpand& 0 \noexpand& \projectcolor: \noexpand& \taskcolor:)}
+\temp:
+
+ \let~=\gal:
+ \sv:forchart
+
+ \ifnum \schedulelimit:=10000 \else
+ \ifnum \schedulelimit:=10000 \else
+ \def~{\noexpand&} \edef\tmp:i{\bars:} \let~=\relax
+ \expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i}
+ \def\maxeffort:{0}
+ \Define\tmp:ii(4){
+ \K:K=##1; \K:K+##4;
+ \IF \GtInt(\K:K,\maxeffort:) \THEN \edef\maxeffort:{\Val\K:K}\FI
+ }
+ \tmp:i(0,999){\tmp:ii}
+\fi
+
+ \dec:dim\schedulelimit:
+
+ \fi
+ \put:schedulechart
+ \let~=\gal:
+ \let\verify:=\verify::
+}
+\Define\put:schedulechart{
+ \ifnum \schedulelimit:=10000 \else
+ \I:I=\effort:from; \J:J=\effort:to; \let~=\relax
+\I:I-1; \J:J-1;
+\def~{\noexpand&} \edef\tmp:i{\bars:} \let~=\relax
+\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i}
+\let\bars:=\empty
+\Define\tmp:ii(1){\edef\bars:{\ifx\bars:\empty\else\bars:~\fi##1}}
+\tmp:i(\Val\I:I,\Val\J:J){\tmp:ii}
+
+ \def~{\noexpand&} \edef\tmp:i{\names:} \let~=\relax
+\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i}
+\let\names:=\empty
+\Define\tmp:ii(1){
+ \IF \GtDec(\K:K,\min:sg) \THEN
+ \IF \LtDec(\K:K,\max:sg) \THEN
+ \edef\names:{\names:~ ##1}
+ \FI \FI
+ \K:K+1;
+}
+\K:K=\effort:max; \K:K-\effort:to; \K:K*2; \edef\min:sg{\Val\K:K}
+\K:K=\effort:max; \K:K-\effort:from; \K:K+1;
+ \K:K*2; \K:K+1; \edef\max:sg{\Val\K:K}
+\K:K=0; \tmp:i(0,9999){\tmp:ii}
+
+ \def~{\noexpand&} \edef\tmp:i{\nonames:} \let~=\relax
+\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i}
+\let\nonames:=\empty
+\Define\tmp:ii(1){
+ \IF \GtDec(\K:K,\min:sg) \THEN
+ \IF \LtDec(\K:K,\max:sg) \THEN
+ \edef\nonames:{\nonames:~##1}
+ \FI \FI
+ \K:K+1;
+}
+\K:K=\effort:from; \K:K-2; \edef\min:sg{\Val\K:K}
+\K:K=\effort:to; \edef\max:sg{\Val\K:K}
+\K:K=0; \tmp:i(0,9999){\tmp:ii}
+
+ \ifnum \effort:from>1
+ \cnd:starts \schedulecode:
+ \fi
+ \bgroup
+ \fi
+ \def~{\noexpand&} \pflag:true
+\edef\temp:{ \noexpand\Table\noexpand\efforts:{ \efforts: } }
+\temp:
+\if T\bartext:
+ \edef\temp:{ \noexpand\Table\noexpand\names:Tbl:{ \names: } }
+ \temp:
+ \let~=\relax
+\Define\temp:(1){\edef\names:{##1~\names:}}
+\let\names:=\empty
+\names:Tbl:(0,99){\temp:}
+\def~{\noexpand&}
+\edef\temp:{ \noexpand\Table\noexpand\names:Tbl:{ \names: } }
+\temp:
+
+\fi
+ \J:J=0; \K:K=0;
+\edef\temp:{ \noexpand\BarChart( \bars: ) } \temp:
+
+ \ifnum \schedulelimit:=10000 \else
+ \MoveToLoc(Origin) \Move(\maxeffort:,0)
+\MarkLoc(NE) \CSeg\Move(NW,SW) \MarkLoc(SE)
+\MoveToLoc(NE) \Text(----)
+
+
+ \fi
+ \let\nodewidth:=\scnodewidth:
+\if A\baraxis: \datesaxis(SW,NE)(S-1)
+
+ \MoveToLoc(NE) {\Text(--\phantom{\showdate:00/00/00/0//}--)
+\MoveToExit(1,0) \Text(----)}
+
+
+ \if T\bartext:
+ \else \MoveToLoc(SW) \Move(-5pt\du,0) \MarkLoc(sw:)
+\MoveToLoc(NE) \Move(5pt\du,0) \MarkLoc(ne:)
+\CSeg\DrawRect(ne:,sw:)
+\namesaxis(sw:,ne:)(W-0)
+\nonamesaxis(sw:,ne:)(W-1)
+\MoveToLoc(ne:) {\Text(--\phantom{\showdate:00/00/00/0//}--)
+\MoveToExit(1,0) \Text(----)}
+
+
+
+ \fi
+\fi
+
+ \ifnum \schedulelimit:=10000 \else
+ \egroup
+ \recall:forchart
+
+ \last:segdraw\put:schedulechart
+
+ \fi
+}
+
+\def\effortchart(#1){ \getparms:#1,,,,,,,,,//
+ \verify:{\first:} \def\verify:##1{}
+ \ifnum\csname\first: :type\endcsname= \milestonenode: \space
+ \pwarn:{\string\effortchart{\first:}?\space `\first:'\space is
+ \space a\space milestone}
+ \else
+ \let\gal:=~
+ \let~=\relax
+ \edef\temp:{\second:\third:\fourth:}
+\ifx\temp:\empty \def\cutprojectstasks:##1{}
+\else \cutoffdates: \cutofftypes:
+ \let\cutprojectstasks:=\cutprojectstasksA:
+\fi
+
+ \let\bars:=\empty \let\names:=\empty \let\nonames:=\empty
+\def\maxeffort:{0} \K:K=0;
+\let\chartelement:=\utaskII:
+\doelements:{\first:}
+
+ \IF \EqInt(\K:K,0) \THEN
+ \pwarn:{empty\space effort\space chart\space for\space `#1'}
+ \ELSE
+ \expandafter\getint:\maxeffort:.0.0// \getscale:\K:K
+ \IF \GtInt(\scale:,1) \THEN
+ \def~{\noexpand&}
+ \edef\temp:{\noexpand\Table\noexpand\temp:{\bars:}}
+ \temp:
+ \let~=\relax
+ \def\bars:##1{}
+ \Define\tempa:(2){ \Q:Q=##1;
+ \Q:Q/\scale:; \edef\bars:{\bars: ~ \Val\Q:Q,##2} }
+ \temp:(0,99){\tempa:}
+\FI
+
+ \let\BarText=\EffortBarText:
+
+\edef\temp:{\noexpand\BarChartSpec( HT\effortbaropts: , \effortbarloc: )
+ ( \effortcolor: ) }
+\temp:
+\if A\effortbaraxis: \if 3\effortbarIIID: \BarGrid(0,,) \FI\FI
+
+
+ \edef\dates:{\maxeffort:}
+\expandafter\getint:\maxeffort:.0.0//
+\I:I=\K:K; \I:I/2; \K:K-\I:I; \K:K-\I:I;
+\Q:Q=\frac:; \Q:Q+\K:K; \Q:Q/2;
+\IF \EqDec(\Q:Q,0)
+ \edef\dates:{0 ~ \Val\I:I ~ \dates:}
+\ELSE \Q:Q*10; \J:J[\Q:Q]; \edef\dates:{0 ~ \Val\I:I.\Val\J:J ~ \dates:}
+\FI
+
+ \edef\names:{0,\lastnames:~\names:}
+\edef\nonames:{0,\lastnames: ~0,\relax~ \nonames:}
+
+ \sv:forchart
+
+ \ifnum \effortlimit:=10000 \else
+ \dec:dim\effortlimit:
+
+ \fi
+ \put:effortchart
+ \FI
+ \let~=\gal:
+ \fi
+ \let\verify:=\verify::
+}
+\Define\put:effortchart{
+ \ifnum \effortlimit:=10000 \else
+ \I:I=\effort:from; \J:J=\effort:to; \let~=\relax
+\I:I-1; \J:J-1;
+\def~{\noexpand&} \edef\tmp:i{\bars:} \let~=\relax
+\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i}
+\let\bars:=\empty
+\Define\tmp:ii(1){\edef\bars:{\ifx\bars:\empty\else\bars:~\fi##1}}
+\tmp:i(\Val\I:I,\Val\J:J){\tmp:ii}
+
+ \def~{\noexpand&} \edef\tmp:i{\names:} \let~=\relax
+\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i}
+\let\names:=\empty
+\Define\tmp:ii(2){
+ \T:T=\effort:max; \T:T-##1;
+ \IF \GtDec(\T:T,\I:I) \THEN
+ \IF \GtDec(\T:T,\effort:to) \THEN\ELSE
+ \T:T=##1; \T:T-\effort:max; \T:T+\effort:to;
+ \IF \EqDec(\T:T,0.0) \THEN \T:T=0.25; \FI
+ \edef\names:{\ifx\names:\empty\else\names:~\fi \Val\T:T,##2}
+ \FI \FI
+}
+\tmp:i(1,9999){\tmp:ii}
+\K:K=\effort:to; \K:K-\I:I;
+\edef\names:{0,\Val\K:K\ifx \names:\empty\else ~\names:\fi}
+
+ \def~{\noexpand&} \edef\tmp:i{\nonames:} \let~=\relax
+\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i}
+\let\nonames:=\empty
+\Define\tmp:ii(2){
+ \T:T=\effort:max; \T:T-##1;
+ \IF \LtDec(\T:T,\I:I) \THEN \ELSE
+ \IF \GtDec(\T:T,\effort:to) \THEN\ELSE
+ \T:T=##1; \T:T-\effort:max; \T:T+\effort:to;
+ \edef\nonames:{\ifx\nonames:\empty\else\nonames:~\fi \Val\T:T,##2}
+ \FI \FI
+}
+\tmp:i(1,9999){\tmp:ii}
+\K:K=\effort:to; \K:K-\I:I;
+\edef\nonames:{0,\Val\K:K\ifx \nonames:\empty\else ~\nonames:\fi}
+
+ \ifnum \effort:from>1
+ \cnd:starts \effortcode:
+ \fi
+ \bgroup
+ \fi
+ \def~{\noexpand&}
+\edef\temp:{ \noexpand\BarChart( \bars: ) } \temp:
+
+ \ifnum \effortlimit:=10000 \else
+ \MoveToLoc(Origin) \Move(\maxeffort:,0)
+\MarkLoc(NE) \CSeg\Move(NW,SW) \MarkLoc(SE)
+\MoveToLoc(NE) \Text(----)
+
+
+ \fi
+ \if A\effortbaraxis:
+ \MoveToLoc(NE) \Move(5pt\du,0) \MarkLoc(ne:)
+ \if 3\effortbarIIID:
+ {\CSeg\Line(ne:,NW) } \CSeg\Line(NW,SW) \CSeg\Line(ne:,NW)
+ \else \CSeg\DrawRect(ne:,SW) \fi
+ \effortaxis(SW,NE)(S-1)
+ \namesaxis(SW,NE)(W5)
+ \nonamesaxis(SW,ne:)(W8)
+ \ifnum \effortlimit:=10000 \else
+ \nonamesaxis(SW,ne:)(W-6)
+
+ \fi
+ \MoveToLoc(ne:) \Text(----)
+
+\fi
+
+ \ifnum \effortlimit:=10000 \else
+ \egroup
+ \recall:forchart
+
+ \last:segdraw\put:effortchart
+
+ \fi
+}
+\def\pertdiagram{\futurelet\:temp\pertd:ag}
+\def\pertd:ag{\ifx \:temp*
+ \def\date:less{\def\dateA:{0}}
+ \def\:temp##1{\pertdiagram:}
+ \else
+ \let\date:less=\empty
+ \let\:temp=\pertdiagram:
+ \fi
+ \:temp}
+\def\pertdiagram:(#1){ \getparms:#1,,,,,,,,,//
+ \verify:{\first:} \def\verify:##1{}
+ \ifnum\csname\first: :type\endcsname= \projectnode: \space
+ \let\gal:=~
+ \let~=\relax
+ \cutoffdates:
+ \cutofftypes:
+ \let\index:=\relax \let\dates:=\empty
+\def\utask:##1{
+ \expandafter\def\csname##1 :bool\endcsname{0}
+ \ifnum\csname##1 :type\endcsname=\milestonenode:\space
+ \axisdate:\dateA:{##1}\empty
+ \else
+ \axisdate:\dateA:{##1}1
+ \fi
+ \date:less
+ \expandafter\ifx\csname -\dateA:-:\endcsname\relax
+ \edef\dates:{ \dates: {\dateA:} }
+ \fi
+ \expandafter\edef\csname -\dateA:-:\endcsname{
+ \expandafter\ifx\csname -\dateA:-:\endcsname\relax \else
+ \csname -\dateA:-:\endcsname
+ \fi
+ \index:{##1} }
+ }
+\csname\first: :under\endcsname
+\sort:
+\def\prev:##1{
+ \expandafter\ifx\csname##1 :bool\endcsname\relax
+
+ \else
+ \J:J=\csname##1 :bool\endcsname; \J:J+1;
+\IF \GtInt(\J:J,\csname\cur: :bool\endcsname) \THEN
+ \pflag:true
+ \expandafter\edef\csname\cur: :bool\endcsname{\Val\J:J}
+\FI
+
+ \fi }
+\def\utask:##1{
+ \def\cur:{##1}
+ \csname##1 :prev\endcsname }
+\def\setrows:{ \pflag:false
+ \csname\first: :under\endcsname
+ \ifpflag:
+ \expandafter\setrows:
+ \fi }
+\setrows:
+
+ \J:J=-1;
+\def\colsno:{0} \expandafter\let\csname 0 :nodes\endcsname=\empty
+\def\utask:##1{ \tcount:=\csname##1 :bool\endcsname\space
+\expandafter\ifx\csname col-:\the\tcount:\endcsname\relax
+ \expandafter
+ \def\csname col-:\the\tcount: :+\endcsname{ \index:{##1} }
+
+ \expandafter\def\csname col-:\the\tcount:\endcsname{0}
+ \tcount:=0\space \J:J+1;
+\else
+ \expandafter\edef\csname col-:\the\tcount: :+\endcsname{
+ \csname col-:\the\tcount: :+\endcsname \index:{##1} }
+
+ \I:I=\csname col-:\the\tcount:\endcsname; \I:I+1;
+ \expandafter\edef\csname col-:\the\tcount:\endcsname{ \Val\I:I }
+ \tcount:=\Val\I:I\space
+ \ifnum \tcount:>\colsno:\space
+ \expandafter\let\csname \the\tcount: :nodes\endcsname=\empty
+ \edef\colsno:{\the\tcount:}
+\fi
+
+\fi
+ }
+\csname\first: :under\endcsname
+
+\Do(0,\Val\J:J){
+ \J:J=\colsno:; \J:J-\csname col-:\the\DoReg\endcsname; \J:J/2;
+ \let\node:=\relax
+\let\currow:=\empty
+\let\index:=\indexIII:
+\let\prev:=\prevI:
+\csname col-:\the\DoReg :+\endcsname
+
+\tcount:=\Val\J:J
+\expandafter\inserttocol:\currow:{}{}
+
+
+}
+
+
+
+
+ \let\nodewidth:=\pertw: \MarkLoc(origin:) \edef\rowsno:{0}
+\sapply{all,merge,{},{}}
+\def\node:##1{
+ \IF \GtInt(\I:I,\rowsno:) \edef\rowsno:{\Val\I:I} \FI \I:I+1;
+ \ifnum\csname##1 :type\endcsname=\milestonenode:\space
+ \let\PertNode:=\MilestoneNode:
+\else
+ \ifnum\csname##1 :type\endcsname=\projectnode:\space
+ \let\PertNode:=\ProjectNode:
+ \else
+ \let\PertNode:=\TaskNode:
+ \fi
+\fi
+
+\DefNode\PertNode:(##1)(--\titletextA:{\perttext:{##1}}--)
+\sapply{all,merge,all,{##1}}
+
+ \AddNodeDim(##1)
+}
+\sapply{MaxXYI,merge,{},{}}
+\Do(0,\colsno:){
+ \I:I=0;
+ \ZeroNodesDim
+ \csname \the\DoReg :nodes\endcsname
+ \sapply{MaxXYI,merge,MaxXYI,{\if H\hpert: \MaxY
+ \else \MaxX\fi :\the\DoReg}}
+
+}
+
+ \def\l:pert{0} \def\u:pert{0}
+\if H\hpert:
+ \grps:ns\step:right\colsno:\pert:cols
+ \grps:ns\step:down\rowsno:\pert:rows
+\else
+ \grps:ns\step:right\colsno:\pert:cols
+ \grps:ns\step:down\rowsno:\pert:rows
+\fi
+\I:I=\step:right; \I:I-1; \edef\r:pert{\Val\I:I}
+\I:I=\step:down; \I:I-1; \edef\d:pert{\Val\I:I}
+\sapply{in,merge,{},{}}
+\sapply{done,merge,{},{}}
+\def\overflow:col{N}
+\MoveToLoc(origin:) \MarkLoc(col.minX) \MarkLoc(col.maxX)
+\MarkLoc(col.maxY) \edef\node:wh{1000}
+
+ \def\:temp{ \def\effort:n{-1} \pert:diag{#1}
+ }
+ \let~=\gal:
+ \else \pwarn:{\string\pertdiagram{\first:}?\space
+ not \space a \space project}
+ \let\:temp\empty
+ \fi
+ \let\verify:=\verify::
+ \:temp
+}
+\def\getnodesbydate:#1{
+ \def\temp:{#1}
+ \ifx \temp:\empty \else
+ \def\temp:{
+ \let\index:=\indexI:
+\Q:Q=0; \R:R=0;
+\csname -#1-:\endcsname
+
+ \let\elms:=\empty
+\def\index:####1{
+ \edef\elms:{\elms: {####1}}
+ \expandafter\def\csname####1 :boolA\endcsname{0}
+ }
+\csname -#1-:\endcsname
+\def\maxsub:{0}
+\def\prev:####1{
+ \def\bef:{####1}
+ \expandafter\compr:\elms:{}
+}
+\subsort:
+
+ \let\index:=\indexII: \T:T=\prevstart:;
+\Do(0,\maxsub:){
+ \R:R=0;
+ \csname -#1-:\endcsname
+ \IF \GtDec(\R:R,\T:T)
+ \T:T=\R:R;
+ \if H\hpert: \T:T+\openpertH:; \else \T:T-\openpertV:; \fi
+ \FI
+}
+
+ \getnodesbydate: }
+ \expandafter\temp:
+ \fi
+}
+\def\indexI:#1{
+ \I:I=\csname#1 : in/cl:\endcsname;
+ \CSeg\:GetXY(origin:,col.\Val\I:I)
+ \if H\hpert:
+ \IF \GtDec(\Va,\Q:Q) \THEN \Q:Q=\Va; \FI
+ \IF \GtDec(\prevstart:,\Q:Q) \THEN \Q:Q=\prevstart:;
+ \Q:Q+\openpertH:; \FI
+ \else
+ \IF \GtDec(\Q:Q,\Vb) \THEN \Q:Q=\Vb; \FI
+ \IF \GtDec(\Q:Q,\prevstart:) \THEN \Q:Q=\prevstart:;
+ \Q:Q-\openpertV:; \FI
+ \fi
+ \edef\prevstart:{\Val\Q:Q}
+}
+\def\pert:diag#1{
+ \seg:prt
+
+\ifx \:tmp\def
+ \ifnum \effort:n>-1
+ \sapply{prevdone,merge,done,{}}
+ \global \expandafter\setbox
+ \csname dra:bx\effort:n\endcsname=\hbox
+ \fi
+ \bgroup
+\fi
+
+ \def\MaxX##1{\MaxY##1/+/-]/[}
+\def\MaxY##1:##2/+/-]/[{
+ \def\:tmp####1{
+ \ifnum \csname####1 : in/cl:\endcsname=##2
+ \sapply{used,merge,used,{####1}}
+ \fi
+}
+\sapply{used,merge,{},{}}
+\sapply{all,\:tmp}
+\sapply{used,subtract,used,done}
+\let\:tmp=\relax
+\sapply{used,\let\:tmp=\def\gob:I}
+
+ \if H\hpert:
+ \IF \LtInt(##2,\u:pert) \THEN \let\:tmp=\relax
+ \ELSE \IF \GtInt(##2,\d:pert) \THEN \let\:tmp=\relax
+ \FI \FI
+\else
+ \IF \LtInt(##2,\l:pert) \THEN \let\:tmp=\relax
+ \ELSE \IF \GtInt(##2,\r:pert) \THEN \let\:tmp=\relax
+ \FI \FI
+\fi
+
+ \ifx \:tmp\def
+ \if H\hpert:
+ \Move(0,-##1) \MarkLoc(col.##2) \Move(0,-##1)
+ \Move(0,-\openpertV:)
+ \else
+ \Move(##1,0) \MarkLoc(col.##2) \Move(##1,0)
+ \Move(\openpertH:,0)
+ \fi
+ \else \ifnum ##2>0
+ \MarkLoc(.) \I:I=##2; \I:I-1; \MoveToLoc(col.\Val\I:I)
+ \MarkLoc(col.##2) \MoveToLoc(.)
+\else \MarkLoc(col.##2) \fi
+ \fi
+}
+\sapply{MaxXYI,\MaxX}
+
+\sapply{in,merge,{},{}}
+\sapply{up,merge,{},{}}
+\sapply{down,merge,{},{}}
+\sapply{left,merge,{},{}}
+\sapply{right,merge,{},{}}
+\let\M:N\empty
+\let\M:X\empty
+
+ \if H\hpert: \EntryExit(-1,0,1,0) \def\prevstart:{-10}
+\else \EntryExit(0,1,0,-1) \def\prevstart:{10} \fi
+\expandafter\getnodesbydate:\dates:{}
+
+ \sapply{edges,merge,{},{}}
+\def\prev:##1{ \sapply{temp,intersect,in,{##1,\cur:}}
+\sapply{temp,\sapply{edges,merge,edges,{##1,\cur:}}\gob:I}
+ }
+\let\utask:=\utaskIV:
+\csname\first: :under\endcsname
+\sapply{edges,subtract,edges,in}
+\sapply{up,intersect,up,edges}
+\sapply{down,intersect,down,edges}
+\sapply{left,intersect,left,edges}
+\sapply{right,intersect,right,edges}
+
+\MoveToLoc(origin:) \Move(10,0) \MarkLoc(.)
+\MoveToLoc(col.maxX) \Move(0,10) \MarkLoc(..)
+\MoveToLL(origin:,.)(col.maxX,..) \Move(0,5) \MarkLoc(col.maxX)
+\MoveToLoc(col.minX) \Move(0,5) \MarkLoc(col.minX)
+
+\K:K=0;
+\sapply{left,\K:K+1;\gob:I} \J:J=\K:K;
+\sapply{right,\K:K+1;\gob:I}
+\sapply{down,\K:K+1;\gob:I}
+\sapply{up,\K:K+1;\gob:I}
+\CSeg\:GetY(col.maxY,origin:) \Vb/\node:wh; \Vb*0.7;
+\IF \GtDec(\Vb,\K:K) \K:K*2;
+ \IF \EqInt(\J:J,0) \K:K=-\K:K; \FI
+\ELSE \K:K/2; \K:K-1; \FI
+
+\sapply{up,\put:nd}
+\sapply{left,\put:nd}
+\sapply{right,\put:nd}
+\sapply{down,\put:nd}
+
+ \def\prev:##1{ \expandafter\ifx\csname##1 :bool\endcsname\relax
+
+\else
+ \def\from:{##1}
+\let\utask:=\clipper:
+\csname\first: :under\endcsname
+\seg:prt
+
+\ifx \:tmp\def
+ \sapply{do,merge,{},{}}
+\sapply{temp,intersect,in,{##1,\cur:}}
+\sapply{temp,\sapply{do,merge,{##1},{}}\gob:I}
+\sapply{do,\ifx\M:N\empty \edef\M:N{##1}\edef\M:X{##1}\fi
+\def\:temp{
+ \CSeg\:GetX(##1,\M:N) \IF \GtDec(\Va,0) \edef\M:N{##1}\FI
+ \CSeg\:GetX(\cur:,\M:N) \IF \GtDec(\Va,0) \edef\M:N{\cur:}\FI
+ \CSeg\:GetX(\M:X,##1) \IF \GtDec(\Va,0) \edef\M:X{##1}\FI
+ \CSeg\:GetX(\M:X,\cur:) \IF \GtDec(\Va,0) \edef\M:X{\cur:}\FI
+}
+\:temp
+{\Edge(##1,\cur:)}\gob:I}
+
+\else
+ \Edge(##1,\cur:)
+
+\fi
+
+\fi
+\Clip()
+\let\utask:=\utaskIV:
+ }
+\let\utask:=\utaskIV:
+\csname\first: :under\endcsname
+
+ \sapply{in,\extrm:in}
+\ifx \M:N\empty\else
+ \MoveToNode(\M:N,-1,0) \MarkLoc(.\M:N)
+ \MoveToNode(\M:X,1,0) \MarkLoc(.\M:X)
+ {\Text(----)}
+
+ \CSeg\:GetX(origin:,.\M:N) \xdef\left:mrk{\Val\Va}
+ \CSeg\:GetX(origin:,.\M:X) \xdef\right:mrk{\Val\Va}
+\fi
+
+ \seg:prt
+
+\ifx \:tmp\def
+ \sapply{done,merge,done,in}
+\edef\:temp{\noexpand \sapply{done,merge,{\csname
+ done:mkls\endcsname},{}}}
+\expandafter
+
+ \egroup \:temp
+ \ifnum \effort:n>-1
+ \sapply{leftover,subtract,done,prevdone}
+ \let\:tmp=\relax
+ \sapply{leftover,\let\:tmp=\def\gob:I}
+ \ifx \:tmp\def
+ \snd:bxo \pertcode:
+ \else
+ \global \expandafter\setbox
+ \csname dra:bx\effort:n\endcsname=\hbox{}
+ \I:I=\effort:n; \I:I-1; \edef\effort:n{\Val\I:I}
+ \fi
+\fi
+
+ \sapply{leftover,subtract,all,done}
+ \let\:tmp=\relax
+ \sapply{leftover,\let\:tmp=\def\gob:I}
+ \ifx \:tmp\def
+ \I:I=\effort:n; \I:I+1; \edef\effort:n{\Val\I:I}
+ \if Y\overflow:col
+ \def\overflow:col{N}
+\else
+ \I:I=\r:pert; \I:I+1; \edef\l:pert{\Val\I:I}
+ \I:I=\r:pert; \I:I+\step:right; \edef\r:pert{\Val\I:I}
+ \ifnum \l:pert > \if H\hpert: \rowsno: \else \colsno: \fi
+ \I:I=\d:pert; \I:I+1; \edef\u:pert{\Val\I:I}
+ \I:I=\d:pert; \I:I+\step:down; \edef\d:pert{\Val\I:I}
+ \def\l:pert{0} \I:I=\step:right; \I:I-1; \edef\r:pert{\Val\I:I}
+ \fi
+\fi
+\if H\hpert: \else
+ \I:I=\l:pert; \I:I+7;
+ \Do(\l:pert,\Val\I:I){
+ \def\:tmp####1{
+ \ifnum \csname####1 : in/cl:\endcsname=\DoReg
+ \sapply{used,merge,used,{####1}}
+ \fi
+}
+\sapply{used,merge,{},{}}
+\sapply{all,\:tmp}
+\sapply{used,subtract,used,done}
+\let\:tmp=\relax
+\sapply{used,\let\:tmp=\def\gob:I}
+\ifx \:tmp\relax
+ \I:I=\r:pert; \I:I+1; \edef\r:pert{\Val\I:I}
+\fi
+
+ }
+\fi
+
+
+ \aft:edraw
+
+\df:bfs
+
+
+ \expandafter\expandafter\expandafter\pert:diag
+ \else
+ \expandafter\expandafter\expandafter\gob:I
+ \fi
+\else
+ \expandafter\gob:I
+\fi {#1}
+
+}
+\def\seg:prt{
+ \let\:tmp=\def
+ \ifnum \pert:rows=10000
+ \ifnum \pert:cols=10000
+ \let\:tmp=\relax
+ \fi \fi
+}
+\def\grps:ns#1#2#3{{
+ \ifnum #3>#2
+ \I:I=#3; \I:I+1;
+ \else
+ \R=#2; \R+1; \R/#3; \R+0.49999; \J:J[\R];
+ \R=#2; \R+1; \R/\J:J; \I:I[\R];
+ \fi
+ \edef#1{\def\noexpand#1{\Val\I:I}}
+ \expandafter}#1}
+\def\put:nd#1{
+ \let\sv:EntryExit\:InOut
+ \IF \LtInt(\K:K,0)
+ \EntryExit(-1,1,-1,-1)
+\MoveToLoc(col.maxX) \Move(\openpertH:,0)
+\FcNode(#1) \pert:bnode(#1)
+\MoveToExit(0,1) \MarkLoc(from) \MoveToExit(0,-1) \MarkLoc(to)
+\MoveToLoc(col.maxX) \CSeg\Move(from,to)
+\Move(0,-\openpertV:) \MarkLoc(col.maxX)
+
+ \ELSE
+ \EntryExit(1,1,1,-1)
+\MoveToLoc(col.minX) \Move(-\openpertH:,0)
+\FcNode(#1) \pert:bnode(#1)
+\MoveToExit(0,1) \MarkLoc(from) \MoveToExit(0,-1) \MarkLoc(to)
+\MoveToLoc(col.minX) \CSeg\Move(from,to)
+\Move(0,-\openpertV:) \MarkLoc(col.minX)
+
+ \FI
+ \K:K-1;
+ \let\:InOut\sv:EntryExit
+}
+\def\gob:I#1{}
+\:DefineExt\pertlimits(1){\endgroup
+ \pertlimits:#1,,,,,//
+}
+\expandafter\long\expandafter\def\csname
+ .:\string \pertlimits\endcsname(#1){\endgroup
+ \pertlimits:#1,,,,,//
+}
+\long\def\pertlimits:#1,#2,#3,#4,#5//{
+ \def\temp:{#1} \ifx\temp:\empty\else \def\pert:rows{#1} \fi
+ \def\temp:{#2} \ifx\temp:\empty\else \def\pert:cols{#2} \fi
+ \def\temp:{#3} \ifx\temp:\empty\else \def\pert:bnode{#3} \fi
+ \def\temp:{#3} \ifx\temp:\empty\else \def\pertcode:{#4} \fi
+}
+\pertlimits(10000,10000,\ExtNode,\par)
+\Define\ExtNode(1){
+ \filtercommand\name{#1}
+ \OvalNode(#1)(--\putcommand--)}
+\def\extrm:in#1{\ifx\M:N\empty \edef\M:N{#1}\edef\M:X{#1}\fi
+\def\:temp{
+ \CSeg\:GetX(#1,\M:N) \IF \GtDec(\Va,0) \edef\M:N{#1}\FI
+ \CSeg\:GetX(\M:X,#1) \IF \GtDec(\Va,0) \edef\M:X{#1}\FI
+}
+\:temp
+}
+\expandafter \ifx \csname tmp:dim\endcsname \relax
+ \csname newdimen\endcsname \tmp:dim
+\fi
+
+
+\:RestoreCatcodes \endinput
+
+
diff --git a/graphics/dratex/wotree.sty b/graphics/dratex/wotree.sty
new file mode 100644
index 0000000000..78ec73999d
--- /dev/null
+++ b/graphics/dratex/wotree.sty
@@ -0,0 +1,106 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% wotree.sty 2000-06-29-20:18 %
+% Copyright (C) 2000 Eitan M. Gurari %
+% %
+% This program can redistributed and/or modified under %
+% the terms of the LaTeX Project Public License %
+% Distributed from CTAN archives in directory %
+% macros/latex/base/lppl.txt; either version 1 of the %
+% License, or (at your option) any later version. %
+% %
+% However, you are allowed to modify this program %
+% without changing its name, if you modify its %
+% signature. Changes to the signature can be introduced %
+% with a directive of the form %
+% \message{signature} %
+% %
+% gurari@cse.ohio-state.edu %
+% http://www.cse.ohio-state.edu/~gurari %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\immediate\write-1{version 2000-06-29-20:18}
+
+\expandafter\edef\csname wo:recall\endcsname{\catcode`:=\the\catcode`:}
+\catcode`\:=11
+
+\Define\WO:GetY(2){\Vb=#2;}
+
+\Define\WOEdge(2){
+ \CSeg\WO:GetY(#2,EdgeGuide)
+ \IF \GtDec(\Vb,0)
+ \MoveToNode(#2,0,-1)
+ \ELSE
+ \MoveToNode(#2,0,1)
+ \FI
+ \MarkLoc(*1) \Move(10,0) \MarkLoc(*2)
+ \MoveToLoc(EdgeGuide) \Move(0,10) \MarkLoc(*3)
+ \MoveToLL(*1,*2)(EdgeGuide,*3) \MarkLoc(*3)
+ \MoveToNode(#1,1,0) \Move(5,0) \LineToLoc(EdgeGuide)
+ \LineToLoc(*3) \CSeg[2]\Line(*1,#2)
+}
+\def\WOTree#1{%
+ \let\WO:tree=\empty
+ \def\:queue{\init:count#1,,//}\put:queue
+ \TreeSpec()()(\WOEdge)
+ \TreeAlign(H,-1,0)(0,0,0)%
+ \WO:TreeSpace
+ \def\wo:temp{\Tree()(}%
+ \expandafter\wo:temp\expandafter{\WO:tree})
+ }
+
+\def\put:queue{%
+ \let\put:woitem=\empty
+ \ifx \WO:tree\empty \else
+ \expandafter\def\expandafter\WO:tree\expandafter{\WO:tree//}%
+ \fi
+ \ifx \:queue\empty \def\wo:temp##1{}\else
+ \let\wo:temp=\:queue \let\:queue=\empty \fi
+ \wo:temp\put:queue }
+
+\def\init:count#1,{%
+ \def\WO:root{#1}\I=0;\WO:count}
+
+\edef\wo:temp{\catcode`\noexpand\&=\the\catcode`\&}
+\catcode`\&=13
+
+\def\WO:count#1,{%
+ \def\wo:temp{#1}\ifx \wo:temp\empty
+ \expandafter\checkWO:root\WO:root//%
+ \edef\wo:temp{\put:woitem\Val\I,\beforeWO:root}%
+ \def\put:woitem{\noexpand&}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\WO:root
+ \expandafter\expandafter\expandafter
+ {\expandafter\wo:temp\WO:root}%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\WO:tree
+ \expandafter\expandafter\expandafter
+ {\expandafter\WO:tree \WO:root}%
+ \def\WO:root##1//{}\expandafter\WO:root
+ \else
+ \expandafter\def\expandafter\:queue
+ \expandafter{\:queue\init:count#1,,//}%
+ \I+1;\expandafter\WO:count
+ \fi }
+
+\wo:temp
+
+\def\checkWO:root{\futurelet\wo:temp\ckWO:root}
+\def\ckWO:root#1//{\edef\beforeWO:root{\ifx \wo:temp\WO \else
+ \ifx \WO:tree\empty\else
+ \noexpand\noexpand\noexpand\WO{}\fi\fi}}
+
+\def\WO#1{\csname :WO:#1\endcsname}
+\def\defWO#1#2{\expandafter\def\csname :WO:#1\endcsname{#2}}
+
+\defWO{}{\llap{$\triangleright$ }}
+\defWO{not}{\hrulefill~~\WO{}}
+\defWO{or}{~$\bigoplus$}
+\defWO{plus}{~$+$}
+\defWO{xor}{~$\bigotimes$}
+
+\Define\WOSpace(2){\def\WO:TreeSpace{\TreeSpace(C,#1,#2)}}
+\WOSpace(10,20)
+
+\wo:recall
+\endinput
+