PostScript中如何将字符串与变量结合生成文本标签?
PostScript循环生成数值标签的解决方案
问题原因
你在循环中使用的(i)是字面量字符串,PostScript会直接将其作为文本输出,不会解析变量i的实际数值,所以所有位置都打印出字符"i"。
解决方法
需要先将整数变量转换为对应的字符串,再传入Label操作符,以下是两种可行方案:
方案1:循环内直接转换数值为字符串
修改循环代码,在调用Label前用cvs操作符将整数转为字符串:
1 10 20 { /i exch def i 0 0 i 256 string cvs % 将整数i转为ASCII字符串 Label } for
- 解释:
256 string创建一个足够容纳整数的空字符串缓冲区,cvs(Convert to String)操作符会把栈顶的整数i转换成对应的字符串,替换空字符串后,栈上的参数正好匹配Label的要求。
方案2:修改Label操作符,支持直接传入数值
如果希望Label能同时接收字符串和数值,可以修改其定义,自动处理数值转字符串的逻辑:
/Label { % i dx dy text/num Label % 判断最后一个参数是否为整数,是则转为字符串 dup type /integertype eq { 256 string cvs } if % 原有的定位和打印逻辑 4 3 roll 1 sub coor exch get aload pop moveto 3 1 roll fsize mul exch fsize mul exch rmoveto show } bind def
修改后可以直接传入变量i调用:
1 10 20 { /i exch def i 0 0 i Label } for
关键说明
PostScript是栈式解释型语言,字面量字符串(xxx)属于静态文本,不会触发变量解析。必须通过cvs这类标准操作符,显式将数值类型转换为字符串类型,才能输出变量对应的数值文本。
内容的提问来源于stack exchange,提问作者Cristian Velandia
相关产品推荐
相关产品推荐

