summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/tree-dvips
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-03-17 23:48:17 +0000
committerKarl Berry <karl@freefriends.org>2011-03-17 23:48:17 +0000
commit569f3ceae0a1a258e89aca93afbeada0f9129831 (patch)
treea13b80740433137426be2670e60d123af5f79296 /Master/texmf-dist/tex/latex/tree-dvips
parent3bf95a44b19b38cd429bb35ec50c1a68fef77122 (diff)
tree-dvips reinstated per author license declaration
git-svn-id: svn://tug.org/texlive/trunk@21751 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/tree-dvips')
-rw-r--r--Master/texmf-dist/tex/latex/tree-dvips/lingmacros.sty312
-rw-r--r--Master/texmf-dist/tex/latex/tree-dvips/tree-dvips.sty271
2 files changed, 583 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/tree-dvips/lingmacros.sty b/Master/texmf-dist/tex/latex/tree-dvips/lingmacros.sty
new file mode 100644
index 00000000000..829effe52cc
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/tree-dvips/lingmacros.sty
@@ -0,0 +1,312 @@
+% Lingmacros
+% include
+% \enumsentence, \eenumsentence, \ex
+% \smalltree
+% \shortex, \shortexnt (\shortexdt no longer needed)
+% \clap, \ollap, \orlap, \oclap on analogy with \rlap and \llap
+% \outerfs
+
+% this file created 1/23/89 by Emma Pease, CSLI
+% modified 4/1/91 by Emma Pease
+% some comments added 8/25/94 by Emma Pease
+
+%Note (for those who use jbmacros):
+% (a) the enumsentence macro is very similar to the \example command
+% in jbmacros; however, it does not have the annoying habit of leaving
+% the example number on one page and the example on the next (some
+% jbmacros don't have this problem). The eenumsentence macro is very
+% similar to the \examples macro.
+% (b) \ex may be different
+
+% the enumsentence macro.
+%
+% \enumsentence{This is an example}
+% produces
+% (1) This is an example
+% while
+% \enumsentence[(a)]{This is another example}
+% produces
+% (a) This is another example
+%
+% A related macros is
+% \eenumsentence{\item[a.] A third example
+% \item[b.] A fourth example}
+% which produces
+% (2) a. A third example
+% b. A fourth example
+%
+% other macro is \ex{1} which produces the number of the following
+% enumsentence (\ex{0} produces number of preceeding enumsentence and
+% so on.)
+%
+% The standard \label command also works within \enumsentence and
+% \eenumsentence.
+%
+% the \enumsentence counter.
+\newcounter{enums}
+
+% Use the command
+%
+% \@addtoreset{enums}{chapter}
+%
+% if you wish it to automatically reset counting at the start of each chapter.
+% Since this is a \@ command you will need to surround it by
+% \makeatletter ... \makeatother
+% if it is in your document proper instead of a style file
+% do not use these commands if the \@addtoreset is in a style file or
+% things will break.
+
+
+% \widelabel is defined for use when the width of the enumsentence or
+% eenumsentence number is wider than 20pt (default labelwidth). As a
+% rule of thumb if your enumerated sentences are only 1 or 2 digit
+% you don't need to worry. At 3 digits, set \widelabel to 2.78pt at 4
+% digits set to 7.78pt.
+
+\newdimen\widelabel
+\widelabel=0pt
+
+
+\def\enumsentence{\@ifnextchar[{\@enumsentence}% %]
+{\refstepcounter{enums}\@enumsentence[(\theenums)]}}
+
+\long\def\@enumsentence[#1]#2{\begin{list}{}{%
+\advance\leftmargin by\widelabel \advance\labelwidth by \widelabel}
+\item[#1] #2
+\end{list}}
+
+% The \ex definition
+\newcounter{tempcnt}
+
+\newcommand{\ex}[1]{\setcounter{tempcnt}{\value{enums}}%
+\addtocounter{tempcnt}{#1}%
+\arabic{tempcnt}}
+
+% modified \@item command \unhbox\@tempboxa replaces \makelabel{#1}
+% Used to get \eenumsentence to work correctly
+\def\@item[#1]{\if@noparitem \@donoparitem
+ \else \if@inlabel \indent \par \fi
+ \ifhmode \unskip\unskip \par \fi
+ \if@newlist \if@nobreak \@nbitem \else
+ \addpenalty\@beginparpenalty
+ \addvspace\@topsep \addvspace{-\parskip}\fi
+ \else \addpenalty\@itempenalty \addvspace\itemsep
+ \fi
+ \global\@inlabeltrue
+\fi
+\everypar{\global\@minipagefalse\global\@newlistfalse
+ \if@inlabel\global\@inlabelfalse \hskip -\parindent \box\@labels
+ \penalty\z@ \fi
+ \everypar{}}\global\@nobreakfalse
+\if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}\fi \fi
+\setbox\@tempboxa\hbox{\makelabel{#1}}%
+\global\setbox\@labels
+ \hbox{\unhbox\@labels \hskip \itemindent
+ \hskip -\labelwidth \hskip -\labelsep
+ \ifdim \wd\@tempboxa >\labelwidth
+ \box\@tempboxa
+ \else \hbox to\labelwidth {\unhbox\@tempboxa}\fi
+ \hskip \labelsep}\ignorespaces}
+
+% for enumerated enumsentences. Internal enumeration is alpha if not
+% otherwise defined.
+
+% counter for items within \eenumsentence. (might use enumi instead?)
+\newcounter{enumsi}
+
+% \eenumsentence{\item[a.] A third \label{bar}example \toplabel{foo}
+% \item[b.] A fourth \label{baz}example}
+% Testing references \ref{foo}, \ref{bar}, and \ref{baz}.
+% which produces
+% (3) a. A third example
+% b. A fourth example
+% Testing references 3, 3a, and 3b.
+
+% To ensure that labels in \eenumsentence come out right.
+%
+\def\theenumsi{\theenums\alph{enumsi}}
+\newdimen\eeindent
+\eeindent=15pt
+% changes \leftmargin increased by \eeindent
+% \labelwidth increased by \eeindent
+% .. .. .leftmargin.. .. .. .. ..
+% oldlabelwidth eeindent labelsep actual entry
+% 20pt 15pt 5pt
+% (enumlabel) eelabel
+% eelabel
+
+\def\@mklab#1{\hfil#1}
+\def\enummklab#1{\hfil(\eelabel)\hbox to \eeindent{\hfil#1}}
+\def\enummakelabel#1{\enummklab{#1}\global\let\makelabel=\@mklab}
+\def\toplabel#1{{\edef\@currentlabel{\p@enums\theenums}\label{#1}}}
+
+\def\eenumsentence{\@ifnextchar[{\@eenumsentence}% %]
+{\refstepcounter{enums}\@eenumsentence[\theenums]}}
+
+\long\def\@eenumsentence[#1]#2{\def\eelabel{#1}\let\holdlabel\makelabel%
+\begin{list}{\alph{enumsi}.}{\usecounter{enumsi}%
+\advance\leftmargin by \eeindent \advance\leftmargin by \widelabel%
+\advance\labelwidth by \eeindent \advance\labelwidth by \widelabel%
+\let\makelabel=\enummakelabel}
+#2
+\end{list}\let\makelabel\holdlabel}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% smalltree
+% use
+% \smalltree{& &a\\
+% &b& &c\\
+% d& &e& &f}
+% produces
+% a
+% b c
+% d e f
+
+
+\long\def\smalltree#1{\leavevmode{\def\\{\cr\noalign{\vskip12pt}}%
+\def\mc##1##2{\multispan{##1}{\hfil##2\hfil}}%
+\tabskip=1em%
+\hbox{\vtop{\halign{&\hfil##\hfil\cr
+#1\crcr}}}}}
+
+% modsmalltree
+% use
+% \modsmalltree{3}{&&a\\ &b&&c\\ d&&e&&f}
+% and produces the same output
+% \mc{n}{item} within either will produce item centered across n
+% number of columns
+% \modsmalltree[arraystretch]{num of cols}{argument}
+%
+\def\modsmalltree{\@ifnextchar[{\@modsmalltree}{\@modsmalltree[2]}}
+
+\long\def\@modsmalltree[#1]#2#3{{\def\mc##1##2{%
+\multicolumn{##1}{c}{\def\arraystretch{1}##2}}%
+\def\arraystretch{#1}%
+\def\ns{\def\arraystretch{1}}%
+\setbox0=\hbox{\begin{tabular}[t]{@{}*{#2}{c}@{}}
+#3
+\end{tabular}}%
+\dimen0=\ht0
+\advance\dimen0 by -\arraystretch \ht\strutbox
+\advance\dimen0 by \ht\strutbox
+\ht0=\dimen0
+\dimen0=\dp0
+\advance\dimen0 by -\arraystretch \dp\strutbox
+\advance\dimen0 by \dp\strutbox
+\dp0=\dimen0
+\leavevmode\box0}}
+
+% center lap creates a box of 0 width centered on the point
+\def\clap#1{\hbox to 0pt{\hss#1\hss}}
+%The first argument in both of these commands is the distance above the
+%baseline desired. The second is what is the actual text.
+% over right lap
+\def\orlap#1#2{\vbox to0pt{\vss\hbox to 0pt{#2\hss}\hbox{\vrule height#1
+width0pt depth0pt}}}
+% over left lap
+\def\ollap#1#2{\vbox to0pt{\vss\hbox to 0pt{\hss#2}\hbox{\vrule height#1
+width0pt depth0pt}}}
+% over center lap
+\def\oclap#1#2{\vbox to0pt{\vss\hbox to 0pt{\hss#2\hss}\hbox{\vrule height#1
+width0pt depth0pt}}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% need to be modified?
+
+% Format
+% \shortex{4}{a & b & c & d}
+% {z & y & x & w}
+% {mnop}
+% produces
+% a b c d
+% z y x w
+% mnop
+%
+% \shortexdt takes two gloss lines
+% \shortexnt takes no gloss lines
+
+\def\shortex#1#2#3#4{\begin{tabular}[t]{@{}*{#1}{l@{\ }}}
+#2\\ #3\\ \multicolumn{#1}{@{}l@{}}{\parbox{\linewidth}{#4}}
+\end{tabular}}
+
+%\def\shortexdt#1#2#3#4#5{\begin{tabular}[t]{@{}*{#1}{l@{\ }}}
+%#2\\ #3\\ \multicolumn{#1}{@{}l@{}}{#4}\\
+%\multicolumn{#1}{@{}l@{}}{#5}
+%\end{tabular}}
+
+\def\shortexnt#1#2#3{\begin{tabular}[t]{@{}*{#1}{l@{\ }}}
+#2\\ #3
+\end{tabular}}
+
+%%%%%%%%%
+% Long-example macros
+%
+% \longex{4}{2}
+% {a & b & c & d}{e & f}
+% {z & y & x & w}{v & u}
+% {mnopqrs}
+% produces
+% a b c d
+% z y x w
+% e f
+% v u
+% mnopqrs
+%
+% \longexdt takes two translation lines
+% \longexnt takes no translation lines
+% \longex can also handle multiple translations, as can \shortex above.
+
+\def\longex#1#2#3#4#5#6#7{\begin{tabular}[t]{@{}l}
+ \begin{tabular}[t]{@{}*{#1}{l@{\ \ }}}
+ #3\\ #5 \end{tabular}\vspace{.5ex}\\
+ \begin{tabular}[t]{@{}*{#2}{l@{\ \ }}}
+ #4\\ #6\\[.5ex] \multicolumn{#2}{@{}l@{}}{\begin{tabular}[t]{@{}l@{}}
+ #7 \end{tabular}} \end{tabular} \end{tabular}}
+
+\def\longexdt#1#2#3#4#5#6#7#8{\begin{tabular}[t]{@{}l}
+ \begin{tabular}[t]{@{}*{#1}{l@{\ \ }}}
+ #3\\ #5 \end{tabular}\vspace{.5ex}\\
+ \begin{tabular}[t]{@{}*{#2}{l@{\ \ }}}
+ #4\\ #6\\[.5ex] \multicolumn{#2}{@{}l@{}}{#7}\\
+ \multicolumn{#2}{@{}l@{}}{#8}
+ \end{tabular} \end{tabular}}
+
+\def\longexnt#1#2#3#4#5#6{\begin{tabular}[t]{@{}l}
+ \begin{tabular}[t]{@{}*{#1}{l@{\ \ }}}
+ #3\\ #5 \end{tabular}\vspace{.5ex}\\
+ \begin{tabular}[t]{@{}*{#2}{l@{\ \ }}}
+ #4\\ #6 \end{tabular} \end{tabular}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% need to create equivalent of AVM structures.
+
+% Structure is
+% \outerfs{alpha & beta\\ gamma & delta}
+% produces
+% __ __
+% | alpha beta |
+% | gamma delta |
+% -- --
+%
+% \outerfs can be nested.
+% inside of enumsentence use with \evnup[2pt]{\outerfs{. . .}}
+% to ensure that top of fs structure lines up with the number
+%
+% Note that you can use \\[1ex] to increase the space between
+% individual lines
+
+\def\outerfs#1{$\left[\begin{tabular}{ll}#1\end{tabular}\right]$}
+
+% \evnup is used to line up the enumsentence number and an entry along
+% the top. It can take an argument to improve lining up.
+\def\evnup{\@ifnextchar[{\@evnup}{\@evnup[0pt]}}
+
+\def\@evnup[#1]#2{\setbox1=\hbox{#2}%
+\dimen1=\ht1 \advance\dimen1 by -.5\baselineskip%
+\advance\dimen1 by -#1%
+\leavevmode\lower\dimen1\box1}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% End of main lingmacros
+%
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}
+
+