¿Cómo utilizar getnodelist?

¿Cómo utilizar getnodelist?

Tomado de pst-nodela documentación de en la página 39:

Esta breve descripción \getnodelistno me ayuda (tal vez a otros también) a entender cómo usarlo.

ingrese la descripción de la imagen aquí

¿Podría darme un ejemplo de cómo usarlo \getnodelistcon no vacío <next command>?

Respuesta1

A juzgar por la fuente de pst-node.tex, no hay diferencia entre

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

y

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

Incluso en el último ejemplo puedes usar \PST@root(= <name>) y \pst@args(contiene el número del último <name>nodo) sin problema.

La primera versión fuerza una estructura más sistemática (por ejemplo, \commandutiliza explícitamente los siguientes nodos). Usarlo en otro lugar podría producir resultados inesperados.

Considere el siguiente ejemplo:

\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}

No hay diferencia. Producen exactamente el mismo resultado.

Pero si desea proporcionar una macro propia, digamos \pstDottedNodes, usted, como autor de esta \pstDottedNodesmacro, no tendrá la oportunidad de anteponer \myCircles. (Se vuelve aún más claro cuando desea ocultar los <name>mensajes internos al usuario y \pstDottedNodessolo tiene un parámetro (el radio).)

\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}

Respuesta2

A continuación se muestra un ejemplo rápido que responde a la pregunta que ilustra cómo dibujar un polígono (cerrado) a partir de una secuencia de puntos:

ingrese la descripción de la imagen aquí

\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}

La idea es utilizar \getnodelistpara llamar.\drawpolygon despuésespecificando un montón de nodos. Cada nodo tiene un nombre raíz (primer argumento de \getnodelist), almacenado en \PST@root.

Respuesta3

Solución de Werners con algunas modificaciones:

\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}

Respuesta4

ingrese la descripción de la imagen aquí

\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}

información relacionada