diff options
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.doc | 1066 |
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 |