%7D%7BA%7D%20%D0%B2%D1%8B%D0%B4%D0%B0%D0%B5%D1%82%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%20NA.x%20%D0%B8%20NA.y%3F.png)
\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
не учитывается существование saveNodeCoors
такой переменной N-<node_name>.x
и N-<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>.x
и 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}
Это дает:
Это происходит, потому что матрица преобразования Postscript при сохранении N-<node>.x
и N-<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
.