我正在用 PostScript 构建一个应用程序,需要在提示时从用户处获取输入(我将使用 GhostScript 执行程序,并且文件不会发送到打印机)。我在 PostScript 语言引用手册中看不到任何表明这是可能的内容,而且我不想回到执行人员那里,那么这可能吗?
最佳答案
事情并没有那么绝望!但这也并不容易。除了 %stdin 之外,还有两个特殊文件可供您读取。 (%lineedit)(r)file dup bytesavailable string readstring pop
将从标准输入读取一行到字符串中。还有 (%statementedit)
文件,该文件将一直读取,直到键入语法上有效的后记片段(加上换行符)。这将匹配括号和花括号,但不匹配方括号。在阅读之前,您应该发出类似 (> )printlush
的提示。
还有一件事,您可以通过将所有这些包装在 stopped
上下文中来捕获 ^D。
{ %stopped
(> )print flush
(%lineedit)(r)file
dup bytesavailable string readstring pop
} stopped not {
(successfully read: )print
print
}{
(received EOF indication)print
}ifelse
您可以使用它来廉价地检测空输入行,而不是在读取字符串后弹出该 bool 值。另请注意,在 EOF 上触发的停止来自 file
中的错误(ghostscript 将其称为 /invalidfilename
),但尽管定义了 file
作为一个操作符,操作符应该在发出错误信号时将它们的参数推回到堆栈上,我注意到 Ghostscript 不一定会这样做(我忘记了它留下了什么,但它不是像你期望的那样 2 个字符串) ,因此您可能需要将 mark
放在前面,将 cleartomark pop
放在整个 block 后面。
特殊文件(%lineedit)
和(%statementedit)
(如果可用)将成功处理退格键和control-U以及可能的其他控制。我相信真正的 Adobe 打印机会用某种状态消息响应 ^T。不过我没见过。
我的 postscript debugger 中有一个更广泛的交互式后记示例。这是a better version of the debugger ,但作为示例可能不太有用。
关于ghostscript - PostScript 执行程序的用户交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7312814/