发出 painting/show 运算符后设置页面大小

Set page size after issuing painting/show operators

我正在(部分)使用 PostScript 开发打印机模拟器。我要模拟的命令系统专为卷筒纸热敏打印机设计,主要用于打印销售点收据。我更愿意按照与真实打印机相同的顺序执行操作,这意味着我的程序在遇到 "cut" 命令之前不知道页面大小。我希望该程序能够使用可变纸张尺寸的 CUPS 打印机¹

我可以在发出 painting/show 命令后更改页面高度,而文档的填充部分不会消失吗?

我尝试修改文档末尾的页面设备字典,但如果我更改 PageSize 数组,文档中的所有内容都会消失。

例如,如果我 运行 下面的程序:

<< /PageSize [ 100 30 ] >> setpagedevice

0 0 moveto
(Text) show
showpage

我得到输出:

但是当我在 showpage 命令之前修改代码以调整页面大小时:

<< /PageSize [ 100 30 ] >> setpagedevice

0 0 moveto
(Text) show

<< /PageSize [ 100 100 ] >> setpagedevice

showpage

我只得到一张空白图片:

我知道我可以延迟painting/show操作符的执行,所以我的程序在绘制之前计算文档大小,并且只在遇到剪切命令时才执行操作。我可以自己实现它,目前我不需要此类解决方案的帮助。我很想知道,是否有更简单的解决方案可以将已绘制的文档剪切为计算出的页面大小。

您不能在 PostScript 中使用标记操作和 然后 select 页面大小。在 PostScript 中设置介质大小会执行隐式擦除页面,清除页面上的所有标记。

参见第 3 版 PLRM(第 6.1.1 节 PageDevice 词典)第 408 页的注释:

Note: setpagedevice is a page-oriented operator used to control the output processing of one or more pages of a page description. Any call to setpagedevice implicitly invokes erasepage and initgraphics, and thus must precede the descriptions of the pages to be affected.

感谢 KenS,我意识到我原来的方法有什么问题,所以我想出了一个替代解决方案,推迟执行标记运算符并预先计算页面高度。以下是我实现具有可变页面大小的简单收据打印机的方法的不完整概念证明:

%!
/feed {
        0                     % return to left margin
        currentpoint exch pop % y coordinate
        20 sub moveto         % feed 20 points
} def

% deferred feed
/_feed {
         /feed cvx % push executable name on stack
         dup exec  % execute procedure, to save position in current point
} def

% deferred show
/_show {
         dup                 % duplicate string
         stringwidth rmoveto % simulate position change
         /show cvx           % push show operator on stack
         2 array
         astore cvx          % create procedure for showing the text
} def

每次我 运行 下划线过程,它们都会将过程压入操作数堆栈,但会应用最终执行期间发生的所有位置变化。

% Set font
/DejaVuSansMono findfont
16 scalefont
setfont

% The receipt itself
0 0 moveto
(text) _show
_feed
(text) _show
_feed

% Save coordinates
currentpoint
/y exch def
/x exch def

% Calculate and set document height based on position
/pageheight y neg def
<< /PageSize [ 100 pageheight ] >> setpagedevice

% Translate the negative y coordinates
0 pageheight 16 sub translate

% reset position
0 0 moveto

% Execute all procedures on the operand stack
count array astore { exec } forall

showpage

此脚本的输出:the word "text" appearing twice, the image is automatically cut to the right height

当然不完整,但我想以最简单的方式演示它。我希望有人会找到它 interesting/useful.