Ghostscript 来自PostScript执行器的用户交互

Ghostscript 来自PostScript执行器的用户交互,ghostscript,postscript,user-interaction,Ghostscript,Postscript,User Interaction,我正在用PostScript构建一个应用程序,需要在提示时为用户输入(我将使用GhostScript执行程序,文件不会发送到打印机)。在我的PostScript语言参考手册中,我看不到任何东西表明这是可能的,我也不想回到高管那里,那么这是可能的吗?PostScript不是作为一种交互式语言设计的,因此没有为用户输入提供很好的支持 您可以从stdin读取输入,然后cat写入stdout或stderr,因此如果这些都连接到控制台,那么理论上您可以通过写入stdout提示用户输入,然后从stdin读取

我正在用PostScript构建一个应用程序,需要在提示时为用户输入(我将使用GhostScript执行程序,文件不会发送到打印机)。在我的PostScript语言参考手册中,我看不到任何东西表明这是可能的,我也不想回到高管那里,那么这是可能的吗?

PostScript不是作为一种交互式语言设计的,因此没有为用户输入提供很好的支持

您可以从stdin读取输入,然后cat写入stdout或stderr,因此如果这些都连接到控制台,那么理论上您可以通过写入stdout提示用户输入,然后从stdin读取输入

请注意,从stdin读取将不允许用户在错误上执行诸如退格之类的操作。至少在视觉上,数据将被发送到PostScript程序,该程序可以处理退格字符


这是我能想到的实现这一目标的唯一途径。

这并不是没有希望的!但这也不容易。除了%stdin之外,还有两个特殊文件可以读取<代码>(%lineedit)(r)文件dup字节可用字符串readstring pop将从stdin中读取一行到字符串中。还有
(%statementedit)
文件,该文件将一直读取,直到键入语法有效的postscript片段(加上换行符)。这将匹配括号和卷曲,但不匹配方括号。在阅读之前,您应该发出类似于
(>)print flush
的提示

还有一件事,您可以通过在
stopped
上下文中包装所有这些内容来捕获^D

{ %stopped
    (> )print flush
    (%lineedit)(r)file
    dup bytesavailable string readstring pop
} stopped not {
    (successfully read: )print
    print
}{
    (received EOF indication)print
}ifelse
您可以使用它廉价地检测空输入行,而不是在readstring之后弹出bool。另外请注意,EOF上触发的停止来自
文件
中的错误(ghostscript称之为
/invalidfilename
),但尽管
文件
被定义为运算符,并且运算符应该在发出错误信号时将其参数推回到堆栈上,但我注意到ghostscript并不一定这样做(我忘了它留下了什么,但它不是你所期望的两个字符串),所以你可能想把
mark
放在前面,把
cleartomarkpop
放在整个块后面

特殊文件
(%lineedit)
(%statementedit)
,如果可用,将成功处理backspaces和control-U以及可能的其他控件。我相信真正的Adobe打印机将以某种状态消息响应^T。但我从未见过它

附言:


在我的中,我有一个更广泛的交互式postscript示例。这是,但作为示例,它可能不太有用。

看起来我将不得不采用这种方法。另一方面,由于您在一台交互式计算机上运行,另一种方法是用另一种语言运行一个交互式程序,并且数据o postscript程序(命令行/文件,甚至是postscript文件模板)?我想在PostScript中实现整个解决方案,以进一步了解该语言,但也不必在程序之间传递信息。@Jashank我有一个更有趣的例子。它只发出一个菜单和一个内部PS>提示符,并将单字母过程定义为命令。我可以建议:
(%lineedit)(r)file dup bytesavable 1 max string readstring pop
,因此它也适用于空行,即,如果您只需按RET!