Por que \nodexn{(1,1)}{A} produz NA.x e NA.y estranhos?

Por que \nodexn{(1,1)}{A} produz NA.x e NA.y estranhos?
\documentclass[preview,border=2cm]{standalone}
\usepackage{pst-tools}
\usepackage{pst-node}
\psset{saveNodeCoors}


\begin{document}
\section*{With pnode}

\begin{pspicture}(3,3)
    \pnode(1,1){A}
    \rput(0,3){\psPrintValue{N-A.x}}
    \rput(0,0){\psPrintValue{N-A.y}}
\end{pspicture}

\section*{With nodexn}

\begin{pspicture}(3,3)
    \nodexn{(1,1)}{A}
    \rput(0,3){\psPrintValue{N-A.x}}
    \rput(0,0){\psPrintValue{N-A.y}}
\end{pspicture}
\end{document}

insira a descrição da imagem aqui

Editar

Acredito fortemente pela inspeção que \nodexnnão respeita a existência da saveNodeCoorsvariável N-<node_name>.xe N-<node_name>.yfica não inicializada.

\documentclass[preview,border=1cm]{standalone}
\usepackage{pst-tools}
\usepackage{pst-node}
\psset{saveNodeCoors}


\begin{document}
\psLoop{5}{%
\begin{pspicture}(3,3)
    \pnode(1,1){A}
    \rput(0,2){\psPrintValue{N-A.x}}
    \rput(0,1){\psPrintValue{N-A.y}}
    %
    \nodexn{(1,1)}{B}
    \rput(2,2){\psPrintValue{N-B.x}}
    \rput(2,1){\psPrintValue{N-B.y}}
\end{pspicture}
\qquad}
\end{document}

insira a descrição da imagem aqui

Responder1

Isso não é um bug no \nodexn, mas pode ser considerado um bug no saveNodeCoors. Você pode ver o mesmo comportamento ao usar, por exemplo \pnode(1,1){A}\pnode(A){C}. O erro também acontece com \nodexn, pois essa macro define um nó interno, cujo valor é carregado para salvar suas coordenadas em N-<node>.xe N-<node>.y:

\documentclass[preview,border=1cm]{standalone}
\usepackage{pst-tools}
\usepackage{pst-node}
\psset{saveNodeCoors}

\begin{document}
\begin{pspicture}(5,3)
    \pnode(1,1){A}
    \rput(0,2){\psPrintValue{N-A.x}}
    \rput(0,1){\psPrintValue{N-A.y}}
    %
    \nodexn{(1,1)}{B}
    \rput(2,2){\psPrintValue{N-B.x}}
    \rput(2,1){\psPrintValue{N-B.y}}
    % 
    \pnode(A){C}
    \rput(4,2){\psPrintValue{N-C.x}}
    \rput(4,1){\psPrintValue{N-C.y}}
\end{pspicture}
\end{document}

Isso dá:

insira a descrição da imagem aqui

Isso acontece porque a matriz de transformação Postscript ao salvar N-<node>.xe N-<node>.ynão é a mesma que ao salvar o novo nó. E este erro aparece apenas ao carregar as coordenadas de um nó anterior, o que acontece por exemplo com \pnode(A){C}ou com \nodexn, que utiliza internamente um nó temporário a partir do qual as coordenadas são carregadas.

As seguintes alterações para \pst@newnodecorrigir o erro:

Substitua as linhas

\ifPst@saveNodeCoors
    \ifx\relax#3\relax 0 0 \else #3 \tx@UserCoor \fi 

com

\ifPst@saveNodeCoors
    \ifx\relax#3\relax 
      0 0 
    \else 
      gsave 
        tx@Dict begin 
          STV CP T
        end
        #3 \tx@UserCoor
      grestore
    \fi

O exemplo a seguir, que contém essas alterações, fornece os resultados corretos:

\documentclass[preview,border=1cm]{standalone}
\usepackage{pst-tools}
\usepackage{pst-node}
\makeatletter
% the following is the definition from pst-node.tex v 1.30, with the mentioned changes
\def\pst@newnode#1#2#3#4{%
\pst@killglue
\leavevmode
\pst@getnode{#1}\pst@thenode
\pst@Verb{
  \ifPst@saveNodeCoors
    \ifx\relax#3\relax 
      0 0 
    \else 
      gsave 
        tx@Dict begin 
          STV CP T
        end
        #3 \tx@UserCoor
      grestore
    \fi 
%  startGlobal
%  \tx@UserCoor
  /N-#1.y\space exch def
  /N-#1.x\space exch def
%  endGlobal
  \fi
  \pst@nodedict
  {#3}
  \ifx\psk@name\relax false \else \psk@name true \fi
  \pst@thenode
  #2
  {#4}
  \tx@NewNode
  end 
}%
%
\global\let\psk@name\relax%
\pstree@nodehook%
\global\let\pstree@nodehook\relax}
\makeatother

\psset{saveNodeCoors}

\begin{document}
\begin{pspicture}(5,3)
    \pnode(1,1){A}
    \rput(0,2){\psPrintValue{N-A.x}}
    \rput(0,1){\psPrintValue{N-A.y}}
    %
    \nodexn{(1,1)}{B}
    \rput(2,2){\psPrintValue{N-B.x}}
    \rput(2,1){\psPrintValue{N-B.y}}
    % 
    \pnode(A){C}
    \rput(4,2){\psPrintValue{N-C.x}}
    \rput(4,1){\psPrintValue{N-C.y}}
\end{pspicture}
\end{document}

insira a descrição da imagem aqui

Editar

Este problema foi corrigido na pst-node.texversão 1.32 2014-02-03.

informação relacionada