我正在编写一个程序,它将postscript文件转换为更简单的点序列,我可以发送给我正在构建的绘图仪。我这样做是通过运行一些头代码来替换绘制操作,将操作打印到stdout,然后我的主控制程序将使用它:
/stroke { gsave
matrix defaultmatrix setmatrix
flattenpath
/str 20 string def
{(m ) print 2 copy exch str cvs print ( ) print =}
{(l ) print exch str cvs print ( ) print =}
{6 {pop} repeat (error) =} % should never happen...
{(l ) print exch str cvs print ( ) print =}
pathforall
grestore
stroke
} bind def
/fill {
gsave stroke grestore fill
} bind def
作为旁注,我真的希望postscript有一个printf命令,比如1 1 add (1+1=%d) printf
。
为了使其适用于字体,我通过使用0 setcachelimit
将缓存限制设置为0来禁用字体缓存。否则,postscript解释器将不会为后续使用缓存对象调用绘制操作。我宁愿通过重新定义setcachedevice
和setcachedevice2
禁用字体缓存,但这些运算符还必须处理一些字符度量标准,而不仅仅是缓存。
用户路径也可以缓存,我可以通过重新定义ucache
并通过/ucache {} def
将缓存限制设置为0来禁用此缓存。
但是,似乎没有配置模式缓存参数的命令,模式不需要显式请求缓存。即使有,我也需要强制它来调用每个参数的绘制操作。每个模式单元甚至在相同的填充操作中。 如何禁用模式缓存?
答案 0 :(得分:2)
<</MaxPatternCache 0>> setsystemparams
假设您的口译员没有密码保护系统参数,并且它尊重此系统参数。
参见第3版PLRM的附录C,特别是&#34; C.3.3其他缓存&#34;。您还需要考虑表格。
答案 1 :(得分:2)
这是尝试printf
实现以匹配您的语法。
/formats <<
(d) { cvi 20 string cvs }
>> def
% val1 val2 .. valN (format-str) printf -
/printf {
0 1 index (%) { % ... (fmt) n (fmt) (%)
search { % ... (fmt) n (post)(%)(pre)
pop pop exch 1 add exch (%) % ... (fmt) n=n+1 (post) (%)
}{ % ... (fmt) n (rem)
pop exit
} ifelse
} loop % val1 val2 .. valN (fmt) n
dup { % ... (fmt) n
exch (%) search pop % ... n (post)(%)(pre)
print pop % ... n (post)
exch dup % ... (post) n n
2 add -1 roll % .. (post) n val1
3 1 roll 1 sub % .. val1 (post) n=n-1
exch % .. val1 n (post)
dup 0 1 getinterval % .. val1 n (post) (p)
exch 1 1 index % .. val1 n (p) (post) 1 (post)
length 1 sub getinterval % .. val1 n (p) (ost)
exch 4 -1 roll % .. n (ost) (p) val1
exch //formats exch
2 copy known not { pop /default } if get exec
print % .. n (ost)
exch
} repeat
pop
print
} def
1 1 add (1+1=%d) printf
但是,如果我可能批评一点,这可能不是后记的最好用法。首先,转换说明符并不是必需的,因为postscript对象带有它们自己的类型信息。有一个名为printf
的NeWS扩展运算符更接近标记,我认为(ref)(pdf)。
我知道它在sprintf
这里有点不同,但printf
条目只是引用了这个条目。