From 554b089e59c2631f8a6cbd760beabc02ea227ef7 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 29 Jul 2011 14:12:10 +0000 Subject: pst-node 1.00/1.17 (9jul11) git-svn-id: svn://tug.org/texlive/trunk@23268 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/generic/pst-node/Changes | 3 + .../doc/generic/pst-node/pst-node-doc.pdf | Bin 307821 -> 528405 bytes .../doc/generic/pst-node/pst-node-doc.tex | 1436 +++++++++++++++++++- .../texmf-dist/doc/generic/pst-node/pst-node97.tex | 390 ++++++ 4 files changed, 1822 insertions(+), 7 deletions(-) create mode 100644 Master/texmf-dist/doc/generic/pst-node/pst-node97.tex (limited to 'Master/texmf-dist/doc/generic/pst-node') diff --git a/Master/texmf-dist/doc/generic/pst-node/Changes b/Master/texmf-dist/doc/generic/pst-node/Changes index 214aa07bf1e..ec43a8bab8e 100644 --- a/Master/texmf-dist/doc/generic/pst-node/Changes +++ b/Master/texmf-dist/doc/generic/pst-node/Changes @@ -1,4 +1,6 @@ ----- pst-node.tex +1.17 2011-07-04 - added optional argument for \pnode for relative + node setting 1.16 2011-05-05 - fixed bug with missing star version for \nput 1.15 2011-02-28 - fixed bug with nodealign 1.14 2010-10-28 - added the macros @@ -16,6 +18,7 @@ ----- pst-node.sty +1.00 2011-06-05 - make ancient variant 97 available (hv) 2008-12-12 first version (hv) diff --git a/Master/texmf-dist/doc/generic/pst-node/pst-node-doc.pdf b/Master/texmf-dist/doc/generic/pst-node/pst-node-doc.pdf index 0e0a19a8a8b..b06e768cad3 100644 Binary files a/Master/texmf-dist/doc/generic/pst-node/pst-node-doc.pdf and b/Master/texmf-dist/doc/generic/pst-node/pst-node-doc.pdf differ diff --git a/Master/texmf-dist/doc/generic/pst-node/pst-node-doc.tex b/Master/texmf-dist/doc/generic/pst-node/pst-node-doc.tex index 2f9a18c5eb0..4f74469c446 100644 --- a/Master/texmf-dist/doc/generic/pst-node/pst-node-doc.tex +++ b/Master/texmf-dist/doc/generic/pst-node/pst-node-doc.tex @@ -1,4 +1,4 @@ -%% $Id: pst-node-doc.tex 465 2011-02-28 16:08:12Z herbert $ +%% $Id: pst-node-doc.tex 536 2011-07-09 21:40:33Z herbert $ \documentclass[11pt,english,BCOR10mm,DIV12,bibliography=totoc,parskip=false,smallheadings headexclude,footexclude,oneside]{pst-doc} \listfiles @@ -6,6 +6,7 @@ \usepackage[utf8]{inputenc} \usepackage{pst-plot} \usepackage{pst-node} +%\usepackage{pax} \let\pstFV\fileversion \let\belowcaptionskip\abovecaptionskip % @@ -35,6 +36,12 @@ \ncangles{9,2}{7,0}\ncangles{9,2}{11,0} \ncangles{17,2}{15,0}\ncangles{17,2}{19,0}} } +\newbox\filebox +\setbox\filebox=\hbox{% + \pspicture(-1,-.5)(1,.7) + \pspolygon[linearc=2pt,shadow=true,shadowangle=45,xunit=1.1]% + (-1,-.55)(-1,.5)(-.8,.5)(-.8,.65)(-.2,.65)(-.2,.5)(1,.5)(1,-.55) + \endpspicture} \lstset{explpreset={pos=l,width=-99pt,overhang=0pt,hsep=\columnsep,vsep=\bigskipamount,rframe={}}} @@ -55,6 +62,10 @@ the basic node commands and connection from the old PSTricks documentation. The second part describes only the new and changed stuff. . +For some copatibility reason you can use the optional argument \Loption{97} +for the package, it loads the version from 1997, which only makes sense +when also running the main package \LPack{pstricks} with this option. + \vfill \noindent Thanks to: Marco Daniel; Denis Girou; Rolf Niepraschk; Sebastian Rahtz; @@ -66,14 +77,1423 @@ Thanks to: Marco Daniel; Denis Girou; Rolf Niepraschk; Sebastian Rahtz; \clearpage \part{Basic commands, connections and labels} -The following pages are from the original documentation of -\PST. This documentation file \LFile{pst-docfull} should be part of any -\TeX\ distribution and was inserted here with the following command: +\leavevmode +\marginpar{% + \leavevmode\lower 20pt\hbox{% + \hbox to0pt{\hbox to \linewidth{\hss\rnode{file}{\copy\filebox}\hss}\hss}% + \raise 10pt\hbox to \linewidth{\hss\large\bfseries\sffamily pst-node\hss}}}% + +The node and node connection macros let you connect information and place +labels, without knowing the exact position of what you are connecting or where +the lines should connect. These macros are useful for making graphs and trees, +mathematical diagrams, linguistic syntax diagrams, and connecting ideas of any +kind. They are the trickiest tricks in PSTricks! + +There are three components to the node macros: +\begin{description} + \item[Node definitions] The node definitions let you assign a name and shape + to an object. See Section \ref{S-nodes}. + \item[Node connections] The node connections connect two nodes, identified + by their names. See Section \ref{S-nc}. + \item[Node labels] The node label commands let you affix labels to the node + connections. See Section \ref{S-nodelabels}. +\end{description} + +You can use these macros just about anywhere. The best way to position them +depends on the application. For greatest flexibility, you can use the nodes in +a \Lenv{pspicture}, positioning and rotating them with \Lcs{rput}. You can also use +them in alignment environments. \LPack{pst-node} contains a special alignment +environment, \Lenv{psmatrix}, which is designed for positioning nodes in a grid, +such as in mathematical diagrams and some graphs. \Lcs{psmatrix} is described in +Section \ref{S-psmatrix}. \LPack{pst-node} also contains high-level macros for +trees. These are described in Part~\ref{P-trees}. + +But don't restrict yourself to these more obvious uses. For example: +\begin{center} + \rnode{A}{% + \parbox{12cm}{\raggedright + I made the file symbol a node. Now I can draw an + arrow so that you know what I am talking about.}} + \ncarc[nodesep=8pt]{->}{A}{file} +\end{center} + +\begin{lstlisting} + \rnode{A}{% + \parbox{4cm}{\raggedright + I made the file symbol a node. Now I can draw an + arrow so that you know what I am talking about.}} + \ncarc[nodesep=8pt]{->}{A}{file} +\end{lstlisting} + +\section{Nodes}\label{S-nodes} + +Nodes have a name. a boundary and a center. +The center of a node is where node connections point to. The boundary is for +determining where to connect a node connection. The various nodes differ in +how they determine the center and boundary. They also differ in what kind of +visable object they create. + + +The\XInfoDanger[0]{} name is for refering to the node when making node connections and labels. +You specify the name as an argument to the node commands. The name must +contain only letters and numbers, and must begin with a letter. Bad node names +can cause PostScript errors. + + +Here are the nodes: + +\begin{BDef} +\Lcs{rnode}\OptArg{refpoint}\Largb{name}\Largb{stuff} +\end{BDef} + + \Lcs{rnode} puts \Larg{stuff} in a box. The center of the node is \Larg{refpoint}, which +you can specify the same way as for \Lcs{rput}. + +\begin{BDef} +\Lcs{Rnode}\Largb{name}\Largb{stuff} +\end{BDef} + + \Lcs{Rnode} also makes a box, but the center is set differently. If you align +\Lcs{rnode}'s by their baseline, differences in the height and depth of the nodes +can cause connecting lines to be not quite parallel, such as in the following +example: + +\begin{LTXexample}[width=0.4\linewidth] + \Large + \rnode{A}{sp} \hskip 2cm \rnode{B}{Bit} + \ncline{A}{B} +\end{LTXexample} + +With \Lcs{Rnode}, the center is determined relative to the baseline: + +\begin{LTXexample}[width=0.4\linewidth] + \Large + \Rnode{A}{sp} \hskip 2cm \Rnode{B}{Bit} + \ncline{A}{B} +\end{LTXexample} + +You can usually get by without fiddling with the center of the node, but to +modify it you set the + \LKeyword{href=num} or + \LKeyword{vref=dim} +parameters. In the horizontal direction, the center is located fraction +\Lkeyword{href} from the center to the edge. E.g, if \LKeyword{href=-1}, the center is on +the left edge of the box. In the vertical direction, the center is located +distance \Lkeyword{vref} from the baseline. The \Lkeyword{vref} parameter is evaluated each +time \Lcs{Rnode} is used, so that you can use \verb|ex| units to have the distance +adjust itself to the size of the current font (but without being sensitive to +differences in the size of letters within the current font). + +The command \Lcs{pnode} creates a zero dimensional node at \Largr{\CAny}. +It +knows an optional argument for an \CAny\ offset, which +expects the two values for $x$ and $y$ separated by a comma: + +\begin{BDef} +\Lcs{pnode}\OptArg*{\Largs{\Larga{offset}}}\Largr{\CAny}\Largb{\Larga{node name}} +\end{BDef} + + +\begin{LTXexample}[width=6cm] +\begin{pspicture}[showgrid](0,-2)(6,2) +\pnode{A}\psdot(A)\uput[90](A){A} +\pnode[0,-2]{B}\psdot(B)\uput[90](B){B} +\pnode(2,0){C}\psdot(C)\uput[90](C){C} +\pnode[1,-2](2,0){D}\psdot(D)\uput[90](D){D} +\pnode[2,2](3.5,0){E}\psdot(E)\uput[90](E){E} +\end{pspicture} +\end{LTXexample} + + +\begin{BDef} +\LcsStar{cnode}\OptArgs\Largr{\CAny}\Largb{radius}\Largb{name} +\end{BDef} + + This draws a circle. Here is an example with \Lcs{pnode} and \Lcs{cnode}: + +\begin{LTXexample} +\begin{pspicture}[showgrid](3,1.25) + \cnode(0,1){.25}{A} + \pnode(3,0){B} + \ncline{<-}{A}{B} +\end{pspicture} +\end{LTXexample} + +\begin{BDef} +\LcsStar{Cnode}\OptArgs\Largr{\CAny}\Largb{name} +\end{BDef} + + This is like \Lcs{cnode}, but the radius is the value of \LKeyword{radius=dim} +This is convenient when you want many circle nodes of the same radius. + +\begin{BDef} +\LcsStar{circlenode}\OptArgs\Largb{name}\Largb{stuff} +\end{BDef} + + This is a variant of \Lcs{pscirclebox} that gives the node the shape of the +circle. + +\begin{BDef} + \LcsStar{cnodeput}\OptArgs\Largb{angle}\Largr{\CAny}\Largb{name}\Largb{stuff} +\end{BDef} + + This is a variant of \Lcs{cput} that gives the node the shape of the +circle. That is, it is like +\begin{lstlisting} + \rput{}(,){\circlenode{}{}} +\end{lstlisting} + + +\begin{BDef} +\LcsStar{ovalnode}\OptArgs\Largb{name}\Largb{stuff} +\end{BDef} + + This is a variant of \Lcs{psovalbox} that gives the node the shape of an +ellipse. Here is an example with \Lcs{circlenode} and \Lcs{ovalnode}: + +\begin{LTXexample}[width=0.3\textwidth] +\circlenode{A}{Circle} and \ovalnode{B}{Oval} +\ncbar[angle=90]{A}{B} +\end{LTXexample} + + +\begin{BDef} +\LcsStar{dianode}\OptArgs\Largb{name}\Largb{stuff} +\end{BDef} + + This is like \Lcs{diabox}. + + +\begin{BDef} +\LcsStar{trinode}\OptArgs\Largb{name}\Largb{stuff} +\end{BDef} + + This is like \Lcs{tribox}. + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,3) + \rput[tl](0,3){\dianode{A}{Diamond}} + \rput[br](4,0){\trinode[trimode=L]{B}{Triangle}} + \nccurve[angleA=-135,angleB=90]{A}{B} +\end{pspicture} +\end{LTXexample} + +\begin{BDef} +\LcsStar{dotnode}\OptArgs\Largr{\CAny}\Largb{name} +\end{BDef} + + This is a variant of \Lcs{psdot}. For example: +\begin{LTXexample} +\begin{pspicture}(3,2) + \dotnode[dotstyle=triangle*,dotscale=2 1](0,0){A} + \dotnode[dotstyle=+](3,2){B} + \ncline[nodesep=3pt]{A}{B} +\end{pspicture} +\end{LTXexample} + + +\begin{BDef} +\LcsStar{fnode}\OptArgs\Largr{\CAny}\Largb{name} +\end{BDef} + + The ``f'' stands for ``frame''. This is like, but easier than, putting a +\Lcs{psframe} in an \Lcs{rnode}. + +\begin{LTXexample} +\begin{pspicture}(3,2) + \fnode{A} + \fnode*[framesize=1 5pt](2,2){B} + \ncline[nodesep=3pt]{A}{B} +\end{pspicture} +\end{LTXexample} + +There are two differences between \Lcs{fnode} and \Lcs{psframe}: +\begin{itemize} + \item There is a single (optional) coordinate argument, that gives the + \emph{center} of the frame. + \item The width and height of the frame are set by the + \LKeyword{framesize=dim1 `dim2'} parameter. If you omit , you get a square frame. +\end{itemize} + + +\section{Node connections}\label{S-nc} + +All the node connection commands begin with \nxLcs{nc}, and they all have the same +syntax:\footnote{% +The node connections can be used with \Lcs{pscustom}. The beginning of the node +connection is attached to the current point by a straight line, as with +\Lcs{psarc}.}$^,$\footnote{% +See page \protect\pageref{S-SpecialCoor} if you want to use the nodes as +coordinates in other PSTricks macros.} + +\begin{BDef} + \nxLcs{*}\OptArgs\Largb{}\Largb{}\Largb{} +\end{BDef} + +A line of some sort is drawn from to . Some of the node +connection commands are a little confusing, but with a little experimentation +you will figure them out, and you will be amazed at the things you can do. +When we refer to the \verb|A| and \verb|B| nodes below, we are referring only to the +order in which the names are given as arguments to the node connection +macros.\footnote{% +When a node name cannot be found on the same page as the node connection +command, you get either no node connection or a nonsense node connection. +However, \TeX{} will not report any errors.} + +The node connections use many of the usual graphics parameters, plus a few +special ones. Let's start with one that applies to all the node connections: + \LKeyword{nodesep=dim} + +\Lkeyword{nodesep} is the border around the nodes that is added for the purpose of +determining where to connect the lines. + +For this and other node connection parameters, you can set different values +for the two ends of the node connection. Set the parameter \Lkeyword{nodesepA} for +the first node, and set \Lkeyword{nodesepB} for the second node. + +The first two node connections draw a line or arc directly between the two +nodes: + +\begin{BDef} +\LcsStar{ncline}\OptArgs\OptArg*{\Largb{arrows}}\Largb{nodeA}\Largb{nodeB} +\end{BDef} + +This draws a straight line between the nodes. For example: +\begin{LTXexample} +\begin{pspicture}(4,3) + \rput[bl](0,0){\rnode{A}{Idea 1}} + \rput[tr](4,3){\rnode{B}{Idea 2}} + \ncline[nodesep=3pt]{<->}{A}{B} +\end{pspicture} +\end{LTXexample} + +\begin{BDef} +\LcsStar{ncarc}\OptArgs\OptArg*{\Largb{arrows}}\Largb{nodeA}\Largb{nodeB} +\end{BDef} + +This connects the two nodes with an arc. +\begin{LTXexample} +\begin{pspicture}[shift=*](3.5,2.5) + \cnodeput(0,0){A}{X} + \cnodeput(3,2){B}{Y} + \psset{nodesep=3pt} + \ncarc{->}{A}{B} + \ncarc{->}{B}{A} +\end{pspicture} +\end{LTXexample} + +The angle between the arc and the line between the two nodes is\footnote{% +Rather than using a true arc, \Lcs{ncarc} actually draws a bezier curve. When +connecting two circular nodes using the default parameter values, the curve +will be indistinguishable from a true arc. However, \Lcs{ncarc} is more +flexible than an arc, and works right connecting nodes of different shapes and +sizes. You can set \Lkeyword{arcangleA} and \Lkeyword{arcangleB} separately, and you can +control the curvature with the \Lkeyword{ncurv} parameter, which is described on page +\pageref{p+ncurv}.} \LKeyword{arcangle=angle} + + +\Lcs{ncline} and \Lcs{ncarc} both determine the angle at which the node +connections join by the relative position of the two nodes. With the next +group of node connections, you specify one or both of the angles in absolute +terms, by setting the + \LKeyword{angle=angle} +(and \Lkeyword{angleA} and \Lkeyword{angleB}) parameter. + +You also specify the length of the line segment where the node connection +joins at one or both of the ends (the ``arms'') by setting the + \LKeyword{arm=dim} +(and \Lkeyword{armA} and \Lkeyword{armB}) parameter. + +These node connections all consist of several line segments, including the +arms. The value of \Lkeyword{linearc} is used for rounding the corners. + +Here they are, starting with the simplest one: + +\begin{BDef} +\LcsStar{ncdiag}\OptArgs\OptArg*{\Largb{arrows}}\Largb{nodeA}\Largb{nodeB} +\end{BDef} -\verb+\includepdf[pages=6-32]{pst-docfull}+ + +An arm is drawn at each node, joining at angle \Lkeyword{angleA} or \Lkeyword{angleB}, +and with a length of \Lkeyword{armA} or \Lkeyword{armB}. Then the two arms are connected +by a straight line, so that the whole line has three line segments. +For example: + +\begin{LTXexample}[width=0.4\textwidth] +\begin{pspicture}(4,3) + \rput[tl](0,3){\rnode{A}{\psframebox{Node A}}} + \rput[br](4,0){\ovalnode{B}{Node B}} + \ncdiag[angleA=-90, angleB=90, arm=.5, linearc=.2]{A}{B} +\end{pspicture} +\end{LTXexample} + +You can also set one or both of the arms to zero length. For example, if you +set \LKeyword{arm=0}, the nodes are connected by a straight line, but you get to +determine where the line connects (whereas the connection point is determined +automatically by \Lcs{ncline}. Compare this use of \Lcs{ncdiag} with \Lcs{ncline} +in the following example: + +\begin{LTXexample}[width=0.4\textwidth] +\begin{pspicture}[shift=*](4,2.5) + \rput[r](4,1){\ovalnode{R}{Root}} + \cnodeput(1,2){A}{XX} + \cnodeput(1,0){B}{YY} + \ncdiag[angleB=180, arm=0]{<-}{A}{R} + \ncline{<-}{B}{R} +\end{pspicture} +\end{LTXexample} + +(Note that in this example, the default value \LKeyword{angleA=0} is used.) + +\begin{BDef} +\LcsStar{ncdiagg}\OptArgs\OptArg*{\Largb{arrows}}\Largb{nodeA}\Largb{nodeB} +\end{BDef} + +\Lcs{ncdiagg} is similar to \Lcs{ncdiag}, but only the arm for node A is drawn. +The end of this arm is then connected directly to node B. Compare +\Lcs{ncdiagg} with \Lcs{ncdiag} when \LKeyword{armB=0}: + +\begin{LTXexample}[width=0.4\textwidth] +\begin{pspicture}[shift=*](3.5,1) +\cnode(0,0){12pt}{a} +\rput[l](3,1){\rnode{b}{H}} +\rput[l](3,-1){\rnode{c}{T}} +\ncdiagg[angleA=180,armA=1.5,nodesepA=3pt]{b}{a} +\nbput[npos=1.2]{\texttt{\string\ncdiagg}} +\ncdiag[angleA=180,armA=1.5,armB=0, + nodesepA=3pt]{c}{a} +\naput[npos=1.2]{\texttt{\string\ncdiag}} +\end{pspicture} +\end{LTXexample} + + You can use \Lcs{ncdiagg} with \LKeyword{armA=0} if you want a straight line that +joins to node A at the angle you specify, and to node B at an angle that is +determined automatically. + +\begin{BDef} +\LcsStar{ncbar}\OptArgs\OptArg*{\Largb{arrows}}\Largb{nodeA}\Largb{nodeB} +\end{BDef} + + This node connection consists of a line with arms dropping ``down'', at +right angles, to meet two nodes at an angle \Lkeyword{angleA}. Each arm is at least +of length \Lkeyword{armA} or \Lkeyword{armB}, but one may be need to be longer. + +\begin{LTXexample}[width=0.4\textwidth] +\rnode{A}{Connect} some \rnode{B}{words}! +\ncbar[nodesep=3pt,angle=-90]{<-**}{A}{B} +\ncbar[nodesep=3pt,angle=70]{A}{B} +\end{LTXexample} + + Generally, the whole line has three straight segments. + +\begin{BDef} +\LcsStar{ncangle}\OptArgs\OptArg*{\Largb{arrows}}\Largb{nodeA}\Largb{nodeB} +\end{BDef} + + + Now we get to a more complicated node connection. \Lcs{ncangle} typically +draws three line segments, like \Lcs{ncdiag}. However, rather than fixing the +length of arm A, we adjust arm A so that the line joining the two arms meets +arm A at a right angle. For example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,3) + \rput[tl](0,3){\rnode{A}{\psframebox{Node A}}} + \rput[br](4,0){\ovalnode{B}{Node B}} + \ncangle[angleA=-90,angleB=90,armB=1cm]{A}{B} +\end{pspicture} +\end{LTXexample} + +Now watch what happens when we change \Lkeyword{angleA}: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,3) + \rput[tl](0,3){\rnode{A}{\psframebox{Node A}}} + \nput[labelsep=0]{-70}{A}{% + \psarcn(0,0){.4cm}{0}{-70} + \uput{.4cm}[-35](0,0){\texttt{angleA}}} + \rput[br](4,0){\ovalnode{B}{Node B}} + \ncangle[angleA=-70,angleB=90,armB=1cm,linewidth=1.2pt]{A}{B} + \nput[labelsep=0]{90}{B}{% + \rput[bl](2pt,1pt){% + \valign{% + \vfil#\vfil\cr + \hbox{\psscaleboxto(.3,.95cm){\}}}\cr% + \hbox{\kern 1pt{\texttt{armB}}}\cr}}} + \ncput[nrot=:U,npos=1]{\psframe[dimen=middle](0,0)(.35,.35)} +\end{pspicture} +\end{LTXexample} + +\Lcs{ncangle} is also a good way to join nodes by a right angle, with just two +line segments, as in this example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,2) + \rput[tl](0,2){\rnode{A}{\psframebox{Node A}}} + \rput[br](4,0){\ovalnode{B}{Node B}} + \ncangle[angleB=90, armB=0, linearc=.5]{A}{B} +\end{pspicture} +\end{LTXexample} + +\begin{BDef} +\LcsStar{ncangles}\OptArgs\OptArg*{\Largb{arrows}}\Largb{nodeA}\Largb{nodeB} +\end{BDef} + + \Lcs{ncangles} is similar to \Lcs{ncangle}, but the length of arm A is fixed by +he \Lkeyword{armA} parameter. Arm A is connected to arm B by two line segments that +eet arm A and each other at right angles. The angle at which they join arm B, +and the length of the connecting segments, depends on the positions of the two +arms. \Lcs{ncangles} generally draws a total of four line segments.\footnote{% +Hence there is one more angle than \Lcs{ncangle}, and hence the \texttt|s| in +\Lcs{ncangles}.} +For example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,4) + \rput[tl](0,4){\rnode{A}{\psframebox{Node A}}} + \rput[br](4,0){\ovalnode{B}{Node B}} + \ncangles[angleA=-90, armA=1cm, armB=.5cm, linearc=.15]{A}{B} +\end{pspicture} +\end{LTXexample} + +Let's see what happens to the previous example when we change \Lkeyword{angleB}: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,4) + \rput[tl](0,4){\rnode{A}{\psframebox{Node A}}} + \rput[br](4,0){\ovalnode{B}{Node B}} + \ncangles[angleA=-90, angleB=135, armA=1cm, armB=.5cm, + linearc=.15]{A}{B} + \nput[labelsep=0]{-90}{A}{% + \psarcn(0,0){.4cm}{0}{-90} + \uput{.4cm}[-45](0,0){\texttt{angleA}} + \rput[tr](-2pt,0){% + \valign{% + \vfil#\vfil\cr + \hbox{\texttt{armA}\kern 1pt}\cr + \hbox{\psscaleboxto(.28,.95cm){\{}}\cr\cr}}} + \nput[labelsep=0]{135}{B}{% + \psarc(0,0){.4cm}{0}{133} + \uput{.4cm}[50.5](0,0){\texttt{angleB}}} + \ncput[nrot=:L,npos=2]{\psline(0,-.35)(-.35,-.35)(-.35,0)} + \ncput[npos=3.5]{% + \rput[r](-.8,0){\rnode{arm}{\texttt{armB}}} + \pnode{brak}}% + \ncline[nodesep=3pt]{->}{arm}{brak} +\end{pspicture} +\end{LTXexample} + +\begin{BDef} +\LcsStar{ncloop}\OptArgs\OptArg*{\Largb{arrows}}\Largb{nodeA}\Largb{nodeB} +\end{BDef} + + \Lcs{ncloop} is also in the same family as \Lcs{ncangle} and \Lcs{ncangles}, but +now typically 5 line segments are drawn. Hence, \Lcs{ncloop} can reach around +to opposite sides of the nodes. The lengths of the arms are fixed by \Lkeyword{armA} +and \Lkeyword{armB}. Starting at arm A, \Lcs{ncloop} makes a 90 degree turn to the +left, drawing a segment of length + \LKeyword{loopsize=dim} +This segment connects to arm B the way arm A connects to arm B with \Lcs{ncline}; +that is, two more segments are drawn, which join the first segment and each +other at right angles, and then join arm B. For example: + +\begin{LTXexample}[pos=t] + \vrule width 0pt height 1cm + \rnode{a}{\psframebox{\Huge A loop}} + \ncloop[angleB=180,loopsize=1,arm=.5,linearc=.2]{->}{a}{a} + \ncput[npos=3.5,nrot=:U]{\psline{|<->|}(.5,-.2)(-.5,-.2)} + \nbput[npos=3.5,nrot=:D,labelsep=.35cm]{{\tt loopsize}} + \kern .5cm +\end{LTXexample} + +In this example, node A and node B are the same node! You can do this with all +the node connections (but it doesn't always make sense). +Here is an example where \Lcs{ncloop} connects two different nodes: + +\begin{LTXexample}[pos=t] + \parbox{3cm}{% + \rnode{A}{\psframebox{\large\textbf{Begin}}} + \vspace{1cm}\hspace*{\fill} + \rnode{B}{\psframebox{\large\textbf{End}}} + \ncloop[angleA=180,loopsize=.9,arm=.5,linearc=.2]{->}{A}{B}} + \ncput[npos=1.5,nrot=:U]{\psline{|<->|}(.45,-.2)(-.45,-.2)} + \nbput[npos=1.5,nrot=:D,labelsep=.35cm]{\texttt{loopsize}} + \kern .5cm +\end{LTXexample} + + +The next two node connections are a little different from the rest. + +\begin{BDef} +\LcsStar{nccurve}\OptArgs\OptArg*{\Largb{arrows}}\Largb{nodeA}\Largb{nodeB} +\end{BDef} + + \Lcs{nccurve} draws a bezier curve between the nodes. + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,3) + \rput[bl](0,0){\rnode{A}{\psframebox{Node A}}} + \rput[tr](4,3){\ovalnode{B}{Node B}} + \nccurve[angleB=180]{A}{B} +\end{pspicture} +\end{LTXexample} + +You specify the angle at which the curve joins the nodes by setting the +\Lkeyword{angle} (and \Lkeyword{angleA} and \Lkeyword{angleB}) parameter. The distance to the +control points is set with the + \LKeyword{ncurv=num} +(and \Lkeyword{ncurvA} and \Lkeyword{ncurvB}) parameter. A lower number gives a tighter +curve. (The distance between the beginning of the arc and the first control +point is one-half \Lkeyword{ncurvA} times the distance between the two endpoints.) + +\begin{BDef} +\LcsStar{nccircle}\OptArgs\OptArg*{\Largb{arrows}}\Largb{nodeA}\Largb{nodeB} +\end{BDef} + +\Lcs{nccircle} draws a circle, or part of a circle, that, if complete, would +pass through the center of the node counterclockwise, at an angle of +\Lkeyword{angleA}. + +\begin{LTXexample} +\vrule width 0pt height 1.4cm +\rnode{A}{\textbf{back}} +\nccircle[nodesep=3pt]{->}{A}{.7cm} +\end{LTXexample} + +\Lcs{nccircle} can only connect a node to itself; it is the only node +connection with this property. \Lcs{nccircle} is also special because it has an +additional argument, for specifying the radius of the circle. + + +The last two node connections are also special. Rather than connecting the +nodes with an open curve, they enclose the nodes in a box or curved box. You +can think of them as variants of \Lcs{ncline} and \Lcs{ncarc}. In both cases, the +half the width of the box is + \LKeyword{boxsize=dim} +You have to set this yourself to the right size, so that the nodes fit inside +the box. The \Lkeyword{boxsize} parameter actually sets the \Lkeyword{boxheight} and +\Lkeyword{boxdepth} parameters. The ends of the boxes extend beyond the nodes by +\Lkeyword{nodesepA} and \Lkeyword{nodesepB}. + + +\begin{BDef} +\LcsStar{ncbox}\OptArgs\Largb{nodeA}\Largb{nodeB} +\end{BDef} + + \Lcs{ncbox} encloses the nodes in a box with straight sides. For example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}[shift=*](4,2.5) + \rput[bl](.5,0){\rnode{A}{Idea 1}} + \rput[tr](3.5,2){\rnode{B}{Idea 2}} + \ncbox[nodesep=.5cm,boxsize=.6,linearc=.2, + linestyle=dashed]{A}{B} +\end{pspicture} +\end{LTXexample} + +\begin{BDef} +\LcsStar{ncarcbox}\OptArgs\Largb{nodeA}\Largb{nodeB} +\end{BDef} + + \Lcs{ncarcbox} encloses the nodes in a curved box that is \Lkeyword{arcangleA} away +from the line connecting the two nodes. + +\begin{LTXexample}[width=5cm] +\begin{pspicture}[shift=*](4,2.5) + \rput[bl](.5,0){\rnode{A}{1}} + \rput[tr](3.5,2){\rnode{B}{2}} + \ncarcbox[nodesep=.2cm,boxsize=.4,linearc=.4, + arcangle=50]{<->}{A}{B} +\end{pspicture} +\end{LTXexample} + +The arc is drawn counterclockwise from node A to node B. + + +There is one other node connection parameter that applies to all the node +connections, except \Lcs{ncarcbox}: + \LKeyword{offset=dim} +(You can also set \Lkeyword{offsetA} and \Lkeyword{offsetB} independently.) This shifts the +point where the connection joins up by (given the convention that +connections go from left to right). + +There are two main uses for this parameter. First, it lets you make two +parallel lines with \Lcs{ncline}, as in the following example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}[shift=*](3.5,2.5) + \cnodeput(0,0){A}{X} + \cnodeput(3,2){B}{Y} + \psset{nodesep=3pt,offset=4pt,arrows=->} + \ncline{A}{B} + \ncline{B}{A} +\end{pspicture} +\end{LTXexample} + +Second, it lets you join a node connection to a rectangular node at a right +angle, without limiting yourself to positions that lie directly above, below, +or to either side of the center of the node. This is useful, for example, if +you are making several connections to the same node, as in the following +example: + +\begin{LTXexample} + \rnode{A}{Word1} and \rnode{B}{Word2} and \rnode{C}{Word3} + \ncbar[offsetB=4pt,angleA=-90,nodesep=3pt]{->}{A}{B} + \ncbar[offsetA=4pt,angleA=-90,nodesep=3pt]{->}{B}{C} +\end{LTXexample} + +Sometimes you might be aligning several nodes, such as in a tree, and you want +to ends or the arms of the node connections to line up. This won't happen +naturally if the nodes are of different size, as you can see in this example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}[shift=*](3.5,3) + \psset{unit=.9} + \Huge + \cnode(1,3){4pt}{a} + \rput[B](0,0){\Rnode{b}{H}} + \rput[B](2,0){\Rnode{c}{a}} + \psset{angleA=90,armA=1,nodesepA=3pt} + \ncdiagg{b}{a} + \ncdiagg{c}{a} +\end{pspicture} +\end{LTXexample} + +%%??? FIXME +If you set the \Lkeyword{nodesep} or \Lkeyword{arm} parameter to a negative value, PSTricks +will measure the distance to the beginning of the node connection or to the +end of the arm relative to the center of the node, rather than relative to the +boundary of the node or the beginning of the arm. Here is how we fix the +previous example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}[shift=*](3.5,3) + \psset{unit=.9} + \Huge + \cnode(1,3){4pt}{a} + \rput[B](0,0){\Rnode{b}{H}} + \rput[B](2,0){\Rnode{c}{a}} + \psset{angleA=90,armA=1,YnodesepA=12pt} + \ncdiagg{b}{a} + \ncdiagg{c}{a} +\end{pspicture} +\end{LTXexample} + +Note also the use of \Lcs{Rnode}. + +One more parameter trick: By using the \Lkeyword{border} parameter, you can create +the impression that one node connection passes over another. + +The node connection commands make interesting drawing tools as well, as an +alternative to \Lcs{psline} for connecting two points. There are variants of +the node connection commands for this purpose. Each begins with \verb|pc| (for +``point connection'') rather than \verb|nc|. E.g., + \verb|\pcarc{<->}(3,4)(6,9)| +gives the same result as + +\begin{lstlisting} + \pnode(3,4){A} + \pnode(6,9){B} + \pcarc{<->}{A}{B} +\end{lstlisting} + +Only \Lcs{nccircle} does not have a \nxLcs{pc} variant: + + + + +\begin{center} +\addtolength{\tabcolsep}{8pt} +\def\c#1{\Largb{node#1}} +\begin{tabular}{ll}\bottomrule + \emph{Command} & \emph{Corresponds to:}\\\midrule + + \Lcs{pcline}\OptArg*{\Largb{arrows}}\c1\c2 & \Lcs{ncline}\\ + + \Lcs{pccurve}\OptArg*{\Largb{arrows}}\c1\c2 & \Lcs{nccurve}\\ + + \Lcs{pcarc}\OptArg*{\Largb{arrows}}\c1\c2 & \Lcs{ncarc}\\ + + \Lcs{pcbar}\OptArg*{\Largb{arrows}}\c1\c2 & \Lcs{ncbar}\\ + + \Lcs{pcdiag}\OptArg*{\Largb{arrows}}\c1\c2 & \Lcs{ncdiag}\\ + + \Lcs{pcdiagg}\OptArg*{\Largb{arrows}}\c1\c2 & \Lcs{ncdiagg}\\ + + \Lcs{pcangle}\OptArg*{\Largb{arrows}}\c1\c2 & \Lcs{ncangle}\\ + + \Lcs{pcangles}\OptArg*{\Largb{arrows}}\c1\c2 & \Lcs{ncangles}\\ + + \Lcs{pcloop}\OptArg*{\Largb{arrows}}\c1\c2 & \Lcs{ncloop}\\ + + \Lcs{pcbox}\c1\c2 & \Lcs{ncbox}\\ + + \Lcs{pcarcbox}\c1\c2 + & \Lcs{ncarcbox} +\end{tabular} +\end{center} + + + + +\section{Node connections labels: I}\label{S-nodelabels} + +Now we come to the commands for attaching labels to the node connections. The +label command must come right after the node connection to which the label is +to be attached. You can attach more than one label to a node connection, and a +label can include more nodes. + +The node label commands must end up on the same \TeX{} page as the node +connection to which the label corresponds. + +There are two groups of connection labels, which differ in how they select the +point on the node connection. In this section we describe the first group: + +\begin{BDef} + \LcsStar{ncput}\OptArgs\Largb{stuff}\\ + \LcsStar{naput}\OptArgs\Largb{stuff}\\ + \LcsStar{nbput}\OptArgs\Largb{stuff} +\end{BDef} + + +These three command differ in where the labels end up with respect to the line: + +\begin{tabular}{@{}ll} + \Lcs{ncput} & \emph{on} the line\\ + \Lcs{naput} & \emph{above} the line\\ + \Lcs{nbput} & \emph{below} the line +\end{tabular} + +(using the convention that node connections go from left to right). + +Here is an example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(3.5,1.5) + \cnode(0,0){.5cm}{root} + \cnode*(3,1.5){4pt}{A} + \cnode*(3,0){4pt}{B} + \cnode*(3,-1.5){4pt}{C} + \psset{nodesep=3pt} + \ncline{root}{A} + \naput{above} + \ncline{root}{B} + \ncput*{on} + \ncline{root}{C} + \nbput{below} +\end{pspicture} +\end{LTXexample} + +\Lcs{naput} and \Lcs{nbput} use the same algorithm as \Lcs{uput} for displacing +the labels, and the distance beteen the line and labels is \Lkeyword{labelsep} (at +least if the lines are straight). + +\Lcs{ncput} uses the same system as \Lcs{rput} for setting the reference +point. You change the reference point by setting the + \LKeyword{ref=ref} +parameter. + +Rotation is also controlled by a graphics parameter: + \LKeyword{nrot=rot} + can be in any of the forms suitable for \Lcs{rput}, and you can also use +the form +\verb|{:}| + +The angle is then measured with respect to the node connection. E.g., if the +angle is \verb|{:U}|, then the label runs parallel to the node connection. Since +the label can include other put commands, you really have a lot of control +over the label position. + +The next example illustrates the use \verb|{:}|, the \Lkeyword{offset} parameter, +and \Lcs{pcline}: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,2.3) + \pspolygon(0,0)(4,2)(4,0) + \pcline[offset=12pt]{|-|}(0,0)(4,2) + \ncput*[nrot=:U]{Length} +\end{pspicture} +\end{LTXexample} + +Here is a repeat of an earlier example, now using \verb|{:}|: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(3.5,1.5) + \cnode(0,0){.5cm}{root} + \cnode*(3,1.5){4pt}{A} + \cnode*(3,0){4pt}{B} + \cnode*(3,-1.5){4pt}{C} + \psset{nodesep=3pt,nrot=:U} + \ncline{root}{A} + \naput{above} + \ncline{root}{B} + \ncput*{on} + \ncline{root}{C} + \nbput{below} +\end{pspicture} +\end{LTXexample} + +The position on the node connection is set by the + \LKeyword{npos=num} +parameter, roughly according to the following scheme: Each node connection has +potentially one or more segments, including the arms and connecting lines. +A number \Lkeyword{npos} between 0 and 1 picks a point on the first segment from node +\verb|A| to \verb|B| (fraction \Lkeyword{npos} from the beginning to the end of the segment), +a number between 1 and 2 picks a number on the second segment, and so on. + +Each node connection has its own default value of \Lkeyword{npos}. If you leave the +\Lkeyword{npos} parameter value empty (e.g., \verb|[npos=]|), then the default is +substituted. This is the default mode. + +Here are the details for each node connection: +\begin{center} +% \catcode`\@=11\setbox\@tempboxa=\hbox{1.5}% +% \edef\t#1{\noexpand\hbox to \the\wd\@tempboxa{\noexpand\tt\noexpand\hss#1}} + \begin{tabular}{lccc} + \emph{Connection} & \emph{Segments} & \emph{Range} & \emph{Default}\\[2pt] + \Lcs{ncline} & 1 & $0\leq pos\leq 1$ & 0.5\\ + \Lcs{nccurve} & 1 & $0\leq pos\leq 1$ & 0.5\\ + \Lcs{ncarc} & 1 & $0\leq pos\leq 1$ & 0.5\\ + \Lcs{ncbar} & 3 & $0\leq pos\leq 3$ & 1.5\\ + \Lcs{ncdiag} & 3 & $0\leq pos\leq 3$ & 1.5\\ + \Lcs{ncdiagg} & 2 & $0\leq pos\leq 2$ & 0.5\\ + \Lcs{ncangle} & 3 & $0\leq pos\leq 3$ & 1.5\\ + \Lcs{ncangles} & 4 & $0\leq pos\leq 4$ &1.5\\ + \Lcs{ncloop} & 5 & $0\leq pos\leq 5$ & 2.5\\ + \Lcs{nccircle} & 1 & $0\leq pos\leq 1$ & 0.5\\ + \Lcs{ncbox} & 4 & $0\leq pos\leq 4$ & 0.5\\ + \Lcs{ncarcbox} & 4 & $0\leq pos\leq 4$ & 0.5 + \end{tabular} +\end{center} + + +Here is an example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,3) +\rput[tl](0,3){\rnode{A}{\psframebox{Node A}}} +\rput[br](3.5,0){\ovalnode{B}{Node B}} +\ncangles[angleA=-90,arm=.4cm,linearc=.15]{A}{B} +\ncput*{d} +\nbput[nrot=:D,npos=2.5]{par} +\end{pspicture} +\end{LTXexample} + +With \Lcs{ncbox} and \Lcs{ncarcbox}\, the segments run counterclockwise, starting +with the lower side of the box. Hence, with \Lcs{nbput} the label ends up +outside the box, and with \Lcs{naput} the label ends up inside the box. + +\begin{LTXexample}[width=5cm] +\begin{pspicture}[shift=*](4,2.5) + \rput[bl](.5,0){\rnode{A}{1}} + \rput[tr](3.5,2){\rnode{B}{2}} + \ncarcbox[nodesep=.2cm,boxsize=.4,linearc=.4, + arcangle=50,linestyle=dashed]{<->}{A}{B} + \nbput[nrot=:U]{set} + \nbput[npos=2]{II} +\end{pspicture} +\end{LTXexample} + +If you set the parameter + \LKeyword{shortput=none/nab/tablr/tab} +to \Lkeyval{nab}, then immediately following a node connection or another node +connection label you can use \verb|^| instead of \Lcs{naput} and \verb|_| instead of +\Lcs{nbput}. + +\begin{LTXexample}[width=5cm] +\begin{pspicture}[shift=*](3.5,1.5) + \cnode(0,0){.5cm}{root} + \cnode*(3,1.5){4pt}{A} + \cnode*(3,-1.5){4pt}{C} + \psset{nodesep=3pt,shortput=nab} + \ncline{root}{A}^{$x$} + \ncline{root}{C}_{$y$} +\end{pspicture} +\end{LTXexample} + +You can still have parameter changes with the short \verb|^| and \verb|_| forms. Another +example is given on page~\pageref{nab-example}. + +If you have set \Lkeyset{shortput=nab}, and then you want to use a true \verb|^| or \verb|_| +character right after a node connection, you must precede the \verb|^| or \verb|_| by +\verb|{}| so that PSTricks does not convert it to \Lcs{naput} or \Lcs{nbput}. + +You can change the characters that you use for the short form with the + +\begin{BDef} +\Lcs{MakeShortNab}\Largb{}\Largb{} +\end{BDef} + +command.\footnote{% +You can also use \Lcs{MakeShortNab} if you want to use \texttt{\textasciicircum} and \texttt{\_} with +non-standard category codes. Just invoke the command after you have made your +\Lcs{catcode} changes.} + +The \Lkeyset{shortput=tablr} and \Lkeyset{shortput=tab} options are described on +pages~\pageref{tablr} and \pageref{tab}, respectively. + +\section{Node connection labels: II} + +Now the second group of node connections: +\begin{BDef} +\LcsStar{tvput}\OptArgs\Largb{stuff}\\ +\LcsStar{tlput}\OptArgs\Largb{stuff}\\ +\LcsStar{trput}\OptArgs\Largb{stuff}\\ +\LcsStar{thput}\OptArgs\Largb{stuff}\\ +\LcsStar{taput}\OptArgs\Largb{stuff}\\ +\LcsStar{tbput}\OptArgs\Largb{stuff} +\end{BDef} + +The difference between these commands and the \verb|\n*put| commands is that these +find the position as an intermediate point between the centers of the nodes, +either in the horizontal or vertical direction. These are good for trees and +mathematical diagrams, where it can sometimes be nice to have the labels be +horizontally or vertically aligned. The \verb|t| stands for ``tree''. + +You specify the position by setting the + \LKeyword{tpos=num} +parameter. + +\Lcs{tvput}, \Lcs{tlput} and \Lcs{trput} find the position that lies fraction + in the \emph{vertical} direction from the upper node to the lower +node. \Lcs{thput}, \Lcs{taput} and \Lcs{tbput} find the position that lies fraction + in the \emph{horizontal} direction from the left node to the right +node. +Then the commands put the label on or next to the line, as follows: +\begin{center} +\begin{tabular}{lll}\toprule + \emph{Command} & \emph{Direction} & \emph{Placement}\\\midrule + \Lcs{tvput} & vertical & middle\\ + \Lcs{tlput} & vertical & left\\ + \Lcs{trput} & vertical & right\\ + \Lcs{thput} & horizontal & middle\\ + \Lcs{taput} & horizontal & above\\ + \Lcs{tbput} & horizontal & below\\\bottomrule +\end{tabular} +\end{center} + +Here is an example: +\begin{LTXexample}[pos=t] + \[ + \setlength{\arraycolsep}{1.1cm} + \begin{array}{cc} + \Rnode{a}{(X-A)} & \Rnode{b}{A} \\[1.5cm] + \Rnode{c}{x} & \Rnode{d}{\tilde{X}} + \end{array} + \psset{nodesep=5pt,arrows=->} \everypsbox{\scriptstyle} + \ncline{a}{c}\tlput{r} \ncline{a}{b}\taput{u} + \ncline[linestyle=dashed]{c}{d}\tbput{b} + \ncline{b}{d}\trput{s} + \everypsbox{} + \begin{array}{cc} + \rnode{a}{(X-A)} & \rnode{b}{a} \\[1.5cm] + \rnode{c}{x} & \rnode{d}{\tilde{X}} + \end{array} + \psset{nodesep=5pt,arrows=->}\everypsbox{\scriptstyle} + \ncline{a}{c}\nbput{r} \ncline{a}{b}\naput{u} + \ncline[linestyle=dashed]{c}{d}\nbput{b} + \ncline{b}{d}\naput{s} + \] +\end{LTXexample} + +On the left is the diagram with \Lcs{tlput}, \Lcs{trput}, \Lcs{tbput} and \Lcs{Rnode}, +as shown in the code. On the right is the same diagram, but with \Lcs{naput}, +\Lcs{nbput} and \Lcs{rnode}. + +These do not have a rotation argument or parameter. However, you can rotate +\Larg{} in 90 degree increments using box rotations (e.g., \Lcs{rotateleft}). + +If you set \Lkeyset{shortput=tablr}, then you can use the following single-character +abbreviations for the \verb|t| put commands:\label{tablr} +\begin{center} + \begin{tabular}{rl}\toprule + \emph{Char.} & \emph{Short for:}\\\midrule +\rule{0pt}{4ex} + \verb|^| & \Lcs{taput} \\ + \verb|_| & \Lcs{tbput} \\ + \verb|<| & \Lcs{tlput} \\ + \verb|>| & \Lcs{trput}\\\bottomrule + \end{tabular} +\end{center} + + +You can change the character abbreviations with + +\begin{BDef} +\Lcs{MakeShortTablr}\Largb{}\Largb{}\Largb{}\Largb{} +\end{BDef} + +The \verb|t| put commands, including an example of \Lkeyset{shortput=tablr}, will be +shown further when we get to mathematical diagrams and trees. + +The\XInfoDanger{~} node macros use \Lcs{pstVerb} and \Lcs{pstverbscale}. + +\section{Attaching labels to nodes} + +The command + +\begin{BDef} +\LcsStar{nput}\OptArgs\Largb{refangle}\Largb{name}\Larg{stuff} +\end{BDef} + + +affixes \Largb{} to node \Largb{}. It is positioned distance \Lkeyword{labelsep} from +the node, in the direction \Largb{} from the center of the node. The +algorithm is the same as for \Lcs{uput}. If you want to rotate the node, set the + \LKeyword{rot=rot} +parameter, where \Larg{} is a rotation that would be valid for \Lcs{rput}.% +\footnote{Not to be confused with the \Lkeyword{nput} parameter.} +The position of the label also takes into account the \Lkeyword{offsetA} +parameter. If \Lkeyword{labelsep} is negative, then the distance is from the center +of the node rather than from the boundary, as with \Lkeyword{nodesep}. + +Here is how I used \Lcs{nput} to mark an angle in a previous example: + +\begin{LTXexample}[width=4cm] +\begin{pspicture}(4,3) +\rput[br](4,0){\ovalnode{B}{Node B}} +\rput[tl](0,3){\rnode{A}{\psframebox{Node A}}} +\nput[labelsep=0]{-70}{A}{% + \psarcn(0,0){.4cm}{0}{-70} + \uput{.4cm}[-35](0,0){\texttt{angleA}}} +\ncangle[angleA=-70,angleB=90,armB=1cm,linewidth=1.2pt]{A}{B} +\ncput[nrot=:U,npos=1]{\psframe[dimen=middle](0,0)(.35,.35)} +\end{pspicture} +\end{LTXexample} + +\section{Mathematical diagrams and graphs}\label{S-psmatrix} + +For some applications, such as mathematical diagrams and graphs, it is useful +to arrange nodes on a grid. You can do this with alignment environments, such +as \TeX's \Lcs{halign} primitive, \LaTeX's \Lenv{tabular} environment, and \AmS-\TeX's +\Lcs{matrix}, but PSTricks contains its own alignment environment that is +especially adapted for this purpose: + +\begin{BDef} +\Lcs{psmatrix}\OptArgs \ldots \Lcs{endpsmatrix} +\end{BDef} + +Here is an example +\begin{LTXexample}[width=5cm] + $ + \psmatrix[colsep=1cm,rowsep=1cm] + & A \\ + B & E & C \\ + & D & + \endpsmatrix + $ +\end{LTXexample} + +As an alignment environment, \Lcs{psmatrix} is similar to \AmS-\TeX's +\Lcs{matrix}. There is no argument for specifying the columns. Instead, you can +just use as many columns as you need. The entries are horizontally centered. +Rows are ended by \verb|\\|. \Lcs{psmatrix} can be used in or out of math mode. + +Our first example wasn't very interesting, because we didn't make use of the +nodes. Actually, each entry is a node. The name of the node in row and +column \Largb{} is \verb|{,}|, with no spaces. Let's see some node +connections: + +\begin{LTXexample}[width=5cm] + $ + \psmatrix[colsep=1cm] + & X \\ + Y & Z + \endpsmatrix + \everypsbox{\scriptstyle}% + \psset{nodesep=3pt,arrows=->} + \ncline{1,2}{2,1} + \tlput{f} + \ncline{1,2}{2,2} + \trput{g} + \ncline[linestyle=dotted]{2,1}{2,2} + \tbput{h} + $ +\end{LTXexample} + +You can include the node connections inside the \Lcs{psmatrix}, in the last entry +and right before \Lcs{endpsmatrix}. One advantage to doing this is that +\Lkeyset{shortput=tab} is the default within a \Lcs{psmatrix}. + +\begin{LTXexample} +$ \begin{psmatrix} + U \\ + & X\times_Z Y & X \\ + & Y & Z + \psset{arrows=->,nodesep=3pt} + \everypsbox{\scriptstyle} + \ncline{1,1}{2,2}_{y} + \ncline[doubleline=true,linestyle=dashed]{-}{1,1}{2,3}^{x} + \ncline{2,2}{3,2}<{q} + \ncline{2,2}{2,3}_{p} + \ncline{2,3}{3,3}>{f} + \ncline{3,2}{3,3}_{g} + \end{psmatrix} $ +\end{LTXexample} + +You can change the kind of nodes that are made by setting the + \LKeyword{mnode=type} +parameter. Valid types are \Lkeyval{R}, +\Lkeyval{r}, +\Lkeyval{C}, +\Lkeyval{f}, \Lkeyval{p}, \Lkeyval{circle}, \Lkeyval{oval}, \Lkeyval{dia}, +\Lkeyval{tri}, \Lkeyval{dot} and \Lkeyval{none}, +standing for \Lcs{Rnode}, \Lcs{rnode}, \Lcs{Cnode}, \Lcs{fnode}, +\Lcs{pnode}, \Lcs{circlenode}, \Lcs{ovalnode}, \Lcs{dotnode} and no node, +respectively. Note that for circles, you use \Lkeyset{mnode=C} and set the radius +with the \Lkeyword{radius} parameter. + +For example:\label{nab-example} +\begin{LTXexample} + \psmatrix[mnode=circle,colsep=1] + & A \\ + B & E & C \\ + & D & + \endpsmatrix + \psset{shortput=nab,arrows=->,labelsep=3pt} + \small + \ncline{2,2}{2,3}^[npos=.75]{a} + \ncline{2,2}{2,1}^{b} + \ncline{3,2}{2,1}^{c} + \ncarc[arcangle=-40,border=3pt]{3,2}{1,2}% + _[npos=.3]{d}^[npos=.7]{e} + \ncarc[arcangle=12]{1,2}{2,1}^{f} + \ncarc[arcangle=12]{2,1}{1,2}^{g} +\end{LTXexample} + +Note that a node is made only for the non-empty entries. You can also specify +a node for the empty entries by setting the + \LKeyword{emnode=type} +parameter. + +You can change parameters for a single entry by starting this entry with the +parameter changes, enclosed in square brackets. Note that the changes affect +the way the node is made, but not contents of the entry (use \Lcs{psset} for +this purpose). For example: +\begin{LTXexample} +$ \psmatrix[colsep=1cm] + & [mnode=circle] X \\ + Y & Z + \endpsmatrix + \psset{nodesep=3pt,arrows=->} + \ncline{1,2}{2,1} + \ncline{1,2}{2,2} + \ncline[linestyle=dotted]{2,1}{2,2} $ +\end{LTXexample} + +If you want your entry to begin with a \verb|[| that is not meant to indicate +parameter changes, the precede it by \verb|{}|. + +You can assign your own name to a node by setting the + \LKeyword{name=} +parameter at the beginning of the entry, as described above. You can still +refer to the node by \verb|{,}|, but here are a few reasons for giving +your own name to a node: +\begin{itemize} + \item The name may be easier to keep track of; + \item Unlike the \verb|{,}| names, the names you give remain valid + even when you add extra rows or columns to your matrix. + \item The names remain valid even when you start a new \Lcs{psmatrix} that + reuses the \verb|{,}| names. +\end{itemize} + + +Here a few more things you should know: +\begin{itemize} + \item The baselines of the nodes pass through the centers of the + nodes. \Lcs{psmatrix} achieves this by setting the + \LKeyword{nodealign=true/false} +parameter to \verb|true|. You can also set this parameter outside of \Lcs{psmatrix} +when you want this kind of alignment. + + \item You can left or right-justify the nodes by setting the + \LKeyword{mcol=l/r/c} +parameter. \verb|l|, \verb|r| and \verb|c| stand for \verb|left|, \verb|right| and \verb|center|, +respectively. + + \item The space between rows and columns is set by the + \LKeyword{rowsep=dim} and + \LKeyword{colsep=dim} +parameters. + + \item If you want all the nodes to have a fixed width, set + \LKeyword{mnodesize=dim} +to a positive value. + + \item If \Lcs{psmatrix} is used in math mode, all the entries are set in math + mode, but you can switch a single entry out of math mode by starting and + ending the entry with \verb|$|. %$ + + \item The radius of the \verb|c| \Lkeyword{mnode} (corresponding to \Lcs{cnode}) is set by +the \Lkeyword{radius} parameter. + + \item Like in \LaTeX, you can end a row with \verb|\\[]| to insert an extra + space between rows. + + \item The command \Lcs{psrowhookii} is executed, if defined, at the beginning of + every entry in row \verb|ii| (row 2), and the command \Lcs{pscolhookv} is executed at + athe beginning of every entry in column \verb|v| (etc.). You can use these hooks, + for example, to change the spacing between two columns, or to use a special + \Lkeyword{mnode} for all the entries in a particular row. + + \item An entry can itself be a node. You might do this if you want an entry + to have two shapes. + + \item If you want an entry to stretch across several (\Largb{}) columns, use the + +\begin{BDef} +\Lcs{psspan}\Largb{int} +\end{BDef} + + \emph{at the end of the entry}. This is like Plain \TeX's \Lcs{multispan}, or + \LaTeX's \Lcs{multicolumn}, but the template for the current column (the first + column that is spanned) is still used. If you want wipe out the template as + well, use \Lcs{multispan}\Largb{} \emph{at the beginning of the entry} instead. + If you just want to wipe out the template, use \Lcs{omit} before the entry. + + \item \Lcs{psmatrix} can be nested, but then all node connections and other + references to the nodes in the \verb|{,}| form for the nested matrix + \emph{must go inside} the \Lcs{psmatrix}. This is how PSTricks decides which + matrix you are referring to. It is still neatest to put all the node + connections towards the end; just be sure to put them before \Lcs{endpsmatrix}. + Be careful also not to refer to a node until it actually appears. The whole + matrix can itself go inside a node, and node connections can be made as + usual. This is not the same as connecting nodes from two different + \Lcs{psmatrix}'s. To do this, you must give the nodes names and refer to them + by these names. + +\end{itemize} + +\section{Obsolete put commands} + +This is old documentation, but these commands will continue to be supported. + +There is also an obsolete command \Lcs{Lput} for putting labels +next to node connections. The syntax is + +\begin{BDef} + \Lcs{Lput}\Largb{}\Largs{}\Largb{}\Largr()\Largb{} +\end{BDef} + +It is a combination of \Lcs{Rput} and \Lcs{lput}, equivalent to + +\begin{BDef} + \Lcs{lput}\Largr{}\Largb{\Lcs{Rput}\Largb{}\Largs{}\Largb{}\Largr{0,0}\Largb{}} +\end{BDef} + +\Lcs{Mput} is a short version of \Lcs{Lput} with no +\verb|{}| or \verb|()| argument. \Lcs{Lput} and \Lcs{Mput} remain part of +PSTricks only for backwards compatibility. + +Here are the node label commands: + +\begin{BDef} +\LcsStar{lput}\OptArgs\Largs{refpoint}\Largb{rotation}\Largr{pos}\Largb{stuff} +\end{BDef} + +The \verb|l| stands for ``label''. Here is an example illustrating the use of the +optional star and \verb|:| with \Lcs{lput}, as well as the use of the +\Lkeyword{offset} parameter with \Lcs{pcline}: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,2.3) + \pspolygon(0,0)(4,2)(4,0) + \pcline[offset=12pt]{|-|}(0,0)(4,2) + \lput*{:U}{Length} +\end{pspicture} +\end{LTXexample} + +(Remember that with the \nxLcs{?put} commands, you can omit the coordinate if you +include the angle of rotation. You are likely to use this feature with the +node label commands.) + +With \Lcs{lput} and \Lcs{rput}, you have a lot of control over the position of the +label. E.\,g., + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,2) + \pcline(0,0)(4,2) + \lput{:U}{\rput[r]{N}(0,.4){label}} +\end{pspicture} +\end{LTXexample} + +puts the label upright on the page, with right side located .4 centimeters +``above'' the position 0.5 of the node connection (above if the node +connection points to the right). However, the \Lcs{aput} and \Lcs{bput} commands +described below handle the most common cases without \Lcs{rput}.\footnote{% +There is also an obsolete command \Lcs{Lput} for putting labels +next to node connections. The syntax is + +\begin{BDef} + \LcsStar{Lput}\Largb{}\Largs{}\Largb{}\Largr{}\Largb{} +\end{BDef} + +It is a combination of \Lcs{Rput} and \Lcs{lput}, equivalent to + +\begin{BDef} + \LcsStar{lput}\Largr{}\Largb{\Lcs{Rput}\Largb{}\Largs{}\Largb{}\Largr{0,0}\Largb{}} +\end{BDef} + +\Lcs{Mput} is a short version of \Lcs{Lput} with no +\texttt{\{\}} or \texttt{()} argument. \Lcs{Lput} and \Lcs{Mput} remain part of +PSTricks only for backwards compatibility.} + +\begin{BDef} +\LcsStar{aput}\Largs{labelsep}\Largb{angle}\Largr{pos}\Largb{stuff} +\end{BDef} + + \Largb{} is positioned distance \Lcs{pslabelsep} \emph{above} the node +connection, given the convention that node connections point to the right. +\Lcs{aput} is a node-connection variant of \Lcs{uput}. For example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,2) + \pspolygon(0,0)(4,2)(4,0) + \pcline[linestyle=none](0,0)(4,2) + \aput{:U}{Hypotenuse} +\end{pspicture} +\end{LTXexample} + +\begin{BDef} +\LcsStar{bput}\Largs{labelsep}\Largb{angle}\Largr{pos}\Largb{stuff} +\end{BDef} + + This is like \Lcs{aput}, but \Largb{} is positioned \emph{below} the node +connection. + + + It is fairly common to want to use the default position and rotation with +these node connections, but you have to include at least one of these +arguments. Therefore, PSTricks contains some variants: + +\begin{BDef} +\Lcs{mput}\Largs{refpoint}\Largb{stuff}\\ +\Lcs{Aput}\Largs{labelsep}\Largb{stuff}\\ +\Lcs{Bput}\Largs{labelsep}\Largb{stuff} +\end{BDef} + +of \Lcs{lput}, \Lcs{aput} and \Lcs{bput}, respectively, that have no angle or +positioning argument. For example: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,2) + \cnode*(0,0){3pt}{A} + \cnode*(4,2){3pt}{B} + \ncline[nodesep=3pt]{A}{B} + \mput*{1} +\end{pspicture} +\end{LTXexample} + +Here is another: + +\begin{LTXexample}[width=5cm] +\begin{pspicture}(4,2) + \pcline{<->}(0,0)(4,2) + \Aput{Label} +\end{pspicture} +\end{LTXexample} \clearpage -\setcounter{page}{33} \part{New commands} \section{Setting bounding box nodes with \nxLcs{psDefBoxNodes}} @@ -105,6 +1525,8 @@ characters, like umlauts or an active \PS\ character, like \texttt{(}. \end{LTXexample} + + \clearpage %-------------------------------------------------------------------------------------- @@ -812,7 +2234,7 @@ line from \verb|+| to \verb|+|. \curvepnode{2}{\pfn}{P}% sets P, Ptang \normalvec(Ptang){Q}\uput[-45](P){P} \psxline[linecolor=red]{<->}(P){-(Ptang)}{1.5(Ptang)} -\psxline[linecolor=blue]{->}(P){}{.5(Q)}%can use {} for {(0,0)} +\psxline[linecolor=blue]{->}(P){}{.5(Q)}%can use } for {(0,0)} \end{pspicture} \end{LTXexample} \vspace{2pc} diff --git a/Master/texmf-dist/doc/generic/pst-node/pst-node97.tex b/Master/texmf-dist/doc/generic/pst-node/pst-node97.tex new file mode 100644 index 00000000000..5df456f3d0b --- /dev/null +++ b/Master/texmf-dist/doc/generic/pst-node/pst-node97.tex @@ -0,0 +1,390 @@ +%% BEGIN: pst-node.tex +%% Generated on <1993/3/12> from `pst-node.doc'. +%% For use with the PostScript header file `pst-node.pro'. +%% +\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. +%% +\csname PSTnodesLoaded\endcsname +\let\PSTnodesLoaded\endinput +\ifx\PSTricksLoaded\endinput\else +\def\next{\input pstricks.tex}\expandafter\next +\fi +\edef\TheAtCode{\the\catcode`\@} +\catcode`\@=11 +\pstheader{pst-node.pro} +\def\pst@nodedict{tx@NodeDict begin } +\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} +\def\tx@NewNode{NewNode } +\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}} +\def\tx@InitPnode{InitPnode } +\def\pnode{\@ifnextchar({\pnode@}{\pnode@(0,0)}} +\def\pnode@(#1)#2{% +\pst@@getcoor{#1}% +\pst@newnode{#2}{10}{\pst@coor}{\tx@InitPnode}% +\ignorespaces} +\def\tx@InitCnode{InitCnode } +\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} +\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}} +\def\circlenode{\def\pst@par{}\pst@object{circlenode}} +\def\circlenode@i#1{\pst@makebox{\pscirclebox@ii{\cnodeput@iii{#1}}}} +\def\tx@GetRnodePos{GetRnodePos } +\def\tx@InitRnode{InitRnode } +\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} +\def\tx@InitRNode{InitRNode } +\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} +\def\tx@GetOnodePos{GetOnodePos } +\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}} +\def\tx@GetCenter{GetCenter } +\def\tx@GetAngle{GetAngle } +\def\tx@GetEdge{GetEdge } +\def\tx@GetPos{GetPos } +\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} +\def\tx@InitNC{InitNC } +\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} +\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}} +\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} +\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} +\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} +\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} +\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} +\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} +\def\tx@LineMP{LineMP } +\def\tx@NCCoor{NCCoor } +\def\tx@NCLine{NCLine } +\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}} +\def\pcline{\def\pst@par{}\pst@object{pcline}} +\def\pcline@i{\pc@object\ncline@ii} +\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 }} +\def\tx@BezierMidpoint{BezierMidpoint } +\def\tx@GetArms{GetArms } +\def\tx@NCCurve{NCCurve } +\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}} +\def\pccurve{\def\pst@par{}\pst@object{pccurve}} +\def\pccurve@i{\pc@object\nccurve@ii} +\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}} +\def\pcarc{\def\pst@par{}\pst@object{pcarc}} +\def\pcarc@i{\pc@object\ncarc@ii} +\def\tx@AnglesMP{AnglesMP } +\def\tx@NCAngles{NCAngles } +\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 } +\def\pcangles{\def\pst@par{}\pst@object{pcangles}} +\def\pcangles@i{\pc@object\ncangles@ii} +\def\tx@NCAngle{NCAngle } +\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}} +\def\pcangle{\def\pst@par{}\pst@object{pcangle}} +\def\pcangle@i{\pc@object\ncangle@ii} +\def\tx@NCBar{NCBar } +\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}} +\def\pcbar{\def\pst@par{}\pst@object{pcbar}} +\def\pcbar@i{\pc@object\ncbar@ii} +\def\tx@NCDiag{NCDiag } +\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}} +\def\pcdiag{\def\pst@par{}\pst@object{pcdiag}} +\def\pcdiag@i{\pc@object\ncdiag@ii} +\def\tx@NCDiagg{NCDiagg } +\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}} +\def\pcdiagg{\def\pst@par{}\pst@object{pcdiagg}} +\def\pcdiagg@i{\pc@object\ncdiagg@ii} +\def\tx@LoopMP{LoopMP } +\def\tx@NCLoop{NCLoop } +\def\psset@loopsize#1{\pst@getlength{#1}\psk@loopsize} +\psset@loopsize{1cm} +\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}} +\def\pcloop{\def\pst@par{}\pst@object{pcloop}} +\def\pcloop@i{\pc@object\ncloop@ii} +\def\tx@NCCircle{NCCircle } +\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}} +\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}}% +\def\tx@LPutCoor{LPutCoor } +\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}}} +\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} +\def\mput{% +\begin@psput{\def\pst@rot{}\pst@getref{\end@psput\lput@i(\lputpos@default)}}} +\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}} +\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)}}} +\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 }} +\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} +\catcode`\@=\TheAtCode\relax +\endinput +%% +%% END: pst-node.tex -- cgit v1.2.3