From 939f4c88e783054e9fab1efb39d417efe1ce5e89 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 20 Sep 2008 13:43:39 +0000 Subject: back to generic git-svn-id: svn://tug.org/texlive/trunk@10658 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/generic/dratex/Examples.tex | 2058 +++++++++++++++ Master/texmf-dist/doc/generic/dratex/README | 2 + Master/texmf-dist/doc/latex/dratex/Examples.tex | 2058 --------------- Master/texmf-dist/doc/latex/dratex/README | 2 - Master/texmf-dist/tex/generic/dratex/AlDraTex.sty | 2262 +++++++++++++++++ Master/texmf-dist/tex/generic/dratex/DraTex.sty | 1636 ++++++++++++ .../texmf-dist/tex/generic/dratex/TeXProject.sty | 2678 ++++++++++++++++++++ Master/texmf-dist/tex/generic/dratex/wotree.sty | 106 + Master/texmf-dist/tex/latex/dratex/AlDraTex.sty | 2262 ----------------- Master/texmf-dist/tex/latex/dratex/DraTex.sty | 1636 ------------ Master/texmf-dist/tex/latex/dratex/TeXProject.sty | 2678 -------------------- Master/texmf-dist/tex/latex/dratex/wotree.sty | 106 - 12 files changed, 8742 insertions(+), 8742 deletions(-) create mode 100644 Master/texmf-dist/doc/generic/dratex/Examples.tex create mode 100644 Master/texmf-dist/doc/generic/dratex/README delete mode 100644 Master/texmf-dist/doc/latex/dratex/Examples.tex delete mode 100644 Master/texmf-dist/doc/latex/dratex/README create mode 100644 Master/texmf-dist/tex/generic/dratex/AlDraTex.sty create mode 100644 Master/texmf-dist/tex/generic/dratex/DraTex.sty create mode 100644 Master/texmf-dist/tex/generic/dratex/TeXProject.sty create mode 100644 Master/texmf-dist/tex/generic/dratex/wotree.sty delete mode 100644 Master/texmf-dist/tex/latex/dratex/AlDraTex.sty delete mode 100644 Master/texmf-dist/tex/latex/dratex/DraTex.sty delete mode 100644 Master/texmf-dist/tex/latex/dratex/TeXProject.sty delete mode 100644 Master/texmf-dist/tex/latex/dratex/wotree.sty (limited to 'Master/texmf-dist') diff --git a/Master/texmf-dist/doc/generic/dratex/Examples.tex b/Master/texmf-dist/doc/generic/dratex/Examples.tex new file mode 100644 index 00000000000..4603a22b63a --- /dev/null +++ b/Master/texmf-dist/doc/generic/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) \(20) +\LineF(20) \Rotate(55) \LineF(16) +\new(hand) \(140) \LineF(35) +\new(hand) \(90) \LineF(7) +\new(head) \(-60) \LineF(19) +\new(left-leg) \(210) \LineF(12) +\Rotate(30) \LineF(14) \new(right-leg) +\Do(1,11){\I+15; \(\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. + +@<<< +BEGIN {print"words\t lines"} +@ +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. + +@<<< +{ c[NF]=c[NF]+1 + {if (NF>m) m=NF} } +|LLL \OutputCode@ +|Close >>> + + +\Exr{22}2{2b} +\<<< +|Open +\AlProTex{awk,<<<|LLL,@,% + list,title,[]} + +An Awk program for deriving +the distribution of words. + +\<<< +BEGIN {print"words\t lines"} +@ +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. + +\<<< +{ c[NF]=c[NF]+1 + {if (NF>m) m=NF} } +|LLL \OutputCode\ +|Close >>> + + +\Exr{22}2{3} + +\<<< +|Open +\AlProTex{p,<<<|LLL,% + title,list,[]} + +\<<< +PROGRAM prog;|LLL + +\<<< +{ comment } |LLL + +\<<< +BEGIN + \ +END.|LLL + +\OutputCode\ +|Close >>> + +\Exr{22}2{4a} + +\<<< +|Open +\AlProTex{p,list,% + <<<|LLL,title,[]} + +\<\><<< +PROGRAM prog;|LLL + +\<<< +{ comment } |LLL + +\<\><<< +BEGIN + \ +END.|LLL + +\OutputCode\<\> +|Close >>> + +\Exr{22}2{4b} + +\<<< +|Open +\AlProTex{p,% + <<<|LLL,title,[]} + +\<\><<< +PROGRAM prog;|LLL +\ShowCode-\<\> + +\<<< +{ comment } |LLL +\ShowCode\ + +\<\><<< +BEGIN + \ +END.|LLL +\ShowCode\<\> +\OutputCode\<\> +|Close >>> + +\Exr{22}2{4c} + +\<<< +|Open +\AlProTex{p,% + <<<|LLL,title,[]} + +\<\><<< +PROGRAM prog;|LLL + +\<<< +{ comment } |LLL + +\<\><<< +BEGIN + \ +END.|LLL + +\OutputCode\<\> +|Close >>> + + + +\Exr{22}2{5a} + +\<<< +|Open +\AlProTex{p,<<<|LLL,% + title,list,[]} + +\<<< +PROGRAM prog;|LLL + +\<<< +{ comment } |LLL + +\<<< +BEGIN + \ +END.|LLL +\OutputCode\ + +|Close >>> + +\Exr{22}2{5b} + +\<<< +|Open +\AlProTex{p,title,list,[]} + +\{PROGRAM prog;} + +\{ \{ comment \} } + +\{BEGIN + \ +END.} +\OutputCode\ + +|Close >>> + + + + +\Exr{22}2{6a} + +\<<< +|Open +\AlProTex{p,<<<|LLL,[],% + title,list} +\<<< +PROGRAM prog; +BEGIN + \ +END.|LLL + +\<<< +{ comment: \\@||` } |LLL +|Close >>> + +\Exr{22}2{6b} + +\<<< +|Open +\AlProTex{p,<<<|LLL,[],% + title,list,@} +\<<< +PROGRAM prog; +BEGIN + @ +END.|LLL + +\<<< +{ comment: \@@||` } |LLL +|Close >>> + +\Exr{22}2{6c} + + +\<<< +|Open +\AlProTex{p,<<<|LLL,[],% + title,list,||} +\<<< +PROGRAM prog; +BEGIN + || +END.|LLL + +\<<< +{ comment: \@||||` } |LLL +|Close >>> + + +\Exr{22}2{6d} + +\<<< +|Open +\AlProTex{p,<<<|LLL,[],% + title,list,`} +\<<< +PROGRAM prog; +BEGIN + ` +END.|LLL + +\<<< +{ comment: \@||`` } |LLL +|Close >>> + +\Exr{22}2{7} + +\<<< +|Open +\AlProTex{p,<<<|LLL,[],% + title,list,||} + +\<<< +\<<< +PROGRAM prog; +BEGIN + |||| +END.>||empty>> + +\<<< +{comment: \@||||||||} >||empty>> + +\OutputCode\ |LLL + +\OutputCode[prg]\ +\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,[]} + +\<<< +PROGRAM prog;|LLL + +\<<< +{ comment } |LLL + +\<<< +BEGIN + \ +END.|LLL + +\OutputCode\ +|Close >>> + +\Exr{22}2{10a} + +\<<< +|Open +\AlProTex{p,<<<|LLL,title,% + list,[],enumerate} + +See lines \RefLine[*]. + +\<<< +PROGRAM prog;\TagLine[*] |LLL + +\<<< +{comment: see \RefLine[*]}|LLL + +\<<< +BEGIN + \ \TagLine[*] |LLL + +\ResetLineCount +\<<< +END.|LLL \OutputCode\ +|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{*}. + +\<<< +PROGRAM prog;\CodeTag[*][1]|LLL + +\<<< +{comment: see \CodeRef[*]}|LLL + +\<<< +BEGIN + \ \CodeTag[*][2]|LLL + +\ResetLineCount \Tag{*}{3} +\<<< +END.|LLL \OutputCode\ +|Close >>> + + + + +\Exr{22}2{11} + +\<<< +|Open +\AlProTex{p,<<<|LLL,title,% + list,[],ShowIndex} + +\<<< +PROGRAM prog;|LLL + +\<<< +{ comment } |LLL +\TextIndex{Tracing} +\SecIndex{***} + +\<<< +BEGIN + \ +END.|LLL + +\def\BeforeIndex{Index} +\ShowIndex +|Close >>> + + + \Exr{22}2{12} + +\<<< +|Open +\AlProTex{p,<<<|LLL,% + title,[],ShowTop} + +\<<< +PROGRAM prog; +BEGIN \ +END.|LLL +\<<< +{ comment 1} +|LLL +\<<< +\ +|LLL +\<<< +{ comment 2 } |LLL +\ShowTop\ + +\def\ShowSep{(* ***** *)\par} +\ShowTop\ +|Close >>> + + \Exr{22}2{13} + + +\<<< +|Open +\AlProTex{p,<<<|LLL,title,% + list,[],NoShow} + +First piece of text. + +\<<< +PROGRAM prog; |LLL + +\ShowOff Second piece of text. + +\<<< +{ comment } |LLL + +\Note Third piece of +text. \EndNote\ShowOn + +\<<< +BEGIN + \ +END.|LLL + +Last piece of text. +|Close >>> + + \Exr{22}2{14} + +\<<< +|Open +\AlProTex{p,<<<|LLL,title,% + list,ShowIndex,ClearCode} + +Chapter 1 + +\<<< +PROGRAM prog; +|LLL +\<<< +BEGIN + { comment 1 } +END.|LLL \ShowIndex + \ClearCode +\vfil\break Chapter 2 + +\<<< +PROGRAM prog; +|LLL +\<<< +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. +@= + x := X * D DIV (D + Z); + +@ The viewer is located + at {\tt (0,0,-D)}. +@= + CONST D=100; + VAR X {x}, Z: INTEGER; + +@ +@= + y := Y * D DIV (D + Z); + +@ +@=Y {y}: INTEGER; + +@* Main program. +@p PROGRAM D2view; + @ + BEGIN read(X,Y,Z); + @ + 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... + +\<<< +PROGRAM prog;|LLL + +Foooo... + +\<<< +{ comment } |LLL + +Foooo... + +\<<< +BEGIN + \ +END.|LLL + +Foooo... + +\OutputCode\ +|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\} + +B. Definitions of code fragments: \hfill {\tt\string\<<< + +\hfill code fragment>>>} + +B. Output file of code (`[{\it extension}]' is optional): + \hfill{\tt\string\o[{\it extention}]\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\ +\<<< +PROGRAM prog;|LLL +\cCccc... + +Foooo... + +\<<< +{ comment } |LLL + +Foooo... + +\<<< +BEGIN + \ +END.|LLL + +Foooo... + +\o\ + +\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@ + +@<<< +PROGRAM prog;|LLL +@cCccc... + +Foooo... + +@<<< +{ comment } |LLL + +Foooo... + +@<<< +BEGIN + @ +END.|LLL + +Foooo... + +@o@ + +@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/Master/texmf-dist/doc/generic/dratex/README b/Master/texmf-dist/doc/generic/dratex/README new file mode 100644 index 00000000000..865e121ca3f --- /dev/null +++ b/Master/texmf-dist/doc/generic/dratex/README @@ -0,0 +1,2 @@ +Documentation can be found at + http://www.cse.ohio-state.edu/~gurari/systems.html diff --git a/Master/texmf-dist/doc/latex/dratex/Examples.tex b/Master/texmf-dist/doc/latex/dratex/Examples.tex deleted file mode 100644 index 4603a22b63a..00000000000 --- a/Master/texmf-dist/doc/latex/dratex/Examples.tex +++ /dev/null @@ -1,2058 +0,0 @@ -%\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) \(20) -\LineF(20) \Rotate(55) \LineF(16) -\new(hand) \(140) \LineF(35) -\new(hand) \(90) \LineF(7) -\new(head) \(-60) \LineF(19) -\new(left-leg) \(210) \LineF(12) -\Rotate(30) \LineF(14) \new(right-leg) -\Do(1,11){\I+15; \(\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. - -@<<< -BEGIN {print"words\t lines"} -@ -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. - -@<<< -{ c[NF]=c[NF]+1 - {if (NF>m) m=NF} } -|LLL \OutputCode@ -|Close >>> - - -\Exr{22}2{2b} -\<<< -|Open -\AlProTex{awk,<<<|LLL,@,% - list,title,[]} - -An Awk program for deriving -the distribution of words. - -\<<< -BEGIN {print"words\t lines"} -@ -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. - -\<<< -{ c[NF]=c[NF]+1 - {if (NF>m) m=NF} } -|LLL \OutputCode\ -|Close >>> - - -\Exr{22}2{3} - -\<<< -|Open -\AlProTex{p,<<<|LLL,% - title,list,[]} - -\<<< -PROGRAM prog;|LLL - -\<<< -{ comment } |LLL - -\<<< -BEGIN - \ -END.|LLL - -\OutputCode\ -|Close >>> - -\Exr{22}2{4a} - -\<<< -|Open -\AlProTex{p,list,% - <<<|LLL,title,[]} - -\<\><<< -PROGRAM prog;|LLL - -\<<< -{ comment } |LLL - -\<\><<< -BEGIN - \ -END.|LLL - -\OutputCode\<\> -|Close >>> - -\Exr{22}2{4b} - -\<<< -|Open -\AlProTex{p,% - <<<|LLL,title,[]} - -\<\><<< -PROGRAM prog;|LLL -\ShowCode-\<\> - -\<<< -{ comment } |LLL -\ShowCode\ - -\<\><<< -BEGIN - \ -END.|LLL -\ShowCode\<\> -\OutputCode\<\> -|Close >>> - -\Exr{22}2{4c} - -\<<< -|Open -\AlProTex{p,% - <<<|LLL,title,[]} - -\<\><<< -PROGRAM prog;|LLL - -\<<< -{ comment } |LLL - -\<\><<< -BEGIN - \ -END.|LLL - -\OutputCode\<\> -|Close >>> - - - -\Exr{22}2{5a} - -\<<< -|Open -\AlProTex{p,<<<|LLL,% - title,list,[]} - -\<<< -PROGRAM prog;|LLL - -\<<< -{ comment } |LLL - -\<<< -BEGIN - \ -END.|LLL -\OutputCode\ - -|Close >>> - -\Exr{22}2{5b} - -\<<< -|Open -\AlProTex{p,title,list,[]} - -\{PROGRAM prog;} - -\{ \{ comment \} } - -\{BEGIN - \ -END.} -\OutputCode\ - -|Close >>> - - - - -\Exr{22}2{6a} - -\<<< -|Open -\AlProTex{p,<<<|LLL,[],% - title,list} -\<<< -PROGRAM prog; -BEGIN - \ -END.|LLL - -\<<< -{ comment: \\@||` } |LLL -|Close >>> - -\Exr{22}2{6b} - -\<<< -|Open -\AlProTex{p,<<<|LLL,[],% - title,list,@} -\<<< -PROGRAM prog; -BEGIN - @ -END.|LLL - -\<<< -{ comment: \@@||` } |LLL -|Close >>> - -\Exr{22}2{6c} - - -\<<< -|Open -\AlProTex{p,<<<|LLL,[],% - title,list,||} -\<<< -PROGRAM prog; -BEGIN - || -END.|LLL - -\<<< -{ comment: \@||||` } |LLL -|Close >>> - - -\Exr{22}2{6d} - -\<<< -|Open -\AlProTex{p,<<<|LLL,[],% - title,list,`} -\<<< -PROGRAM prog; -BEGIN - ` -END.|LLL - -\<<< -{ comment: \@||`` } |LLL -|Close >>> - -\Exr{22}2{7} - -\<<< -|Open -\AlProTex{p,<<<|LLL,[],% - title,list,||} - -\<<< -\<<< -PROGRAM prog; -BEGIN - |||| -END.>||empty>> - -\<<< -{comment: \@||||||||} >||empty>> - -\OutputCode\ |LLL - -\OutputCode[prg]\ -\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,[]} - -\<<< -PROGRAM prog;|LLL - -\<<< -{ comment } |LLL - -\<<< -BEGIN - \ -END.|LLL - -\OutputCode\ -|Close >>> - -\Exr{22}2{10a} - -\<<< -|Open -\AlProTex{p,<<<|LLL,title,% - list,[],enumerate} - -See lines \RefLine[*]. - -\<<< -PROGRAM prog;\TagLine[*] |LLL - -\<<< -{comment: see \RefLine[*]}|LLL - -\<<< -BEGIN - \ \TagLine[*] |LLL - -\ResetLineCount -\<<< -END.|LLL \OutputCode\ -|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{*}. - -\<<< -PROGRAM prog;\CodeTag[*][1]|LLL - -\<<< -{comment: see \CodeRef[*]}|LLL - -\<<< -BEGIN - \ \CodeTag[*][2]|LLL - -\ResetLineCount \Tag{*}{3} -\<<< -END.|LLL \OutputCode\ -|Close >>> - - - - -\Exr{22}2{11} - -\<<< -|Open -\AlProTex{p,<<<|LLL,title,% - list,[],ShowIndex} - -\<<< -PROGRAM prog;|LLL - -\<<< -{ comment } |LLL -\TextIndex{Tracing} -\SecIndex{***} - -\<<< -BEGIN - \ -END.|LLL - -\def\BeforeIndex{Index} -\ShowIndex -|Close >>> - - - \Exr{22}2{12} - -\<<< -|Open -\AlProTex{p,<<<|LLL,% - title,[],ShowTop} - -\<<< -PROGRAM prog; -BEGIN \ -END.|LLL -\<<< -{ comment 1} -|LLL -\<<< -\ -|LLL -\<<< -{ comment 2 } |LLL -\ShowTop\ - -\def\ShowSep{(* ***** *)\par} -\ShowTop\ -|Close >>> - - \Exr{22}2{13} - - -\<<< -|Open -\AlProTex{p,<<<|LLL,title,% - list,[],NoShow} - -First piece of text. - -\<<< -PROGRAM prog; |LLL - -\ShowOff Second piece of text. - -\<<< -{ comment } |LLL - -\Note Third piece of -text. \EndNote\ShowOn - -\<<< -BEGIN - \ -END.|LLL - -Last piece of text. -|Close >>> - - \Exr{22}2{14} - -\<<< -|Open -\AlProTex{p,<<<|LLL,title,% - list,ShowIndex,ClearCode} - -Chapter 1 - -\<<< -PROGRAM prog; -|LLL -\<<< -BEGIN - { comment 1 } -END.|LLL \ShowIndex - \ClearCode -\vfil\break Chapter 2 - -\<<< -PROGRAM prog; -|LLL -\<<< -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. -@= - x := X * D DIV (D + Z); - -@ The viewer is located - at {\tt (0,0,-D)}. -@= - CONST D=100; - VAR X {x}, Z: INTEGER; - -@ -@= - y := Y * D DIV (D + Z); - -@ -@=Y {y}: INTEGER; - -@* Main program. -@p PROGRAM D2view; - @ - BEGIN read(X,Y,Z); - @ - 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... - -\<<< -PROGRAM prog;|LLL - -Foooo... - -\<<< -{ comment } |LLL - -Foooo... - -\<<< -BEGIN - \ -END.|LLL - -Foooo... - -\OutputCode\ -|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\} - -B. Definitions of code fragments: \hfill {\tt\string\<<< - -\hfill code fragment>>>} - -B. Output file of code (`[{\it extension}]' is optional): - \hfill{\tt\string\o[{\it extention}]\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\ -\<<< -PROGRAM prog;|LLL -\cCccc... - -Foooo... - -\<<< -{ comment } |LLL - -Foooo... - -\<<< -BEGIN - \ -END.|LLL - -Foooo... - -\o\ - -\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@ - -@<<< -PROGRAM prog;|LLL -@cCccc... - -Foooo... - -@<<< -{ comment } |LLL - -Foooo... - -@<<< -BEGIN - @ -END.|LLL - -Foooo... - -@o@ - -@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/Master/texmf-dist/doc/latex/dratex/README b/Master/texmf-dist/doc/latex/dratex/README deleted file mode 100644 index 865e121ca3f..00000000000 --- a/Master/texmf-dist/doc/latex/dratex/README +++ /dev/null @@ -1,2 +0,0 @@ -Documentation can be found at - http://www.cse.ohio-state.edu/~gurari/systems.html diff --git a/Master/texmf-dist/tex/generic/dratex/AlDraTex.sty b/Master/texmf-dist/tex/generic/dratex/AlDraTex.sty new file mode 100644 index 00000000000..dc44afbcab9 --- /dev/null +++ b/Master/texmf-dist/tex/generic/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} \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,\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} + \: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} + \: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=\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{\begingroup\:Spaces + \:DiagNds(#1,#3)}} + + \Define\:Temp{ +\def\:DiagNds(##1,##2)(##3){\endgroup + \Table\:Temp{##3} \:SetDiaNodes##2 + \Indirect} + }\:Temp \Define\Diagram{ \Indirect } + +\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 } + \Do(0,#2){ \:C=\DoReg; \Indirect\DecVar } + \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(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=-}; \:C-1; + \Indirect{\Va+}; + \Va*\:YGridEntry; \:C+1; + \Indirect{\Va+}; \:C-1; + \Indirect+\Va; } +\:C=0; \:VerAdj(0,99){\:C+1; \:AdjGridHeight} +\Do(2,\:Nrows){ \:C=\DoReg; \:C-1; + \Indirect{\Va=}; \:C+1; + \Indirect+\Va; } \FI +\IF \GtInt(\:Ncols,1) \THEN + \Do(2,\:Ncols){ \:C=\DoReg; + \Indirect{\Va=+}; \:C-1; + \Indirect{\Va-}; + \Va*\:XGridEntry; \:C+1; + \Indirect{\Va+}; \:C-1; + \Indirect+\Va; } +\:C=0; \:HorAdj(0,99){\:C+1; \:AdjGridWidth} +\Do(2,\:Ncols){ \:C=\DoReg; \:C-1; + \Indirect{\Va=}; \:C+1; + \Indirect+\Va; } \FI +\Do(1,\:Nrows){ \:C=\DoReg; + \Indirect{\Indirect=-}; } + \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{\: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=}; + \IF \GtDec(\Va,\:Ve) \THEN + \Indirect=\Va; \FI + \Indirect{\:Ve=}; + \IF \GtDec(\Vb,\:Ve) \THEN + \Indirect=\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=}; + \Indirect{\Vb=}; + \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=}; \Va+#1; + \IF \LtDec(\Va,#2) \THEN \Va=#2; \ELSE + \IF \GtDec(\Va,#3) \THEN \Va=#3; \FI \FI + \Indirect=\Va; }\Define\:AdjGridHeight(3){ + \Indirect{\Va=}; \Va+#1; + \IF \LtDec(\Va,#2) \THEN \Va=#2; \ELSE + \IF \GtDec(\Va,#3) \THEN \Va=#3; \FI \FI + \Indirect=\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} \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&{ + \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=-}; \:Ca-1; + \Indirect\DecVar +\ifx H\:TreeDir \Indirect=-\:EntryX; +\else \Indirect=\:EntryY; \fi +\Indirect+1; +\Indirect{\Indirect*}; +\Indirect/2; + \Indirect{\Va+}; + \ifx H\:TreeDir \Va*-\:EntryX; + \else \Va*\:EntryY; \fi + \:Ca+1; \Indirect{\Va+}; \:Ca-1; + \Indirect+\Va; + \Indirect/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=} +\Indirect{\let\:vb=} + \let\:TagNode=\::TagNode +\let\:EdgeNode=\::EdgeNode + +\Do(0,\Val\:C){ \:Ca=-1; \:Cb=-1; + \Indirect(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(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{\:Temp} + \def\:tempa{} \:Vc=0; +\def\:tempb{\:tk=} \:Ca=-1; +\Indirect(0,99){\:Ca+1; \:MeasureRow} +\Indirect\DecVar +\Indirect=\: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},0) +\else \Indirect{\Move(0,\Val}) \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+#1; + \Va=#1; \Va*\:TreeEdgeSpec; \Indirect+\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},0) + \else \Indirect{\Move(0,-\Val}) \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/Master/texmf-dist/tex/generic/dratex/DraTex.sty b/Master/texmf-dist/tex/generic/dratex/DraTex.sty new file mode 100644 index 00000000000..2a3f3e1e584 --- /dev/null +++ b/Master/texmf-dist/tex/generic/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& && \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/Master/texmf-dist/tex/generic/dratex/TeXProject.sty b/Master/texmf-dist/tex/generic/dratex/TeXProject.sty new file mode 100644 index 00000000000..79bcbb789f6 --- /dev/null +++ b/Master/texmf-dist/tex/generic/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/Master/texmf-dist/tex/generic/dratex/wotree.sty b/Master/texmf-dist/tex/generic/dratex/wotree.sty new file mode 100644 index 00000000000..78ec73999d5 --- /dev/null +++ b/Master/texmf-dist/tex/generic/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 + diff --git a/Master/texmf-dist/tex/latex/dratex/AlDraTex.sty b/Master/texmf-dist/tex/latex/dratex/AlDraTex.sty deleted file mode 100644 index dc44afbcab9..00000000000 --- a/Master/texmf-dist/tex/latex/dratex/AlDraTex.sty +++ /dev/null @@ -1,2262 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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} \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,\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} - \: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} - \: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=\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{\begingroup\:Spaces - \:DiagNds(#1,#3)}} - - \Define\:Temp{ -\def\:DiagNds(##1,##2)(##3){\endgroup - \Table\:Temp{##3} \:SetDiaNodes##2 - \Indirect} - }\:Temp \Define\Diagram{ \Indirect } - -\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 } - \Do(0,#2){ \:C=\DoReg; \Indirect\DecVar } - \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(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=-}; \:C-1; - \Indirect{\Va+}; - \Va*\:YGridEntry; \:C+1; - \Indirect{\Va+}; \:C-1; - \Indirect+\Va; } -\:C=0; \:VerAdj(0,99){\:C+1; \:AdjGridHeight} -\Do(2,\:Nrows){ \:C=\DoReg; \:C-1; - \Indirect{\Va=}; \:C+1; - \Indirect+\Va; } \FI -\IF \GtInt(\:Ncols,1) \THEN - \Do(2,\:Ncols){ \:C=\DoReg; - \Indirect{\Va=+}; \:C-1; - \Indirect{\Va-}; - \Va*\:XGridEntry; \:C+1; - \Indirect{\Va+}; \:C-1; - \Indirect+\Va; } -\:C=0; \:HorAdj(0,99){\:C+1; \:AdjGridWidth} -\Do(2,\:Ncols){ \:C=\DoReg; \:C-1; - \Indirect{\Va=}; \:C+1; - \Indirect+\Va; } \FI -\Do(1,\:Nrows){ \:C=\DoReg; - \Indirect{\Indirect=-}; } - \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{\: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=}; - \IF \GtDec(\Va,\:Ve) \THEN - \Indirect=\Va; \FI - \Indirect{\:Ve=}; - \IF \GtDec(\Vb,\:Ve) \THEN - \Indirect=\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=}; - \Indirect{\Vb=}; - \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=}; \Va+#1; - \IF \LtDec(\Va,#2) \THEN \Va=#2; \ELSE - \IF \GtDec(\Va,#3) \THEN \Va=#3; \FI \FI - \Indirect=\Va; }\Define\:AdjGridHeight(3){ - \Indirect{\Va=}; \Va+#1; - \IF \LtDec(\Va,#2) \THEN \Va=#2; \ELSE - \IF \GtDec(\Va,#3) \THEN \Va=#3; \FI \FI - \Indirect=\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} \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&{ - \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=-}; \:Ca-1; - \Indirect\DecVar -\ifx H\:TreeDir \Indirect=-\:EntryX; -\else \Indirect=\:EntryY; \fi -\Indirect+1; -\Indirect{\Indirect*}; -\Indirect/2; - \Indirect{\Va+}; - \ifx H\:TreeDir \Va*-\:EntryX; - \else \Va*\:EntryY; \fi - \:Ca+1; \Indirect{\Va+}; \:Ca-1; - \Indirect+\Va; - \Indirect/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=} -\Indirect{\let\:vb=} - \let\:TagNode=\::TagNode -\let\:EdgeNode=\::EdgeNode - -\Do(0,\Val\:C){ \:Ca=-1; \:Cb=-1; - \Indirect(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(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{\:Temp} - \def\:tempa{} \:Vc=0; -\def\:tempb{\:tk=} \:Ca=-1; -\Indirect(0,99){\:Ca+1; \:MeasureRow} -\Indirect\DecVar -\Indirect=\: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},0) -\else \Indirect{\Move(0,\Val}) \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+#1; - \Va=#1; \Va*\:TreeEdgeSpec; \Indirect+\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},0) - \else \Indirect{\Move(0,-\Val}) \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/Master/texmf-dist/tex/latex/dratex/DraTex.sty b/Master/texmf-dist/tex/latex/dratex/DraTex.sty deleted file mode 100644 index 2a3f3e1e584..00000000000 --- a/Master/texmf-dist/tex/latex/dratex/DraTex.sty +++ /dev/null @@ -1,1636 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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& && \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/Master/texmf-dist/tex/latex/dratex/TeXProject.sty b/Master/texmf-dist/tex/latex/dratex/TeXProject.sty deleted file mode 100644 index 79bcbb789f6..00000000000 --- a/Master/texmf-dist/tex/latex/dratex/TeXProject.sty +++ /dev/null @@ -1,2678 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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/Master/texmf-dist/tex/latex/dratex/wotree.sty b/Master/texmf-dist/tex/latex/dratex/wotree.sty deleted file mode 100644 index 78ec73999d5..00000000000 --- a/Master/texmf-dist/tex/latex/dratex/wotree.sty +++ /dev/null @@ -1,106 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 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 - -- cgit v1.2.3