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