From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- graphics/dratex/TeXProject.sty | 2678 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2678 insertions(+) create mode 100644 graphics/dratex/TeXProject.sty (limited to 'graphics/dratex/TeXProject.sty') diff --git a/graphics/dratex/TeXProject.sty b/graphics/dratex/TeXProject.sty new file mode 100644 index 0000000000..79bcbb789f --- /dev/null +++ b/graphics/dratex/TeXProject.sty @@ -0,0 +1,2678 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2001-02-14-12:58 +% TeXProject.sty % +% Copyright (C) 1995 Stephane Bressan & Eitan M. Gurari % +% % +% This program can redistributed and/or modified under % +% the terms of the LaTeX Project Public License % +% Distributed from CTAN archives in directory % +% macros/latex/base/lppl.txt; either version 1 of the % +% License, or (at your option) any later version. % +% % +% However, you are allowed to modify this program % +% without changing its name, if you modify its % +% signature. Changes to the signature can be introduced % +% with a directive of the form % +% \message{signature} % +% % +% Stephane.Bressan@ecrc.de gurari@cse.ohio-state.edu % +% http://www.cse.ohio-state.edu/~gurari/ % +% Needs: % +% DraTex.sty and AlDraTex.sty % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\immediate\write-1{version 2001-02-14-12:58} +\ifx\Draw\UnDefined + \def\DrawRect{\input DraTex.sty } + \expandafter\DrawRect +\fi +\ifx\Tree\UnDefined + \def\Tree{\input AlDraTex.sty } + \expandafter\Tree +\fi +\expandafter\edef\csname :RestoreCatcodes\endcsname{% + \catcode`\noexpand\noexpand\noexpand \^=\the\catcode`\^% +} +\catcode`\^=7 +\expandafter\edef\csname :RestoreCatcodes\endcsname{% + \csname :RestoreCatcodes\endcsname + \catcode`\noexpand \_=\the\catcode`\_% + \catcode`\noexpand \ =\the\catcode`\ % + \catcode`\noexpand \&=\the\catcode`\&% + \catcode`\noexpand :=\the\catcode`:% + \catcode`\noexpand \^^M=\the\catcode`\^^M% + \let\expandafter\noexpand + \csname:RestoreCatcodes\endcsname=\noexpand\undefined} +\catcode`\^^M=9 \catcode`\ =9 \catcode`\&=13 \relax + \expandafter + \def\csname reseffB:\endcsname#1{\csname reseffC:\endcsname#1:} +\expandafter + \def\csname reseffC:\endcsname#1:#2:{ + \csname reseff:\endcsname{#1}{#2}} + \catcode`\:=11 \relax + \newif\ifpwarnn: +\def\warningsoff{\pwarnn:false} +\def\warningson{\pwarnn:true} +\warningson +\def\pwarn:#1{\ifpwarnn: \immediate\write16{l.\the\inputlineno + \space--- warning ---\space #1}\fi} +\def\whitedef:#1{ + \expandafter\def\csname #1\endcsname{\bgroup + \ignorewhite: \csname #1:X\endcsname} + + \expandafter\def\csname #1:X\endcsname##1{\egroup + \expandafter\ifx\csname##1 :type\endcsname\relax \else + \pwarn:{Redefining\space##1?} + \fi + \edef\items:{\item:{##1}\items:} + \expandafter\let\csname##1 :bool\endcsname=\empty + \expandafter\edef\csname##1 :prjid\endcsname{ + \expandafter\noexpand\csname\projectid: :minmax\endcsname} + \csname #1:Y\endcsname{##1}} + \expandafter\def\csname #1:Y\endcsname} + +\def\ignorewhite:{ \ifnum \the\catcode`\ =9 \else + \catcode`\ =9 \catcode`\^^M=9 \catcode`\^^I=9 \relax \fi } +\def\forbiencomm:{\pwarn:{\string\newproject\space missing}} +\def\defcom#1{ + \expandafter\def\csname#1\endcsname{ + \bgroup \ignorewhite: \csname#1:A\endcsname} + \expandafter\def\csname#1:A\endcsname##1{\egroup + \csname#1:B\endcsname{##1}} + \expandafter\def\csname#1:B\endcsname} +\def\verify:::#1{ + \expandafter\ifx\csname#1 :title\endcsname\relax \pwarn:{#1?} \fi + \csname#1 :prjid\endcsname +% +} +\IntVar\I:I \IntVar\J:J \IntVar\K:K +\DecVar\Q:Q \DecVar\R:R \DecVar\T:T + + \def\tasknode:{0} +\def\milestonenode:{1} +\def\projectnode:{2} +\whitedef:{DEFTASK:}#1#2{ + \expandafter\edef\csname#1 :type\endcsname{\tasknode:} + \expandafter\def\csname#1 :title\endcsname{#2} + \bgroup \ignorewhite: \deftaskA:{#1}} + +\def\deftaskA:#1#2#3#4#5{\egroup + \expandafter\edef\csname#1 :date1\endcsname{#2} + \expandafter\edef\csname#1 :date2\endcsname{#3} + \def\temp:{#4} +\ifx\temp:\empty + \pwarn:{`#1'\space has\space no\space contributions} +\else + \getlist:{#1 :eff}{#4}\reseffA: + \let\reseff:=\relax + \let\reseffA:=\reseffB: + \expandafter\edef\csname#1 :eff\endcsname{\csname#1 :eff\endcsname} +\fi + + \setprev:{#1}{#5} + \deftaskB:{#1}} + +\def\deftaskB:#1#2{ + \expandafter\def\csname#1 :desc\endcsname{#2} + \trace:{#1} } +\whitedef:{DEFMILESTONE:}#1#2#3{ + \expandafter\edef\csname#1 :type\endcsname{\milestonenode:} + \expandafter\def\csname#1 :title\endcsname{#2} + \expandafter\edef\csname#1 :date\endcsname{#3} + \bgroup \ignorewhite: \defmilestoneA:{#1}} + +\def\defmilestoneA:#1#2{\egroup + \setprev:{#1}{#2} + \defmilestoneB:{#1}} + +\def\defmilestoneB:#1#2{ + \expandafter\def\csname#1 :desc\endcsname{#2} + \trace:{#1}} +\whitedef:{DEFPROJECT:}#1#2{ + \expandafter\edef\csname#1 :type\endcsname{\projectnode:} + \edef\projects:{{#1}{\projects:}} + \expandafter\def\csname#1 :title\endcsname{#2} + \bgroup \ignorewhite: \defprojectA:{#1}} + +\def\defprojectA:#1#2#3{\egroup + \getlist:{#1 :under}{#2}\utask: +\def\utask:##1{% + \sapply{:temp,merge, + {\expandafter \ifx \csname ##1:ancs\endcsname\relax\else + \csname ##1:ancs\endcsname\fi},{#1}} + \expandafter \let \csname ##1: ancs\endcsname= \:temp:mkls + \let\:temp:mkls =\:UnDef + } +\csname#1: under\endcsname + + + \setprev:{#1}{#3} + \defprojectB:{#1}} + +\def\defprojectB:#1#2{ + \expandafter\def\csname#1 :desc\endcsname{#2} + \trace:{#1}} +\def\setproject:data#1{ + \expandafter\ifx\csname#1 :type\endcsname\relax + \pwarn:{Missing\space `#1'} + \fi + \ifnum\csname#1 :type\endcsname=\projectnode:\relax + \expandafter\ifx\csname#1 :date1\endcsname\relax + \def\minY:{10000} \def\minM:{10000} \def\minD:{10000} +\def\maxY:{0} \def\maxM:{0} \def\maxD:{0} + + \let\utask:=\utask:I +\csname#1 :under\endcsname + + \expandafter\edef\csname#1 :date1\endcsname{\minD:/\minM:/\minY:} +\expandafter\edef\csname#1 :date2\endcsname{\maxD:/\maxM:/\maxY:} + + \fi \fi +} + + \def\newproject{ + \let\item:=\relax +\def\items:{} +\tcount:=0\relax +\let\deftask=\DEFTASK: +\let\defmilestone=\DEFMILESTONE: +\let\defproject=\DEFPROJECT: +\let\restoregal::=~ +\def\restoregal:{\let~=\restoregal::} +\def\projects:{} +\def\verify:##1{} +\def\verify::##1{} +\let\minmaxdates=\MINMAXDATES: +\MINMAXDATES:{1/1/0//31/12/99} + +} +\def\endprojectdefA:{ \let\deftask=\forbiencomm: +\let\defmilestone=\deftask +\let\defproject=\deftask +\let\minmaxdates=\forbiencomm: + +} +\endprojectdefA: + +\def\endnewproject{ + \endprojectdefA: \def\item:##1{ + \let\prev:=\checkmemb: \csname##1 :prev\endcsname + \let\utask:=\checkmemb: \csname##1 :under\endcsname +} +\items: + +\ifx \projects:\empty\else + \expandafter\setproject:\projects: + \expandafter\verify:dates:\projects: +\fi + + \def\item:##1{ \expandafter\let\csname##1 :bool\endcsname=\UnDef: } +\items: +\let\item:=\UnDef: +\let\items:=\UnDef: +\restoregal: +\let\projects:=\UnDef: +\let\verify:=\verify::: +\let\verify::=\verify::: + + \I:I=\projectid:; \I:I+1; \edef\projectid:{\Val\I:I} +} + + \def\filtercommand{ + \def\filtercommand:##1{ + \def\putcommand{##1} + \let\filtercommand:=\empty +} } +\let\filtercommand:=\empty +\defcom{name}#1{ \verify:{#1} + \expandafter\expandafter\expandafter\filtercommand: + \expandafter\expandafter\expandafter{\csname#1 :title\endcsname }} +\defcom{annotation}#1{ \verify:{#1} + \expandafter\expandafter\expandafter\filtercommand: + \expandafter\expandafter\expandafter{\csname#1 :desc\endcsname}} +\defcom{resource}#1{{ \verify:{#1} +\ifnum\csname#1 :type\endcsname=\milestonenode:\space + \pwarn:{`#1'\space has\space no\space resources} ??? +\fi +\def\sepitems:{\def\sepitems:{\append:Def\all:des{,\space}}} +\let\reseff:=\reseffI: \let\all:des=\empty +\traversedo:{#1}\listrsrc: +\expandafter\def\expandafter\all:des + \expandafter{\expandafter\filtercommand:\expandafter{\all:des}} + \expandafter}\all:des} +\defcom{effort}#1{{ \def\temp:##1,##2,##3//{ + \def\first:{##1} \def\second:{##2} +} +\temp:#1,,// \verify:{\first:} +\ifnum\csname\first: :type\endcsname=\milestonenode:\space + \pwarn:{`#1'\space has\space no\space resources} ??? + \let\:temp=\empty +\else + \findeffort:\first:\second: + \edef\:temp{\noexpand\filtercommand:{\temp:}} +\fi + \expandafter}\:temp} +\defcom{contributions}#1{{ \verify:{#1} +\ifnum\csname#1 :type\endcsname=\milestonenode:\space + \pwarn:{`#1'\space has\space no\space contributions} ??? +\else \findthecontri:{#1} \fi + }} +\defcom{start}#1{ \verify:{#1} \startfinish:{#1}1 } + +\defcom{finish}#1{\verify:{#1} \startfinish:{#1}2 } + +\def\startfinish:#1#2{ + \ifnum\csname#1 :type\endcsname=\milestonenode:\relax + \expandafter\expandafter\expandafter + \filtercommand: \expandafter\expandafter\expandafter + {\expandafter\expandafter\expandafter + \showdate:\csname#1 :date\endcsname/0/0/0//} + \else + \expandafter\expandafter\expandafter + \filtercommand: \expandafter\expandafter\expandafter + {\expandafter\expandafter\expandafter + \showdate:\csname#1 :date#2\endcsname/0/0/0//} + \fi } +\defcom{apply}#1{ \apply:#1,,,,// } +\defcom{rapply}#1{ \rapply:#1,,,,// } +\defcom{sapply}#1{ + \edef\:temp{\Val\I:I} +\push:macro\:temp + + \def\temp:##1,##2,##3,##4/+/-]/[{ + \def\result:lst{##1} \let\list:op=\empty + \IF \EqText(##2,merge)\THEN + \def\list:op{\two:args#1,/+/-]/[ +\expandafter\edef\csname \result:lst :mkls\endcsname{\arg:one,\arg:two} +\cln:res + +}\FI + \IF \EqText(##2,intersect)\THEN + \def\list:op{\two:args#1,/+/-]/[ +\get:result\in:both +\cln:res + +} \FI + \IF \EqText(##2,subtract)\THEN + \def\list:op{\two:args#1,/+/-]/[ +\get:result\first:only +\cln:res + +} \FI + \IF \EqText(##2,milestones)\THEN + \def\list:op{\one:args#1,/+/-]/[ +\let\arg:one=\arg:two +\get:result\scr:mi +\cln:res + +} \FI + \IF \EqText(##2,tasks)\THEN + \def\list:op{\one:args#1,/+/-]/[ +\let\arg:one=\arg:two +\get:result\scr:ta +\cln:res + +} \FI + \IF \EqText(##2,projects)\THEN + \def\list:op{\one:args#1,/+/-]/[ +\let\arg:one=\arg:two +\get:result\scr:pr +\cln:res + +} \FI + \IF \EqText(##2,after)\THEN + \def\list:op{\one:args#1,/+/-]/[ +\let\arg:one=\arg:two +\get:result\scr:af +\cln:res + +}\FI + \IF \EqText(##2,before)\THEN + \def\list:op{\one:args#1,/+/-]/[ +\let\arg:one=\arg:two \def\prev:########1{,########1} +\get:result\scr:be +\cln:res + +}\FI + \IF \EqText(##2,up)\THEN + \def\list:op{\one:args#1,/+/-]/[ +\let\arg:one=\arg:two +\get:result\scr:up +\cln:res + +} \FI + \IF \EqText(##2,down)\THEN + \def\list:op{\one:args#1,/+/-]/[ +\let\arg:one=\arg:two \def\utask: ########1{,########1} +\get:result\scr:dw +\cln:res + +} \FI + \IF \EqText(##2,sort)\THEN + \def\list:op{\one:args#1,/+/-]/[ +\let\arg:one=\arg:two +\let\:temp\empty +\get:result\scr:srt \sapply{##1,\gob:I} + +} \FI + \IF \EqText(##2,defproject)\THEN + \def\list:op{\one:args#1,/+/-]/[ +\df:spr#1/+/-]/[ +\ifx \arg:two\empty + \pwarn:{defproject\space ##1\space without\space members?} +\else + \let\arg:one=\arg:two + \get:result\scr:df + \edef\:temp{{##1}{\AA:k}{\:temp}{}{\BB:k}} + \expandafter\let\csname##1 :date1\endcsname\relax + \expandafter\let\csname##1 :date2\endcsname\relax + \push:macro\checkmemb: \def\checkmemb:########1{} + \newproject \expandafter\defproject\:temp \endnewproject + \pop:macro\checkmemb: +\fi +} \FI + \IF \EqText(##1,traceon)\THEN + \def\list:op{\let\rs:trc=\empty +} \FI + \IF \EqText(##1,traceoff)\THEN + \def\list:op{\def\rs:trc########1{} +} \FI + \ifx \list:op\empty + \def\list:op{\futurelet + \:temp\sapply:apply #1,,,,/+/-]/[ +} + \fi + \list:op } +\temp:#1,,,,/+/-]/[ + + \pop:macro\:temp +\I:I=\:temp; + +} +\IntVar\s:appN +\def\sapply:apply#1,#2,#3/+/-]/[{ + \ifx \:temp\bgroup \else + \expandafter\ifx\csname #1:mkls\endcsname\relax + \pwarn:{\string\sapply{#1,\string#2,...}?} +\fi\fi + + \expandafter\edef\csname \result:lst :mkls\endcsname{\ifx + \:temp\bgroup #1\else + \expandafter\ifx\csname #1:mkls\endcsname\relax #1 + \else \csname #1:mkls\endcsname + \fi \fi} + \cln:res + + \def\breadth{0} + \def\app:mi{#2} + \expandafter\expandafter\expandafter\r:app + \expandafter\expandafter\expandafter\s:app + \csname \result:lst :mkls\endcsname,/+/-]/[ +} +\def\s:app#1{\I:I=\breadth; \I:I+1; \edef\breadth{\Val\I:I} + \push:macro\breadth +\push:macro\app:mi +\push:macro\app:pr +\push:macro\app:ta + + \app:mi{#1} + \pop:macro\app:ta +\pop:macro\app:pr +\pop:macro\app:mi +\pop:macro\breadth + +} +\def\s:appA#1{\I:I=\breadth; \I:I+1; \edef\breadth{\Val\I:I} + \push:macro\breadth +\push:macro\app:mi +\push:macro\app:pr +\push:macro\app:ta + + \apply{#1,\app:mi,\app:pr,\app:ta} + \pop:macro\app:ta +\pop:macro\app:pr +\pop:macro\app:mi +\pop:macro\breadth + +} +\def\scr:ta#1{\ifnum\csname#1:type\endcsname=\tasknode:\space + \edef\:temp{\:temp,#1}\fi } +\def\scr:mi#1{\ifnum\csname#1:type\endcsname=\milestonenode:\space + \edef\:temp{\:temp,#1}\fi } +\def\scr:pr#1{\ifnum\csname#1:type\endcsname=\projectnode:\space + \edef\:temp{\:temp,#1}\fi } +\def\df:spr#1,#2,#3,#4,#5/+/-]/[{% + \def\AA:k{#4} + \def\BB:k{#5} +} +\def\scr:df#1{\edef\:temp{\ifx\:temp\empty \else \:temp,\fi #1}} +\def\first:only#1{ + \def\a:temp{#1} + \expandafter\r:app\expandafter\also:second\arg:two,,/+/-]/[ + \ifx \a:temp\empty\else \edef\:temp{\:temp,#1}\fi +} +\def\also:second#1{\def\b:temp{#1}\ifx \a:temp\b:temp + \let\a:temp\empty\fi} +\def\in:both#1{ + \def\a:temp{#1} + \expandafter\r:app\expandafter\found:both\arg:two,,/+/-]/[ +} +\def\found:both#1{\def\b:temp{#1}\ifx \a:temp\b:temp + \edef\:temp{\:temp,#1}\fi} +\def\two:args#1,#2,{\futurelet\:temp\first:arg} +\def\first:arg#1,{\verify:arg{#1} + \edef\arg:one{\ifx \:temp\bgroup + #1\else \csname #1:mkls\endcsname \fi} + \futurelet\:temp\second:arg} +\def\second:arg#1,#2/+/-]/[{\verify:arg{#1} + \edef\arg:two{\ifx \:temp\bgroup + #1\else \csname #1:mkls\endcsname \fi}} +\def\one:args#1,#2,{\futurelet\:temp\second:arg} +\def\verify:arg#1{ + \ifx \:temp\bgroup\else + \expandafter\ifx \csname #1:mkls\endcsname\relax + \pwarn:{`#1'\space in\space \string\sapply?} + \fi \fi} +\def\cln:res{ + \let\:temp=\empty \car:dinality=0; + \expandafter\expandafter\expandafter\r:app + \expandafter\expandafter\expandafter\pre:dup + \csname \result:lst :mkls\endcsname,,/+/-]/[% + \expandafter\let\csname \result:lst :mkls\endcsname=\:temp + \edef\breadth{\Val\car:dinality} + \rs:trc{\immediate\write16{...[\result:lst]........\:temp}} +} +\IntVar\car:dinality +\def\scr:srt#1{ +\expandafter\let\expandafter\:temp\expandafter\empty + \expandafter\next:compare\:temp,,,/+/-]/[#1/+/-]/[ +} +\def\next:compare#1,#2/+/-]/[#3/+/-]/[{ + \if :#1: + \edef\:temp{\ifx\:temp\empty\else \:temp,\fi#3} + \def\next:##1/+/-]/[##2/+/-]/[{} + \else \comp:r{#1}{#3} + \ifnum \com:p>0 + \edef\:temp{\ifx\:temp\empty\else \:temp,\fi#3,#1} + \def\next:##1,,##2/+/-]/[##3/+/-]/[{\edef + \:temp{\ifx\:temp\empty\else \:temp,\fi##1}} + \else \edef\:temp{\ifx\:temp\empty\else \:temp,\fi#1} + \if :#2: + \edef\:temp{\ifx\:temp\empty\else \:temp,\fi#3} + \def\next:##1/+/-]/[##2/+/-]/[{} + \else + \let\next:=\next:compare + \fi\fi \fi + \next: #2/+/-]/[#3/+/-]/[ +} +\def\comp:r#1#2{ + \def\com:p{0}% + \comp:re#1/+/-]/[#2/+/-]/[% +} +\def\comp:re#1#2/+/-]/[#3#4/+/-]/[{% + \ifnum `#1<`#3\def\com:p{-1}\let\next:=\relax + \else \ifnum `#1>`#3\def\com:p{1}\let\next:=\relax + \else \def\next:{\comp:re#2/+/-]/[#4/+/-]/[}% + \if !#2!\let\next:=\relax \fi + \if !#4!\let\next:=\relax \fi + \def\:tempa{#2}\def\:tempb{#4}% + \ifx \:tempa\space + \ifx \:tempb\:tempa \else \def\com:p{-1}\fi + \let\next:=\relax + \else\ifx \:tempb\space \def\com:p{1}\let\next:=\relax + \fi\fi + \fi\fi + \next: +} +\def\rs:trc#1{} +\def\get:result#1{ + \let\:temp=\empty + \expandafter\r:app\expandafter#1\arg:one,,/+/-]/[% + \expandafter\let\csname \result:lst :mkls\endcsname=\:temp} +\def\scr:af#1{% +\expandafter\ifx \csname#1:succe\endcsname\relax\else + \expandafter\expandafter\expandafter\r:app + \expandafter\expandafter\expandafter\scr:aff + \csname #1:succe\endcsname,/+/-]/[ +\fi} +\def\scr:aff#1{\edef\:temp{\:temp,#1}} +\def\scr:up#1{% +\expandafter\ifx \csname#1:ancs\endcsname\relax\else + \expandafter\expandafter\expandafter\r:app + \expandafter\expandafter\expandafter\scr:aff + \csname #1:ancs\endcsname,/+/-]/[ +\fi} +\def\scr:dw#1{\expandafter\ifx \csname #1:under\endcsname\relax\else + \edef\:temp{\:temp,\csname #1:under\endcsname}\fi} +\def\scr:be#1{\expandafter\ifx \csname #1:prev\endcsname\relax\else + \edef\:temp{\:temp,\csname #1:prev\endcsname}\fi} +\def\pre:dup#1{% + \def\a:temp{#1}\let\c:temp=\empty + \expandafter\r:app\expandafter\is:dup\:temp,/+/-]/[% + \ifx \c:temp\empty + \car:dinality+1; + \edef\:temp{\:temp\ifx \:temp\empty\else ,\fi#1}\fi} +\def\is:dup#1{\def\b:temp{#1}\ifx \a:temp\b:temp \let\c:temp=\b:temp\fi} +\def\r:app#1#2,#3/+/-]/[{% + \if !#2!\else #1{#2}\fi + \if !#3!\expandafter\r:gobble\else \expandafter\r:app\fi + #1#3/+/-]/[} +\def\r:gobble#1/+/-]/[{} + + + \def\prjc:VII#1#2#3#4#5#6#7{ + \gdef\all:prjc{} + { \contributionsstyle{ + \expandafter \gdef \expandafter\all:prjc + \expandafter{\all:prjc\add:contrib{##1}{#1}} + }{}{} + \contributions{#1} + } + \all:prjc +} +\def\gob:V#1#2#3#4#5{} +\def\f:cntr#1{\apply{#1,\gob:V,\findcontribution,\gob:V}} + +\IntVar\cntr:N + +\def\add:contrib#1#2{ + \let\N:EXT=\empty + \def\findcontribution##1##2##3##4##5{ + \IF \EqText(##2,#1) \THEN + \gdef\N:EXT{##1} + \FI + } + \sapply{con.TRIB,\f:cntr} + \ifx \N:EXT\empty + \cntr:N+1; + \sapply{\pc:id.\Val\cntr:N,defproject,{#2},#1,} + \sapply{con.TRIB,merge,con.TRIB,{\pc:id.\Val\cntr:N}} + \else + \sapply{ts.k,down,{\N:EXT}} + \sapply{ts.k,merge,ts.k,{#2}} + \expandafter\let\csname\N:EXT :type\endcsname\relax + \sapply{\N:EXT,defproject,ts.k,#1,} + \fi +} +\def\contributorsproject#1#2#3#4{ + \push:macro\checkmemb: \def\checkmemb:##1{} + \cntr:N=0; \def\pc:id{#1} + \sapply{con.TRIB,merge,{},{}} + \sapply{#1,defproject,{#3},,} + \rapply{#1,\gob:V,\gob:V,\prjc:VII} + \expandafter\let\csname#1 :type\endcsname\relax + \sapply{#1,defproject,con.TRIB,#2,#4} + \pop:macro\checkmemb: + \sapply{#1,down,{#1}} +\sapply{#1,\connect:up{#1}} +\sapply{#1,merge,{},{}} + + \sapply{con.TRIB,merge,{},{}} +} + + \def\setnumericdate#1#2{{ + \expandafter \ifx \csname maxMM:\endcsname\relax + \getminmaxdates:1/1/0//31/12/99// + \fi + \def\yrS:{0} \def\moS:{0} \def\dateS:{0} + \if /\actual:date #2///+/-]/[/ + \date:Coordinate#1#2,,/+/-]/[ + \else + \def\real::date##1,##2/+/-]/[{##1} + \edef\real::date{\real::date #2,/+/-]/[} + \axisdate:#1{real:}\empty + \fi + \edef#1{\def\noexpand#1{#1}} + \expandafter}#1} + +\def\actual:date#1/#2/#3/+/-]/[{#2} +\def\date:Coordinate#1#2,#3,#4/+/-]/[{ + \expandafter \ifx \csname#2 :type\endcsname\relax + \def#1{0} + \pwarn:{\noexpand\setnumericdate for\space `#2'?} + \else\ifnum\csname#2 :type\endcsname=\milestonenode:\relax + \axisdate:#1{#2}\empty + \else + \IF \EqText(start,#3) \THEN + \axisdate:#1{#2}1 + \ELSE \IF \EqText(finish,#3) \THEN + \axisdate:#1{#2}2 + \ELSE + \def#1{0} + \pwarn:{\noexpand\setnumericdate for\space `#3'?} + \FI \FI + \fi \fi +} +\def\datesproject#1#2#3#4{ + \push:macro\checkmemb: \def\checkmemb:##1{} \def\pc:id{#1} + \let\all:prjc=\empty + \sapply{#1,defproject,{#3},,} + \cntr:N=1000; +\bck:N=2; +\rapply{#1,\cnt:V,\cnt:V,\cnt:VII} +\bck:N*2; \bck:N+1000; + + \rapply{#1,\prjd:V,\prjd:V,\prjd:VII} + \edef\:temp{\noexpand \sapply{#1,sort,{\all:prjc}}}\:temp + \let\all:prjc=\empty + \sapply{#1.m,merge,{},{}} + \let\prv:=\empty \cntr:N=0; + \push:macro\pwarn: \def\pwarn:##1{} + \sapply{#1,\set:dateprj} + \sapply{#1,defproject,#1.m,#2,#4} + \pop:macro\pwarn: + \pop:macro\checkmemb: + \sapply{#1,\cp:dt} + + \sapply{#1,down,{#1}} +\sapply{#1,\connect:up{#1}} +\sapply{#1,merge,{},{}} + + \sapply{#1.m,merge,{},{}} +} +\def\connect:up#1#2{\expandafter \edef \csname #2: ancs\endcsname{#1}} +\def\prjd:VII#1#2#3#4#5#6#7{\prjd:{#1}} +\def\prjd:V#1#2#3#4#5{\prjd:{#1}} +\def\prjd:#1{ + \cntr:N+1; \bck:N-1; + {\datestyle{ + \setnumericdate\:dateA{#1,start} +\setnumericdate\:dateB{#1,finish} +\I:I=\:dateA; \I:I+1000000000; \edef\:dateA{\Val\I:I} +\I:I=\:dateB; \I:I+1000000000; \edef\:dateB{\Val\I:I} +\def\xx{#1}\ifx \xx\pc:id \else + \xdef\all:prjc{\ifx \all:prjc\empty \else \all:prjc,\fi} + \ifnum\csname#1 :type\endcsname=\milestonenode:\relax + \xdef\all:prjc{\all:prjc \:dateA.\Val\cntr:N.0.#1} + \else + \xdef\all:prjc{\all:prjc \:dateA.\Val\cntr:N.1.#1, + \:dateB. + \ifnum\csname#1 :type\endcsname=\projectnode:\space + \Val\bck:N\else \Val\cntr:N\fi + .2.#1} +\fi \fi + + }{}{} + \def\pwarn:##1{} \start{#1} + } +} +\def\cp:dt#1{ + \def\:temp##1##2{##2} + \edef\:tmp{\expandafter\expandafter\expandafter + \:temp\csname#1 :under\endcsname} + \ifnum\csname\:tmp :type\endcsname=\milestonenode:\relax + \edef\:temp{\csname\:tmp :date\endcsname} + \else + \edef\:tempa{\noexpand\IF\noexpand\EqText(\csname#1 + :desc\endcsname,start)} + \:tempa + \edef\:temp{\csname\:tmp :date1\endcsname} + \ELSE + \edef\:temp{\csname\:tmp :date2\endcsname} + \FI + \fi + \expandafter\let\csname#1 :date1\endcsname=\:temp + \expandafter\let\csname#1 :date2\endcsname=\:temp +} +\IntVar\bck:N +\def\cnt:V#1#2#3#4#5{\bck:N+1;} +\def\cnt:VII#1#2#3#4#5#6#7{\bck:N+1;} + + \newif\iftrace: \trace:false +\def\traceon{\trace:true } +\def\traceoff{\trace:false } + +\def\trace:#1{% + \iftrace: + \apply{#1,\traceM:,\traceP:,\traceT:}% + \fi +} +\def\traceM:#1#2#3#4#5{% + \immediate\write16{\string\defmilestone{#1}{#2}{#3}{#4}{#5}}} +\def\traceP:#1#2#3#4#5{% + \immediate\write16{\string\defproject{#1}{#2}{#3}{#4}{#5}}} +\def\traceT:#1#2#3#4#5#6#7{% + \immediate\write16{\string\deftask{#1}{#2}{#3}{#4}{#5}{#6}{#7}}} +\def\getlist:#1#2#3{ + \def\op:{#3} \let#3=\relax + \let~=\space \let\temp:=\empty \getlist::#2,,,/+/-]/[ \restoregal: + \expandafter\let\csname#1\endcsname=\temp: +} +\def\getlist::#1,#2,#3/+/-]/[{ + \def\next:{#1} + \ifx\next:\empty + \def\temp::{#3} \ifx\temp::\empty\else \missingiem:#3// \fi + \else + \edef\temp:{\temp: \op:{#1}} + \def\next:{\getlist::#2,#3/+/-]/[} \expandafter\next: + \fi +} +\def\missingiem:#1,,,//{ + \pwarn:{missing\space item\space in\space,,#1} +} +\def\setprev:#1#2{ + \def\temp:{#2} + \ifx\temp:\empty \expandafter\def\csname#1 :prev\endcsname{} + \else + \getlist:{#1 :prev}{#2}\prev: + \def\prev:##1{\expandafter \edef \csname ##1: succe\endcsname + {\expandafter \ifx \csname ##1: succe\endcsname\relax\else + \csname ##1: succe\endcsname ,\fi#1}} +\csname#1: prev\endcsname + + \fi +} +\def\projectid:{0} +\def\setproject:#1#2{ + \traversedo:{#1}\setproject:data + + \def\temp:{#2} + \ifx\temp:\empty\else \def\temp:{\setproject:#2} \fi + \temp: +} +\def\verify:dates:#1#2{ + \traversedo:{#1}\checknodedates: + + \def\temp:{#2} + \ifx\temp:\empty\else \def\temp:{\verify:dates:#2} \fi + \temp: +} +\def\traversedo:#1#2{ + \def\utask:##1{ + \expandafter\let\csname##1 :sve\endcsname =\utask: + \csname##1 :under\endcsname + #2{##1} + \def\utask:{\let\utask: =} + \expandafter\utask:\csname##1 :sve\endcsname + } + \csname#1 :under\endcsname #2{#1} +} +\def\checkmemb:#1{ + \expandafter\ifx\csname#1 :bool\endcsname\relax + \pwarn:{definition\space for\space '#1'?} + \fi +} +\def\utask:I#1{ + \ifnum\csname#1 :type\endcsname=\milestonenode:\relax + \edef\temp:{\csname#1 :date\endcsname} + \expandafter\maxDate:\temp:/ +\else + \edef\temp:{\csname#1 :date2\endcsname} + \expandafter\maxDate:\temp:/ + \edef\temp:{\csname#1 :date1\endcsname} +\fi +\expandafter\minDate:\temp:/ + +} +\def\minDate:#1/#2/#3/{ + \ifnum #3<\minY:\relax \def\minD:{#1} \def\minM:{#2} \def\minY:{#3} + \else \ifnum #3=\minY:\relax + \ifnum #2<\minM: \def\minD:{#1} \def\minM:{#2} + \else \ifnum #2=\minM: + \ifnum #1<\minD:\relax\def\minD:{#1} \fi + \fi\fi + \fi\fi } + +\def\maxDate:#1/#2/#3/{ + \ifnum #3>\maxY:\relax \def\maxD:{#1} \def\maxM:{#2} \def\maxY:{#3} + \else \ifnum #3=\maxY:\relax + \ifnum #2>\maxM: \def\maxD:{#1} \def\maxM:{#2} + \else \ifnum #2=\maxM: + \ifnum #1>\maxD:\relax\def\maxD:{#1} \fi + \fi\fi + \fi\fi } +\def\getitems:#1#2{ + \def\items:{} \let\item:=\relax + \tcount:=#2 \relax \advance\tcount: by -1\relax + \let\utask:=\getchi: + \csname#1 :under\endcsname + \def\item:##1{ \expandafter\let\csname##1 :bool\endcsname=\UnDef: } + \items: +} +\def\getchi:#1{ + \expandafter\ifx\csname#1 :bool\endcsname\relax + \def\next:{ \edef\items:{ \item:{#1} \items: } } + \ifnum\csname#1 :type\endcsname=\projectnode:\space + \ifnum 0<\tcount: + \def\next:{ + \advance\tcount: by -1 \relax + \csname#1 :under\endcsname \relax + \advance\tcount: by 1 \relax + } +\fi + + \fi + \expandafter\next: + \fi + } +\newcount\tcount: +\def\checknodedates:#1{ + \def\prev:##1{ \checkafter:{#1}{##1} } + \csname#1 :prev\endcsname +} +\def\checkafter:#1#2{ + \getdate:\temp:A{#1}1 + \getdate:\temp:B{#2}2 + \edef\temp:{\temp:A/\temp:B/{`#1'\space starts\space + before\space `#2'\space ends}} + \expandafter\checkdates:\temp: +} + +\def\getdate:#1#2#3{ + \ifnum\csname#2 :type\endcsname=\milestonenode:\space + \edef#1{\csname#2 :date\endcsname} + \else \edef#1{\csname#2 :date#3\endcsname} + \fi +} + +\def\checkdates:#1/#2/#3/#4/#5/#6/#7{ + \ifnum #6>#3\space \pwarn:{#7} + \else \ifnum #6=#3\space + \ifnum #5>#2\space \pwarn:{#7} + \else \ifnum #5=#2\space + \ifnum #4>#1\space \pwarn:{#7} \fi + \fi\fi + \fi\fi } +\def\listrsrc:#1{ + \ifnum\csname#1 :type\endcsname=\tasknode:\space + \csname#1 :eff\endcsname + \else + \expandafter\expandafter \csname#1 :under\endcsname + \fi +} +\long\def\append:Def#1#2{% + \def\:temp{\def#1}% + \expandafter\expandafter\expandafter\:temp\expandafter{#1#2}} +\def\reseffI:#1#2{ + \expandafter\ifx\csname#1 :bool\endcsname\relax + \sepitems: \append:Def\all:des{#1} + \expandafter\let\csname#1 :bool\endcsname=\empty + \fi +} +\def\effortout:{ + \I:I[\Q:Q]; + \IF \EqDec(\I:I,\Q:Q) \THEN \edef\temp:{\Val\I:I} + \ELSE \edef\temp:{\Val\Q:Q} \FI +} +\long\def\contr::#1#2#3{ + \def\contr:##1##2{ \ifnum 0<\tcount:\relax#3\fi #1#2 } +} +\def\contributionsstyle{ \contr:: +} +\contributionsstyle{#1}{\space (#2)}{,\space} + +\def\findeffort:#1#2{ \ifx#2\empty + \def\reseff:##1##2{ \Q:Q + ##2; } +\else + \def\reseff:##1##2{ + \def\temp:{##1} + \ifx\temp:#2 \Q:Q + ##2; \fi + } +\fi +\Q:Q=0; +\ifnum\csname#1 :type\endcsname=\tasknode:\space + \csname#1 :eff\endcsname +\else + \getitems:{#1}{999} + \def\item:##1{ \csname##1 :eff\endcsname } + \items: +\fi +\effortout: + } +\def\findthecontri:#1{\def\reseff:##1##2{ + \expandafter\ifx\csname##1 :bool\endcsname\relax + \expandafter\def\csname##1 :bool\endcsname{##2} + \edef\alls:{\alls: \all:{##1}} + \else + \Q:Q=\csname##1 :bool\endcsname; + \Q:Q+##2; + \expandafter\edef\csname##1 :bool\endcsname{\Val\Q:Q} + \fi +} +\let\alls:=\empty \let\all:=\relax +\ifnum\csname#1 :type\endcsname=\tasknode:\space + \csname#1 :eff\endcsname +\else + \getitems:{#1}{999} + \def\item:##1{ \ifx \yrS: \:UnDef \csname##1 :eff\endcsname +\else + \edef\svK:K{\Val\K:K} + \axisdate:\temp:{##1}1 \ifnum \temp:<\dateA:\else + \axisdate:\temp:{##1}2 \ifnum \temp:>\dateB:\else + \csname##1 :eff\endcsname + \fi\fi + \K:K=\svK:K; +\fi + } + \items: +\fi +\tcount:=0 +\def\all:##1{ + \Q:Q=\csname##1 :bool\endcsname; + \contr:{##1}{{\effortout:\temp:}} + \tcount:=1 +} +\alls: +} +\def\datestyle{\def\showdate:##1/##2/##3/##4//} +\datestyle{#1/#2/#3} +\def\apply:#1,#2,#3,#4,#5//{ + \verify:{#1} \def\verify:##1{} + \extract: + \def\mop:{#2} \def\pop:{#3} \def\top:{#4} + \apply::{#1} + \let\verify:=\verify:: +} +\def\rapply:#1,#2,#3,#4,#5//{ + \verify:{#1} \def\verify:##1{} + \def\utask:##1{ + \def\mop:{#2} \def\pop:{#3} \def\top:{#4} + \apply::{##1} + \I:I=\depth; \I:I+1; \edef\depth{\Val\I:I} + \ifnum\csname#1 :type\endcsname=\projectnode:\space + \csname##1 :under\endcsname + \fi + \I:I=\depth; \I:I-1; \edef\depth{\Val\I:I} + } + \utask:{#1} \let\verify:=\verify:: +} + +\def\depth{0}\def\apply::#1{ + \push:macro\utask: +\push:macro\contr: + + \extract: + \let\temp:=\empty + \ifnum \csname#1 :type\endcsname=\milestonenode:\space + \ifx \mop:\empty \else + \edef\temp:{\expandafter\noexpand\mop:{#1}{\csname#1 :title\endcsname}{\csname#1 :date\endcsname} +{\expandafter\ifx\csname#1 :prev\endcsname\empty\else + \pp:\csname#1 :prev\endcsname + \fi} +{\expandafter\noexpand\csname#1 :desc\endcsname} +} +\fi + + \else + \ifnum \csname#1 :type\endcsname=\projectnode:\space + \ifx \pop:\empty \else + \edef\temp:{\expandafter\noexpand\pop:{#1}{\csname#1 :title\endcsname}{ +\expandafter\ifx\csname#1 :under\endcsname\relax\else + \pp:\csname#1 :under\endcsname +\fi} +{\expandafter\ifx\csname#1 :prev\endcsname\empty\else + \pp:\csname#1 :prev\endcsname +\fi}{\expandafter\noexpand\csname#1 :desc\endcsname} +} +\fi + + \else + \ifx \top:\empty \else + \edef\temp:{\expandafter\noexpand + \top:{#1}{\csname#1 :title\endcsname} +{\csname#1 :date1\endcsname} +{\csname#1 :date2\endcsname} +{\expandafter\ifx\csname#1 :eff\endcsname\relax\else + \pp:\csname#1 :eff\endcsname +\fi} +{\expandafter\ifx\csname#1 :prev\endcsname\empty\else + \pp:\csname#1 :prev\endcsname +\fi}{\expandafter\noexpand\csname#1 :desc\endcsname} +} +\fi + + \fi + \fi + \temp: + \pop:macro\contr: +\pop:macro\utask: + +} +\def\extract:{ + \def\pp:{\expandafter\expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\ppp:} + \def\ppp:##1,{} + \def\prev:##1{,##1} + \def\utask:##1{,##1} + \edef\reseff:##1##2{,##1\string :##2} +} +\def\push:macro#1{ + \expandafter\let\csname appl:\Val\s:appN\endcsname#1 + \s:appN+1; +} +\def\pop:macro#1{ + \s:appN-1; + \expandafter\let\expandafter#1\csname appl:\Val\s:appN\endcsname +} +\def\set:dateprj#1{\set:dtpr#1,} +\def\set:dtpr#1.#2.#3.#4,{ + \I:I=#1; \I:I-1000000000; + \edef\:temp{\noexpand \sapply{\pc:id.#4\ifcase#3\space\else .#3\fi + ,defproject,{#4},\Val\I:I, + \ifcase#3\space \or start\or finish\else \fi}} \:temp + \ifx \prv:\empty \else + \expandafter\edef\csname \pc:id.#4\ifcase#3\space\else .#3\fi + :prev\endcsname {\noexpand \prev:{\pc:id.\prv:}} + \expandafter\edef\csname \pc:id.\prv: :succe\endcsname + {\pc:id.#4\ifcase#3\space\else .#3\fi} + \fi + \edef\prv:{#4\ifcase#3\space\else .#3\fi} + \edef\all:prjc{\ifx \all:prjc\empty\else \all:prjc,\fi + \pc:id.#4\ifcase#3\space\else .#3\fi} + \edef\:temp{\noexpand \sapply{\pc:id.m,merge, + \pc:id.m,{\pc:id.#4\ifcase#3\space\else .#3\fi}}} \:temp +} +\def\gettree:{ + \let\nextrow:=\empty \J:J=0; \row: \edef\tree:{ \tree: // } + \ifx\nextrow:\empty \else + \let\row:=\nextrow: \K:K-1; + \expandafter\gettree: + \fi +} +\def\getnode:#1{ + \I:I=0; \J:J+1; + \ifnum\csname#1 :type\endcsname=\projectnode:\space + \expandafter\expandafter \csname#1 :under\endcsname + \fi + \expandafter\ifx\csname#1 :bool\endcsname\relax + \expandafter\let\csname#1 :bool\endcsname=\empty +\else + \advance\tcount: by 1\space + \expandafter\edef\csname##1 :id\endcsname{\the\tcount:} +\fi + + \edef\tree:{ \tree: + \ifnum\Val\J:J>1\empty~ \fi + \Val\I:I, \csname#1 :type\endcsname, {\treetext:{#1}} + \nodeid:{#1} + } +} +\:DefineExt\treestyle(5){\endgroup + \def\temp:{#1} \ifx\temp:\empty\else \let\project:node=#1 \fi + \def\temp:{#2} \ifx\temp:\empty\else \let\milestone:node=#2 \fi + \def\temp:{#3} \ifx\temp:\empty\else \let\task:node=#3 \fi + \def\temp:{#4} \ifx\temp:\empty\else \let\project:edge=#4 \fi + \def\temp:{#5} \ifx\temp:\empty\else \def\treenodewidth:{#5pt} \fi +} +\treestyle(\VRectNode, \RectNode, \SRectNode,\TreeEdge,70) +\def\getparms:#1,#2,#3,#4,#5,#6,#7,#8,#9//{ + \def\first:{#1} \def\second:{#2} \def\third:{#3} + \def\fourth:{#4} \def\fifth:{#5} \def\sixth:{#6} + \def\seventh:{#7} \def\eighth:{#8} } +\def\axisdate:#1#2#3{ + \breakdate:\DD:\MM:\YY:{#2}#3 + \K:K=\YY:; \IF \LtInt(\K:K,\yrS:) \THEN \K:K+\maxYY:; \FI + \K:K*\maxMM:; \K:K+\MM:; + \IF \EqInt(\maxYY:,0) \THEN + \IF \LtInt(\K:K,\moS:) \THEN \K:K+\maxMM:; \FI + \FI + \K:K*\maxDD:; \K:K+\DD:; + \K:K-\dateS:; \edef#1{\Val\K:K} +} +\def\breakdate:#1#2#3#4#5{ + \expandafter\ifx \csname#4 :date#5\endcsname\relax + \pwarn:{Dates\space not\space available\space for\space #4} + \else + \def\temp:##1/##2/##3/{\def#1{##1}\def#2{##2}\def#3{##3}} + \expandafter\expandafter + \expandafter\temp:\csname#4 :date#5\endcsname/ + \fi +} + +\def\titletext:#1{ + \Text(--\titletextA:{#1}--) +} + +\def\titletextA:#1{\ifdim\nodewidth:>0in + \vbox\bgroup \hsize=\nodewidth: + \leftskip 0pt plus 0.5\hsize + \rightskip 0pt plus 0.5\hsize + \parfillskip 0pt \fi + #1 \ifdim\nodewidth:>0in + \egroup \fi} +\def\treenodestyle{\def\treetext:##1} +\treenodestyle{\csname#1 :title\endcsname} +\def\last:segdraw#1{ + \ifnum \effort:n>1 + \I:I=\effort:n; \I:I-1; \edef\effort:n{\Val\I:I} + \I:I=\effort:from; \I:I+\effort:step; \edef\effort:from{\Val\I:I} + \I:I=\effort:to; \I:I+\effort:step; \edef\effort:to{\Val\I:I} + \ifnum \effort:max < \effort:to \let\effort:to=\effort:max \fi + \expandafter\expandafter\expandafter#1 + \fi +} +\def\doelements:#1{% + \ifx\fifth:\empty \def\fifth:{1}\fi + \IF \EqInt(\fifth:,0)\THEN \chartelement:{#1}% + \ELSE \rapply{#1,\milestonechild:,\projectchild:,\taskchild:}\FI} + +\def\milestonechild:#1#2#3#4#5{\child:{#1}} +\def\taskchild:#1#2#3#4#5#6#7{\child:{#1}} +\def\projectchild:#1#2#3#4#5{\IF \EqInt(\depth,\fifth:)\THEN + \chartelement:{#1}\FI} + +\def\child:#1{\IF \GtInt(\depth,\fifth:)\ELSE + \chartelement:{#1}\FI } +\def\getscale:#1{ + \def\scale:{1} + \K:K=#1; + \Do(0,4){ \IF \GtInt(\K:K,1000) \K:K/10; \edef\scale:{\scale:0} \FI } + \R:R=200; \R:R/\K:K; \R:R*\:Cons\:Xunits; \Scale(\Val\R:R,4) +} +\defcom{MINMAXDATES:}#1{ + \expandafter\edef\csname\projectid: :minmax\endcsname{ + \noexpand \getminmaxdates:#1//} + } +\def\getminmaxdates:#1/#2/#3//#4/#5/#6//{ + \I:I=#4; \I:I-#1; \I:I+1; \edef\maxDD:{\Val\I:I} + \I:I=#5; \I:I-#2; \I:I+1; \edef\maxMM:{\Val\I:I} + \I:I=#6; \I:I-#3; \I:I+1; \edef\maxYY:{\Val\I:I} +} +\newif\ifpflag: +\def\cutprojectstasksA:#1{ + \axisdate:\dateA:{#1}1 + \axisdate:\dateB:{#1}2 + \ifnum \dateB:<0\space \pflag:false \fi + \ifnum \dateA:>\dateF:\space \pflag:false \fi + \ifnum \dateA:<0\space \def\dateA:{0} \fi + \ifnum \dateB:>\dateF:\space \let\dateB:=\dateF: \fi + \ifnum \optt:=\csname#1 :type\endcsname\space \pflag:false \fi + \ifnum \optp:=\csname#1 :type\endcsname\space \pflag:false \fi +} +\Define\ignoredepth:{ + \let\sv:AddBarDepth=\:AddBarDepth + \Define\:AddBarDepth(2){\let\:AddBarDepth=\sv:AddBarDepth } +} +\def\movemilestonesym:#1,#2//{\Q:Q=#1;\Q:Q-#2; \Q:Q/2; + \Move(0,\Val\Q:Q) } +\def\putbartext:{ + \if E\bareff: \efforts:(\Val\K:K,\Val\K:K){ \geteff: } + \else \if T\bartext: + \K:K+1; \names:Tbl:(\Val\K:K,\Val\K:K){ \getname: } + \else \let\bareff:=X + \fi\fi + \if X\bareff: \else + \K:K+1; + \let\nodewidth:=\scnodewidth: \titletext:{\temp:} + \MoveToExit(-1.1,1.1) \MarkLoc(1-:) + \MoveToExit(1.1,-1.1) \MarkLoc(2-:) \CSeg\Clip(2-:,1-:) + \fi +} +\Define\getname:(1){ \def\temp:{#1} } +\Define\geteff:(1){\findeffort:{#1}\empty} +\def\datesaxis(#1)(#2){ \scheaxis:{#1}{#2}\dates:} +\def\nonamesaxis(#1)(#2){ \scheaxis:{#1}{#2}\nonames:} +\def\namesaxis(#1)(#2){{\let\TicText=\TicName:: + \scheaxis:{#1}{#2}\names: }} +\def\scheaxis:#1#2#3{ \def~{\noexpand&} + \edef\temp:{\noexpand\Axis(#1)(#2,#3) } \temp: } +\TextPar\Define\TicName::(1){\IF \EqText(,#1) \THEN + \ELSE \let\nodewidth:=\scnodewidth: + \titletext:{#1} \FI} +\:DefineExt\schedulestyle(7){\endgroup + \def\baropt:##1##2##3##4//{ + \let\baropt:=\empty \let\txtopt:=\UndDef: + \baroptA:##1 \baroptA:##2 \baroptA:##3 + } + \let\baropts:=\empty \let\bartext:=x \let\barIIID:=x + \let\baraxis:=x \let\bareff:=x + \def\temp:{#1} \ifx\temp:\empty\else \baropt:#1......// \fi + \def\temp:{#2#3} \ifx\temp:\empty\else \def\barloc:{#2,#3} \fi + \def\temp:{#4} \ifx\temp:\empty\else \def\projectcolor:{#4} \fi + \def\temp:{#5} \ifx\temp:\empty\else \def\taskcolor:{#5} \fi + \def\temp:{#6} \ifx\temp:\empty\else \def\milestonesym:{#6} \fi + \def\temp:{#7} \ifx\temp:\empty\else \def\scnodewidth:{#7pt} \fi +} +\:DefineExt\schedulelimits(1){\endgroup + \schedulelimits:#1,,,// +} +\expandafter\long\expandafter\def\csname + .:\string \schedulelimits\endcsname(#1){\endgroup + \schedulelimits:#1,,,// +} +\long\def\schedulelimits:#1,#2,#3//{ + \def\temp:{#1} \ifx\temp:\empty\else \def\schedulelimit:{#1} \fi + \def\temp:{#2} \ifx\temp:\empty\else \def\schedulecode:{#2} \fi +} +\schedulelimits(10000,\par) +\def\baroptA:#1{ + \if#1T \let\bartext:=T \fi + \if#1A \let\baraxis:=A \fi + \if#1E \let\bareff:=E \let\baraxis:=A \fi + \if3#1 \let\barIID:=3 \edef\baropts:{\baropts: 3} \fi +} + +\schedulestyle(A,2.5,7.5,3,0,$\otimes$,70) +\def\cutoffdates:{ + \def\yrS:{0} \def\moS:{0} \def\dateS:{0} +\ifx\second:\empty + \axisdate:\dateS:{\first:}1 +\else + \let\:date:=\second: + \axisdate:\dateS:{}: +\fi +\let\dyS:=\DD: \let\moS:=\MM: \let\yrS:=\YY: +\ifx\third:\empty + \axisdate:\dateF:{\first:}2 +\else + \let\:date:=\third: + \axisdate:\dateF:{}: +\fi +\let\dyF:=\DD: \let\moF:=\MM: \let\yrF:=\YY: + +} +\def\cutofftypes:{ + \def\optm:{-1} \def\optt:{-1} \def\optp:{-1} + \expandafter\cutofftypesA:\fourth:....// +} +\def\cutofftypesA:#1#2#3#4//{ + \chkop:#1 \chkop:#2 \chkop:#3 +} +\def\chkop:#1{ + \if M#1 \let\optm:=\milestonenode: \fi + \if T#1 \let\optt:=\tasknode: \fi + \if P#1 \let\optp:=\projectnode: \fi +} +\def\getint:#1.#2.#3//{ \K:K=#1; \def\frac:{0.#2} } +\def\utaskII:#1{ + \ifnum \csname#1 :type\endcsname=\milestonenode:\space \else + \pflag:true + \edef\svK:K{\Val\K:K} \cutprojectstasks:{#1} \K:K=\svK:K; + \ifpflag: \ifnum \csname#1 :type\endcsname=\projectnode:\space + \J:J=0; \contributionsstyle{}{}{} \findthecontri:{#1} +\def\all:##1{ \reseffII:{##1}{\csname##1 :bool\endcsname} + \expandafter\let\csname##1 :bool\endcsname=\:UnDef + } +\alls: + +\else \J:J=0; +\let\reseff:=\reseffII: +\csname#1 :eff\endcsname + \fi +\R:R=\J:J; \R:R/2; \R:R+\K:K; \K:K+\J:J; +\edef\names:{ \names: \ifx\names: \empty\else ~ \fi + \Val\R:R,\csname#1 :title\endcsname } +\edef\nonames:{ \nonames: \ifx\nonames:\empty\else ~ \fi + \Val\K:K,\relax + } +\edef\lastnames:{ \Val\K:K } + + \fi + \fi +} +\def\reseffII:#1#2{ \J:J+1; +\IF \GtDec(#2,\maxeffort:) \edef\maxeffort:{#2} \fi +\edef\bars:{ #2,#1 \ifx\bars:\empty\else ~ \fi \bars: } + } +\def\dec:dim#1{% + \def~{\noexpand&} \edef\tmp:i{\bars:} + \expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i} + \Define\tmp:ii(1){} \I:I=0; \tmp:i(0,999){\I:I+1; \tmp:ii} + \edef\effort:max{\Val\I:I} \I:I+#1; \I:I-1; + \I:I / #1; + \edef\effort:n{\Val\I:I} \J:J=\effort:max; \J:J/\effort:n; + \I:I=\J:J; \I:I*\effort:n; \IF \LtInt(\I:I,\effort:max) \J:J+1;\FI + \def\effort:from{1} \edef\effort:to{\Val\J:J} + \let\effort:step=\effort:to +} +\def\cnd:starts#1{ + \aft:edraw + + \df:bfs + + \snd:bxo #1 + \global \expandafter\setbox + \csname dra:bx\effort:n\endcsname=\hbox +} +\def\aft:edraw{ + \ifx \effort:boxes\:Undef + \gdef\effort:boxes{\global\let\effort:boxes=\:Undef} + \global\let\ef:EndDraw=\EndDraw + \gdef\EndDraw{\ef:EndDraw \global\let\EndDraw=\:UnDef \effort:boxes } + \fi +} +\def\df:bfs{ + \expandafter\ifx \csname dra:bx\effort:n\endcsname\relax + \global\csname newbox\expandafter + \endcsname \csname dra:bx\effort:n\endcsname \fi +} +\def\snd:bxo#1{ + \expandafter\ifx \csname right:mrk\endcsname\relax + \tmp:dim=\:RBorder + \advance\tmp:dim by -\:LBorder +\else + \tmp:dim=\right:mrk pt \advance\tmp:dim by - \left:mrk pt + \global\let\right:mrk\:UnDef +\fi + + \expandafter\tmp:toks\expandafter{\effort:boxes} + \expandafter\expandafter\expandafter\tmp:toks + \expandafter\expandafter\expandafter{\expandafter + \the\expandafter\tmp:toks #1} + \xdef\effort:boxes{\the\tmp:toks \noexpand\Draw + \noexpand\Text(--\noexpand \hbox to\the\tmp:dim{ +\hss + + \box \csname dra:bx\effort:n\endcsname + } + + --)\noexpand\EndDraw } +} +\ifx \tmp:toks\:UnDef \csname newtoks\endcsname \tmp:toks \fi +\def\sv:forchart{ + \let\sv:bars=\bars: + \let\sv:names=\names: + \let\sv:nonames=\nonames: + \let\gall:=~ +} +\def\recall:forchart{ + \let\bars:=\sv:bars + \let\names:=\sv:names + \let\nonames:=\sv:nonames + \let~=\gall: +} +\TextPar\Define\EffortBarText:(1){ + \MoveToLoc(BarBot) \Move(5pt\du,0) + \EntryExit(-1,0,0,0) \Text(--#1--) + \MoveToExit(-1.1,1.1) \MarkLoc(1-:) + \MoveToExit(1.1,-1.1) \MarkLoc(2-:) \CSeg\Clip(2-:,1-:) +} +\:DefineExt\effortstyle(1){\endgroup\effortstyle:(#1,,,)} +\Define\effortstyle:(6){ + \def\baropt:##1##2##3##4//{ + \effortbaroptA:##1 \effortbaroptA:##2 \effortbaroptA:##3 + } + \let\effortbaropts:=\empty \let\effortbaraxis:=x + \let\effortbartext:=x \let\effortbarIIID:=x + \def\temp:{#1} \ifx\temp:\empty\else \baropt:#1......// \fi + \def\temp:{#2#3} \ifx\temp:\empty\else \def\effortbarloc:{#2,#3} \fi + \def\temp:{#4} \ifx\temp:\empty\else \def\effortcolor:{#4} \fi + \def\temp:{#5} \ifx\temp:\empty\else \def\efftextwidth:{#5pt} \fi +} +\:DefineExt\effortlimits(1){\endgroup + \effortlimits:#1,,,// +} +\expandafter\long\expandafter\def\csname + .:\string \effortlimits\endcsname(#1){\endgroup + \effortlimits:#1,,,// +} +\long\def\effortlimits:#1,#2,#3//{ + \def\temp:{#1} \ifx\temp:\empty\else \def\effortlimit:{#1} \fi + \def\temp:{#2} \ifx\temp:\empty\else \def\effortcode:{#2} \fi +} +\effortlimits(10000,\par) +\def\effortbaroptA:#1{ + \if#1A \let\effortbaraxis:=A \fi + \if#1T \let\effortbartext:=T \fi + \if3#1 \let\effortbarIIID:=3 + \edef\effortbaropts:{\effortbaropts: 3} \fi +} + +\effortstyle(A,2.5,7.5,1,70) +\let\effortaxis=\datesaxis +\TextPar\Define\TicName:(1){ \IF \EqText(,#1) \THEN + \ELSE \let\nodewidth:=\efftextwidth: + \titletext:{#1} \FI} +\def\sort:{ + \let\sorted:=\empty + \pflag:false + \expandafter\sortA:\dates:{} + \let\dates:=\sorted: + \ifpflag: \expandafter\sort: \fi} +\def\sortA:#1#2{ + \def\temp:{#2} + \ifx\temp:\empty \edef\sorted:{\sorted: {#1}} \let\next:=\relax + \else + \ifnum #1>#2\space + \pflag:true + \edef\sorted:{\sorted: {#2}} \def\next:{\sortA:{#1}} + \else + \edef\sorted:{\sorted: {#1}} \def\next:{\sortA:{#2}} + \fi + \fi + \next: +} +\def\indexIII:#1{ + \Q:Q = 0; \I:I = 0; + \csname#1 :prev\endcsname + \IF \GtInt(\I:I,0) \THEN \Q:Q / \I:I; \FI + \def\entry:{#1} \let\next:=\empty + \expandafter\addtocurrow:\currow:{}{} +} +\def\prevI:#1{ + \expandafter\ifx\csname#1 : in/cl: \endcsname\relax \else + \Q:Q + \csname#1 : in/cl: \endcsname; + \I:I + 1; + \fi +} +\def\addtocurrow:#1#2{ + \def\temp:{#1} + \ifx\temp:\empty + \edef\next:{\next:{\Val\Q:Q}{\entry:}} \let\currow:=\next: + \else + \IF \GtDec(#1,\Q:Q) \THEN + \edef\next:{\next:{\Val\Q:Q}{\entry:}} + \Q=#1; \def\entry:{#2} + \ELSE + \edef\next:{\next:{#1}{#2}} + \FI + \expandafter\addtocurrow: + \fi } +\def\inserttocol:#1#2{ + \def\temp:{#1} \ifx\temp:\empty \else + \expandafter\edef\csname \the\tcount: :nodes\endcsname{ + \csname\the\tcount: :nodes\endcsname + \node:{#2} } + \expandafter\edef\csname#2 : in/cl: \endcsname{\the\tcount:} + \advance\tcount: by 1\relax + \expandafter\inserttocol: + \fi +} +\def\pertnodestyle{\def\perttext:##1} +\pertnodestyle{\csname#1 :title\endcsname} +\def\subsort:{ + \pflag:false + \expandafter\subsortA:\elms:{} + \ifpflag: \expandafter\subsort: \fi +} + +\def\subsortA:#1{ + \def\cur:{#1} + \ifx\cur:\empty \else + \csname#1 :prev\endcsname + \expandafter\subsortA: + \fi +} + +\def\compr:#1{ + \def\temp:{#1} + \ifx\temp:\bef: + \I:I=\csname#1 :boolA\endcsname; \I:I+1; + \IF \GtInt(\I:I,\csname\cur: :boolA\endcsname) \THEN + \pflag:true + \expandafter\edef\csname\cur: :boolA\endcsname{\Val\I:I} + \IF \GtInt(\I:I,\maxsub:) \THEN \edef\maxsub:{\Val\I:I} \FI + \FI + \fi + \ifx\temp:\empty\else \expandafter\compr:\fi +} +\def\indexII:#1{ + \ifnum\csname#1 :boolA\endcsname=\DoReg + \I:I=\csname#1 : in/cl:\endcsname; + \CSeg\:GetXY(origin:,col.\Val\I:I) + \def\adjprt:{0} +\ifx\prtadjtbl:\empty\else + \Define\searchadj:(2){ \IF \EqText(##1,#1) \THEN \def\adjprt:{##2}\FI} + \prtadjtbl:(0,999){\searchadj:} +\fi + + \if H\hpert: + \IF \LtDec(\Va,\T:T) \THEN \Va=\T:T; \FI + \IF \LtDec(\R:R,\Va) \THEN \R:R=\Va; \FI + \Vb+\adjprt:; + + \else + \IF \GtDec(\Vb,\T:T) \THEN \Vb=\T:T; \FI + \IF \GtDec(\R:R,\Vb) \THEN \R:R=\Vb; \FI + \Va+\adjprt:; + + \fi + \MoveTo(\Val\Va,\Val\Vb) +\seg:prt + +\ifx \:tmp\def + \if H\hpert: + \IF \LtInt(\I:I,\u:pert) \THEN + \sapply{up,merge,up,{#1}} + + \ELSE \IF \GtInt(\I:I,\d:pert) \THEN + \sapply{down,merge,down,{#1}} + + \ELSE \IF \LtInt(\DoReg,\l:pert) \THEN + \sapply{temp,intersect,done,{#1}} +\sapply{temp,\Va=1;\gob:I} +\sapply{left,merge,left,{#1}} + + \ELSE \IF \GtInt(\DoReg,\r:pert) \THEN + \MarkLoc(here) \CSeg\:GetY(col.maxY,here) +\IF \LtDec(\Vb,0) \THEN \MarkLoc(col.maxY) \FI +\CSeg\:GetX(col.maxX,here) +\IF \LtDec(\Va,0) \THEN + \CSeg\:GetX(origin:,here) + \Va/\node:wh; \Va+\l:pert; \Va-1; + \IF \LtDec(\Va,\r:pert) \Va=-1; \FI +\FI +\sapply{temp,intersect,done,{#1}} +\sapply{temp,\Va=1;\gob:I} +\IF \LtDec(\Va,0) \THEN + \Va=-1; +\sapply{temp,intersect,done,{#1}} +\sapply{temp,\Va=1;\gob:I} +\IF \LtDec(\Va,0) \THEN + \IF \GtInt(\DoReg,\r:pert) \THEN \ELSE + \MarkLoc(.) \CSeg\:GetX(origin:,.) + \Va/\node:wh; \Va/\step:right; +% \immediate\write16{..(\the\DoReg,\Val\I:I).......\Val\Vb....\step:down} + \IF \GtDec(\Va,1.3) \THEN + \gdef\overflow:col{Y} + \ELSE + \Va=-1; + \FI +\FI + +\FI +\IF \LtDec(\Va,0) \THEN + \MarkLoc(before) \PutNode(#1) \MarkLoc(here) +\CSeg\:GetX(before,here) +\IF \LtDec(\Va,\node:wh) \THEN + \edef\node:wh{\Val\Va} +\FI +\sapply{in,merge,in,{#1}} + + \Move(\openpertH:,-\adjprt:) +\ELSE + \sapply{temp,intersect,done,{#1}} +\sapply{temp,\Va=1;\gob:I} +\sapply{left,merge,left,{#1}} + +\FI + +\ELSE + \sapply{right,merge,right,{#1}} +\FI + + \ELSE \Va=-1; +\sapply{temp,intersect,done,{#1}} +\sapply{temp,\Va=1;\gob:I} +\IF \LtDec(\Va,0) \THEN + \IF \GtInt(\DoReg,\r:pert) \THEN \ELSE + \MarkLoc(.) \CSeg\:GetX(origin:,.) + \Va/\node:wh; \Va/\step:right; +% \immediate\write16{..(\the\DoReg,\Val\I:I).......\Val\Vb....\step:down} + \IF \GtDec(\Va,1.3) \THEN + \gdef\overflow:col{Y} + \ELSE + \Va=-1; + \FI +\FI + +\FI +\IF \LtDec(\Va,0) \THEN + \MarkLoc(before) \PutNode(#1) \MarkLoc(here) +\CSeg\:GetX(before,here) +\IF \LtDec(\Va,\node:wh) \THEN + \edef\node:wh{\Val\Va} +\FI +\sapply{in,merge,in,{#1}} + + \Move(\openpertH:,-\adjprt:) +\ELSE + \sapply{temp,intersect,done,{#1}} +\sapply{temp,\Va=1;\gob:I} +\sapply{left,merge,left,{#1}} + +\FI + + \FI \FI \FI \FI +\else + \IF \LtInt(\I:I,\l:pert) \THEN + \sapply{left,merge,left,{#1}} + + \ELSE \IF \GtInt(\I:I,\r:pert) \THEN + \sapply{right,merge,right,{#1}} + + \ELSE \IF \LtInt(\DoReg,\u:pert) \THEN + \sapply{temp,intersect,done,{#1}} +\sapply{temp,\Va=1;\gob:I} +\sapply{up,merge,up,{#1}} + + \ELSE \IF \GtInt(\DoReg,\d:pert) \THEN + \MarkLoc(here) \CSeg\:GetY(here,col.maxY) +\IF \LtDec(\Vb,0) \THEN + \CSeg\:GetY(here,origin:) + \Vb/\node:wh; \Vb+\u:pert; \Vb-1; + \IF \LtDec(\Vb,\d:pert) \Vb=-1; \FI +\FI +\sapply{temp,intersect,done,{#1}} +\sapply{temp,\Vb=1;\gob:I} +\IF \LtDec(\Vb,0) \THEN + \Va=-1; +\sapply{temp,intersect,done,{#1}} +\sapply{temp,\Va=1;\gob:I} +\IF \LtDec(\Va,0) \THEN + \IF \GtInt(\DoReg,\d:pert) \THEN \ELSE + \MarkLoc(.) \CSeg\:GetY(.,origin:) + \Vb/\node:wh; \Vb/\step:down; +% \immediate\write16{..(\the\DoReg,\Val\I:I).......\Val\Vb....\step:down} + \IF \GtDec(\Vb,1.2) \THEN + \gdef\overflow:col{Y} \Va=1; + \FI +\FI + +\FI +\IF \LtDec(\Va,0) \THEN + \MarkLoc(before) \PutNode(#1) +\MarkLoc(here) +\CSeg\:GetY(here,before) +\IF \LtDec(\Vb,\node:wh) \THEN + \edef\node:wh{\Val\Vb} +\FI +\CSeg\:GetY(here,col.maxY) +\IF \GtDec(\Vb,0) \THEN \MarkLoc(col.maxY) \FI +\sapply{in,merge,in,{#1}} + + \Move(-\adjprt:,-\openpertV:) +\ELSE + \sapply{down,merge,down,{#1}} +\FI + +\ELSE + \sapply{down,merge,down,{#1}} + +\FI + + \ELSE \Va=-1; +\sapply{temp,intersect,done,{#1}} +\sapply{temp,\Va=1;\gob:I} +\IF \LtDec(\Va,0) \THEN + \IF \GtInt(\DoReg,\d:pert) \THEN \ELSE + \MarkLoc(.) \CSeg\:GetY(.,origin:) + \Vb/\node:wh; \Vb/\step:down; +% \immediate\write16{..(\the\DoReg,\Val\I:I).......\Val\Vb....\step:down} + \IF \GtDec(\Vb,1.2) \THEN + \gdef\overflow:col{Y} \Va=1; + \FI +\FI + +\FI +\IF \LtDec(\Va,0) \THEN + \MarkLoc(before) \PutNode(#1) +\MarkLoc(here) +\CSeg\:GetY(here,before) +\IF \LtDec(\Vb,\node:wh) \THEN + \edef\node:wh{\Val\Vb} +\FI +\CSeg\:GetY(here,col.maxY) +\IF \GtDec(\Vb,0) \THEN \MarkLoc(col.maxY) \FI +\sapply{in,merge,in,{#1}} + + \Move(-\adjprt:,-\openpertV:) +\ELSE + \sapply{down,merge,down,{#1}} +\FI + + \FI \FI \FI \FI +\fi + +\else + \PutNode(#1) + \if H\hpert: \Move(\openpertH:,-\adjprt:) + \else \Move(-\adjprt:,-\openpertV:) \fi + +\fi +\MarkLoc(col.\Val\I:I) +\MoveToNode(#1,1,1) \MarkLoc(.) +\CSeg\:GetX(col.maxX,.) +\IF \GtDec(\Va,0) \THEN \MarkLoc(col.maxX) \FI + + + \fi +} +\Define\adjustpert(1){ + \def\prtadjtbl:{#1} + \ifx\prtadjtbl:\empty \else \Table\prtadjtbl:{#1} \fi +} +\adjustpert() +\def\utaskIV:#1{ \def\cur:{#1} \csname#1 :prev\endcsname } +\def\clipper:#1{ + \pflag:true + \seg:prt + +\ifx \:tmp\def \pflag:false \fi +\sapply{temp,merge,in,left} +\sapply{temp,merge,right,temp} +\sapply{temp,merge,up,temp} +\sapply{temp,merge,down,temp} +\sapply{temp,intersect,temp,{#1}} +\sapply{temp,\pflag:true \gob:I} + + \ifpflag: + \def\temp::{#1} +\ifx \temp::\cur: \pflag:false +\else\ifx\temp::\from: \pflag:false + \else \MoveToLoc(\cur:) \CSeg[0.5]\Move(\cur:,\from:) \MarkLoc(:=center=:) +\CSeg\:GetXY(\cur:,:=center=:) +\IF \LtDec(\Va,0) \THEN \Va=-\Va; \FI \edef\HH:{\Val\Va} +\IF \LtDec(\Vb,0) \THEN \Vb=-\Vb; \FI \edef\VV:{\Val\Vb} + + \MoveToNode(#1,0,-1) \MarkLoc(:=loc=:) +\CSeg\:GetY(:=center=:,:=loc=:) +\IF \GtDec(\Vb,\VV:) \THEN \pflag:false \ELSE + \MoveToNode(#1,0,1) \MarkLoc(:=loc=:) + \CSeg\:GetY(:=loc=:,:=center=:) + \IF \GtDec(\Vb,\VV:) \THEN \pflag:false \ELSE + \MoveToNode(#1,1,0) \MarkLoc(:=loc=:) + \CSeg\:GetX(:=loc=:,:=center=:) + \IF \GtDec(\Va,\HH:) \THEN \pflag:false \ELSE + \MoveToNode(#1,-1,0) \MarkLoc(:=loc=:) + \CSeg\:GetX(:=center=:,:=loc=:) + \IF \GtDec(\Va,\HH:) \THEN \pflag:false \FI + \FI + \FI +\FI + +\fi \fi + + \fi + \ifpflag: + \MoveToNode(#1,1,1) \MarkLoc(b:) + \MoveToNode(#1,-1,-1) \MarkLoc(a:) \CSeg\Clip(a:,b:) + \fi +} +\:DefineExt\pertstyle(7){\endgroup + \def\baropt:##1##2//{ + \pertoptA:##1 + } + \let\hpert:=x + \def\temp:{#1} \ifx\temp:\empty\else \baropt:#1......// \fi + \def\temp:{#2} \ifx\temp:\empty\else \def\openpertH:{#2} \fi + \def\temp:{#3} \ifx\temp:\empty\else \def\openpertV:{#3} \fi + \def\temp:{#4} \ifx\temp:\empty\else \let\MilestoneNode:=#4\fi + \def\temp:{#5} \ifx\temp:\empty\else \let\ProjectNode:=#5 \fi + \def\temp:{#6} \ifx\temp:\empty\else \let\TaskNode:=#6 \fi + \def\temp:{#7} \ifx\temp:\empty\else \def\pertw:{#7pt} \fi +} +\def\pertoptA:#1{ + \if#1H \let\hpert:=H \fi +} + +\pertstyle(,30,20,\RectNode,\VRectNode,\SRectNode,70) + + \def\treediagram(#1){{ \getparms:#1,,,,,,,,,// + \verify:{\first:} \def\verify:##1{} + \ifx\EndDraw\UnDef: + \pwarn:{\string\treediagram\space not\space within\space + \string\Draw...\string\EndDraw} + \fi + \ifx\second:\empty \def\second:{999} \fi \K:K=\second:; + \ifnum\csname\first: :type\endcsname=\projectnode:\space + \else \K:K=0; \fi + \IF \EqInt(\K:K,0) \THEN + \ifnum\csname\first: type\endcsname=\projectnode:\space + \let\temp:=\projectnode +\else + \ifnum\csname\first: type\endcsname=\tasknode:\space + \let\temp:=\tasknode + \else \let\temp:=\milestonenode + \fi +\fi +\temp:()(--{\treetext:{\first:}}--) + + \ELSE + \tcount: = 0 \let\nodeid: = \relax + +\let\node:=\getnode: +\def\row:{ \node:{\first:} } +\let~=\relax +\let\tree:=\empty +\def\utask:##1{ + \IF \GtInt(\K:K,0) \THEN + \I:I+1; + \let\node:=\relax + \edef\nextrow:{ \nextrow: \node:{##1} } + \let\node:=\getnode: + \FI + } + + \TextNode(1){ \titletext:{##1} } +\let\nodewidth:=\treenodewidth: +\def\temp:{\noexpand&} +\edef\temp:{ + \noexpand\TreeSpec + (\projectnode: ,\noexpand\project:node \temp: + \tasknode: ,\noexpand\task:node \temp: + \milestonenode:,\noexpand + \milestone:node)()(\noexpand\project:edge) +} \temp: + + \gettree: \def~{\noexpand&} + \def\nodeid:##1{ + \expandafter\ifx\csname##1 :id\endcsname\relax \else + ${}^{\csname##1 :id\endcsname}$ + \fi } + + \edef~{\noexpand\Tree()(\tree:)} ~ + \FI +}} + +\def\schedulechart(#1){ \getparms:#1,,,,,,,,,// + \verify:{\first:} \def\verify:##1{} + \def\efforts:##1{} + + \let\gal:=~ + \let~=\relax + \let\cutprojectstasks:=\cutprojectstasksA: + \cutoffdates: \getscale:\dateF: + \I:I=\K:K; +\IF \LtInt(\I:I,3) \THEN \I:I=3; +\ELSE + \I:I=\yrF:; \I:I-\yrS:; \IF \LtInt(\I:I,0) \I:I+\maxYY:; \FI + \IF \LtInt(\I:I,2) \THEN + \I:I*\maxMM:; \I:I+\moF:; \I:I-\moS:; + \FI +\FI +\let\nodates:=\empty +\Do(1,\Val\I:I){ \edef\nodates:{\nodates: ~} } + +\edef\dates:{\showdate:\dyS:/\moS:/\yrS:/0// \nodates: + \showdate:\dyF:/\moF:/\yrF:/0//} + + \cutofftypes: + \let\bars:=\empty \let\names:=\empty \let\nonames:=\empty +\def\chartelement:##1{ \pflag:true +\ifnum \csname##1 :type\endcsname=\milestonenode:\space + \axisdate:\dateA:{##1}\empty +\I:I=\dateA:; \def\temp:{-1} \J:J=0; \K:K=0; +\ifnum \dateA:<0\space \pflag:false \fi +\ifnum \dateA:>\dateF:\space \pflag:false \fi +\ifnum \optm:=\csname##1 :type\endcsname\space \pflag:false \fi + +\else + \cutprojectstasks:{##1} +\def\temp:{0} +\ifnum \csname##1 :type\endcsname=\projectnode:\space + \I:I=\dateA:; \J:J=\dateB:; \K:K=0; \J:J-\I:I; +\else \I:I=\dateA:; \J:J=0; \K:K=\dateB:; \K:K-\I:I; +\fi + +\fi +\I:I/\scale:; \J:J/\scale:; \K:K/\scale:; +\ifpflag: + \edef\bars:{ \bars: \ifx\bars:\empty\else ~ \fi + \Val\I:I,\temp:,\Val\J:J,\Val\K:K } + \edef\names:{ ~ \csname##1 :title\endcsname ~ \names:} +\edef\nonames:{\nonames:~} +\edef\efforts:{\efforts: ~ ##1 } + +\fi + } +\doelements:{\first:} + + \Define\DrawBar(2){ +\IF \GtInt(\J:J,0) \THEN + \IF \EqInt(\J:J,1) \THEN + \IF \EqInt(##1,-1) \THEN + \EntryExit(0,0,0,0) \expandafter\movemilestonesym:\barloc:// + \Text(--\milestonesym:--) + \MoveToExit(0,1) \Move(0,5pt\du) \EntryExit(0,-1,0,0) \putbartext: + + \ignoredepth: + \FI + \ELSE + \IF \GtDec(##1,0) \THEN + \MarkLoc(o) \R:R=##1; \R:R/2; \Q:Q=##2; \Q:Q/2; +\Move(\Val\R:R,\Val\Q:Q) +\EntryExit(0,0,0,0) \putbartext: \MoveToLoc(o) + + \DrawRect(##1,##2) + \FI + \FI +\ELSE \ignoredepth: \FI +\J:J+1; \IF \EqInt(\J:J,4) \THEN \J:J=0; \FI +} +\edef\temp:{\noexpand\BarChartSpec(HS\baropts:,\barloc: \noexpand & + \barloc: \noexpand & \barloc: \noexpand & \barloc:) + (0 \noexpand& 0 \noexpand& \projectcolor: \noexpand& \taskcolor:)} +\temp: + + \let~=\gal: + \sv:forchart + + \ifnum \schedulelimit:=10000 \else + \ifnum \schedulelimit:=10000 \else + \def~{\noexpand&} \edef\tmp:i{\bars:} \let~=\relax + \expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i} + \def\maxeffort:{0} + \Define\tmp:ii(4){ + \K:K=##1; \K:K+##4; + \IF \GtInt(\K:K,\maxeffort:) \THEN \edef\maxeffort:{\Val\K:K}\FI + } + \tmp:i(0,999){\tmp:ii} +\fi + + \dec:dim\schedulelimit: + + \fi + \put:schedulechart + \let~=\gal: + \let\verify:=\verify:: +} +\Define\put:schedulechart{ + \ifnum \schedulelimit:=10000 \else + \I:I=\effort:from; \J:J=\effort:to; \let~=\relax +\I:I-1; \J:J-1; +\def~{\noexpand&} \edef\tmp:i{\bars:} \let~=\relax +\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i} +\let\bars:=\empty +\Define\tmp:ii(1){\edef\bars:{\ifx\bars:\empty\else\bars:~\fi##1}} +\tmp:i(\Val\I:I,\Val\J:J){\tmp:ii} + + \def~{\noexpand&} \edef\tmp:i{\names:} \let~=\relax +\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i} +\let\names:=\empty +\Define\tmp:ii(1){ + \IF \GtDec(\K:K,\min:sg) \THEN + \IF \LtDec(\K:K,\max:sg) \THEN + \edef\names:{\names:~ ##1} + \FI \FI + \K:K+1; +} +\K:K=\effort:max; \K:K-\effort:to; \K:K*2; \edef\min:sg{\Val\K:K} +\K:K=\effort:max; \K:K-\effort:from; \K:K+1; + \K:K*2; \K:K+1; \edef\max:sg{\Val\K:K} +\K:K=0; \tmp:i(0,9999){\tmp:ii} + + \def~{\noexpand&} \edef\tmp:i{\nonames:} \let~=\relax +\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i} +\let\nonames:=\empty +\Define\tmp:ii(1){ + \IF \GtDec(\K:K,\min:sg) \THEN + \IF \LtDec(\K:K,\max:sg) \THEN + \edef\nonames:{\nonames:~##1} + \FI \FI + \K:K+1; +} +\K:K=\effort:from; \K:K-2; \edef\min:sg{\Val\K:K} +\K:K=\effort:to; \edef\max:sg{\Val\K:K} +\K:K=0; \tmp:i(0,9999){\tmp:ii} + + \ifnum \effort:from>1 + \cnd:starts \schedulecode: + \fi + \bgroup + \fi + \def~{\noexpand&} \pflag:true +\edef\temp:{ \noexpand\Table\noexpand\efforts:{ \efforts: } } +\temp: +\if T\bartext: + \edef\temp:{ \noexpand\Table\noexpand\names:Tbl:{ \names: } } + \temp: + \let~=\relax +\Define\temp:(1){\edef\names:{##1~\names:}} +\let\names:=\empty +\names:Tbl:(0,99){\temp:} +\def~{\noexpand&} +\edef\temp:{ \noexpand\Table\noexpand\names:Tbl:{ \names: } } +\temp: + +\fi + \J:J=0; \K:K=0; +\edef\temp:{ \noexpand\BarChart( \bars: ) } \temp: + + \ifnum \schedulelimit:=10000 \else + \MoveToLoc(Origin) \Move(\maxeffort:,0) +\MarkLoc(NE) \CSeg\Move(NW,SW) \MarkLoc(SE) +\MoveToLoc(NE) \Text(----) + + + \fi + \let\nodewidth:=\scnodewidth: +\if A\baraxis: \datesaxis(SW,NE)(S-1) + + \MoveToLoc(NE) {\Text(--\phantom{\showdate:00/00/00/0//}--) +\MoveToExit(1,0) \Text(----)} + + + \if T\bartext: + \else \MoveToLoc(SW) \Move(-5pt\du,0) \MarkLoc(sw:) +\MoveToLoc(NE) \Move(5pt\du,0) \MarkLoc(ne:) +\CSeg\DrawRect(ne:,sw:) +\namesaxis(sw:,ne:)(W-0) +\nonamesaxis(sw:,ne:)(W-1) +\MoveToLoc(ne:) {\Text(--\phantom{\showdate:00/00/00/0//}--) +\MoveToExit(1,0) \Text(----)} + + + + \fi +\fi + + \ifnum \schedulelimit:=10000 \else + \egroup + \recall:forchart + + \last:segdraw\put:schedulechart + + \fi +} + +\def\effortchart(#1){ \getparms:#1,,,,,,,,,// + \verify:{\first:} \def\verify:##1{} + \ifnum\csname\first: :type\endcsname= \milestonenode: \space + \pwarn:{\string\effortchart{\first:}?\space `\first:'\space is + \space a\space milestone} + \else + \let\gal:=~ + \let~=\relax + \edef\temp:{\second:\third:\fourth:} +\ifx\temp:\empty \def\cutprojectstasks:##1{} +\else \cutoffdates: \cutofftypes: + \let\cutprojectstasks:=\cutprojectstasksA: +\fi + + \let\bars:=\empty \let\names:=\empty \let\nonames:=\empty +\def\maxeffort:{0} \K:K=0; +\let\chartelement:=\utaskII: +\doelements:{\first:} + + \IF \EqInt(\K:K,0) \THEN + \pwarn:{empty\space effort\space chart\space for\space `#1'} + \ELSE + \expandafter\getint:\maxeffort:.0.0// \getscale:\K:K + \IF \GtInt(\scale:,1) \THEN + \def~{\noexpand&} + \edef\temp:{\noexpand\Table\noexpand\temp:{\bars:}} + \temp: + \let~=\relax + \def\bars:##1{} + \Define\tempa:(2){ \Q:Q=##1; + \Q:Q/\scale:; \edef\bars:{\bars: ~ \Val\Q:Q,##2} } + \temp:(0,99){\tempa:} +\FI + + \let\BarText=\EffortBarText: + +\edef\temp:{\noexpand\BarChartSpec( HT\effortbaropts: , \effortbarloc: ) + ( \effortcolor: ) } +\temp: +\if A\effortbaraxis: \if 3\effortbarIIID: \BarGrid(0,,) \FI\FI + + + \edef\dates:{\maxeffort:} +\expandafter\getint:\maxeffort:.0.0// +\I:I=\K:K; \I:I/2; \K:K-\I:I; \K:K-\I:I; +\Q:Q=\frac:; \Q:Q+\K:K; \Q:Q/2; +\IF \EqDec(\Q:Q,0) + \edef\dates:{0 ~ \Val\I:I ~ \dates:} +\ELSE \Q:Q*10; \J:J[\Q:Q]; \edef\dates:{0 ~ \Val\I:I.\Val\J:J ~ \dates:} +\FI + + \edef\names:{0,\lastnames:~\names:} +\edef\nonames:{0,\lastnames: ~0,\relax~ \nonames:} + + \sv:forchart + + \ifnum \effortlimit:=10000 \else + \dec:dim\effortlimit: + + \fi + \put:effortchart + \FI + \let~=\gal: + \fi + \let\verify:=\verify:: +} +\Define\put:effortchart{ + \ifnum \effortlimit:=10000 \else + \I:I=\effort:from; \J:J=\effort:to; \let~=\relax +\I:I-1; \J:J-1; +\def~{\noexpand&} \edef\tmp:i{\bars:} \let~=\relax +\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i} +\let\bars:=\empty +\Define\tmp:ii(1){\edef\bars:{\ifx\bars:\empty\else\bars:~\fi##1}} +\tmp:i(\Val\I:I,\Val\J:J){\tmp:ii} + + \def~{\noexpand&} \edef\tmp:i{\names:} \let~=\relax +\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i} +\let\names:=\empty +\Define\tmp:ii(2){ + \T:T=\effort:max; \T:T-##1; + \IF \GtDec(\T:T,\I:I) \THEN + \IF \GtDec(\T:T,\effort:to) \THEN\ELSE + \T:T=##1; \T:T-\effort:max; \T:T+\effort:to; + \IF \EqDec(\T:T,0.0) \THEN \T:T=0.25; \FI + \edef\names:{\ifx\names:\empty\else\names:~\fi \Val\T:T,##2} + \FI \FI +} +\tmp:i(1,9999){\tmp:ii} +\K:K=\effort:to; \K:K-\I:I; +\edef\names:{0,\Val\K:K\ifx \names:\empty\else ~\names:\fi} + + \def~{\noexpand&} \edef\tmp:i{\nonames:} \let~=\relax +\expandafter\Table\expandafter\tmp:i\expandafter{\tmp:i} +\let\nonames:=\empty +\Define\tmp:ii(2){ + \T:T=\effort:max; \T:T-##1; + \IF \LtDec(\T:T,\I:I) \THEN \ELSE + \IF \GtDec(\T:T,\effort:to) \THEN\ELSE + \T:T=##1; \T:T-\effort:max; \T:T+\effort:to; + \edef\nonames:{\ifx\nonames:\empty\else\nonames:~\fi \Val\T:T,##2} + \FI \FI +} +\tmp:i(1,9999){\tmp:ii} +\K:K=\effort:to; \K:K-\I:I; +\edef\nonames:{0,\Val\K:K\ifx \nonames:\empty\else ~\nonames:\fi} + + \ifnum \effort:from>1 + \cnd:starts \effortcode: + \fi + \bgroup + \fi + \def~{\noexpand&} +\edef\temp:{ \noexpand\BarChart( \bars: ) } \temp: + + \ifnum \effortlimit:=10000 \else + \MoveToLoc(Origin) \Move(\maxeffort:,0) +\MarkLoc(NE) \CSeg\Move(NW,SW) \MarkLoc(SE) +\MoveToLoc(NE) \Text(----) + + + \fi + \if A\effortbaraxis: + \MoveToLoc(NE) \Move(5pt\du,0) \MarkLoc(ne:) + \if 3\effortbarIIID: + {\CSeg\Line(ne:,NW) } \CSeg\Line(NW,SW) \CSeg\Line(ne:,NW) + \else \CSeg\DrawRect(ne:,SW) \fi + \effortaxis(SW,NE)(S-1) + \namesaxis(SW,NE)(W5) + \nonamesaxis(SW,ne:)(W8) + \ifnum \effortlimit:=10000 \else + \nonamesaxis(SW,ne:)(W-6) + + \fi + \MoveToLoc(ne:) \Text(----) + +\fi + + \ifnum \effortlimit:=10000 \else + \egroup + \recall:forchart + + \last:segdraw\put:effortchart + + \fi +} +\def\pertdiagram{\futurelet\:temp\pertd:ag} +\def\pertd:ag{\ifx \:temp* + \def\date:less{\def\dateA:{0}} + \def\:temp##1{\pertdiagram:} + \else + \let\date:less=\empty + \let\:temp=\pertdiagram: + \fi + \:temp} +\def\pertdiagram:(#1){ \getparms:#1,,,,,,,,,// + \verify:{\first:} \def\verify:##1{} + \ifnum\csname\first: :type\endcsname= \projectnode: \space + \let\gal:=~ + \let~=\relax + \cutoffdates: + \cutofftypes: + \let\index:=\relax \let\dates:=\empty +\def\utask:##1{ + \expandafter\def\csname##1 :bool\endcsname{0} + \ifnum\csname##1 :type\endcsname=\milestonenode:\space + \axisdate:\dateA:{##1}\empty + \else + \axisdate:\dateA:{##1}1 + \fi + \date:less + \expandafter\ifx\csname -\dateA:-:\endcsname\relax + \edef\dates:{ \dates: {\dateA:} } + \fi + \expandafter\edef\csname -\dateA:-:\endcsname{ + \expandafter\ifx\csname -\dateA:-:\endcsname\relax \else + \csname -\dateA:-:\endcsname + \fi + \index:{##1} } + } +\csname\first: :under\endcsname +\sort: +\def\prev:##1{ + \expandafter\ifx\csname##1 :bool\endcsname\relax + + \else + \J:J=\csname##1 :bool\endcsname; \J:J+1; +\IF \GtInt(\J:J,\csname\cur: :bool\endcsname) \THEN + \pflag:true + \expandafter\edef\csname\cur: :bool\endcsname{\Val\J:J} +\FI + + \fi } +\def\utask:##1{ + \def\cur:{##1} + \csname##1 :prev\endcsname } +\def\setrows:{ \pflag:false + \csname\first: :under\endcsname + \ifpflag: + \expandafter\setrows: + \fi } +\setrows: + + \J:J=-1; +\def\colsno:{0} \expandafter\let\csname 0 :nodes\endcsname=\empty +\def\utask:##1{ \tcount:=\csname##1 :bool\endcsname\space +\expandafter\ifx\csname col-:\the\tcount:\endcsname\relax + \expandafter + \def\csname col-:\the\tcount: :+\endcsname{ \index:{##1} } + + \expandafter\def\csname col-:\the\tcount:\endcsname{0} + \tcount:=0\space \J:J+1; +\else + \expandafter\edef\csname col-:\the\tcount: :+\endcsname{ + \csname col-:\the\tcount: :+\endcsname \index:{##1} } + + \I:I=\csname col-:\the\tcount:\endcsname; \I:I+1; + \expandafter\edef\csname col-:\the\tcount:\endcsname{ \Val\I:I } + \tcount:=\Val\I:I\space + \ifnum \tcount:>\colsno:\space + \expandafter\let\csname \the\tcount: :nodes\endcsname=\empty + \edef\colsno:{\the\tcount:} +\fi + +\fi + } +\csname\first: :under\endcsname + +\Do(0,\Val\J:J){ + \J:J=\colsno:; \J:J-\csname col-:\the\DoReg\endcsname; \J:J/2; + \let\node:=\relax +\let\currow:=\empty +\let\index:=\indexIII: +\let\prev:=\prevI: +\csname col-:\the\DoReg :+\endcsname + +\tcount:=\Val\J:J +\expandafter\inserttocol:\currow:{}{} + + +} + + + + + \let\nodewidth:=\pertw: \MarkLoc(origin:) \edef\rowsno:{0} +\sapply{all,merge,{},{}} +\def\node:##1{ + \IF \GtInt(\I:I,\rowsno:) \edef\rowsno:{\Val\I:I} \FI \I:I+1; + \ifnum\csname##1 :type\endcsname=\milestonenode:\space + \let\PertNode:=\MilestoneNode: +\else + \ifnum\csname##1 :type\endcsname=\projectnode:\space + \let\PertNode:=\ProjectNode: + \else + \let\PertNode:=\TaskNode: + \fi +\fi + +\DefNode\PertNode:(##1)(--\titletextA:{\perttext:{##1}}--) +\sapply{all,merge,all,{##1}} + + \AddNodeDim(##1) +} +\sapply{MaxXYI,merge,{},{}} +\Do(0,\colsno:){ + \I:I=0; + \ZeroNodesDim + \csname \the\DoReg :nodes\endcsname + \sapply{MaxXYI,merge,MaxXYI,{\if H\hpert: \MaxY + \else \MaxX\fi :\the\DoReg}} + +} + + \def\l:pert{0} \def\u:pert{0} +\if H\hpert: + \grps:ns\step:right\colsno:\pert:cols + \grps:ns\step:down\rowsno:\pert:rows +\else + \grps:ns\step:right\colsno:\pert:cols + \grps:ns\step:down\rowsno:\pert:rows +\fi +\I:I=\step:right; \I:I-1; \edef\r:pert{\Val\I:I} +\I:I=\step:down; \I:I-1; \edef\d:pert{\Val\I:I} +\sapply{in,merge,{},{}} +\sapply{done,merge,{},{}} +\def\overflow:col{N} +\MoveToLoc(origin:) \MarkLoc(col.minX) \MarkLoc(col.maxX) +\MarkLoc(col.maxY) \edef\node:wh{1000} + + \def\:temp{ \def\effort:n{-1} \pert:diag{#1} + } + \let~=\gal: + \else \pwarn:{\string\pertdiagram{\first:}?\space + not \space a \space project} + \let\:temp\empty + \fi + \let\verify:=\verify:: + \:temp +} +\def\getnodesbydate:#1{ + \def\temp:{#1} + \ifx \temp:\empty \else + \def\temp:{ + \let\index:=\indexI: +\Q:Q=0; \R:R=0; +\csname -#1-:\endcsname + + \let\elms:=\empty +\def\index:####1{ + \edef\elms:{\elms: {####1}} + \expandafter\def\csname####1 :boolA\endcsname{0} + } +\csname -#1-:\endcsname +\def\maxsub:{0} +\def\prev:####1{ + \def\bef:{####1} + \expandafter\compr:\elms:{} +} +\subsort: + + \let\index:=\indexII: \T:T=\prevstart:; +\Do(0,\maxsub:){ + \R:R=0; + \csname -#1-:\endcsname + \IF \GtDec(\R:R,\T:T) + \T:T=\R:R; + \if H\hpert: \T:T+\openpertH:; \else \T:T-\openpertV:; \fi + \FI +} + + \getnodesbydate: } + \expandafter\temp: + \fi +} +\def\indexI:#1{ + \I:I=\csname#1 : in/cl:\endcsname; + \CSeg\:GetXY(origin:,col.\Val\I:I) + \if H\hpert: + \IF \GtDec(\Va,\Q:Q) \THEN \Q:Q=\Va; \FI + \IF \GtDec(\prevstart:,\Q:Q) \THEN \Q:Q=\prevstart:; + \Q:Q+\openpertH:; \FI + \else + \IF \GtDec(\Q:Q,\Vb) \THEN \Q:Q=\Vb; \FI + \IF \GtDec(\Q:Q,\prevstart:) \THEN \Q:Q=\prevstart:; + \Q:Q-\openpertV:; \FI + \fi + \edef\prevstart:{\Val\Q:Q} +} +\def\pert:diag#1{ + \seg:prt + +\ifx \:tmp\def + \ifnum \effort:n>-1 + \sapply{prevdone,merge,done,{}} + \global \expandafter\setbox + \csname dra:bx\effort:n\endcsname=\hbox + \fi + \bgroup +\fi + + \def\MaxX##1{\MaxY##1/+/-]/[} +\def\MaxY##1:##2/+/-]/[{ + \def\:tmp####1{ + \ifnum \csname####1 : in/cl:\endcsname=##2 + \sapply{used,merge,used,{####1}} + \fi +} +\sapply{used,merge,{},{}} +\sapply{all,\:tmp} +\sapply{used,subtract,used,done} +\let\:tmp=\relax +\sapply{used,\let\:tmp=\def\gob:I} + + \if H\hpert: + \IF \LtInt(##2,\u:pert) \THEN \let\:tmp=\relax + \ELSE \IF \GtInt(##2,\d:pert) \THEN \let\:tmp=\relax + \FI \FI +\else + \IF \LtInt(##2,\l:pert) \THEN \let\:tmp=\relax + \ELSE \IF \GtInt(##2,\r:pert) \THEN \let\:tmp=\relax + \FI \FI +\fi + + \ifx \:tmp\def + \if H\hpert: + \Move(0,-##1) \MarkLoc(col.##2) \Move(0,-##1) + \Move(0,-\openpertV:) + \else + \Move(##1,0) \MarkLoc(col.##2) \Move(##1,0) + \Move(\openpertH:,0) + \fi + \else \ifnum ##2>0 + \MarkLoc(.) \I:I=##2; \I:I-1; \MoveToLoc(col.\Val\I:I) + \MarkLoc(col.##2) \MoveToLoc(.) +\else \MarkLoc(col.##2) \fi + \fi +} +\sapply{MaxXYI,\MaxX} + +\sapply{in,merge,{},{}} +\sapply{up,merge,{},{}} +\sapply{down,merge,{},{}} +\sapply{left,merge,{},{}} +\sapply{right,merge,{},{}} +\let\M:N\empty +\let\M:X\empty + + \if H\hpert: \EntryExit(-1,0,1,0) \def\prevstart:{-10} +\else \EntryExit(0,1,0,-1) \def\prevstart:{10} \fi +\expandafter\getnodesbydate:\dates:{} + + \sapply{edges,merge,{},{}} +\def\prev:##1{ \sapply{temp,intersect,in,{##1,\cur:}} +\sapply{temp,\sapply{edges,merge,edges,{##1,\cur:}}\gob:I} + } +\let\utask:=\utaskIV: +\csname\first: :under\endcsname +\sapply{edges,subtract,edges,in} +\sapply{up,intersect,up,edges} +\sapply{down,intersect,down,edges} +\sapply{left,intersect,left,edges} +\sapply{right,intersect,right,edges} + +\MoveToLoc(origin:) \Move(10,0) \MarkLoc(.) +\MoveToLoc(col.maxX) \Move(0,10) \MarkLoc(..) +\MoveToLL(origin:,.)(col.maxX,..) \Move(0,5) \MarkLoc(col.maxX) +\MoveToLoc(col.minX) \Move(0,5) \MarkLoc(col.minX) + +\K:K=0; +\sapply{left,\K:K+1;\gob:I} \J:J=\K:K; +\sapply{right,\K:K+1;\gob:I} +\sapply{down,\K:K+1;\gob:I} +\sapply{up,\K:K+1;\gob:I} +\CSeg\:GetY(col.maxY,origin:) \Vb/\node:wh; \Vb*0.7; +\IF \GtDec(\Vb,\K:K) \K:K*2; + \IF \EqInt(\J:J,0) \K:K=-\K:K; \FI +\ELSE \K:K/2; \K:K-1; \FI + +\sapply{up,\put:nd} +\sapply{left,\put:nd} +\sapply{right,\put:nd} +\sapply{down,\put:nd} + + \def\prev:##1{ \expandafter\ifx\csname##1 :bool\endcsname\relax + +\else + \def\from:{##1} +\let\utask:=\clipper: +\csname\first: :under\endcsname +\seg:prt + +\ifx \:tmp\def + \sapply{do,merge,{},{}} +\sapply{temp,intersect,in,{##1,\cur:}} +\sapply{temp,\sapply{do,merge,{##1},{}}\gob:I} +\sapply{do,\ifx\M:N\empty \edef\M:N{##1}\edef\M:X{##1}\fi +\def\:temp{ + \CSeg\:GetX(##1,\M:N) \IF \GtDec(\Va,0) \edef\M:N{##1}\FI + \CSeg\:GetX(\cur:,\M:N) \IF \GtDec(\Va,0) \edef\M:N{\cur:}\FI + \CSeg\:GetX(\M:X,##1) \IF \GtDec(\Va,0) \edef\M:X{##1}\FI + \CSeg\:GetX(\M:X,\cur:) \IF \GtDec(\Va,0) \edef\M:X{\cur:}\FI +} +\:temp +{\Edge(##1,\cur:)}\gob:I} + +\else + \Edge(##1,\cur:) + +\fi + +\fi +\Clip() +\let\utask:=\utaskIV: + } +\let\utask:=\utaskIV: +\csname\first: :under\endcsname + + \sapply{in,\extrm:in} +\ifx \M:N\empty\else + \MoveToNode(\M:N,-1,0) \MarkLoc(.\M:N) + \MoveToNode(\M:X,1,0) \MarkLoc(.\M:X) + {\Text(----)} + + \CSeg\:GetX(origin:,.\M:N) \xdef\left:mrk{\Val\Va} + \CSeg\:GetX(origin:,.\M:X) \xdef\right:mrk{\Val\Va} +\fi + + \seg:prt + +\ifx \:tmp\def + \sapply{done,merge,done,in} +\edef\:temp{\noexpand \sapply{done,merge,{\csname + done:mkls\endcsname},{}}} +\expandafter + + \egroup \:temp + \ifnum \effort:n>-1 + \sapply{leftover,subtract,done,prevdone} + \let\:tmp=\relax + \sapply{leftover,\let\:tmp=\def\gob:I} + \ifx \:tmp\def + \snd:bxo \pertcode: + \else + \global \expandafter\setbox + \csname dra:bx\effort:n\endcsname=\hbox{} + \I:I=\effort:n; \I:I-1; \edef\effort:n{\Val\I:I} + \fi +\fi + + \sapply{leftover,subtract,all,done} + \let\:tmp=\relax + \sapply{leftover,\let\:tmp=\def\gob:I} + \ifx \:tmp\def + \I:I=\effort:n; \I:I+1; \edef\effort:n{\Val\I:I} + \if Y\overflow:col + \def\overflow:col{N} +\else + \I:I=\r:pert; \I:I+1; \edef\l:pert{\Val\I:I} + \I:I=\r:pert; \I:I+\step:right; \edef\r:pert{\Val\I:I} + \ifnum \l:pert > \if H\hpert: \rowsno: \else \colsno: \fi + \I:I=\d:pert; \I:I+1; \edef\u:pert{\Val\I:I} + \I:I=\d:pert; \I:I+\step:down; \edef\d:pert{\Val\I:I} + \def\l:pert{0} \I:I=\step:right; \I:I-1; \edef\r:pert{\Val\I:I} + \fi +\fi +\if H\hpert: \else + \I:I=\l:pert; \I:I+7; + \Do(\l:pert,\Val\I:I){ + \def\:tmp####1{ + \ifnum \csname####1 : in/cl:\endcsname=\DoReg + \sapply{used,merge,used,{####1}} + \fi +} +\sapply{used,merge,{},{}} +\sapply{all,\:tmp} +\sapply{used,subtract,used,done} +\let\:tmp=\relax +\sapply{used,\let\:tmp=\def\gob:I} +\ifx \:tmp\relax + \I:I=\r:pert; \I:I+1; \edef\r:pert{\Val\I:I} +\fi + + } +\fi + + + \aft:edraw + +\df:bfs + + + \expandafter\expandafter\expandafter\pert:diag + \else + \expandafter\expandafter\expandafter\gob:I + \fi +\else + \expandafter\gob:I +\fi {#1} + +} +\def\seg:prt{ + \let\:tmp=\def + \ifnum \pert:rows=10000 + \ifnum \pert:cols=10000 + \let\:tmp=\relax + \fi \fi +} +\def\grps:ns#1#2#3{{ + \ifnum #3>#2 + \I:I=#3; \I:I+1; + \else + \R=#2; \R+1; \R/#3; \R+0.49999; \J:J[\R]; + \R=#2; \R+1; \R/\J:J; \I:I[\R]; + \fi + \edef#1{\def\noexpand#1{\Val\I:I}} + \expandafter}#1} +\def\put:nd#1{ + \let\sv:EntryExit\:InOut + \IF \LtInt(\K:K,0) + \EntryExit(-1,1,-1,-1) +\MoveToLoc(col.maxX) \Move(\openpertH:,0) +\FcNode(#1) \pert:bnode(#1) +\MoveToExit(0,1) \MarkLoc(from) \MoveToExit(0,-1) \MarkLoc(to) +\MoveToLoc(col.maxX) \CSeg\Move(from,to) +\Move(0,-\openpertV:) \MarkLoc(col.maxX) + + \ELSE + \EntryExit(1,1,1,-1) +\MoveToLoc(col.minX) \Move(-\openpertH:,0) +\FcNode(#1) \pert:bnode(#1) +\MoveToExit(0,1) \MarkLoc(from) \MoveToExit(0,-1) \MarkLoc(to) +\MoveToLoc(col.minX) \CSeg\Move(from,to) +\Move(0,-\openpertV:) \MarkLoc(col.minX) + + \FI + \K:K-1; + \let\:InOut\sv:EntryExit +} +\def\gob:I#1{} +\:DefineExt\pertlimits(1){\endgroup + \pertlimits:#1,,,,,// +} +\expandafter\long\expandafter\def\csname + .:\string \pertlimits\endcsname(#1){\endgroup + \pertlimits:#1,,,,,// +} +\long\def\pertlimits:#1,#2,#3,#4,#5//{ + \def\temp:{#1} \ifx\temp:\empty\else \def\pert:rows{#1} \fi + \def\temp:{#2} \ifx\temp:\empty\else \def\pert:cols{#2} \fi + \def\temp:{#3} \ifx\temp:\empty\else \def\pert:bnode{#3} \fi + \def\temp:{#3} \ifx\temp:\empty\else \def\pertcode:{#4} \fi +} +\pertlimits(10000,10000,\ExtNode,\par) +\Define\ExtNode(1){ + \filtercommand\name{#1} + \OvalNode(#1)(--\putcommand--)} +\def\extrm:in#1{\ifx\M:N\empty \edef\M:N{#1}\edef\M:X{#1}\fi +\def\:temp{ + \CSeg\:GetX(#1,\M:N) \IF \GtDec(\Va,0) \edef\M:N{#1}\FI + \CSeg\:GetX(\M:X,#1) \IF \GtDec(\Va,0) \edef\M:X{#1}\FI +} +\:temp +} +\expandafter \ifx \csname tmp:dim\endcsname \relax + \csname newdimen\endcsname \tmp:dim +\fi + + +\:RestoreCatcodes \endinput + + -- cgit v1.2.3