Wie verwende ich getnodelist?

Wie verwende ich getnodelist?

Entnommen aus pst-nodeder Dokumentation von auf Seite 39:

Diese sehr kurze Beschreibung \getnodelisthilft mir (und vielleicht auch anderen) nicht, die Verwendung zu verstehen.

Bildbeschreibung hier eingeben

\getnodelistKönnen Sie mir ein Beispiel für die Verwendung von „non-empty“ geben <next command>?

Antwort1

Der Quelle nach zu urteilen pst-node.tex, gibt es keinen Unterschied zwischen

\getnodelist{<name>}{\command}(…)(…)…

Und

\getnodelist{<name>}{}(…)(…)… \command

Auch im letzteren Beispiel können Sie problemlos \PST@root(= <name>) und \pst@args(enthält die Nummer des letzten Knotens) verwenden.<name>

Die erste Version erzwingt eine systematischere Struktur ( \commandverwendet z. B. explizit die folgenden Knoten). Die Verwendung an anderer Stelle kann zu unerwarteten Ergebnissen führen.

Betrachten Sie das folgende Beispiel:

\documentclass[pstricks]{standalone}
\usepackage{pstricks,multido,pst-node}
\makeatletter
\def\myCircles#1{%
    \multido{\iCount=0+1}{\the\numexpr\pst@args+1\relax}{
        \pscircle*(\PST@root\iCount){#1}
    }
}
\makeatother
\begin{document}
    \begin{pspicture}(7,7)
    \getnodelist{P}{\myCircles{.25}}(2,2)(2,5)(5,2)(5,5)
    \end{pspicture}
    \begin{pspicture}(7,7)
    \getnodelist{P}{}(2,2)(2,5)(5,2)(5,5)\myCircles{.25}
    \end{pspicture}
\end{document}

Es gibt keinen Unterschied. Sie führen zum exakt gleichen Ergebnis.

Wenn Sie jedoch ein eigenes Makro bereitstellen möchten, z. B. \pstDottedNodes, haben Sie als Autor dieses \pstDottedNodesMakros keine Möglichkeit, ein voranzustellen \myCircles. (Dies wird noch deutlicher, wenn Sie die internen s vor dem Benutzer verbergen möchten <name>und \pstDottedNodesnur einen Parameter (den Radius) haben.)

\documentclass[pstricks]{standalone}
\usepackage{pstricks,multido,pst-node}
\makeatletter
\def\pstDottedNodes#1#2{\getnodelist{#1}{\myCircles{#2}}}
\def\myCircles#1{%
    \multido{\iCount=0+1}{\the\numexpr\pst@args+1\relax}{
        \pscircle*(\PST@root\iCount){#1}
    }
}
\makeatother
\begin{document}
\begin{pspicture}(7,7)
\pstDottedNodes{P}{.25}(2,2)(2,5)(5,2)(5,5)
\end{pspicture}
\end{document}

Antwort2

Hier ist ein kurzes Beispiel, das die Frage beantwortet und veranschaulicht, wie man aus einer Folge von Punkten ein (geschlossenes) Polygon zeichnet:

Bildbeschreibung hier eingeben

\documentclass{article}
\usepackage{multido,pst-node}% http://ctan.org/pkg/{multido,pst-node}
\makeatletter
\newcounter{mycount}
\newcommand{\drawpolygon}{%
  \setcounter{mycount}{\csname\PST@root nodecount\endcsname}% Extract number of nodes
    \stepcounter{mycount}\pnode(\PST@root 0){\PST@root\themycount}% Add extra node that matches origin node (for closed polygon)
  \multido{\iA=0+1,\iB=1+1}{\value{mycount}}{%
      \psline(\PST@root\iA)(\PST@root\iB)\psdot(\PST@root\iA)}% Draw line + dot
}
\makeatother
\begin{document}
\begin{pspicture}
    \SpecialCoor
    \getnodelist{P}{\drawpolygon}(1,1)(2,1)(2,2)(1,2)
    \degrees[5]
    \rput{0}(4,2){\getnodelist{Q}{\drawpolygon}(1;0)(1;1)(1;2)(1;3)(1;4)}
\end{pspicture}
\end{document}

Die Idee ist, zu verwenden, \getnodelistum anzurufen\drawpolygon nachAngabe einer Reihe von Knoten. Jeder Knoten hat einen Stammnamen (erstes Argument für \getnodelist), der in gespeichert ist \PST@root.

Antwort3

Werners Lösung mit einigen Modifikationen:

\documentclass{article}
\usepackage{multido,pst-node}

\newcommand\drawpolygon[1]{{%
  \psset{showpoints}
  \multido{\iA=0+1}{\csname#1nodecount\endcsname}{%
    \psline(#1\iA)(#1\the\numexpr\iA+1)}
  \psline(#1 0)(#1\csname#1nodecount\endcsname)}}

\begin{document}
\begin{pspicture}
    \getnodelist{P}{\drawpolygon{P}}(1,1)(2,1)(2,2)(1,2)
    \degrees[5]
    \rput{0}(4,2){\getnodelist{Q}{\drawpolygon{Q}}(1;0)(1;1)(1;2)(1;3)(1;4)}
\end{pspicture}
\end{document}

Antwort4

Bildbeschreibung hier eingeben

\documentclass[border=12pt]{standalone}
\usepackage{multido,pst-node}
\makeatletter

\newcommand\psPolygon[2][my@pst@node@name]{\getnodelist{#1}{\my@Polygon{#2}}}

\def\my@Polygon#1{%
    \pscustom[#1]
    {
        \psnline{-}(0,\csname\PST@root nodecount\endcsname){\PST@root}
        \closepath
    }
    \multido{\i=0+1}{\the\numexpr\pst@args+1\relax}{%
        \pscircle*(\PST@root\i){2pt}
    }\ignorespaces
}

\makeatother

\begin{document}
\begin{pspicture}(5,5)
\psPolygon{fillstyle=solid,fillcolor=orange,origin={2.5,2.5}}(0,0)(5,0)(5,5)(0,5)
\end{pspicture}

\qquad

\begin{pspicture}(-2,-2)(2,2)
\degrees[5]
\psPolygon[Karl]{fillstyle=solid,fillcolor=orange}(1;0)(1;1)(1;2)(1;3)(1;4)
\psline(Karl0)(Karl2)
\end{pspicture}

\end{document}

verwandte Informationen