diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/tree-dvips/tree-dvips.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/tree-dvips/tree-dvips.sty | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/tree-dvips/tree-dvips.sty b/Master/texmf-dist/tex/latex/tree-dvips/tree-dvips.sty new file mode 100644 index 00000000000..31218352a85 --- /dev/null +++ b/Master/texmf-dist/tex/latex/tree-dvips/tree-dvips.sty @@ -0,0 +1,271 @@ +% how to run. +% \input tree.sty or \documentstyle[tree]{..} +% run through latex as you normally do +% remember to send it to a postscript printer + +% Written by Emma Pease +% Modified by Avery Andrews May 1992 +% Modifications suggested by Gintautas Grigelionis +% (gintas@theophys.kth.se) added May 1995 +% arrows fixed on anodeconnect and aanodeconnect added May 1995 by Emma + +% to do, fix barnodeconnect arrows +% clean up code + +%% version .91 - May 16, 1995 +\typeout{tree-dvips version .91 of May 16, 1995} + +% This ensures that the header file for postscript is inserted. Note +% that extracting pages with dvips will keep this header file but that +% extracting with dviselect will not unless the absolute first page is +% included. +\special{header=tree-dvips91.pro} + + +% The \pscmd command insures that all things in the postscript are +% properly bracketed. Also included are the current parameters for +% nodemargin, width of lines, dashlength, arrow width, length, and inset. + +\def\pscmd#1{\special{ps:@beginspec% +/nodemargin \@int{\the\nodemargin}\space pt def % +\@int{\the\treelinewidth}\space pt setlinewidth % +\ifdim\dashlength=0pt [] 0 setdash% +/arrowwidth \@int{\the\arrowwidth}\space pt def % +/arrowlength \@int{\the\arrowlength}\space pt def % +/arrowinset \@int{\the\arrowinset}\space pt def % +\else [\@int{\the\dashlength}\space pt] 0 setdash \fi\space #1 % +@endspec}} + +% \@int ensures that the numbers are passed down to the printer +% correctly. +{\catcode`p=12 \catcode`t=12 \gdef\wnum#1pt{#1}} +\def\@int#1{\expandafter\wnum#1} + + +% PARAMETERS IN TREE MODE + +% nodemargin is the extra margin around the hbox enclosing the node. +% treelinewidth is the width of the lines +% dashlength is the length of the dashes + +\newdimen\nodemargin % +\nodemargin=2pt + +\newdimen\treelinewidth +\treelinewidth=.3pt + +\newdimen\dashlength +\dashlength=0pt + +% * _ +% * +% * * arrowwidth +% * +% * _ +% | | arrowlength +% | | arrowinset + +% arrowwidth + +\newdimen\arrowwidth +\arrowwidth 3pt + +\newdimen\arrowlength +\arrowlength 4pt + +\newdimen\arrowinset +\arrowinset 1pt + +% Some commands to manipulate parameters + +\def\thinline{\treelinewidth=.3pt} + +% \makedash{dimen} makes dashes of dimen length if dimen = 0pt then +% solid line +\def\makedash#1{\dashlength=#1} + +\def\arrowhead#1#2#3{\arrowwidth#1\arrowlength#2\arrowinset#3} + + +% NODE COMMANDS + +% A node defines a region of the page with a height, depth, width, and +% location of the lower left hand corner + +\def\node#1#2{\leavevmode + \setbox1=\hbox{#2}\pscmd{/#1 \@int{\the\wd1} \space pt + \@int{\the\ht1} \space pt + \@int{\the\dp1} \space pt + node}\box1\relax} + + +% nodepoint is a specialized node with 0pt width, height, and depth +% Unlike \node is can be displaced. +% \nodepoint{nodename}[horizontal displacement][vertical displacement] +% default is current point +\def\nodepoint#1{\@ifnextchar [{\@nodepoint{#1}}{\@nodepoint{#1}[0pt][0pt]}} + +\def\@nodepoint#1[#2][#3]{{\@tempdima=#2 \@tempdimb=#3% +\pscmd{/nodemargin 0 def % +/#1 \@int{\the\@tempdima}\space pt \@int{\the\@tempdimb}\space pt % +rmoveto 0 0 0 node}}} + + + + +\newtoks\pos@t \pos@t={top} +\newtoks\pos@b \pos@b={bottom} +\newtoks\pos@l \pos@l={left} +\newtoks\pos@r \pos@r={right} +\newtoks\pos@tl \pos@tl={topleft} +\newtoks\pos@tr \pos@tr={topright} +\newtoks\pos@bl \pos@bl={bottomleft} +\newtoks\pos@br \pos@br={bottomright} + + +% COMMANDS FOR CONNECTING NODES + +% nodeconnect commands +% \nodeconnect +% \anodeconnect - arrow at toloc +% \aanodeconnect - arrow at both ends +% arguments are [fromloc]{fromnode}[toloc]{tonode} + +% \nodeconnect[fromloc]{fromnode}[toloc]{tonode} +\def\nodeconnect{\@ifnextchar [{\@nodeconnect}{\@nodeconnect[b]}} +\def\@nodeconnect[#1]#2{\@ifnextchar [{\@@nodeconnect[#1]{#2}}{\@@nodeconnect[#1]{#2}[t]}} + +\def\@@nodeconnect[#1]#2[#3]#4{\pscmd{% +/#2 getnode node\the\csname pos@#1\endcsname \space% +/#4 getnode node\the\csname pos@#3\endcsname\space nodeconnect}} + +% \delink[fromloc]{fromnode}[toloc]{tonode}{length} +% places a bar of length perpendicular to and halfway along the line +% connecting the two locations. +\def\delink{\@ifnextchar [{\@delink}{\@delink[b]}} +\def\@delink[#1]#2{\@ifnextchar [{\@@delink[#1]{#2}}{\@@delink[#1]{#2}[t]}} + +\def\@@delink[#1]#2[#3]#4#5{\@tempdima=#5% +\pscmd{/blong \@int{\the\@tempdima} \space pt def% +/#2 getnode node\the\csname pos@#1\endcsname \space% +/#4 getnode node\the\csname pos@#3\endcsname\space delink}} + + +% \anodeconnect[fromloc]{fromnode}[toloc]{tonode} +% The tonode has an arrow pointing to it +\def\anodeconnect{\@ifnextchar [{\@anodeconnect}{\@anodeconnect[b]}} +\def\@anodeconnect[#1]#2{\@ifnextchar [{\@@anodeconnect[#1]{#2}}{\@@anodeconnect[#1]{#2}[t]}} + +\def\@@anodeconnect[#1]#2[#3]#4{\pscmd{% +/#2 getnode node\the\csname pos@#1\endcsname \space% +/#4 getnode node\the\csname pos@#3\endcsname\space arrownodeconnect}} + +% \aanodeconnect[fromloc]{fromnode}[toloc]{tonode} +% double arrowed line +\def\aanodeconnect{\@ifnextchar [{\@aanodeconnect}{\@aanodeconnect[b]}} +\def\@aanodeconnect[#1]#2{\@ifnextchar [{\@@aanodeconnect[#1]{#2}}{\@@aanodeconnect[#1]{#2}[t]}} + +\def\@@aanodeconnect[#1]#2[#3]#4{\pscmd{% +/#2 getnode node\the\csname pos@#1\endcsname \space% +/#4 getnode node\the\csname pos@#3\endcsname\space doublearrownodeconnect}} + + +% nodecurve commands +% nodecurve... no arrow +% anodecurve.. arrow at to +% aanodecurve.. arrows at to and from +% arguments: +% \..[fromloc][fromang]{fromnode}[toloc][toang]{tonode}{fdepth}[tdepth] +% defaults +% fromloc [b] +% toloc [t] +% fromang 0 (in degrees) direction is calculated counterclockwise +% toang 0 (in degrees) direction is calculated counterclockwise +% tdepth same as fdepth + + +% nodecurve commands set value of \@arrow, then invoke \nodecurve@ + +\newcount\@arrow +\newdimen\@tempdimc + +\def\nodecurve{\@arrow=0\nodecurve@} +\def\anodecurve{\@arrow=1\nodecurve@} +\def\aanodecurve{\@arrow=2\nodecurve@} +\def\delinkcurve#1{\@tempdimc=#1% +\@arrow=3\nodecurve@} + +\def\nodecurve@{\@ifnextchar [{\@nodecurve@}{\@nodecurve@[b]}} + +\def\@nodecurve@[#1]{\@ifnextchar [{\a@nodecurve@[#1]}{\a@nodecurve@[#1][0]}} + +\def\a@nodecurve@[#1][#2]#3{\@ifnextchar [{\@a@nodecurve@[#1][#2]{#3}}% +{\@a@nodecurve@[#1][#2]{#3}[t]}} + +\def\@a@nodecurve@[#1][#2]#3[#4]{\@ifnextchar [{\a@a@nodecurve@[#1][#2]#3[#4]}% +{\a@a@nodecurve@[#1][#2]#3[#4][0]}} + +\def\a@a@nodecurve@[#1][#2]#3[#4][#5]#6#7{\@ifnextchar [% +{\@a@a@nodecurve@[#1][#2]{#3}[#4][#5]{#6}{#7}}% +{\@a@a@nodecurve@[#1][#2]{#3}[#4][#5]{#6}{#7}[#7]}} + +\def\@a@a@nodecurve@[#1][#2]#3[#4][#5]#6#7[#8]{\@tempdima=#7% +\@tempdimb=#8% +\@tempdimc=10pt% +\pscmd{/depth \@int{\the\@tempdimb} \space pt def % + /toangle \space #5 \space def % + /fromangle \space #2 \space def % + /#6 \the\csname pos@#4\endcsname cur\space % + /depth \@int{\the\@tempdima} \space pt def % + /#3 \the\csname pos@#1\endcsname cur\space % + \ifnum\@arrow=0 nodecurve \else % select & invoke PS command + \ifnum\@arrow=1 arrownodecurve \else + \ifnum\@arrow=2 arrow2nodecurve \else + /blong \@int{\the\@tempdimc} \space pt def + delinkcurve + \fi\fi\fi}} + + + +% above is well tested below is not +\newif\iftransparent + +\def\nodebox#1{\pscmd{/#1 nodebox}} +\def\nodeoval#1{\pscmd{/#1 nodeoval}} +\def\nodetriangle#1#2{\pscmd{/#1 /#2 nodetriangle}} + +% \nodecircle[depth]{nodename} + +\def\nodecircle{\@ifnextchar [ {\@nodecircle}{\@nodecircle[0pt]}} + +\def\@nodecircle[#1]#2{\@tempdima=#1% +\iftransparent +\pscmd{\@int{\the\@tempdima}\space pt /#2 nodecircletrans} +\else +\pscmd{\@int{\the\@tempdima}\space pt /#2 nodecircle}\fi} + + +% \barnodeconnect[depth]{fromnode}{tonode} +\def\barnodeconnect{\@ifnextchar[ {\@barnodeconnect}{\@barnodeconnect[5pt]}} + +\def\@barnodeconnect[#1]#2#3{\@tempdima=#1 \ifdim\@tempdima<0pt +\pscmd{\@int{\the\@tempdima}\space pt % +/#2 getnode nodebottom /#3 getnode nodebottom barnodeconnect} +\else +\pscmd{\@int{\the\@tempdima}\space pt % +/#2 getnode nodetop /#3 getnode nodetop barnodeconnect} +\fi} + +\def\abarnodeconnect{\@ifnextchar[ {\@abarnodeconnect}{\@abarnodeconnect[5pt]}} + +\def\@abarnodeconnect[#1]#2#3{\@tempdima=#1 \ifdim\@tempdima<0pt +\pscmd{\@int{\the\@tempdima}\space pt % +/#2 getnode nodebottom /#3 getnode nodebottom arrowbarnodeconnect} +% above replaces the line below. +% /#2 getnode nodebottom /#3 getnode nodebottom abarnodeconnect} +\else +\pscmd{\@int{\the\@tempdima}\space pt % +/#2 getnode nodetop /#3 getnode nodetop arrowbarnodeconnect} +\fi} + + |