Entnommen aus pst-node
der Dokumentation von auf Seite 39:
Diese sehr kurze Beschreibung \getnodelist
hilft mir (und vielleicht auch anderen) nicht, die Verwendung zu verstehen.
\getnodelist
Kö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 ( \command
verwendet 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 \pstDottedNodes
Makros keine Möglichkeit, ein voranzustellen \myCircles
. (Dies wird noch deutlicher, wenn Sie die internen s vor dem Benutzer verbergen möchten <name>
und \pstDottedNodes
nur 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:
\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, \getnodelist
um 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
\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}