Warum erzeugt \nodexn{(1,1)}{A} seltsame NA.x und NA.y?

Warum erzeugt \nodexn{(1,1)}{A} seltsame NA.x und 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}

Bildbeschreibung hier eingeben

Bearbeiten

Ich bin aufgrund der Überprüfung fest davon überzeugt, dass die Existenz der Variablen \nodexnnicht respektiert wird und sie daher nicht initialisiert wird.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}

Bildbeschreibung hier eingeben

Antwort1

Dies ist kein Fehler in \nodexn, kann aber als Fehler in angesehen werden saveNodeCoors. Dasselbe Verhalten können Sie beispielsweise bei der Verwendung von beobachten \pnode(1,1){A}\pnode(A){C}. Der Fehler tritt auch bei auf , da dieses Makro einen internen Knoten definiert, dessen Wert geladen wird, um seine Koordinaten in und \nodexnzu speichern :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}

Das gibt:

Bildbeschreibung hier eingeben

Das passiert, weil die Postscript-Transformationsmatrix beim Speichern von N-<node>.xund N-<node>.ynicht dieselbe ist wie beim Speichern des neuen Knotens. Und dieser Fehler tritt nur auf, wenn die Koordinaten von einem vorherigen Knoten geladen werden, was z. B. bei \pnode(A){C}oder bei passiert \nodexn, das intern einen temporären Knoten verwendet, von dem die Koordinaten geladen werden.

Die folgenden Änderungen \pst@newnodebeheben den Fehler:

Ersetzen Sie die Zeilen

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

mit

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

Das folgende Beispiel mit diesen Änderungen liefert die richtigen Ergebnisse:

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

Bildbeschreibung hier eingeben

Bearbeiten

Dieses Problem wurde in pst-node.texVersion behoben 1.32 2014-02-03.

verwandte Informationen