如何在运行时收集PostScript操作以在以后执行?

时间:2019-06-09 22:15:53

标签: postscript

在一些用于绘制数据的代码中,我正在遍历样本,并试图在动态创建标签(线和文本)的同时将数据与曲线连接。因此,我正在并行创建两个不相关的路径。这两个元素使用不同的图形属性和变换的坐标系,因此我经常使用gsave ... grestore,可能会创建效率低下的代码。

我的想法是收集用于绘制这两个路径之一的指令,然后在绘制另一个补丁后执行它们。

可能cvx会有所帮助,但是我想知道如何在将运算符添加到数组时防止执行这些运算符(我希望[ moveto ]]之前的堆栈中弹出两个元素被执行)。 [ /moveto ]会成功吗?

另一个问题是,当我需要操作数堆栈来绘制另一条路径时,很难收集操作数组。

例如,一部分标签代码(丑陋,因为仍在工作)看起来像这样:

            gsave
                currentpoint translate la rotate
                0 rlineto
                %% add a tick mark if it's far enough from the last one (or if it is important)
                mlx x mly y distance lw 2 mul gt
                m lm gt or
                { %if
                    /mlx x def
                    /mly y def
                    currentpoint
                    lw setlinewidth     % label len
                    stroke
                    (Helvetica) findfont fs scalefont setfont
                    moveto              % label
                    180 rotate
                    dup stringwidth pop neg fs 3 div sub fs -2.5 div
                    rmoveto
                    %% add a text label if it looks like there is room (or if it is important)
                    tlx x tly y distance fs 1.2 mul gt
                    m lm gt or
                    { %ifelse
                        show
                        /tlx x def
                        /tly y def
                    }
                    { pop } ifelse
                    /lm m def
                } { pop }
                ifelse
            grestore

1 个答案:

答案 0 :(得分:1)

对于第一部分,/moveto cvx将为您提供一个不会立即执行的可执行文件名称,但是如果将其放入可执行数组并exec,它将稍后执行。如果仅执行/moveto,则该名称是文字名称,以后将不会使用exec执行。

对于另一部分,在仍将堆栈用于执行的同时将片段收集到数组中,一种简单的方法是将mark放在堆栈上,并将所有内容滚动到标记后面以进行处理。例如

mark

%... do stuff with stack

1 2 3 counttomark 1 add 3 roll  % save 3 numbers behind mark

%... do stuff with stack

cleartomark                  % discard working area
count array astore           % make array from stack contents