summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/pstricks/code/pst-node.doc
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/generic/pstricks/code/pst-node.doc')
-rw-r--r--Master/texmf-dist/doc/generic/pstricks/code/pst-node.doc1066
1 files changed, 1066 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/pstricks/code/pst-node.doc b/Master/texmf-dist/doc/generic/pstricks/code/pst-node.doc
new file mode 100644
index 00000000000..8f725482dd3
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/pstricks/code/pst-node.doc
@@ -0,0 +1,1066 @@
+%% BEGIN: pst-node.doc
+\def\fileversion{0.93a}
+\def\filedate{93/03/12}
+%%
+%% pst-node.tex: Node macros for PSTricks.
+%% See the PSTricks read-me file and the User's Guide for documentation.
+%%
+%% COPYRIGHT 1993, by Timothy Van Zandt, tvz@Princeton.EDU
+%%
+%% Copying of part or all of any file in the pstricks.tex package
+%% is allowed under the following conditions only:
+%% (1) You may freely distribute unchanged copies of the files. Please
+%% include the documentation when you do so.
+%% (2) You may modify a renamed copy of any file, but only for personal
+%% use or use within an organization.
+%% (3) You may copy fragments from the files, for personal use or for use
+%% in a macro package for distribution, as long as credit is given
+%% where credit is due.
+%%
+%% You are NOT ALLOWED to take money for the distribution or use of
+%% these files or modified versions or fragments thereof, except for
+%% a nominal charge for copying etc.
+%%
+% **************************************************************************
+% This file contains the documented code for pst-node.tex and pst-node.pro.
+% See the PSTricks read-me file for information on how to use this file.
+% **************************************************************************
+%
+% \EndDocPreamble
+%
+% \CheckSum{5874}
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \part{pst-node.doc}
+%
+% Check whether file has been loaded already.
+% \begin{macrocode}
+\csname PSTnodesLoaded\endcsname
+\let\PSTnodesLoaded\endinput
+% \end{macrocode}
+%
+% Load "pstricks.tex" if necessary:
+% \begin{macrocode}
+\ifx\PSTricksLoaded\endinput\else
+ \def\next{\input pstricks.tex}\expandafter\next
+\fi
+% \end{macrocode}
+%
+% Take care of the catcode of "@":
+% \begin{macrocode}
+\edef\TheAtCode{\the\catcode`\@}
+\catcode`\@=11
+% \end{macrocode}
+%
+%
+% \section{Node header}
+%
+% Nodes use the dictionary "tx@NodeDict", which is always put on the stack
+% after "tx@Dict". "tx@NodeDict" should avoid using the same procedure names
+% as are found in "tx@Dict", especially those that do not use scratch
+% variables and hence can be used without problem when "tx@NodeDict" is on top
+% of the stack. When invoking a "tx@Dict" procedure that does use scratch
+% variables, "tx@Dict" should be put on top.
+%
+% \begin{macro}{\pst@nodedict}
+% \begin{macrocode}
+\pst@ATH<\% Version \fileversion, \filedate.>
+\pst@ATH<\% For use with \pstdriver.>
+\pst@ATH</tx@NodeDict 200 dict def tx@NodeDict begin>
+\ifx\pst@useheader\iftrue
+ \pstheader{pst-node.pro}
+ \def\pst@nodedict{tx@NodeDict begin }
+\else
+ \def\pst@nodedict{%
+ /tx@NodeDict where
+ { pop }
+ { userdict begin /tx@NodeDict 200 dict def end }
+ ifelse
+ tx@NodeDict begin }
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Nodes}
+%
+%
+% \begin{macro}{\pst@getnode}
+% \begin{macrocode}
+% A node is a dictionary. To reduce the chance of errors, we check that the
+% name begins with a letter and does not contain any spaces.
+% \begin{macrocode}
+\def\pst@getnode#1#2{%
+ \pst@expandafter\pst@@getnode{#1} * \@nil{#1}#2}
+\def\pst@@getnode#1#2 #3\@nil#4#5{%
+ \ifcat#1a\relax
+ \def#5{/TheNode#1#2 }%
+ \else
+ \def#5{/BadNode }%
+ \@pstrickserr{Bad node name: `#4'}\@ehpa
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% Before a node is defined, the coordinate system is scaled to PSTricks'
+% standard coordinate system, with the origin at \TeX's current point. The
+% following objects should then be added to the node dictionary:
+% \begin{description}
+% \item[NodeMtrx] The current matrix.
+% \item[X] The x-coordinate of the center.
+% \item[Y] The y-coordinate of the center.
+% \item[NodePos] A procedure that, given the values of "Sin", "Cos", and
+% "Nodesep", gives the relative position of the point that is distance
+% "Nodesep"from the edge of the node, in the direction "(Cos,Sin)" from the
+% center. ``Relative'' means relative to "(X,Y)" and for the coordinate system
+% in effect when the node was defined.
+% \end{description}
+%
+% \begin{macro}{\tx@NewNode,\pst@newnode}
+% The node's dictionary size should be large enough for the 7 key's mentioned
+% above, plus any keys the node needs for "NodePos", plus a few more to avoid
+% mistakes.
+%
+% Syntax for "NewNode"
+% \begin{LVerbatim}
+% {<beforenode_proc>} /<node_name> <dict_size> {<node_proc>} NewNode"
+% \end{LVerbatim}
+% "<beforenode_proc>" is stuff to be done with "tx@Dict". It might leave
+% things on the stack for use by "<node_proc>".
+%
+% Syntax for "\pst@newnode":
+% \begin{LVerbatim}
+% \pst@newnode{<node_name>}{<dict_size>}{<beforenode_proc>}{<node_proc>}
+% \end{LVerbatim}
+% \begin{macrocode}
+\pst@def{NewNode}<%
+ gsave
+ /next ED
+ dict
+ dup 3 -1 roll ED
+ begin
+ tx@Dict begin
+ \tx@STV
+ CP T
+ exec
+ end
+ /NodeMtrx CM def
+ next
+ end
+ grestore>
+\def\pst@newnode#1#2#3#4{%
+ \leavevmode
+ \pst@getnode{#1}\pst@thenode
+ \pst@Verb{%
+ \pst@nodedict
+ { #3 } \pst@thenode #2 { #4 } \tx@NewNode
+ end}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tx@InitPnode,\pnode}
+% \begin{macrocode}
+\pst@def{InitPnode}<%
+ /Y ED /X ED
+ /NodePos { Nodesep Cos mul Nodesep Sin mul } def>
+\def\pnode{\@ifnextchar({\pnode@}{\pnode@(0,0)}}
+\def\pnode@(#1)#2{%
+ \pst@@getcoor{#1}%
+ \pst@newnode{#2}{10}{\pst@coor}{\tx@InitPnode}%
+ \ignorespaces}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tx@InitCnode,\cnode}
+% \begin{macrocode}
+\pst@def{InitCnode}<%
+ /r ED /Y ED /X ED
+ /NodePos { Nodesep r add dup Cos mul exch Sin mul } def>
+\def\cnode{\def\pst@par{}\pst@object{cnode}}
+\def\cnode@i{\@ifnextchar({\cnode@ii}{\cnode@ii(0,0)}}
+\def\cnode@ii(#1)#2#3{%
+ \begingroup
+ \use@par
+ \pscircle@do(#1){#2}%
+ \pst@@getcoor{#1}%
+ \pssetlength\pst@dimc{#2}%
+ \pst@newnode{#3}{11}{%
+ \pst@coor
+ \pst@number\pst@dimc
+ \pst@number\pslinewidth
+ \psk@dimen .5 sub mul sub}%
+ {\tx@InitCnode}%
+ \endgroup
+ \ignorespaces}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\cnodeput{\def\pst@par{}\pst@object{cnodeput}}
+\def\cnodeput@i{%
+ \begingroup
+ \pst@killglue
+ \leavevmode
+ \pst@getrputrot
+ \cnodeput@ii}
+\def\cnodeput@ii(#1)#2{%
+ \pst@makebox{\cput@iii{\cnodeput@iii{#2}}(#1)}}
+\def\cnodeput@iii#1{%
+ \pst@newnode{#1}{11}{\pscirclebox@iv \pst@number\pslinewidth add}%
+ {\tx@InitCnode}}
+% \end{macrocode}
+%
+% \begin{macro}{\circlenode}
+% \begin{macrocode}
+\def\circlenode{\def\pst@par{}\pst@object{circlenode}}
+\def\circlenode@i#1{\pst@makebox{\pscirclebox@ii{\cnodeput@iii{#1}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\pst@def{GetRnodePos}<%
+ Cos 0 gt
+ { /dx r Nodesep add def }
+ { /dx l Nodesep sub def }
+ ifelse
+ Sin 0 gt
+ { /dy u Nodesep add def }
+ { /dy d Nodesep sub def }
+ ifelse
+ dx Sin mul abs dy Cos mul abs gt
+ { dy Cos mul Sin div dy }
+ { dx dup Sin mul Cos \tx@Div }
+ ifelse>
+% \end{macrocode}
+%
+% \begin{macro}{InitRnode}
+% Syntax:
+% \begin{Ex}
+% <yref ht dp bool xref wd> InitRnode
+% \end{Ex}
+% Additional keys: "r", "l", "d", "u", "dx" and "dy".
+% \begin{macrocode}
+\pst@def{InitRnode}<%
+ /r ED r mul neg /l ED /r r l add def
+ /X l neg def
+ { neg /d ED /u ED /Y 0 def }
+ { neg /Y ED
+ Y sub /u ED
+ u mul neg /d ED
+ /u u d add def
+ /Y Y d sub def }
+ ifelse
+ /NodePos { \tx@GetRnodePos } def>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rnode}
+% The ability to set the refpoint is an undocumented feature that may be
+% omitted.
+% \begin{macrocode}
+\def\rnode{\begingroup\pst@getref\rnode@}
+\def\rnode@#1{\pst@makebox{\rnode@@{#1}}}
+\def\rnode@@#1{%
+ \ifx\refpoint@x\relax
+ \def\refpoint@y{.5}%
+ \def\refpoint@x{.5}%
+ \fi
+ \pst@newnode{#1}{16}{}{%
+ \ifx\refpoint@x\relax .5 \else \refpoint@y\space \fi
+ \pst@number{\ht\pst@hbox}%
+ \pst@number{\dp\pst@hbox}%
+ \ifx\refpoint@y\@empty true \else false \fi
+ \refpoint@x\space
+ \pst@number{\wd\pst@hbox}%
+ \tx@InitRnode}%
+ \box\pst@hbox
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{InitRNode}
+% Syntax:
+% \begin{Ex}
+% <ht dp wd xref yref> "InitRNode"
+% \end{Ex}
+% \begin{macrocode}
+\pst@def{InitRNode}<%
+ /Y ED /X ED /r ED /X r 2 div X add def /r r X sub def /l X neg def
+ Y add neg /d ED Y sub /u ED
+ /NodePos { \tx@GetRnodePos } def>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\Rnode}
+% \begin{macrocode}
+\def\Rnode{\@ifnextchar({\Rnode@}{\Rnode@(\RnodeRef)}}
+\def\Rnode@(#1)#2{\pst@makebox{\Rnode@@(#1){#2}}}
+\def\Rnode@@(#1)#2{%
+ \begingroup
+ \pst@@getcoor{#1}%
+ \pst@newnode{#2}{16}{%
+ \pst@number{\ht\pst@hbox}\pst@number{\dp\pst@hbox}%
+ \pst@number{\wd\pst@hbox}\pst@coor}{\tx@InitRNode}%
+ \box\pst@hbox
+ \endgroup}
+\def\RnodeRef{0,.7ex}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{GetOnodePos}
+% \begin{macrocode}
+\pst@def{GetOnodePos}<%
+ /ww w Nodesep add def /hh h Nodesep add def
+ Sin ww mul Cos hh mul \tx@Atan dup
+ cos ww mul exch sin hh mul>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ovalnode}
+% Additional keys: "w", "h", "ww", "hh".
+% \begin{macrocode}
+\def\ovalnode{\def\pst@par{}\pst@object{ovalnode}}
+\def\ovalnode@i#1{\pst@makebox{\psovalbox@ii{\ovalnode@ii{#1}}}}
+\def\ovalnode@ii#1{%
+ \pst@newnode{#1}{14}{}{%
+ /X \pst@number{\wd\pst@hbox}2 div def
+ /Y \pst@number\pst@dimg 2 div \pst@number{\dp\pst@hbox}sub def
+ /w \pst@number\pst@dima def
+ /h \pst@number\pst@dimb def
+ /NodePos { \tx@GetOnodePos } def}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Node connections: Preliminaries}
+%
+% \begin{macro}{\tx@GetCenter,\tx@GetAngle}
+% Syntax:
+% \begin{Ex}
+% - "GetCenter" <x y> \hskip 1em (Center coordinates)\\
+% - "GetAngle" <angle> \hskip 1em (Angle from A to B)
+% \end{Ex}
+% \begin{macrocode}
+\pst@def{GetCenter}<begin X Y NodeMtrx transform CM itransform end>
+\pst@def{GetAngle}<%
+ nodeA \tx@GetCenter
+ nodeB \tx@GetCenter
+ 3 -1 roll sub 3 1 roll sub neg \tx@Atan>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tx@GetEdge,\tx@GetPos}
+% Syntax:
+% \begin{Ex}
+% <offset angle nodesep node> "GetEdge" <x y>
+% \end{Ex}
+% "GetPos" defines "(x1,y1)" and "(x2,y2)" to be coordinates of position for
+% node A and B, taking into account "AngleA", "AngleB", "OffsetA", "OffsetB",
+% "NodesepA" and "NodesepB".
+% \begin{macrocode}
+\pst@def{GetEdge}<%
+ begin
+ /Nodesep ED
+ dup
+ 1 0 NodeMtrx dtransform CM idtransform exch atan sub
+ dup sin /Sin ED cos /Cos ED
+ NodePos Y add exch X add exch
+ NodeMtrx transform CM itransform
+ end % offset angle x y
+ 4 2 roll
+% Now add the offsets:
+ 1 index 0 eq
+ { pop pop }
+ { 2 copy 5 2 roll % x offset angle y offset angle
+ cos mul add
+ 4 1 roll
+ sin mul sub
+ exch }
+ ifelse>
+\pst@def{GetPos}<%
+ OffsetA AngleA NodesepA nodeA \tx@GetEdge /y1 ED /x1 ED
+ OffsetB AngleB NodesepB nodeB \tx@GetEdge /y2 ED /x2 ED>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\check@arrow#1#2{%
+ \check@@arrow#2-\@nil
+ \if@pst
+ \addto@par{arrows=#2}%
+ \def\next{#1}%
+ \else
+ \def\next{#1{#2}}%
+ \fi
+ \next}
+\def\check@@arrow#1-#2\@nil{%
+ \ifx\@nil#2\@nil\@pstfalse\else\@psttrue\fi}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\pst@def{InitNC}<%
+ /nodeB ED /nodeA ED
+ /NodesepB ED /NodesepA ED
+ /OffsetB ED /OffsetA ED
+ tx@NodeDict nodeA known tx@NodeDict nodeB known and dup
+ { /nodeA nodeA load def /nodeB nodeB load def } if>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\nc@object#1#2#3#4{%
+ \begin@OpenObj
+ \showpointsfalse
+ \pst@getnode{#1}\pst@tempa
+ \pst@getnode{#2}\pst@tempb
+ \gdef\lputpos@default{#3}%
+ \addto@pscode{%
+ \pst@nodedict
+ \psk@offsetA
+ \psk@offsetB neg
+ \psk@nodesepA
+ \psk@nodesepB
+ \pst@tempa
+ \pst@tempb
+ \tx@InitNC { #4 } if
+ end}%
+ \def\use@pscode{%
+ \pst@Verb{gsave \tx@STV newpath \pst@code\space grestore}%
+ \gdef\pst@code{}}%
+ \end@OpenObj}
+\def\lputpos@default{.5}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\pc@object#1{%
+ \@ifnextchar({\pc@@object#1}{\pst@getarrows{\pc@@object#1}}}
+\def\pc@@object#1(#2)(#3){%
+ \pnode(#2){@@A}\pnode(#3){@@B}%
+ #1{@@A}{@@B}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\psset@nodesepA#1{\pst@getlength{#1}\psk@nodesepA}
+\def\psset@nodesepB#1{\pst@getlength{#1}\psk@nodesepB}
+\def\psset@nodesep#1{%
+ \psset@nodesepA{#1}\let\psk@nodesepB\psk@nodesepA}
+\psset@nodesep{0}
+% \end{macrocode}
+%
+% \begin{macro}{\psset@offset,\psk@offsetA,\psk@offsetB}
+% \begin{macrocode}
+\def\psset@offsetA#1{\pst@getlength{#1}\psk@offsetA}
+\def\psset@offsetB#1{\pst@getlength{#1}\psk@offsetA}
+\def\psset@offset#1{%
+ \psset@offsetA{#1}\let\psk@offsetB\psk@offsetA}
+\psset@offset{0}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\psset@arm,\psk@armA,\psk@armB}
+% \begin{macrocode}
+\def\psset@armA#1{\pst@getlength{#1}\psk@armA}
+\def\psset@armB#1{\pst@getlength{#1}\psk@armB}
+\def\psset@arm#1{\psset@armA{#1}\let\psk@armB\psk@armA}
+\psset@arm{10pt}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\psset@angle,\psk@angleA,\psk@angleB}
+% \begin{macrocode}
+\def\psset@angleA#1{\pst@getangle{#1}\psk@angleA}
+\def\psset@angleB#1{\pst@getangle{#1}\psk@angleB}%
+\def\psset@angle#1{\pst@getangle{#1}\psk@angleA
+ \let\psk@angleB\psk@angleA}
+\psset@angle{0}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\psset@arcangle,\psk@arcangleA,\psk@arcangleB}
+% \begin{macrocode}
+\def\psset@arcangleA#1{\pst@getangle{#1}\psk@arcangleA}
+\def\psset@arcangleB#1{\pst@getangle{#1}\psk@arcangleB}%
+\def\psset@arcangle#1{\pst@getangle{#1}\psk@arcangleA
+ \let\psk@arcangleB\psk@arcangleA}
+\psset@arcangle{8}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\psset@ncurv,\psk@ncurvA,\psk@ncurvB}
+% \begin{macrocode}
+\def\psset@ncurvA#1{\pst@checknum{#1}\psk@ncurvA}
+\def\psset@ncurvB#1{\pst@checknum{#1}\psk@ncurvB}%
+\def\psset@ncurv#1{\psset@ncurvA{#1}\let\psk@ncurvB\psk@ncurvA}
+\psset@ncurv{.67}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Node connections: The real thing}
+%
+% \begin{macrocode}
+\pst@def{LineMP}<%
+ 4 copy
+ 1 t sub mul exch t mul add 3 1 roll
+ 1 t sub mul exch t mul add exch 6 2 roll
+ sub 3 1 roll sub \tx@Atan>
+% \end{macrocode}
+%
+% \begin{macro}{\tx@NCCoor,\tx@NCLine}
+% Syntax:
+% \begin{Ex}
+% <OffsetB NodesepB OffsetA NodesepA> NCLine
+% \end{Ex}
+% Leaves coordinates on stack rather than actually drawing line.
+% \begin{macrocode}
+\pst@def{NCCoor}<%
+ \tx@GetAngle
+ /AngleA ED /AngleB AngleA 180 add def
+ \tx@GetPos
+ /LPutVar [ x2 x1 y2 y1 ] cvx def
+ /LPutPos { LPutVar \tx@LineMP } def
+ x1 y1 x2 y2>
+\pst@def{NCLine}<%
+ \tx@NCCoor
+ tx@Dict begin
+ ArrowB
+ 4 2 roll
+ ArrowA
+ lineto
+ end>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\ncline{\def\pst@par{}\pst@object{ncline}}
+\def\ncline@i{\check@arrow{\ncline@ii}}
+\def\ncline@ii#1#2{\nc@object{#1}{#2}{.5}{\tx@NCLine}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\pcline{\def\pst@par{}\pst@object{pcline}}
+\def\pcline@i{\pc@object\ncline@ii}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\def\ncLine{\def\pst@par{}\pst@object{ncLine}}
+\def\ncLine@i{\check@arrow{\ncLine@ii}}
+\def\ncLine@ii#1#2{\nc@object{#1}{#2}{.5}%
+ {\tx@NCLine
+ /LPutVar [
+ nodeA \tx@GetCenter
+ nodeB \tx@GetCenter
+ 3 1 roll 4 1 roll
+ ] cvx def }}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\pst@def{BezierMidpoint}<%
+ /y3 ED /x3 ED
+ /y2 ED /x2 ED
+ /y1 ED /x1 ED
+ /y0 ED /x0 ED
+ /t ED
+ /cx x1 x0 sub 3 mul def
+ /cy y1 y0 sub 3 mul def
+ /bx x2 x1 sub 3 mul cx sub def
+ /by y2 y1 sub 3 mul cy sub def
+ /ax x3 x0 sub cx sub bx sub def
+ /ay y3 y0 sub cy sub by sub def
+ ax t 3 exp mul bx t t mul mul add cx t mul add x0 add
+ ay t 3 exp mul by t t mul mul add cy t mul add y0 add
+ 3 ay t t mul mul mul 2 by t mul mul add cy add
+ 3 ax t t mul mul mul 2 bx t mul mul add cx add
+ atan>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\pst@def{GetArms}<%
+ /x1a armA AngleA cos mul x1 add def
+ /y1a armA AngleA sin mul y1 add def
+ /x2a armB AngleB cos mul x2 add def
+ /y2a armB AngleB sin mul y2 add def>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\pst@def{NCCurve}<%
+ \tx@GetPos
+ x1 x2 sub y1 y2 sub \tx@Pyth
+ 2 div dup
+ 3 -1 roll mul /armA ED mul /armB ED
+ \tx@GetArms
+ x1a y1a x1 y1 tx@Dict begin ArrowA end
+ x2a y2a x2 y2 tx@Dict begin ArrowB end
+ curveto
+ /LPutVar [ x1 y1 x1a y1a x2a y2a x2 y2 ] cvx def
+ /LPutPos { t LPutVar \tx@BezierMidpoint } def>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\nccurve{\def\pst@par{}\pst@object{nccurve}}
+\def\nccurve@i{\check@arrow{\nccurve@ii}}
+\def\nccurve@ii#1#2{\nc@object{#1}{#2}{.5}{%
+ /AngleA \psk@angleA\space def /AngleB \psk@angleB\space def
+ \psk@ncurvB\space \psk@ncurvA\space
+ \tx@NCCurve}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\pccurve{\def\pst@par{}\pst@object{pccurve}}
+\def\pccurve@i{\pc@object\nccurve@ii}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\def\ncarc{\def\pst@par{}\pst@object{ncarc}}
+\def\ncarc@i{\check@arrow{\ncarc@ii}}
+\def\ncarc@ii#1#2{\nc@object{#1}{#2}{.5}{%
+ \tx@GetAngle dup
+ \psk@arcangleA\space add /AngleA ED
+ \psk@arcangleB\space sub 180 add /AngleB ED
+ \psk@ncurvB\space \psk@ncurvA\space
+ \tx@NCCurve}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\pcarc{\def\pst@par{}\pst@object{pcarc}}
+\def\pcarc@i{\pc@object\ncarc@ii}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\pst@def{AnglesMP}<%
+ LPutVar
+ t 3 gt
+ { /t t 3 sub def }
+ { t 2 gt
+ { /t t 2 sub def 10 -2 roll }
+ { t 1 gt
+ { /t t 1 sub def 10 -4 roll }
+ { 10 4 roll }
+ ifelse }
+ ifelse }
+ ifelse
+ 6 { pop } repeat
+ 3 -1 roll exch \tx@LineMP>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\pst@def{NCAngles}<%
+ \tx@GetPos
+ \tx@GetArms
+ /mtrx AngleA matrix rotate def
+ x1a y1a mtrx transform pop
+ x2a y2a mtrx transform exch pop
+ mtrx itransform
+ /y0 ED /x0 ED
+ mark
+ armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1a y1a armA 0 ne { x1 y1 } if
+ tx@Dict begin false \tx@Line end
+ /LPutVar [ x2 y2 x2a y2a x0 y0 x1a y1a x1 y1 ] cvx def
+ /LPutPos { \tx@AnglesMP } def>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\ncangles{\def\pst@par{}\pst@object{ncangles}}
+\def\ncangles@i{\check@arrow{\ncangles@ii}}
+\def\ncangles@ii#1#2{%
+ \nc@object{#1}{#2}{1.5}{\ncangles@iii \tx@NCAngles}}
+\def\ncangles@iii{%
+ tx@Dict begin
+ \ifdim\pslinearc>\z@
+ /r \pst@number\pslinearc def
+ /Lineto { \tx@Arcto } def
+ \else
+ /Lineto { L } def
+ \fi
+ end
+ /AngleA \psk@angleA\space def /AngleB \psk@angleB\space def
+ /armA \psk@armA\space def /armB \psk@armB\space def }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\pcangles{\def\pst@par{}\pst@object{pcangles}}
+\def\pcangles@i{\pc@object\ncangles@ii}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\pst@def{NCAngle}<%
+ \tx@GetPos
+ /x2a armB AngleB cos mul x2 add def
+ /y2a armB AngleB sin mul y2 add def
+ /mtrx AngleA matrix rotate def
+ x2a y2a mtrx transform pop
+ x1 y1 mtrx transform exch pop
+ mtrx itransform
+ /y0 ED /x0 ED
+ mark
+ armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1 y1
+ tx@Dict begin false \tx@Line end
+ /LPutVar [ x2 y2 x2 y2 x2a y2a x0 y0 x1 y1 ] cvx def
+ /LPutPos { \tx@AnglesMP } def>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\ncangle{\def\pst@par{}\pst@object{ncangle}}
+\def\ncangle@i{\check@arrow{\ncangle@ii}}
+\def\ncangle@ii#1#2{%
+ \nc@object{#1}{#2}{1.5}{\ncangles@iii \tx@NCAngle}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\pcangle{\def\pst@par{}\pst@object{pcangle}}
+\def\pcangle@i{\pc@object\ncangle@ii}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\pst@def{NCBar}<%
+ \tx@GetPos
+ \tx@GetArms
+ /mtrx AngleA matrix rotate def
+ x1a y1a mtrx transform pop
+ x2a y2a mtrx transform pop sub
+ dup 0 mtrx itransform
+ 3 -1 roll 0 gt
+ { /y2a exch y2a add def /x2a exch x2a add def }
+ { /y1a exch neg y1a add def /x2a exch neg x2a add def }
+ ifelse
+ mark
+ x2 y2 x2a y2a x1a y1a x1 y1
+ tx@Dict begin false \tx@Line end
+ /LPutVar [ x2 y2 x2 y2 x2a y2a x1a y1a x1 y1 ] cvx def
+ /LPutPos { LPutVar \tx@AnglesMP } def>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\ncbar{\def\pst@par{}\pst@object{ncbar}}
+\def\ncbar@i{\check@arrow{\ncbar@ii}}
+\def\ncbar@ii#1#2{\nc@object{#1}{#2}{1.5}{%
+ \ncangles@iii /AngleB \psk@angleA def \tx@NCBar}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\pcbar{\def\pst@par{}\pst@object{pcbar}}
+\def\pcbar@i{\pc@object\ncbar@ii}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\pst@def{NCDiag}<%
+ \tx@GetPos
+ \tx@GetArms
+ mark
+ x2 y2 x2a y2a x1a y1a x1 y1
+ tx@Dict begin false \tx@Line end
+ /LPutVar [ x2 y2 x2 y2 x2a y2a x1a y1a x1 y1 ] cvx def
+ /LPutPos { \tx@AnglesMP } def>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\ncdiag{\def\pst@par{}\pst@object{ncdiag}}
+\def\ncdiag@i{\check@arrow{\ncdiag@ii}}
+\def\ncdiag@ii#1#2{%
+ \nc@object{#1}{#2}{1.5}{\ncangles@iii \tx@NCDiag}}
+% \end{macrocode}
+%
+% \begin{macro}{\pcdiag}
+% \begin{macrocode}
+\def\pcdiag{\def\pst@par{}\pst@object{pcdiag}}
+\def\pcdiag@i{\pc@object\ncdiag@ii}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\pst@def{NCDiagg}<%
+ OffsetA AngleA NodesepA nodeA \tx@GetEdge
+ /y1 ED /x1 ED
+ /x1a armA AngleA cos mul x1 add def
+ /y1a armA AngleA sin mul y1 add def
+ nodeB \tx@GetCenter
+ y1a sub exch x1a sub \tx@Atan 180 add /AngleB ED
+ OffsetB AngleB NodesepB nodeB \tx@GetEdge
+ /y2 ED /x2 ED
+ mark
+ x2 y2 x1a y1a x1 y1
+ tx@Dict begin false \tx@Line end
+ /LPutVar [ x2 y2 x2 y2 x2 y2 x1a y1a x1 y1] cvx def
+ /LPutPos { \tx@AnglesMP } def>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\ncdiagg{\def\pst@par{}\pst@object{ncdiagg}}
+\def\ncdiagg@i{\check@arrow{\ncdiagg@ii}}
+\def\ncdiagg@ii#1#2{%
+ \nc@object{#1}{#2}{.5}{\ncangles@iii \tx@NCDiagg}}
+% \end{macrocode}
+%
+% \begin{macro}{\pcdiagg}
+% \begin{macrocode}
+\def\pcdiagg{\def\pst@par{}\pst@object{pcdiagg}}
+\def\pcdiagg@i{\pc@object\ncdiagg@ii}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tx@LoopMP}
+% \begin{macrocode}
+\pst@def{LoopMP}<%
+ /t t abs def
+ [ LPutVar ] length 2 div 1 sub dup t lt { /t ED } { pop } ifelse
+ mark LPutVar
+ t cvi { /t t 1 sub def pop pop } repeat
+ counttomark 1 add 4 roll cleartomark
+ 3 -1 roll exch \tx@LineMP>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\pst@def{NCLoop}<%
+ \tx@GetPos
+ \tx@GetArms
+ /mtrx AngleA matrix rotate def
+ x1a y1a mtrx transform loopsize add /y1b ED /x1b ED
+ /x2b x2a y2a mtrx transform pop def
+ x2b y1b mtrx itransform /y2b ED /x2b ED
+ x1b y1b mtrx itransform /y1b ED /x1b ED
+ mark
+ armB 0 ne { x2 y2 } if x2a y2a x2b y2b x1b y1b x1a y1a armA
+ 0 ne { x1 y1 } if
+ tx@Dict begin false \tx@Line end
+ /LPutVar [ x2 y2 x2a y2a x2b y2b x1b y1b x1a y1a x1 y1 ] cvx def
+ /LPutPos { \tx@LoopMP } def>
+% \end{macrocode}
+%
+% \begin{macro}{\psset@loopsize}
+% \begin{macrocode}
+\def\psset@loopsize#1{\pst@getlength{#1}\psk@loopsize}
+\psset@loopsize{1cm}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\ncloop{\def\pst@par{}\pst@object{ncloop}}
+\def\ncloop@i{\check@arrow{\ncloop@ii}}
+\def\ncloop@ii#1#2{%
+ \nc@object{#1}{#2}{2.5}%
+ {\ncangles@iii /loopsize \psk@loopsize\space def \tx@NCLoop}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\pcloop{\def\pst@par{}\pst@object{pcloop}}
+\def\pcloop@i{\pc@object\ncloop@ii}
+% \end{macrocode}
+%
+% \begin{macro}{\tx@NCCircle}
+% \begin{macrocode}
+\pst@def{NCCircle}<%
+ nodeA \tx@GetCenter
+ 0 0 NodesepA nodeA \tx@GetEdge
+ % Stack: x-center y-center x-edge y-origin
+ pop 3 1 roll
+ /Y ED /X ED % center
+ X sub 2 div % half distance to edge
+ dup 2 exp r r mul sub abs sqrt atan 2 mul /a ED % angle to edge
+ r AngleA 90 add \tx@PtoC % displacement to origin
+ Y add exch X add exch % origin
+ 2 copy /LPutVar [ 4 2 roll r a ] def
+ /LPutPos { LPutVar aload pop t 360 mul add dup 5 1 roll
+ 90 sub \tx@PtoC 3 -1 roll add 3 1 roll add exch 3 -1 roll } def
+ r
+ AngleA 90 sub a add % begin arc angle
+ AngleA 270 add a sub % end arc angle
+ % Stack: x0 y0 r a1 a2
+ tx@Dict begin
+ /angleB ED
+ /angleA ED
+ /r ED
+ /c 57.2957 r \tx@Div def
+ /y ED
+ /x ED>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\nccircle{\def\pst@par{}\pst@object{nccircle}}
+\def\nccircle@i{\check@arrow{\nccircle@ii}}
+\def\nccircle@ii#1#2{%
+ \pssetlength\pst@dima{#2}%
+ \nc@object{#1}{#1}{.5}{%
+ /AngleA \psk@angleA def
+ /r \pst@number\pst@dima def
+ \tx@NCCircle \psarc@v end}}
+% \end{macrocode}
+%
+%
+% \section{Node Labels}
+%
+%
+% \begin{macro}{\pst@getlputrot}
+% \begin{macrocode}
+\def\pst@getlputrot#1{%
+ \@ifnextchar(%
+ {\def\pst@rot{}#1}%
+ {\pst@@getlputrot{\@ifnextchar({#1}{#1(\lputpos@default)}}}}
+\def\pst@@getlputrot#1#2{%
+ \pst@expandafter{\@ifnextchar:{\pst@@@getlputrot}%
+ {\@ifstar{\pst@@@getrot}{\pst@@getrot}}}{#2}\@nil
+ \ifx\pst@rotlist\@empty\else
+ \edef\pst@rotlist{\pst@rotlist \pst@rot add }%
+ \fi
+ #1}
+\def\pst@@@getlputrot#1#2\@nil{%
+ \pst@@getrot#2\@nil
+ \edef\pst@rot{langle \ifx\pst@rot\@empty\else\pst@rot add \fi}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{LPutCoor}
+% \begin{macrocode}
+\pst@def{LPutCoor}<%
+ tx@NodeDict /LPutPos known
+ { gsave
+ LPutPos
+ tx@Dict begin
+ /langle ED
+ CM 3 1 roll
+ \tx@STV
+ CP 3 -1 roll sub neg 3 1 roll sub exch
+ moveto
+ setmatrix
+ CP
+ end
+ grestore }
+ { 0 0 tx@Dict /langle 0 def end }
+ ifelse>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\psput@lput}
+% \begin{macrocode}
+\def\psput@lput#1#2{%
+ \pst@checknum{#1}\pst@tempa
+ \hbox{%
+ \pst@Verb{%
+ \pst@nodedict
+ /t \pst@tempa\space def
+ \tx@LPutCoor
+ end
+ \tx@PutBegin}%
+ \box#2%
+ \pst@Verb{\tx@PutEnd}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lput}
+% \begin{macrocode}
+\def\lput{\begin@psput{\pst@getref{\pst@getlputrot{\end@psput\lput@i}}}}
+\def\lput@i(#1){%
+ \pst@makesmall\pst@hbox
+ \ifx\pst@rot\@empty\else\pst@rotate\pst@hbox\fi
+ \psput@lput{#1}\pst@hbox}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mput}
+% \begin{macrocode}
+\def\mput{%
+ \begin@psput{\def\pst@rot{}\pst@getref{\end@psput\lput@i(\lputpos@default)}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\aput,\Aput,\bput,\Bput}
+% \begin{macrocode}
+\def\aput@#1{\begin@psput{%
+ \def\pst@refangle{#1 }%
+ \@ifnextchar[{\aput@i}{\pst@getlputrot{\end@psput\aput@ii}}}}
+\def\aput@i[#1]{%
+ \pssetlength\pslabelsep{#1}\pst@getlputrot{\end@psput\aput@ii}}
+\def\aput@ii(#1){%
+ \uput@iv\aput@iii
+ \psput@lput{#1}\pst@hbox}
+\def\aput@iii{exch pop add a \tx@PtoC h1 add exch w1 add exch }
+\def\aput{\aput@{langle 90 add}}
+\def\bput{\aput@{langle 90 sub}}
+\def\Aput@#1{\begin@psput{%
+ \def\pst@refangle{#1 }%
+ \def\pst@rot{}%
+ \@ifnextchar[{\Aput@i}{\end@psput\aput@ii(\lputpos@default)}}}
+\def\Aput@i[#1]{%
+ \pssetlength\pslabelsep{#1}%
+ \end@psput\aput@ii(\lputpos@default)}
+\def\Aput{\Aput@{langle 90 add}}
+\def\Bput{\Aput@{langle 90 sub}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\Lput,\Mput}
+% These are obsolete.
+% \begin{macrocode}
+\def\Lput{%
+ \begin@psput{\pst@getlabelsep{\pst@getlputrot{\end@psput{\Rput@i\lput@i}}}}}
+\def\Mput{%
+ \begin@psput{%
+ \def\pst@rot{}%
+ \pst@getlabelsep{\end@psput{\Rput@i\lput@i}(\lputpos@default)}}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Node coordinates}
+%
+% \begin{macro}{\node@coor}
+% \begin{macrocode}
+\def\node@coor#1;#2\@nil{%
+ \pst@getnode{#1}\pst@tempg
+ \edef\pst@coor{%
+ \pst@nodedict
+ tx@NodeDict \pst@tempg known
+ { \pst@tempg load \tx@GetCenter }
+ { 0 0 }
+ ifelse
+ end }}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Node@coor}
+% \begin{macrocode}
+\def\Node@coor[#1]#2;#3\@nil{%
+ \begingroup
+ \psset{#1}%
+ \pst@getnode{#2}\pst@tempg
+ \xdef\pst@tempg{%
+ \pst@nodedict
+ tx@NodeDict \pst@tempg known
+ { \psk@offsetA \psk@angleA \psk@nodesepA \pst@tempg load \tx@GetEdge }
+ { 0 0 }
+ ifelse
+ end }%
+ \endgroup
+ \let\pst@coor\pst@tempg}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\pst@ATH<end>
+\catcode`\@=\TheAtCode\relax
+\endinput
+% \end{macrocode}
+%
+% \Finale
+% \endinput
+%
+%% END: pst-node.doc