我想从postscript中获取StandardEncoding向量(PLRM的附录E.6中有图形版本,但没有文本)。我正在寻找类似 [/A/B/C/D] 的东西,但事实上,任何我可以通过正则表达式将编码向量中的位置与字符命令相关联的东西都会很好。
我已经尝试过
(%stdout)
(w)
file
/StandardEncoding
writestring
但它(显然)不起作用,因为/StandardEncoding 不是字符串。我如何将这样的向量打印到标准输出?
最佳答案
最简单。
StandardEncoding ==
或者使用索引。十进制:
0 StandardEncoding { exch dup =only(: )print 1 add exch == } forall pop
八进制:
0 StandardEncoding { exch dup 8 3 string cvrs =only(: )print 1 add exch == } forall pop
十六进制:
0 StandardEncoding { exch dup 16 2 string cvrs =only(: )print 1 add exch == } forall pop
此外,您应该知道 /StandardEncoding
是一个字面名称(因为 /
),因此名称本身位于堆栈中。如果您进行了下一步并转换为字符串,它只会打印单词“StandardEncoding”。因此,要自动加载(并可能执行)与名称关联的值,请删除斜杠 ( /
),以便该名称可执行。字StandardEncoding
(没有斜杠!)成为向量。斜线的作用很像 quote
Lisp 家族语言。
为了便于说明,这里有一些打印内容和迭代数组的更多方法。
StandardEncoding {
(%stdout)(w)file exch 80 string cvs writestring
(%stdout)(w)file (\n) writestring
} forall
StandardEncoding
0 1 2 index length 1 sub { % Arr i
2 copy get 80 string cvs print % Arr i
(\n) print % Arr i
pop % Arr
} for
[ StandardEncoding 0 {
{
2 copy get ==only
()=
1 add
} loop
} stopped cleartomark
最后一个使用无限循环并捕获 rangecheck
当 get
时发出信号的错误尝试读取不存在的元素。它将在堆栈上留下 5 个值 ( StandardEncoding 256 StandardEncoding 256 true
),您可以使用 cleartomark
丢弃它们。如图所示,或者简单地pop pop pop pop pop
(或5{pop}repeat
)。
编辑:进一步研究最后一个示例。这将错误捕获与预期抛出错误的运算符(operator)隔离开来。隔离预期错误可以让任何意外错误打印出常见的诊断信息。
[ StandardEncoding 0 {
2 copy
{ get } stopped { exit } if
==only ()=
1 add
} loop cleartomark
关于postscript - 如何在 Ghostscript 中将向量打印到标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15384970/