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