\nodexn{(1,1)}{A} が奇妙な NA.x と NA.y を生成するのはなぜでしょうか?

\nodexn{(1,1)}{A} が奇妙な NA.x と NA.y を生成するのはなぜでしょうか?
\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}

ここに画像の説明を入力してください

編集

検査によって変数\nodexnの存在が尊重されず、初期化されていないままになっていると強く信じています。saveNodeCoorsN-<node_name>.xN-<node_name>.y

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

ここに画像の説明を入力してください

答え1

これは のバグではありません\nodexnが、 のバグとみなすことができますsaveNodeCoors。例えば を使用した場合にも同じ動作が見られます\pnode(1,1){A}\pnode(A){C}。このエラーは にも発生します。そのマクロは内部ノードを定義し、その値がおよび\nodexnに座標を保存するためにロードされるからです。N-<node>.xN-<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}

つまり、次のようになります。

ここに画像の説明を入力してください

これは、保存時の PostScript 変換マトリックスがN-<node>.xN-<node>.y新しいノードを保存するときのマトリックスと同じではないために発生します。また、このエラーは、以前のノードから座標をロードするときにのみ表示されます。これは、たとえば、 または で発生します\pnode(A){C}。 では\nodexn、座標がロードされる一時ノードが内部的に使用されます。

\pst@newnodeエラーを修正するには、次の変更を行います。

行を置き換える

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

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

これらの変更を加えた次の例では、正しい結果が得られます。

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

ここに画像の説明を入力してください

編集

この問題はpst-node.tex、バージョンで修正されました1.32 2014-02-03

関連情報