首先考虑下面的完整代码。
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pstricks-add}
\begin{document}
\begin{pspicture}(-5,-5)(5,5)
\def\points{(0,0)(1,0)}%
\pstVerb{/Angles 0 def /CPX 1 def /CPY 0 def}
\multido{\i=1+1}{15}
{
\xdef\points{\points(!1 Angles 1 \i\space 1 sub sqrt atan add dup /Angles ED PtoC %
dup CPY add /CPY ED exch dup CPX add /CPX ED exch)(!CPX neg CPY neg)(!CPX CPY)}
}
\expandafter\psrline\points
\end{pspicture}
\begin{pspicture}(-5,-5)(5,5)
\def\points{(0,0)(1,0)}%
\pstVerb{/Angles 0 def /CPX 1 def /CPY 0 def}
\multido{\i=1+1}{15}
{
\pstVerb{Angles 1 \i\space 1 sub sqrt atan add /Angles exch def}%
\xdef\points{\points(!1 Angles PtoC %
dup CPY add /CPY ED exch dup CPX add /CPX ED exch)(!CPX neg CPY neg)(!CPX CPY)}
}
\expandafter\psrline\points
\end{pspicture}
\end{document}
它产生如下两个输出。
解释
当我将定义Angles
从
xdef\points{\points(!1 Angles 1 \i\space 1 sub sqrt atan add dup /Angles ED PtoC %
dup CPY add /CPY ED exch dup CPX add /CPX ED exch)(!CPX neg CPY neg)(!CPX CPY)}
到
\pstVerb{Angles 1 \i\space 1 sub sqrt atan add /Angles exch def}
为什么输出变得不正确?
答案1
从根本上来说,PostScript 不能直接转换为 TeX。只有\space
和才能\i
被正确识别和扩展。
当你在循环\pstVerb
内包含 时\multido
,你将Angles
使用 PostScript 存储 的更新版本。但是, 的构造\points
不会Angles
考虑 的这个修改版本,因为它不是以通常的 TeX 方式展开的。因此,调用
\expandafter\psrline\points
只是在扩展Angles
时使用最新版本。\psrline
\points
答案2
我得到的解决方案如下。
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pstricks-add}
\begin{document}
\begin{pspicture}[showgrid](-5,-5)(5,5)
\psset{linecolor=red}
\def\points{(0,0)(1,0)}%
\pstVerb
{
/Angles 0 def
/CPx 1 def
/CPy 0 def
/updateCP {2 copy CPy add /CPy ED CPx add /CPx ED} bind def
/updateA {1 sub sqrt 1 exch atan Angles add /Angles ED} bind def
}
\multido{\i=1+1}{15}
{
\xdef\points{\points(!1 \i\space updateA Angles PtoC updateCP)(!CPx neg CPy neg)(!CPx CPy)}
}
\expandafter\psrline\points
\end{pspicture}
\end{document}