以下将在运行时创建一个过程,该过程将在调用时将两个值放入堆栈:
72 720 moveto
/cp [ currentpoint ] cvx def
cp
100 100 moveto
cp
这将在堆栈上留下 72 720 72 720。发生的情况是 cp 的定义首先用两个值填充了一个数组。它是可执行的,因此当调用 cp 时,每次调用时都会将两个存储的值压入堆栈,而不管当前点位置的变化。
当然,这样做的用处不仅仅是到达一个明确的点,而是在执行期间捕获一个点。如果代码片段是
72 720 moveto
(Begin with, end with) show
/cp [ currentpoint ] cvx def
% intervening code ...
cp moveto
(, whatever!) show
那么这个的用处就更加明显了。
请注意,要使其正常工作,需要存在当前点。在问题部分,可以创建过程 {currentpoint},因为执行被延迟。但是,如果在没有当前点的情况下调用 currentpoint,则会导致 postscript 错误。下面是一个简短的后记程序来探索这一点。
%!
/fontsize 14 def
/lineheight 16 def
/Times-Roman findfont fontsize scalefont setfont
/newline
{72 currentpoint exch pop lineheight sub
dup 72 lt {showpage pop 720} if
moveto
} def
/cp2 { currentpoint } def
72 720 moveto
/cp1 [ currentpoint ] cvx def
cp1
cp2
(Test line) show
cp1
cp2
144 500 moveto
cp1
cp2
/cp1 [ currentpoint ] cvx def
cp1
cp2
(Test line) stringwidth
newline
(-top of stack-) show
newline
count {30 string cvs show newline} repeat
(-bottom of stack-) show newline
showpage
我在互联网上搜索了许多参考资料以弄清楚这一点,但没有看到任何东西。我曾求助于将 x 和 y 值存储在单独的变量中,但这种方法的不雅性让我想出了这种方法。如果有人知道这是某个关键字下的主题,请告诉我们。