%% 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 \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} % {} / {} NewNode" % \end{LVerbatim} % "" is stuff to be done with "tx@Dict". It might leave % things on the stack for use by "". % % Syntax for "\pst@newnode": % \begin{LVerbatim} % \pst@newnode{}{}{}{} % \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} % 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} % "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" \hskip 1em (Center coordinates)\\ % - "GetAngle" \hskip 1em (Angle from A to B) % \end{Ex} % \begin{macrocode} \pst@def{GetCenter} \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} % "GetEdge" % \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} % 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 \catcode`\@=\TheAtCode\relax \endinput % \end{macrocode} % % \Finale % \endinput % %% END: pst-node.doc