%% $Id: pst-tree.tex 466 2011-02-28 17:13:11Z herbert $ %% COPYRIGHT 1993, 1994, 1999 by Timothy Van Zandt, tvz@nwu.edu. %% COPYRIGHT 2000-2003 by Denis Girou. %% Copyright 2004-2011 Herbert Voss % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2003/12/01 or later. % % This work has the LPPL maintenance status "maintained". % % This Current Maintainer of this work is Herbert Voss % % This work consists of the file pstricks.tex, PostScript macros % for Generic TeX. % See the PSTricks User's Guide for description. % \csname PSTreeLoaded\endcsname \let\PSTreeLoaded\endinput \ifx\PSTnodesLoaded\endinput\else\input pst-node.tex\fi\relax \ifx\PSTXKeyLoaded\endinput\else\input pst-xkey \fi % \def\fileversion{1.12} \def\filedate{2011/02/28} \message{ v\fileversion, \filedate (tvz,dg,hv)} % \edef\TheAtCode{\the\catcode`\@} \catcode`\@=11 % \pst@addfams{pst-tree} \newbox\pstree@rootbox \newbox\pstree@box \def\pstree@succrow{% \ifpstreeflip\def\pssubtree@vertical{\pssubtree@vertical@vflip}% \else\def\pssubtree@vertical{\pssubtree@vertical@v}\fi % \def\pstree@node{\pstree@node@v}% % \def\pssubtree@horizontal{\pssubtree@horizontal@v}}% % \def\pssubtree@vertical@v{% \vrule height \pst@dimc depth \pst@dimd width \z@ \ifnum\psnodecnt=\z@ \global\let\pstree@theleftprofile\pstree@leftprofile \global\let\pstree@therightprofile\pstree@rightprofile \else \psk@thistreefit\pstree@therightprofile\pstree@leftprofile \kern\the\pst@cnth sp \pstree@zip\pstree@therightprofile \pstree@rightprofile\pstree@therightprofile \global\advance\pstree@cnt\pst@cnth \pst@cnth=\pstree@cnt \pstree@zip\pstree@leftprofile \pstree@theleftprofile\pstree@theleftprofile \fi \box\pstree@box \global\advance\psnodecnt 1\relax}% % \def\pssubtree@vertical@vflip{% \vrule height \pst@dimc depth \pst@dimd width \z@ \ifnum\psnodecnt=\z@ \global\let\pstree@theleftprofile\pstree@leftprofile \global\let\pstree@therightprofile\pstree@rightprofile \else \psk@thistreefit\pstree@theleftprofile\pstree@rightprofile \kern-\pst@cnth sp \pstree@zip\pstree@theleftprofile \pstree@leftprofile\pstree@theleftprofile \global\advance\pstree@cnt\pst@cnth \pst@cnth=\pstree@cnt \pstree@zip\pstree@rightprofile \pstree@therightprofile\pstree@therightprofile \fi \box\pstree@box \global\advance\psnodecnt 1\relax}% % \def\pstree@node@v{% \edef\pstree@leftprofile{\psk@thistreenodesize\pst@dima,\pstree@stop,}% \edef\pstree@rightprofile{\psk@thistreenodesize\pst@dimb,\pstree@stop,}% \pssubtree@vertical} % \def\pssubtree@horizontal@v{% \pstree@max\pstree@upprofile\pst@cntg \pst@dimc=\pst@cntg sp \pstree@max\pstree@downprofile\pst@cntg \pst@dimd=\pst@cntg sp \pstree@treebboxadjust \edef\pstree@leftprofile{\number\pst@dima,\pstree@stop,}% \edef\pstree@rightprofile{\number\pst@dimb,\pstree@stop,}% \pssubtree@vertical}% % \def\pstree@tightfit#1#2{% \pst@cnth=\z@ \edef\next{\noexpand\pstree@@tightfit#1\noexpand\@nil#2\noexpand\@nil}% \next \advance\pst@cnth\psk@thistreesep\relax \advance\pst@cnth\pstree@tspace\relax \gdef\pstree@tspace{\z@}} % \def\pstree@@tightfit#1,#2\@nil#3,#4\@nil{% \ifnum#1=\pstree@stop \let\next\relax \else \ifnum#3=\pstree@stop\let\next\relax \else \pst@cntg=#1 \advance\pst@cntg#3 \ifnum\pst@cntg>\pst@cnth\pst@cnth=\pst@cntg\fi \def\next{\pstree@@tightfit#2\@nil#4\@nil}% \fi \fi \next} % \def\pstree@loosefit#1#2{% \pstree@max{#1}\pst@cnth \pstree@max{#2}\pst@cntg \advance\pst@cnth\pst@cntg \advance\pst@cnth\psk@thistreesep\relax \advance\pst@cnth\pstree@tspace\relax \gdef\pstree@tspace{\z@}} % \def\tspace#1{% \pst@@killglue \pssetlength\pst@dimg{#1}% \xdef\pstree@tspace{\number\pst@dimg}% \ignorespaces} % \define@key[psset]{pst-tree}{treefit}[tight]{% \@ifundefined{pstree@#1fit}% {\@pstrickserr{Bad `treefit' parameter value: `#1'}\@ehpa}% {\expandafter\let\expandafter\psk@treefit\csname pstree@#1fit\endcsname}} \psset[pst-tree]{treefit=tight} % \define@key[psset]{pst-tree}{thistreefit}[tight]{% \@ifundefined{pstree@#1fit}% {\@pstrickserr{Bad `treefit' parameter value: `#1'}\@ehpa}% {\expandafter\let\expandafter\psk@thistreefit\csname pstree@#1fit\endcsname}} \psset[pst-tree]{thistreefit=tight} % \def\pstree@zip#1#2#3{% \def\pst@tempg{}% \edef\next{\noexpand\pstree@@zip#1\noexpand\@nil#2\noexpand\@nil}% \next \global\let#3\pst@tempg} % \def\pstree@@zip#1,#2\@nil#3,#4\@nil{% \ifnum#1=\pstree@stop \edef\pst@tempg{\pst@tempg#3,#4}% \let\next\relax \else \ifnum#3=\pstree@stop \pst@cntg=#1 \advance\pst@cntg-\pst@cnth \edef\pst@tempg{\pst@tempg\the\pst@cntg,}% \def\next{\pstree@@zip#2\@nil\pstree@stop,\@nil}% \else \edef\pst@tempg{\pst@tempg#3,}% \def\next{\pstree@@zip#2\@nil#4\@nil}% \fi \fi \next} % \def\pstree@max#1#2{% \pst@cntg=\z@ \expandafter\pstree@@max#1#2=\pst@cntg}% % \def\pstree@@max#1,{% \ifnum#1=\pstree@stop\else \ifnum#1>\pst@cntg \pst@cntg=#1 \fi \expandafter\pstree@@max \fi} % \def\pstree@add#1{% \def\pst@tempg{}% \expandafter\pstree@@add#1% \xdef#1{\pst@tempg\pstree@stop,}} % \def\pstree@@add#1,{% \ifnum#1=\pstree@stop\else \pst@cnth=#1 \advance\pst@cnth\pst@cntg \xdef\pst@tempg{\pst@tempg\the\pst@cnth,}% \expandafter\pstree@@add \fi} % \newcount\psnodecnt \let\c@psnodecnt\psnodecnt \newcount\pstreelevel \let\c@pstreelevel\pstreelevel \newcount\pstreecnt \let\c@pstreecnt\pstreecnt \newcount\pstree@cnt % \def\pstree{\def\pst@par{}\pst@object{pstree}} \def\pstree@i{\def\pstree@makebox{\pst@@makebox}\pstree@ii} % \def\psTree{\def\pst@par{}\pst@object{psTree}} \def\psTree@i{\def\pstree@makebox{\pst@makelongbox}\pstree@ii} % hv --begin 1.00 2007-01-03 make it LaTeX-compatible %\def\endpsTree{\pst@endlongbox\ignorespaces} \def\endpsTree{\pst@endlongbox\csname ignorespacesafterend\endcsname} % hv --end \def\pstree@ii{% \ifnum\pstreelevel=\z@ \let\pstree@savedshortput\pst@shortput \psset{shortput=tab}% \else \pst@@killglue \fi \begingroup \begingroup \def\pstree@node{% \xdef\pstree@next{% \noexpand\@psttrue \noexpand\def\noexpand\pst@tempa{\number\pst@dima}% \noexpand\def\noexpand\pst@tempb{\number\pst@dimb}% \noexpand\def\noexpand\pst@tempc{\number\pst@dimc}% \noexpand\def\noexpand\pst@tempd{\number\pst@dimd}}% \box\pstree@box}% \def\pssubtree@horizontal{\pssubtree@horizontal@o}% \def\pssubtree@vertical{\pssubtree@vertical@o}% \global\let\pstree@next\relax \pst@makebox\pstree@iii} % \def\pstree@iii{% \global\setbox\pst@boxg=\box\pst@hbox \endgroup \setbox\pstree@rootbox=\box\pst@boxg \@pstfalse \pstree@next \if@pst \ifdim\wd\pstree@rootbox=\z@\else \@pstrickserr{Extraneous space in root node}\@ehpa \typeout{===>\the\wd\pst@hbox (rootbox)} \wd\pstree@rootbox=\z@ \fi \else \@pstrickserr{Missing or bad root node (level \the\pstreelevel, node \the\psnodecnt)}\@ehpa \def\pstree@next{% \def\pst@tempa{0}% \def\pst@tempb{0}% \def\pst@tempc{0}% \def\pst@tempd{0}}% \wd\pstree@rootbox=\z@ \fi \pstree@savevalues \begingroup \pstree@initsuccvalues \pstree@setlevelpar \pstree@do} % \def\pstree{\def\pst@par{}\pst@object{pstree}} \def\pstree@i{\def\pstree@makebox{\pst@@makebox}\pstree@ii} % \def\psTree{\def\pst@par{}\pst@object{psTree}} \def\psTree@i{\def\pstree@makebox{\pst@makelongbox}\pstree@ii} % hv --begin 1.00 2007-01-03 make it LaTeX-compatible %\def\endpsTree{\pst@endlongbox\ignorespaces} \def\endpsTree{\pst@endlongbox\csname ignorespacesafterend\endcsname} % hv --end \def\pstree@ii{% \ifnum\pstreelevel=\z@ \let\pstree@savedshortput\pst@shortput \psset{shortput=tab}% \else \pst@@killglue \fi \begingroup \begingroup \def\pstree@node{% \xdef\pstree@next{% \noexpand\@psttrue \noexpand\def\noexpand\pst@tempa{\number\pst@dima}% \noexpand\def\noexpand\pst@tempb{\number\pst@dimb}% \noexpand\def\noexpand\pst@tempc{\number\pst@dimc}% \noexpand\def\noexpand\pst@tempd{\number\pst@dimd}}% \box\pstree@box}% \def\pssubtree@horizontal{\pssubtree@horizontal@o}% \def\pssubtree@vertical{\pssubtree@vertical@o}% \global\let\pstree@next\relax \pst@makebox\pstree@iii} % \def\pstree@iii{% \global\setbox\pst@boxg=\box\pst@hbox \endgroup \setbox\pstree@rootbox=\box\pst@boxg \@pstfalse \pstree@next \if@pst \ifdim\wd\pstree@rootbox=\z@\else \@pstrickserr{Extraneous space in root node}\@ehpa \typeout{===>\the\wd\pst@hbox (rootbox)} \wd\pstree@rootbox=\z@ \fi \else \@pstrickserr{Missing or bad root node (level \the\pstreelevel, node \the\psnodecnt)}\@ehpa \def\pstree@next{% \def\pst@tempa{0}% \def\pst@tempb{0}% \def\pst@tempc{0}% \def\pst@tempd{0}}% \wd\pstree@rootbox=\z@ \fi \pstree@savevalues \begingroup \pstree@initsuccvalues \pstree@setlevelpar \pstree@do} % \def\pstree@setlevelpar{% \advance\pstreelevel1 \let\psk@thislevelsep\relax \let\psk@thistreesep\relax \let\psk@thistreefit\relax \let\psk@thistreenodesize\relax \csname pstreehook\romannumeral\pstreelevel\endcsname \use@par \ifx\psk@thistreesep\relax \let\psk@thistreesep\psk@treesep\fi \ifx\psk@thistreenodesize\relax \let\psk@thistreenodesize\psk@treenodesize\fi \ifx\psk@thistreefit\relax \let\psk@thistreefit\psk@treefit\fi \ifx\psk@thislevelsep\relax \let\psk@thislevelsep\psk@levelsep \let\psk@thislevelsepmode\psk@levelsepmode \fi \ifnum\psk@treemode=\pstree@predmode\else \global\advance\pstreecnt1 \edef\pstree@thetree{\the\pstreecnt}% \let\pstree@predmode\psk@treemode \fi \ifx\psk@thislevelsepmode\relax \pst@dimg=\psk@thislevelsep\relax \pst@cntg=0\@nameuse{pstree@levelsepadjust-\pstree@thetree-\the\pstreelevel}% \advance\pst@dimg\pst@cntg sp \edef\psk@thislevelsep{\number\pst@dimg sp}% \fi \ifnum\psk@treemode>1 \def\pst@tposflip{1 sub neg }\else\def\pst@tposflip{}\fi \ifx\pstree@bboxadjust\@empty\else \xdef\pstree@treebboxadjust{% \pstree@bboxadjust \ifpsshowbbox\noexpand\pstree@showbbox\fi}% \gdef\pstree@bboxadjust{}% \fi \let\pst@thispsbox\@skiplevelfalse} % \def\pstree@predmode{-1} \def\pstree@savevalues{% \edef\pstree@restorevalues{% \noexpand\gdef\noexpand\pstree@theleftprofile{\pstree@theleftprofile}% \noexpand\gdef\noexpand\pstree@therightprofile{\pstree@therightprofile}% \noexpand\gdef\noexpand\pstree@theupprofile{\pstree@theupprofile}% \noexpand\gdef\noexpand\pstree@thedownprofile{\pstree@thedownprofile}% \noexpand\gdef\noexpand\pstree@tspace{\pstree@tspace}% \noexpand\gdef\noexpand\pssucc{\pssucc}% \global\psnodecnt=\the\psnodecnt\relax \global\pstree@cnt=\the\pstree@cnt\relax}% \let\pstree@savebboxadjust\pstree@treebboxadjust} \def\pstree@initsuccvalues{% \def\pstree@therightprofile{\pstree@stop,}% \let\pstree@theleftprofile\pstree@therightprofile \let\pstree@theupprofile\pstree@therightprofile \let\pstree@thedownprofile\pstree@therightprofile \psnodecnt=\z@ \pstree@cnt\z@ \gdef\pstree@tspace{\z@}% \let\pspred\pssucc} \def\pssucc{T} \pstree@initsuccvalues \def\pstree@down{% \pstree@succrow \pstree@makebox{\pstree@vertical{\lower}}} \def\pstree@up{% \pstree@succrow \pstree@makebox{\pstree@vertical{\raise}}} \def\pstree@levelsepadjust#1#2{% % DG/SR modification begin - May 14, 1997 - Patch 1 % Problem with levelsep=*... %\pst@cntg=0\@nameuse{pstree@levelsepadjust-#1}% \pst@cntg=0\@nameuse{pstree@levelsepadjust-#1} % DG/SR modification end \ifnum#2>\pst@cntg \expandafter\xdef\csname pstree@levelsepadjust-#1\endcsname{#2}% \fi} % DG/SR modification begin - October 28, 1999 - Patch 5 - For plain TeX \ifx\@undefined\@auxout\newwrite\@auxout\fi % DG/SR modification end \def\pstree@initlevelsepadjust{% \@ifundefined{@latexerr}{% \immediate\openin1 \jobname.pst \ifeof1 \else\input \jobname.pst\fi \immediate\closein1 \csname newwrite\endcsname\pstree@auxout \immediate\openout\pstree@auxout \jobname.pst }{\let\pstree@auxout\@auxout}% \global\let\pstree@initlevelsepadjust\relax} \newcount\pstree@stop \pstree@stop=-987654321 \def\pstree@vertical#1{% \pst@cntg=\ifpstreeflip-\fi\wd\pst@hbox \divide\pst@cntg 2 \pstree@add\pstree@theleftprofile \pstree@add\pstree@therightprofile \pst@dimg=\psk@thislevelsep\relax \ifx\psk@thislevelsepmode\relax \pstree@vertlevelsepadjust{#1}\fi \global\setbox\pstree@box=\hbox{% \vrule height \pst@tempc sp depth \pst@tempd sp width \z@ \unhbox\pstree@rootbox #1\pst@dimg\hbox to\z@{\hss\unhbox\pst@hbox\hss}}% \if@skiplevel\skiplevel@vertical\else\endgroup\fi \edef\pstree@leftprofile{\pst@tempa,\pstree@theleftprofile}% \edef\pstree@rightprofile{\pst@tempb,\pstree@therightprofile}% \pst@dimc=\ht\pstree@box \pst@dimd=\dp\pstree@box \ifpsshowbbox \pstree@max\pstree@leftprofile\pst@cntg \pst@dima=\pst@cntg sp \pstree@max\pstree@rightprofile\pst@cntg \pst@dimb=\pst@cntg sp \pstree@showbbox \fi \dp\pstree@box=\z@ \ht\pstree@box=\z@ \pstree@restorevalues \pssubtree@vertical \global\let\pstree@treebboxadjust\pstree@savebboxadjust \endgroup \ifnum\pstreelevel>\z@\expandafter\ignorespaces\fi} % \def\pstree@vertlevelsepadjust#1{% \ifx\if@filesw\iffalse\else \ifx#1\lower \pst@dimh=\pst@tempd sp \advance\pst@dimh\ht\pst@hbox \else \pst@dimh=\pst@tempc sp \advance\pst@dimh\dp\pst@hbox \fi \immediate\write\@auxout{% \string\pstree@levelsepadjust{\pstree@thetree-\the\pstreelevel}{\number\pst@dimh}}% \fi} % \def\pstree@succcolumn{% \def\pssubtree@vertical{\pssubtree@vertical@h}% \def\pssubtree@horizontal{\pssubtree@horizontal@h}% \def\pstree@node{\pstree@node@h}}% % \def\pssubtree@horizontal@h{% \xdef\pstree@theleftprofile{\number\pst@dima,\pstree@theleftprofile}% \xdef\pstree@therightprofile{\number\pst@dimb,\pstree@therightprofile}% \ifnum\psnodecnt=\z@ \global\let\pstree@theupprofile\pstree@upprofile \global\let\pstree@thedownprofile\pstree@downprofile \box\pstree@box \else \ifpstreeflip\pssubtree@horizontal@@hflip\else\pssubtree@horizontal@@h\fi \fi \global\advance\psnodecnt 1\relax} % \def\pssubtree@horizontal@@h{% \psk@thistreefit\pstree@thedownprofile\pstree@upprofile \global\advance\pstree@cnt\pst@cnth \lower\the\pstree@cnt sp\box\pstree@box \pstree@zip\pstree@thedownprofile\pstree@downprofile\pstree@thedownprofile \pst@cnth=\pstree@cnt \pstree@zip\pstree@upprofile\pstree@theupprofile\pstree@theupprofile} % \def\pssubtree@horizontal@@hflip{% \psk@thistreefit\pstree@theupprofile\pstree@downprofile \global\advance\pstree@cnt\pst@cnth \raise\the\pstree@cnt sp\box\pstree@box \pstree@zip\pstree@theupprofile\pstree@upprofile\pstree@theupprofile \pst@cnth=\pstree@cnt \pstree@zip\pstree@downprofile\pstree@thedownprofile\pstree@thedownprofile} % \def\pstree@node@h{% \edef\pstree@upprofile{\psk@thistreenodesize\pst@dimc,\pstree@stop,}% \edef\pstree@downprofile{\psk@thistreenodesize\pst@dimd,\pstree@stop,}% \pssubtree@horizontal@h}% % \def\pssubtree@vertical@h{% \pstree@max\pstree@leftprofile\pst@cntg \pst@dima=\pst@cntg sp \pstree@max\pstree@rightprofile\pst@cntg \pst@dimb=\pst@cntg sp \pstree@treebboxadjust \edef\pstree@upprofile{\number\pst@dimc,\pstree@stop,}% \edef\pstree@downprofile{\number\pst@dimd,\pstree@stop,}% \pssubtree@horizontal@h}% % \newif\if@psrighttree \def\pstree@right{% \@psrighttreetrue \pstree@succcolumn \pstree@makebox\pstree@horizontal} % \def\pstree@left{% \@psrighttreefalse \pstree@succcolumn \pstree@makebox\pstree@horizontal} % \def\pstree@horizontal{% \ifdim\wd\pst@hbox=\z@\else \@pstrickserr{Extraneous space in tree successors}\@ehpa \typeout{===>\the\wd\pst@hbox (hbox)} \fi \pst@cntg=\ifpstreeflip\ht\else\dp\fi\pst@hbox \divide\pst@cntg 2 \pstree@add\pstree@theupprofile \pstree@add\pstree@thedownprofile % DG/SR modification begin - Sep. 24, 1997 - Patch 3 %\ifx\psk@thislevelsepmode\relax %\pstree@horizlevelsepadjust %\fi % DG/SR modification end \pst@dimg\psk@thislevelsep\relax \global\setbox\pstree@box=\hbox{% \unhbox\pstree@rootbox \kern\if@psrighttree\else-\fi\pst@dimg \ifpstreeflip\lower\else\raise\fi\pst@cntg sp\box\pst@hbox}% % DG/SR modification begin - Sep. 24, 1997 - Patch 3 \ifx\psk@thislevelsepmode\relax \pstree@horizlevelsepadjust \fi % DG/SR modification end \if@psrighttree \pst@dimh=\pst@dimg \pstree@max\pstree@therightprofile\pst@cntg \global\advance\pst@dimh\pst@cntg sp \global\pst@dimg=\pst@tempa sp \else \pstree@max\pstree@theleftprofile\pst@cntg \global\advance\pst@dimg\pst@cntg sp \global\pst@dimh=\pst@tempb sp \fi \if@skiplevel\skiplevel@horizontal\else\endgroup\fi \pst@dima=\pst@dimg \pst@dimb=\pst@dimh \edef\pstree@upprofile{\pst@tempc,\pstree@theupprofile}% \edef\pstree@downprofile{\pst@tempd,\pstree@thedownprofile}% \dp\pstree@box=\z@ \ht\pstree@box=\z@ \wd\pstree@box=\z@ \ifpsshowbbox \pstree@max\pstree@upprofile\pst@cntg \pst@dimc=\pst@cntg sp \pstree@max\pstree@downprofile\pst@cntg \pst@dimd=\pst@cntg sp \pstree@showbbox \fi \pstree@restorevalues \pssubtree@horizontal \endgroup \ifnum\pstreelevel>\z@\expandafter\ignorespaces\fi} % % DG/SR modification begin - Sep. 24, 1997 - Patch 2 %\def\pstree@horizlevelsepadjust#1{% \def\pstree@horizlevelsepadjust{% % DG/SR modification end \ifx\if@filesw\iffalse\else \if@psrighttree \pst@dimh=\pst@tempb sp \pstree@max\pstree@theleftprofile\pst@cntg \advance\pst@dimh\pst@cntg sp \else \pst@dimh=\pst@tempa sp \pstree@max\pstree@therightprofile\pst@cntg \advance\pst@dimh\pst@cntg sp \fi \immediate\write\@auxout{% \string\pstree@levelsepadjust{\pstree@thetree-\the\pstreelevel}{\number\pst@dimh}}% \fi} % \define@key[psset]{pst-tree}{treemode}[0]{% \pst@cntg=\ifx#1U\@empty2\else\ifx#1R\@empty1\else\ifx#1L\@empty3\else0\fi\fi\fi \relax \edef\psk@treemode{\the\pst@cntg}% \ifcase\pst@cntg \let\pstree@do\pstree@down\or \let\pstree@do\pstree@right\or \let\pstree@do\pstree@up\or \let\pstree@do\pstree@left \fi} \psset[pst-tree]{treemode=0} % \let\pstree@do\pstree@down \define@key[psset]{pst-tree}{treesep}[0.75cm]{% \pssetlength\pst@dimg{#1}% \edef\psk@treesep{\number\pst@dimg}}% \psset[pst-tree]{treesep=.75cm} % \define@key[psset]{pst-tree}{thistreesep}{% \pssetlength\pst@dimg{#1}% \edef\psk@thistreesep{\number\pst@dimg}}% %\psset[pst-tree]{thistreesep=.75cm} % \define@key[psset]{pst-tree}{treenodesize}[-1pt]{% \pssetlength\pst@dimg{#1}% \ifdim\pst@dimg<\z@ \let\psk@treenodesize\number \else \edef\psk@treenodesize{\number\pst@dimg\noexpand\@gobble}% \fi} \psset[pst-tree]{treenodesize=-1pt} % \define@key[psset]{pst-tree}{thistreenodesize}[-1pt]{% \pssetlength\pst@dimg{#1}% \ifdim\pst@dimg<\z@ \let\psk@thistreenodesize\number \else \edef\psk@thistreenodesize{\number\pst@dimg\noexpand\@gobble}% \fi} \psset[pst-tree]{thistreenodesize=-1pt} % \define@key[psset]{pst-tree}{levelsep}[2cm]{% \pst@expandafter{\pst@ifstar\psset@@levelsep}{#1}\@nil} \def\psset@@levelsep#1\@nil{% \pst@@getlength{#1}\psk@levelsep \if@star \pstree@initlevelsepadjust \let\psk@levelsepmode\relax \else \def\psk@levelsepmode{}% \fi} \psset[pst-tree]{levelsep=2cm} \define@key[psset]{pst-tree}{thislevelsep}{% \pst@expandafter{\pst@ifstar\psset@@thislevelsep}{#1}\@nil} \def\psset@@thislevelsep#1\@nil{% \pst@@getlength{#1}\psk@thislevelsep \if@star \pstree@initlevelsepadjust \let\psk@thislevelsepmode\relax \else \def\psk@thislevelsepmode{}% \fi} % \define@boolkey[psset]{pst-tree}[ps]{treeflip}[true]{} \psset[pst-tree]{treeflip=false} % \def\pstree@node@o{% \leavevmode \hbox{% \vrule height \pst@dimc depth \pst@dimd width \z@ \kern\pst@dima \box\pstree@box \kern\pst@dimb}} % \def\pssubtree@vertical@o{% \pstree@max\pstree@leftprofile\pst@cntg \pst@dima=\pst@cntg sp \pstree@max\pstree@rightprofile\pst@cntg \pst@dimb=\pst@cntg sp \pstree@treebboxadjust \pstree@node} % \def\pssubtree@horizontal@o{% \pstree@max\pstree@upprofile\pst@cntg \pst@dimc=\pst@cntg sp \pstree@max\pstree@downprofile\pst@cntg \pst@dimd=\pst@cntg sp \pstree@treebboxadjust \pstree@node} % \def\pstree@outer{% \def\pstree@node{\pstree@node@o}% \def\pssubtree@vertical{\pssubtree@vertical@o}% \def\pssubtree@horizontal{\pssubtree@horizontal@o}% \pstreelevel=\z@ \def\pstree@predmode{-1}% \def\pst@tposflip{}% \let\pst@thisbox\relax \let\pst@shortput\pstree@savedshortput} % \let\pstree@savedshortput\ignorespaces \pstree@outer % \define@boolkey[psset]{pst-tree}[ps]{showbbox}[true]{} \psset[pst-tree]{showbbox=false} % \def\pstree@showbbox{% \setbox\pstree@box=\hbox{% \psframe[linewidth=0,linecolor=black,linestyle=solid,fillstyle=none]% (-\pst@dima,-\pst@dimd)(\pst@dimb,\pst@dimc)% \box\pstree@box}}% % \define@key[psset]{pst-tree}{edge}[\ncline]{% \def\psedge{#1}% \ifx\psedge\@none\def\psedge##1##2{}\fi} \psset[pst-tree]{edge=\ncline} % \def\pspred{T} \def\pstree@makenodebox{% \pst@@killglue \let\pst@thispsbox\pstree@outer \pst@makebox} % \def\begin@treenode{% \pst@@killglue \begingroup \use@par \global\let\pstree@edge\psedge \xdef\pssucc{\pspred-\the\psnodecnt}} % \def\MakeShortTnput#1{\def\end@treenode{\@ifnextchar#1{\tnput@}{\end@@treenode}}} \MakeShortTnput{~} % \def\end@@treenode{% \pstree@bboxadjust \gdef\pstree@bboxadjust{}% \ifpsshowbbox\pstree@showbbox\fi \pstree@node \endgroup \ifnum\pstreelevel>\z@ \pstree@edge{\pspred}{\pssucc}% \expandafter\pst@shortput \else \expandafter\ignorespaces \fi} % \def\pstree@bboxadjust{} \def\pstree@setbboxadjust#1#2{% \pssetlength\pst@dimg{#1}% \xdef\pstree@bboxadjust{% \pstree@bboxadjust#2\number\pst@dimg sp\relax}} % \define@key[psset]{pst-tree}{bbl}{\pstree@setbboxadjust{#1}{\pst@dima=}} \define@key[psset]{pst-tree}{bbr}{\pstree@setbboxadjust{#1}{\pst@dimb=}} \define@key[psset]{pst-tree}{bbh}{\pstree@setbboxadjust{#1}{\pst@dimc=}} \define@key[psset]{pst-tree}{bbd}{\pstree@setbboxadjust{#1}{\pst@dimd=}} \define@key[psset]{pst-tree}{xbbl}{\pstree@setbboxadjust{#1}{\advance\pst@dima}} \define@key[psset]{pst-tree}{xbbr}{\pstree@setbboxadjust{#1}{\advance\pst@dimb}} \define@key[psset]{pst-tree}{xbbh}{\pstree@setbboxadjust{#1}{\advance\pst@dimc}} \define@key[psset]{pst-tree}{xbbd}{\pstree@setbboxadjust{#1}{\advance\pst@dimd}} % \let\pstree@treebboxadjust\relax \def\Tn{\def\pst@par{}\pst@object{Tn}} \def\Tn@i{% \pst@@killglue \global\let\pssucc\pspred \begingroup \pst@dima=\z@ \pst@dimb=\z@ \pst@dimc=\z@ \pst@dimd=\z@ \setbox\pstree@box=\hbox{}%% \pstree@node \endgroup \ignorespaces} % \def\Tp{\def\pst@par{}\pst@object{Tp}} \def\Tp@i{% \begin@treenode \pst@dima=\z@ \pst@dimb=\z@ \pst@dimc=\z@ \pst@dimd=\z@ \setbox\pstree@box=\hbox{% \pst@newnode{\pssucc}{10}{0 0 }{\tx@InitPnode}}% \end@treenode} % \def\Tc{\def\pst@par{}\pst@object{Tc}} \def\Tc@i#1{% \begin@treenode \pssetlength\pst@dima{#1}% \pst@dimb=\pst@dima \pst@dimc=\pst@dima \pst@dimd=\pst@dima \Pst@nodealignfalse \setbox\pstree@box=\hbox{\cnode@ii(\z@,\z@){#1}{\pssucc}}% \end@treenode} % \def\TC{\def\pst@par{}\pst@object{TC}} \def\TC@i{\Tc@i{\psk@radius}} % \def\Toval{\def\pst@par{}\pst@object{Toval}} \def\Toval@i{\pstree@makenodebox{\Toval@ii\ovalnode@ii}} \def\Toval@ii#1{% \begin@treenode \Pst@nodealigntrue \setbox\pstree@box=\hbox{#1\pssucc}% \pst@dima=\wd\pstree@box \divide\pst@dima 2 \pst@dimb=\pst@dima \pst@dimc=\ht\pstree@box \pst@dimd=\dp\pstree@box \setbox\pstree@box=\hbox to\z@{\hss\unhbox\pstree@box\hss}% \dp\pstree@box=\z@ \ht\pstree@box=\z@ \end@treenode% } % \def\Tcircle{\def\pst@par{}\pst@object{Tcircle}} \def\Tcircle@i{\pstree@makenodebox{\Toval@ii\circlenode@ii}} % DG/SR modification begin - Mar. 7, 2003 - Patch 6 \def\TCircle{\pst@object{TCircle}} \def\TCircle@i{\pst@@killglue\pst@makebox{\Toval@ii\Circlenode@ii}} % DG/SR modification end % \def\Tf{\def\pst@par{}\pst@object{Tf}} \def\Tf@i{\Toval@ii{\fnode@ii()}} % \def\Tdia{\def\pst@par{}\pst@object{Tdia}} \def\Tdia@i{\pstree@makenodebox{\Toval@ii\dianode@ii}} % \def\Ttri{\def\pst@par{}\pst@object{Ttri}} \def\Ttri@i{\pstree@makenodebox{\Ttri@ii}} \def\Ttri@ii{% \begin@treenode \Pst@nodealigntrue \setbox\pstree@box=\hbox{\trinode@ii\pssucc}% \pst@dima=\pst@dimg % Set by \pst@triboxsep \pst@dimb=\wd\pstree@box \advance\pst@dimb-\pst@dima \pst@dimc=\ht\pstree@box \pst@dimd=\dp\pstree@box \setbox\pstree@box=\hbox to\z@{\hss\unhbox\pstree@box\hss}% \dp\pstree@box=\z@ \ht\pstree@box=\z@ \end@treenode% } \def\Tr{\def\pst@par{}\pst@object{Tr}} % SR modification begin - Oct. 27, 1996 %\def\Tr@i{\pstree@makenodebox{\Tr@ii{\begingroup\rnode@ii}}} \def\Tr@i{\pstree@makenodebox{\Tr@ii{\rnode@iii\rnode@iv}}} % SR modification end \def\Tr@ii#1{% \begin@treenode \def\pstree@nodehook{% \xdef\pstree@next{\pst@dima=\number\pst@dima sp\relax}}% \Pst@nodealigntrue \setbox\pstree@box\hbox{#1\pssucc}% \pstree@next \pst@dimb=\wd\pstree@box \advance\pst@dimb-\pst@dima \pst@dimc=\ht\pstree@box \pst@dimd=\dp\pstree@box \setbox\pstree@box\hbox to\z@{\kern-\pst@dima\unhbox\pstree@box\hss}% \ht\pstree@box=\z@ \dp\pstree@box=\z@ \end@treenode} % \def\TR{\def\pst@par{}\pst@object{TR}} % DG modification begin - Oct. 25, 1996 %\def\TR@i{\pstree@makenodebox{\Tr@ii{\Rnode@ii}}} \def\TR@i{\pstree@makenodebox{\Tr@ii{\rnode@iii\Rnode@ii}}} % DG modification end \def\Tdot{\def\pst@par{}\pst@object{Tdot}} \def\Tdot@i{% \begin@treenode \def\pstree@nodehook{\xdef\pstree@next{% \pst@dima=\number\pst@dima sp\relax \pst@dimc=\number\pst@dimb sp\relax}}% \Pst@nodealignfalse \setbox\pstree@box=\hbox{\dotnode@ii(\z@,\z@)\pssucc}% \pstree@next \pst@dimb=\pst@dima \pst@dimd=\pst@dimc \end@treenode} % \define@key[psset]{pst-tree}{fansize}[1cm]{\pst@@getlength{#1}\psk@fansize} \psset[pst-tree]{fansize=1cm} \def\Tfan{\def\pst@par{}\pst@object{Tfan}} \def\Tfan@i{% \addto@par{edge=none}% \begin@treenode \solid@star \pst@dimb=\psk@fansize \pst@dimd=\pslinewidth \advance\pst@dimb-\pst@dimd \divide\pst@dimb 2 \divide\pst@dimd 2 \ifodd\psk@treemode\relax \pst@dima=\pst@dimd \pst@dimc=\pst@dimb \else \pst@dima=\pst@dimb \pst@dimc=\pst@dimd \fi \setbox\pstree@box=\hbox{% \pst@newnode{\pssucc}{16}{}{% /Y 0 def /X 0 def /l \pst@number\pst@dima def /r l def /u \pst@number\pst@dimc def /d u def /NodePos { \tx@GetRnodePos } def}% \def\pst@linetype{1}% \nc@object{Closed}{\pspred}{\pssucc}{.5}{% tx@Dict begin \psline@iii pop end /w \pst@number\pst@dimb CLW 2 div sub def /m \ifodd\psk@treemode false \else true \fi def \tx@Tfan}}% \pst@dimb=\pst@dima \pst@dimd=\pst@dimc \end@treenode} % \define@key[psset]{pst-tree}{tnsep}[{}]{% \def\pst@tempg{#1}% \ifx\pst@tempg\@empty \def\psk@tnsep{\number\pslabelsep sp}% \else \pst@@getlength{#1}\psk@tnsep \fi} \psset[pst-tree]{tnsep={}} % \define@key[psset]{pst-tree}{tnyref}[{}]{\def\psk@tnyref{#1}}% \psset[pst-tree]{tnyref={}} % \define@key[psset]{pst-tree}{tnheight}[\ht\strutbox]{\edef\psk@tnheight{#1}} \psset[pst-tree]{tnheight=\ht\strutbox} % \define@key[psset]{pst-tree}{tndepth}[\dp\strutbox]{\edef\psk@tndepth{#1}} \psset[pst-tree]{tndepth=\dp\strutbox} % \define@key[psset]{pst-tree}{tnpos}[{}]{% \def\pst@tempg{#1}% \ifx\pst@tempg\@empty \def\psk@tnpos{% \ifcase\psk@treemode b\or r\or a\or l\fi}% \else \@ifundefined{pstree@tnput@#1}% {\@pstrickserr{Bad tnpos: `#1'}\@ehpa}% {\edef\psk@tnpos{#1}}% \fi} \psset[pst-tree]{tnpos={}} % \def\tnput@#1{\def\pst@par{}\pst@object{tnput}} \def\tnput@i{\pstree@makenodebox{\tnput@ii}} \def\tnput@ii{% \begingroup \use@par \xdef\next{% \if@star\noexpand\pst@starbox\fi \noexpand\def\noexpand\psk@thistndepth{\psk@tndepth}% \noexpand\def\noexpand\psk@thistnheight{\psk@tnheight}% \noexpand\def\noexpand\psk@thistnyref{\psk@tnyref}% \noexpand\def\noexpand\psk@thistnsep{\psk@tnsep}% \expandafter\noexpand\csname pstree@tnput@\psk@tnpos\endcsname}% \endgroup \next \end@treenode} % \@namedef{pstree@tnput@b}{% \pstree@tnput@@v\pst@dimd\ht\dp\lower\psk@thistnheight} \@namedef{pstree@tnput@a}{% \pstree@tnput@@v\pst@dimc\dp\ht\raise\psk@thistndepth} % \def\pstree@tnput@@v#1#2#3#4#5{% \pst@dimh=\wd\pst@hbox \pst@dimg=\psk@href\pst@dimh \advance\pst@dimg\pst@dimh \divide\pst@dimg 2 \advance\pst@dimh-\pst@dimg \ifdim\pst@dimg>\pst@dima \pst@dima=\pst@dimg\fi \ifdim\pst@dimh>\pst@dimb \pst@dimb=\pst@dimh\fi \pst@dimh=\psk@thistnsep\relax \ifdim\pst@dimh<\z@ \pst@dimh=-\pst@dimh \else\advance\pst@dimh#1\fi \pssetlength\dimen@{#5}% \ifdim\dimen@>#2\pst@hbox \advance\pst@dimh\dimen@\relax \else \advance\pst@dimh#2\pst@hbox \fi \setbox\pstree@box=\hbox{% \box\pstree@box #4\pst@dimh\hbox to\z@{\kern-\pst@dimg\unhbox\pst@hbox\hss}}% #1=#3\pstree@box \dp\pstree@box=\z@ \ht\pstree@box=\z@} % \@namedef{pstree@tnput@l}{% \pstree@tnput@@h\pst@dima{% \hss \lower\pst@dimg\box\pst@hbox \kern\pst@dimh \box\pstree@box}} % \@namedef{pstree@tnput@r}{% \pstree@tnput@@h\pst@dimb{% \box\pstree@box \kern\pst@dimh \lower\pst@dimg\box\pst@hbox \hss}}% % \def\pstree@tnput@@h#1#2{% \ifx\psk@thistnyref\@empty \pssetlength\pst@dimg\psk@vref \else \pst@dimg=\ht\pst@hbox \advance\pst@dimg\dp\pst@hbox \pst@dimg=\psk@thistnyref\pst@dimg \advance\pst@dimg-\dp\pst@hbox \fi \pst@dimh=\psk@thistnsep\relax \ifdim\pst@dimh<\z@ \pst@dimh=-\pst@dimh\else\advance\pst@dimh#1\fi #1=\pst@dimh \advance#1\wd\pst@hbox \setbox\pstree@box=\hbox to\z@{#2}% \ifdim\ht\pstree@box>\pst@dimc \pst@dimc=\ht\pstree@box\fi \ifdim\dp\pstree@box>\pst@dimd \pst@dimd=\dp\pstree@box\fi \dp\pstree@box=\z@ \ht\pstree@box=\z@} % \newif\if@skiplevel \def\skiplevel{\def\pst@par{}\pst@object{skiplevel}} \def\skiplevel@i{\def\pstree@makebox{\pst@@makebox}\skiplevel@ii} \def\skiplevel@ii{% \pst@@killglue \begingroup \let\pssucc\pspred \def\pst@tempa{0}% \def\pst@tempb{0}% \def\pst@tempc{0}% \def\pst@tempd{0}% \setbox\pstree@rootbox=\hbox{}% \pstree@savevalues \begingroup \pstree@initsuccvalues \pstree@setlevelpar \@skipleveltrue \pstree@do} % DG/SR modification begin - Aug. 31, 1999 - Patch 4 %\def\pstree@gettop#1{\expandafter\pstree@@gettop#1\@nil} %\def\pstree@@gettop#1,#2\@nil{#1} % DG/SR modification end \def\skiplevel@horizontal{% % DG/SR modification begin - Aug. 31, 1999 - Patch 4 %\pst@dimc=\pstree@gettop\pstree@theupprofile sp %\pst@dimd=\pstree@gettop\pstree@thedownprofile sp \edef\pstree@upprofile{\pst@tempc,\pstree@theupprofile}% \edef\pstree@downprofile{\pst@tempd,\pstree@thedownprofile}% \pstree@max\pstree@upprofile\pst@cntg \pst@dimc=\pst@cntg sp \pstree@max\pstree@downprofile\pst@cntg \pst@dimd=\pst@cntg sp % DG/SR modification end \pstree@treebboxadjust \gdef\pstree@treebboxadjust{}% \xdef\pstree@next{% \noexpand\def\noexpand\pst@tempc{\number\pst@dimc}% \noexpand\def\noexpand\pst@tempd{\number\pst@dimd}}% \endgroup \pstree@next} % \def\skiplevel@vertical{% % DG/SR modification begin - Aug. 31, 1999 - Patch 4 %\pst@dima=\pstree@gettop\pstree@theleftprofile sp %\pst@dimb=\pstree@gettop\pstree@therightprofile sp \edef\pstree@leftprofile{\pst@tempa,\pstree@theleftprofile}% \edef\pstree@rightprofile{\pst@tempb,\pstree@therightprofile}% \pstree@max\pstree@leftprofile\pst@cntg \pst@dima=\pst@cntg sp \pstree@max\pstree@rightprofile\pst@cntg \pst@dimb=\pst@cntg sp % DG/SR modification end \pstree@treebboxadjust \gdef\pstree@treebboxadjust{}% \xdef\pstree@next{% \noexpand\def\noexpand\pst@tempa{\number\pst@dima}% \noexpand\def\noexpand\pst@tempb{\number\pst@dimb}}% \endgroup \pstree@next} % \def\skiplevels{\def\pst@par{}\pst@object{skiplevels}} \def\skiplevels@i#1{% \pst@@killglue \begingroup \pst@cnta=#1\relax \edef\skiplevels@num{\the\pst@cnta}% \def\pstree@makebox{\pst@makelongbox}% \def\endskiplevels{}% \loop \ifnum\pst@cnta>\z@ \advance\pst@cnta-1 \expandafter\def\expandafter\endskiplevels\expandafter{% \endskiplevels\pst@endlongbox} \skiplevel@ii \repeat \expandafter\def\expandafter\endskiplevels\expandafter{% \endskiplevels\endgroup\ignorespaces} \ignorespaces} % \catcode`\@=\TheAtCode\relax \endinput %% %% END: pst-tree.tex