将公共角度移动到 \pstVerb 会产生不正确的结果

将公共角度移动到 \pstVerb 会产生不正确的结果

首先考虑下面的完整代码。

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

相关内容