2

我正在用 PostScript 构建一个应用程序,它需要在提示时接受用户的输入(我将使用 GhostScript 执行程序,并且文件不会发送到打印机)。我在我的 PostScript 语言参考手册中看不到任何暗示这是可能的,而且我不想回到执行官那里,所以这可能吗?

4

2 回答 2

3

没那么绝望!但这也不是一件容易的事。除了 %stdin 之外,您还可以读取另外两个特殊文件。(%lineedit)(r)file dup bytesavailable string readstring pop将从标准输入读取一行到一个字符串。还有一个(%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

您可以使用它来廉价地检测空输入行,而不是在读取字符串之后弹出该布尔值。另请注意,在 EOF 上触发的停止来自file(ghostscript 调用它/invalidfilename)中的错误,但尽管file被定义为运算符,并且运算符应该在发出错误信号时将其参数推回堆栈,我注意到ghostscript 不一定要这样做(我忘记了它留下了什么,但它不是你期望的 2 个字符串),所以你可能想把整个块放在mark前面和后面。cleartomark pop

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

PS。:!

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

于 2011-09-08T10:49:56.257 回答
2

PostScript 不是作为交互式语言设计的,因此没有很好的用户输入规定。

您可以从标准输入读取输入,然后将其写入标准输出或标准错误,因此如果将它们连接到控制台,那么理论上您可以通过写入标准输出来提示用户输入,并从标准输入读回输入。

请注意,从标准输入读取将不允许用户在错误上执行退格等操作。至少在视觉上不会,数据将被发送到可以处理退格字符的 PostScript 程序。

这是我能想到的实现这一目标的唯一方法。

于 2011-09-06T07:00:50.687 回答