summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pst-jftree/pst-jftree.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/pst-jftree/pst-jftree.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pst-jftree/pst-jftree.tex214
1 files changed, 214 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pst-jftree/pst-jftree.tex b/Master/texmf-dist/tex/generic/pst-jftree/pst-jftree.tex
new file mode 100644
index 00000000000..d2d601dc089
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/pst-jftree/pst-jftree.tex
@@ -0,0 +1,214 @@
+% 10 January 2004, John Frampton (frampton@neu.edu)
+% Users should feel free to modify this file in any way they
+% see fit. If these modification go beyond your personal
+% use, please send me a careful description of the
+% modifications that have been made and the reasons that
+% they were made.
+% 13 Jan, 2004 - error message if no root node defined in \jftree
+
+\csname JFTreeLoaded\endcsname
+\let\JFTreeLoaded\endinput
+\ifx\PSTricksLoaded\endinput \else \input pstricks \fi\relax
+\ifx\PSTnodesLoaded\endinput \else \input pst-node \fi\relax
+\edef\TheAtCode{\the\catcode`\@}
+\catcode`\@=11
+%%%%%%%%%%%%%%%%%%%%%%%
+%% register resources
+\newtoks\jfteverynode
+\newdimen\jft@xpos
+\newdimen\jft@ypos
+\newdimen\m@xl
+\newdimen\m@xr
+\newdimen\m@xb
+\newbox\jft@treebox
+%%%%%%%%%%%%%%%%%%%%%%%
+%% new PSTricks parameters
+\def\psset@nodetopgap#1{\pssetlength\pst@dima{#1}%
+ \edef\n@detopgap{\the\pst@dima}}
+\def\psset@nodebotgap#1{\pssetlength\pst@dima{#1}%
+ \edef\n@debotgap{\the\pst@dima}}
+\def\psset@everynode#1{\jfteverynode={#1}}
+\def\psset@triratio#1{\edef\jft@triratio{#1}}
+\def\psset@scaleby#1{\edef\jft@scaleby{#1}}
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\jftpsset#1{\ifx#1\relax\relax
+ \else \psset{#1}\fi \ignorespaces}
+\def\jftpsset#1{\edef\temp{#1}\ifx\temp\@empty
+ \else \expandafter\psset\expandafter{\temp}\fi \ignorespaces}
+
+%
+\def\jft@getpars#1{\def\k@@p{#1}\futurelet\temp\jft@getparsA}
+\def\jft@getparsA{\ifx\temp[\let\next\jft@getparsB
+ \else \def\jft@pars{}\let\next=\k@@p \fi\next}
+\def\jft@getparsB[#1]{\def\jft@pars{#1}\k@@p}
+%\jft@getparsC}
+%\def\jft@getparsC{\futurelet\temp\jft@getparsD}
+%\def\jft@getparsD{\k@@p}
+
+% define a branch
+\def\defbranch{\jft@getpars\d@fbranch}
+\def\d@fbranch#1#2(#3)#4(#5){%
+ \edef#1{\noexpand\bgroup
+ \edef\noexpand\@hleg{#5}%
+ \edef\noexpand\@vleg{#3}%
+ \edef\noexpand\m@kelevelpars{\jft@pars}%
+ \noexpand\jft@getpars\noexpand\dr@wbranch}}
+\def\dr@wbranch{\jftpsset{\m@kelevelpars}
+ {\jftpsset{\jft@pars}
+ \pssetxlength\pst@dima{\@vleg}
+ \pst@dima=-\jft@scaleby\pst@dima
+ \@scalebyslope\pst@dima{\@hleg}\pst@dima
+ \edef\@hleg{\the\pst@dima}%
+ \pssetylength\pst@dima{\@vleg}
+ \pst@dima=\jft@scaleby\pst@dima
+ \edef\@vleg{\the\pst@dima}%
+ \pst@dima=\jft@xpos \pst@dimb=\jft@ypos
+ \advance\jft@xpos by \@hleg
+ \advance\jft@ypos by -\@vleg
+ \psline(\pst@dima,\pst@dimb)(\jft@xpos,\jft@ypos)
+ \xdef\temp{\noexpand\jft@xpos=\the\jft@xpos
+ \noexpand\jft@ypos=\the\jft@ypos}%
+ \aftergroup\temp}%
+ \ev@ltarget}
+%
+\def\ev@ltarget{\futurelet\temp\ev@ltargetA}
+\def\ev@ltargetA{\ifx\temp\bgroup\let\next\ev@ltargetB \else
+ \let\next\ev@ltargetC \fi \next}
+\def\ev@ltargetB#1{\setbox0=\hbox{{\jft@testnode #1}}%
+ \d@@fnode \setn@de \egroup\ignorespaces}
+\def\ev@ltargetC#1{#1\egroup\ignorespaces}
+
+% use \@scalebyslope\pst@dima{3/4}\pst@dimb
+% \pst@dima is the height to be scaled,
+% the result is put in \pst@dimb
+\def\@scalebyslope#1#2#3{#3=#1\expandafter
+ \@@scalebyslope\expandafter#3#2//}
+\def\@@scalebyslope#1#2/#3/{\pst@divide{#1}{#2pt}\temp
+ #1=\temp pt \def\temp{#3}%
+ \ifx\temp\@empty \let\next=\relax
+ \else \multiply#1 by #3 \let\next=\@gobble\fi \next}
+
+\def\deftriangle{\jft@getpars\d@ftriangle}
+\def\d@ftriangle#1#2(#3)#4(#5)#6(#7){%
+ \edef#1{\noexpand\bgroup
+ \edef\noexpand\@leftleg{#5}%
+ \edef\noexpand\@rightleg{#7}%
+ \edef\noexpand\@upleg{#3}%
+ \edef\noexpand\m@kelevelpars{\jft@pars}%
+ \noexpand\jft@getpars\noexpand\dr@wtriangle}}
+\def\dr@wtriangle{\jftpsset{\m@kelevelpars}
+ {\jftpsset{\jft@pars}
+ \pssetxlength\pst@dima{\@upleg}
+ \pst@dima=\jft@scaleby\pst@dima
+ \pst@dimb=-\pst@dima
+ \@scalebyslope\pst@dima{\@leftleg}\pst@dima
+ \@scalebyslope\pst@dimb{\@rightleg}\pst@dimb
+ \edef\@leftleg{\the\pst@dima}%
+ \edef\@rightleg{\the\pst@dimb}%
+ \pssetylength\pst@dima{\@upleg}
+ \pst@dima=\jft@scaleby\pst@dima
+ \edef\@upleg{\the\pst@dima}%
+ \pst@dima=\jft@xpos \pst@dimb=\jft@ypos % save old
+ \pst@dimc=\jft@xpos \advance\pst@dimc by \@rightleg % right edge
+ \advance\jft@xpos by -\@leftleg % left edge
+ \advance\jft@ypos by -\@upleg % new bottom edge
+ \pspolygon(\jft@xpos,\jft@ypos)(\pst@dimc,\jft@ypos)(\pst@dima,\pst@dimb)
+ \ifdim\pst@dimc>\m@xr \global\m@xr=\pst@dimc \fi
+ \ifdim\jft@xpos<\m@xl \global\m@xl=\jft@xpos \fi
+ \pst@dimc=\@leftleg \advance\pst@dimc by \@rightleg
+ \xdef\jfttriwd{\the\pst@dimc}%
+ \advance\jft@xpos by \jft@triratio\pst@dimc
+ \xdef\temp{\noexpand\jft@xpos=\the\jft@xpos
+ \noexpand\jft@ypos=\the\jft@ypos
+ \noexpand\def\noexpand\jfttriwd{\the\pst@dimc}}%
+ \aftergroup\temp}%
+ \ev@ltarget}
+\def\triline#1{\hbox to\jfttriwd{#1}}
+
+% define a variable width triangle
+\def\defvartriangle{\jft@getpars\d@fvartriangle}
+\def\d@fvartriangle#1#2(#3){%
+ \edef#1{\noexpand\bgroup
+ \edef\noexpand\@upleg{#3}%
+ \edef\noexpand\m@kelevelpars{\jft@pars}%
+ \noexpand\jft@getpars\noexpand\dr@wvartriangle}}
+\def\dr@wvartriangle#1{\jftpsset{\m@kelevelpars}
+ \jftpsset{\jft@pars}
+ \setbox0=\hbox{{\jft@testnode #1}}%
+ \pst@dima=\jft@xpos \pst@dimb=\jft@ypos % save old
+ \advance\jft@xpos by -\jft@triratio\wd0
+ \pst@dimc=\jft@xpos
+ \advance\pst@dimc by \wd0
+ \pssetylength\pst@dimd{\@upleg}
+ \pst@dimd=\jft@scaleby\pst@dimd
+ \advance\jft@ypos by -\pst@dimd
+ \pspolygon(\jft@xpos,\jft@ypos)(\pst@dimc,\jft@ypos)(\pst@dima,\pst@dimb)
+ \ifdim\pst@dimc>\m@xr \global\m@xr=\pst@dimc \fi
+ \ifdim\jft@xpos<\m@xl \global\m@xl=\jft@xpos \fi
+ \advance\jft@xpos by .5\wd0
+ \d@@fnode \setn@de \egroup}
+
+% disposition of the {stuff} associated with a node
+\def\d@fnode#1#2#3\cr{%
+ \if@rootnode \def\@startnode{#1}\@rootnodefalse\fi
+ \def#1{%
+ \setbox0=\hbox{{\jft@testnode #2}}%
+ \d@@fnode
+ \def\temp{#1}\ifx\temp\@startnode
+ \xdef\adj@stht{-\the\jft@ypos}\fi
+ \setn@de #3}}
+\def\d@@fnode{%
+ \ifn@degaps \else \pssetylength\pst@dimg{\n@detopgap}
+ \advance\jft@ypos by -\pst@dimg \fi
+ {\advance\jft@xpos by-.5\wd0
+ \ifdim\jft@xpos<\m@xl \global\m@xl=\jft@xpos \fi
+ \advance\jft@xpos by\wd0
+ \ifdim\jft@xpos>\m@xr \global\m@xr=\jft@xpos \fi}%
+ \advance\jft@ypos by -\ht0}
+\def\setn@de{%
+ \pst@dima=-\dp0
+ \rput[B](\jft@xpos,\jft@ypos){\copy0}
+ \advance\jft@ypos by\pst@dima
+ \ifdim\jft@ypos<\m@xb \global\m@xb=\jft@ypos \fi
+ \ifn@degaps \else \pssetlength\pst@dimg{\n@debotgap}
+ \advance\jft@ypos by -\pst@dimg \fi \ignorespaces}
+
+% look for \omit and take appropriate action
+\newif\ifn@degaps
+\def\jft@testnode{\futurelet\temp\jft@testn@de}
+\def\jft@testn@de{\ifx\temp\omit
+ \global\n@degapstrue \let\next=\@gobble
+ \else \global\n@degapsfalse
+ \edef\next{\the\jfteverynode}\fi \next}
+
+\newif\if@rootnode
+\def\jftree{\jft@getpars\jft@tree}
+\def\jft@tree{\setbox\jft@treebox=\hbox\bgroup \let\!=\d@fnode
+ \let\@startnode=\@empty
+ \jftpsset{\jft@pars}
+ \jft@xpos=0pt \jft@ypos=0pt \m@xl=0pt \m@xr=0pt \m@xb=0pt
+ \@rootnodetrue
+ \ignorespaces}
+\def\endjftree{\ifx\@startnode\@empty
+ \errmessage{JFTree Error: Root node definition is missing}\fi
+ \@startnode\egroup
+ \dp\jft@treebox=-\m@xb
+ \leavevmode\kern-\m@xl\raise\adj@stht\box\jft@treebox\kern\m@xr}
+
+\let\defnode=\d@fnode
+
+%% set defaults
+\newpsstyle{jftreedefault}{arrows=c-c,linewidth=.6pt,scaleby=1,
+ nodetopgap=3pt,nodebotgap=3pt,triratio=.5,everynode=\strut}
+\psset{style=jftreedefault}
+%% provide a minimal complement of branches and triangles
+\defbranch\medleft(1)(1)
+\defbranch\medright(1)(-1)
+\defbranch\medvert(1)(1/0)
+\deftriangle\medtri(1)(1)(-1)
+\defvartriangle\medvar(1)
+
+\catcode`\@=\TheAtCode\relax
+\endinput
+