summaryrefslogtreecommitdiff
path: root/graphics/dratex/TeXProject.sty
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/dratex/TeXProject.sty
Initial commit
Diffstat (limited to 'graphics/dratex/TeXProject.sty')
-rw-r--r--graphics/dratex/TeXProject.sty2678
1 files changed, 2678 insertions, 0 deletions
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
+
+