介绍
我正在为新手写一篇关于 PSTricks 的简短介绍教程。我很难解释节点A
(例如)、\rput
和(!\psGetNodeCenter{A} A.x A.y)
的(!N-A.x N-A.y)
设计工作原理。
我已阅读pst-node
如下所示的文档。
以下内容摘自第 35-36 页:
手册上说:
- 变换矩阵将被重置
\psGetNodeCenter
。 (!N-A.x N-A.y)
不受影响\rput
。
我读了很多遍,还是有些困惑。语句太短了。
问题
请考虑下图以进行剩余的讨论。
情况1
A
在外面定义一个节点\rput
,并用 翻译一个点\rput
。和
(!\psGetNodeCenter{A} A.x A.y)
\pnode(2,2){A} \rput(1,1){\psdots(!\psGetNodeCenter{A} A.x A.y)}
和
(!N-A.x N-A.y)
\pnode(2,2){A} \rput(1,1){\psdots(!N-A.x N-A.y)}
结果不同。
\rput
只影响(!N-A.x N-A.y)
。案例 2
A
里面定义了一个节点\rput
,并用 翻译了一个点\rput
。和
(!\psGetNodeCenter{A} A.x A.y)
\rput(1,1){\pnode(2,2){A}\psdots(!\psGetNodeCenter{A} A.x A.y)}
和
(!N-A.x N-A.y)
\rput(1,1){\pnode(2,2){A}\psdots(!N-A.x N-A.y)}
结果相同。
\rput
影响两者。案例 3
A
里面定义一个节点\rput
,外面定义一个点\rput
。和
(!\psGetNodeCenter{A} A.x A.y)
\rput(1,1){\pnode(2,2){A}} \psdots(!\psGetNodeCenter{A} A.x A.y)
和
(!N-A.x N-A.y)
\rput(1,1){\pnode(2,2){A}} \psdots(!N-A.x N-A.y)
结果不同。
\rput
只影响(!\psGetNodeCenter{A} A.x A.y)
。
MWE 如下。
\documentclass[margin=12pt]{standalone}
\usepackage{pst-node}
\addtopsstyle{gridstyle}{gridlabels=5pt}
\psset{saveNodeCoors,linecolor=red}
\everypsbox{\color{blue}}
\begin{document}
\begin{psmatrix}
\begin{pspicture}[showgrid=bottom](3,3)
\rput(1,1){Case 1-A}
\pnode(2,2){A}
\rput(1,1){\psdots(!\psGetNodeCenter{A} A.x A.y)}
\end{pspicture}
&
\begin{pspicture}[showgrid=bottom](3,3)
\rput(1,1){Case 1-B}
\pnode(2,2){A}
\rput(1,1){\psdots(!N-A.x N-A.y)}
\end{pspicture}
\\
% case 2
\begin{pspicture}[showgrid=bottom](3,3)
\rput(1,1){Case 2-A}
\rput(1,1){\pnode(2,2){A}\psdots(!\psGetNodeCenter{A} A.x A.y)}
\end{pspicture}
&
\begin{pspicture}[showgrid=bottom](3,3)
\rput(1,1){Case 2-B}
\rput(1,1){\pnode(2,2){A}\psdots(!N-A.x N-A.y)}
\end{pspicture}
\\
% case 3
\begin{pspicture}[showgrid=bottom](3,3)
\rput(1,1){Case 3-A}
\rput(1,1){\pnode(2,2){A}}
\psdots(!\psGetNodeCenter{A} A.x A.y)
\end{pspicture}
&
\begin{pspicture}[showgrid=bottom](3,3)
\rput(1,1){Case 3-B}
\rput(1,1){\pnode(2,2){A}}
\psdots(!N-A.x N-A.y)
\end{pspicture}
\end{psmatrix}
\end{document}
问题
由于文档中的陈述似乎不清楚,我该如何向新手解释他们的行为?
注:由于(!\psGetNodeCenter{A} A.x A.y)
与相同(A)
,因此(A)
这里不再讨论。
如果你是一名老师,你会怎样向你的学生解释呢?
答案1
(A)
关键点在于理解由 创建的节点\pnode
与一对坐标之间的区别(x,y)
:
坐标对,例如
(1,1)
指定一个相对的点。其位置取决于当前环境,无论是surrounded by \psdot(1,1) text
,还是 ,或者 随 而移位\rput(2,2){\psdot(1,1)}
等。节点
(A)
是指页面上的绝对固定点。它与环境无关。
下面的例子继续这一过程。
\documentclass[pstricks, margin=12pt]{standalone}
\usepackage{pst-node}
\begin{document}
\begin{pspicture}[showgrid](2,2)
\rput(1,1){%
\pnode(1,1){A}}
\psdot(A)
\pnode(1,1){B}
\rput(1,1){%
\psdot[linecolor=red](B)}
\end{pspicture}
\end{document}
黑点位于 处(2,2
,因为移动了用于定义节点 的\rput
坐标对。红点保留在 处,因为定义后对 没有任何影响:(1,1
A
(1,1)
\rput
(B)
这就是所有节点的本质。
关于\psGetNodeCenter
,你是对的:在这方面使用(!\psGetNodeCenter{A} A.x A.y)
相当于(A)
。
该参数saveNodeCoors
保存相对的节点定义时的坐标。例如,在上面的例子中,在(!N-A.x N-A.y)
和处添加点会在 处放置两个点,它们是用于定义两个节点和 的坐标对:(!N-B.x N-B.y)
(1,1)
A
B
\documentclass[pstricks, margin=12pt]{standalone}
\usepackage{pst-node}\SpecialCoor
\begin{document}
\begin{pspicture}[showgrid, saveNodeCoors](2,2)
\rput(1,1){%
\pnode(1,1){A}}
\psdot(A)
\pnode(1,1){B}
\rput(1,1){%
\psdot[linecolor=red](B)}
%
\psdot[dotstyle=+, dotscale=2](!N-A.x N-A.y)
\psdot[dotstyle=x, dotscale=2](!N-B.x N-B.y)
\end{pspicture}
\end{document}
继续说:
像 或 这样的坐标
(1, 1)
对节点表达式是相对的,并且可以像、等! N-A.x N-A.y
一样进行缩放和平移。\rput
\scale
\translate
节点
(A)
和节点表达式\psGetNodeCenter
是固定的、“不可变的”点。