是否可以退出 PostScript 表达式并中止绘图?

是否可以退出 PostScript 表达式并中止绘图?

我只想在条件满足时绘制一个点,否则取消绘制单个点。以下代码是我真实场景的简化版本。请不要建议其他方法,因为我想学习的部分是中止绘制。

下面的代码旨在当 x 轴上的点的横坐标为偶数时为其绘制一个点。更准确地说,奇数横坐标没有点。

\documentclass[pstricks,border=12pt,12pt]{standalone}
\usepackage{multido}
\SpecialCoor
\begin{document}
\begin{pspicture}[showgrid](-5,-5)(5,5)
    \multido{\i=-5+1}{11}{\qdisk(!\i\space 2 mod 0 eq {\i\space 0} {<don't draw a dot and continue the loop>} ifelse){2pt}}
\end{pspicture}
\end{document}

是否可以退出 PostScript 表达式并仅针对某些不符合条件的点中止绘图?

编辑

我希望获得一个不仅对qdisk其他图形宏(包括带星号的版本)有用而且也有用的解决方案。

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{multido}
\SpecialCoor

\begin{document}
% Herbert's method
\begin{pspicture}[showgrid](10,4)
    \multido{\i=1+1}{9}
    {
        \pscircle*(!\i\space dup 2 mod 0 ne {/SD {pop pop pop} def} if 1){5pt}
        \pscircle(!\i\space dup 2 mod 0 ne {/SD {pop pop pop} def} if 3){5pt}
    }
\end{pspicture}

% modified Herbert's method
\begin{pspicture}[showgrid](10,4)
    \multido{\i=1+1}{9}
    {
        \pscircle*(!\i\space dup 2 mod 0 ne {/SD {} def} if 1){5pt}
        \pscircle(!\i\space dup 2 mod 0 ne {/SD {} def} if 3){5pt}
    }
\end{pspicture}

% modified AlexG's method
\begin{pspicture}[showgrid](10,4)
    \multido{\i=1+1}{9}
    {
        \pscircle*(!\i\space dup 2 mod 0 ne {mark Rand Rand /SD {cleartomark} def} if 1){5pt}
        \pscircle(!\i\space dup 2 mod 0 ne {mark Rand Rand /SD {cleartomark} def} if 3){5pt}
    }
\end{pspicture}

% my attempt with other macros
\begin{pspicture}[showgrid](10,4)
    \multido{\i=1+1}{9}
    {
        % compilable but result in a wrong output
        \psframe
            (!\i\space dup 2 mod 0 ne {/SD {pop pop pop} def} if .2 sub 2.8)
            (!\i\space dup 2 mod 0 ne {/SD {pop pop pop} def} if .2 add 3.2)
        %--------------------------------------------------------------------------------
        % does not compile with  GhostScript
        %\psframe
            %(!\i\space dup 2 mod 0 ne {mark Rand Rand /SD {cleartomark} def} if .2 sub 2.8)
            %(!\i\space dup 2 mod 0 ne {mark Rand Rand /SD {cleartomark} def} if .2 add 3.2)
    }
\end{pspicture}
\end{document}

按相同顺序输出。

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

答案1

不可以,由于 Postscript 的堆栈特性,这是不可能的。

在这个特定情况下,逐字 Postscript 参数(!...)只是将磁盘坐标放在操作数堆栈上。磁盘本身稍后被绘制,当 PS 过程SD(它实现磁盘绘制)被放在堆栈上并执行时。

为了不绘制选定的磁盘,示例的 else 子句中的代码必须跳转到操作数堆栈的未来状态,即过程的顶部SD。这是不可能的,因为SD还没有到达那里。

您所能做的就是临时重新定义SD以清除操作数堆栈直到用mark关键字定义的某个位置:

\documentclass[pstricks,border=12pt,12pt]{standalone}
\usepackage{multido}
\SpecialCoor
\begin{document}
\begin{pspicture}[showgrid](-5,-5)(5,5)
  \multido{\i=-5+1}{11}{\qdisk(!
    \i\space 2 mod 0 eq {\i\space 0} % put desired disk coordinates on the stack if condition is fulfilled 
    { %else
      mark  % mark stack position up to which the operand stack needs to be cleared
      -1 -1 % put some dummy coords on the stack to satisfy operators that come in between them and SD
      /SD {cleartomark} def % redefine SD to clear the stack upto the previously defined position
    } ifelse){2pt}}
\end{pspicture}
\end{document}

更新:

对于任何其他 PSTricks 图形命令,您必须研究其实现才能确定哪些位需要修改。以下是\pscircle示例\psframe

\documentclass[pstricks,border=12pt,12pt]{standalone}
\usepackage{multido}
\SpecialCoor

\begin{document}
  \begin{pspicture}[showgrid](10,4)
    \multido{\i=1+1}{9}
    {
      \pscircle*(!\i\space dup 2 mod 0 ne
        {
          mark  % mark stack position up to which the operand stack needs to be cleared
          exch  % swap \i and mark
          /arc {cleartomark} def % redefine arc to clear the stack upto the previously defined position
        } if 1
      ){5pt}
      \pscircle(!\i\space dup 2 mod 0 ne {mark exch /arc {cleartomark} def} if 3){5pt}
    }
  \end{pspicture}

  \begin{pspicture}[showgrid](10,4)
      \multido{\i=1+1}{9}
      {
          \psframe
          (!\i\space dup 2 mod 0 ne { mark exch /Frame {cleartomark} def } if .2 sub 2.8)
          (!\i\space .2 add 3.2)
          %procedure `Frame' executed around here.
      }
  \end{pspicture}
\end{document}

答案2

\documentclass[pstricks,border=12pt,12pt]{standalone}
\SpecialCoor
\begin{document}

\begin{pspicture}[showgrid](-5,-5)(5,5)
  \psforeach{\iA}{-5,-4,..,5}{\qdisk(!
    \iA\space dup 2 mod 0 ne { /SD { pop pop pop } def } if 0 ){2pt}}
\end{pspicture}
\end{document}

或对于任何可能的对象:

\documentclass[pstricks,border=12pt,12pt]{standalone}
\makeatletter\let\Modulo\pst@mod\makeatother
\begin{document}

\begin{pspicture}[showgrid](-5,-5)(5,5)
  \psforeach{\iA}{-5,-4,..,5}{%
    \Modulo\iA2\Value
    \ifnum\Value=0 \pscircle(\iA,0){5pt}\fi}
\end{pspicture}

\end{document}

相关内容