您熟悉您使用的 PostScript 代码吗?还是只是从某个地方盲目复制和粘贴?如果你想了解它,你应该在谷歌上搜索“PostScript Language Reference”或“Red Book”或“PLRM”。这些资源以 PDF 格式从 Adobe 提供。
您的 PostScript 片段使用以下步骤:
(test)
将字符串“test”放在堆栈的顶部。
dup
复制堆栈上最顶层的项目。(您现在将在堆栈上两次获得该字符串。)
stringwidth
. 执行此运算符后,将消耗最顶部的“测试”字符串,并将两个值添加到堆栈中:字符串的高度(最顶部)和字符串的宽度(从顶部开始的第二个)。[更新: 实际上,“字符串的高度”并不完全正确 - 它是完成绘制字符串后当前点的垂直偏移量...... ]
- 接下来,您使用
pop
. 这只是删除堆栈上的最高值。现在只有字符串的宽度保留在堆栈的顶部。
2 div
将该值除以 2 并留下结果(字符串宽度的一半)。
neg
否定堆栈上的最高值。现在负值在堆栈的最顶端。
0
将值“0”放在堆栈顶部。
rmoveto
然后消耗堆栈上的两个最高值并将当前点向左移动该距离(字符串宽度的一半)。
show
消耗第一个一直保留在堆栈底部的“测试”字符串并“显示”它。
那么考虑到字符串的高度有什么用呢?试试你的最后一行:
200 700 moveto (test) dup true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch 200 700 moveto rmoveto show"
要了解我的更改,请查看The Red Book 中、 、 、charpath
和div
运算exch
符的含义。pathbbox
roll
sub
此命令使用 Ghostscript 从代码在 Windows 上创建 PDF 文件(更易于查看和检查结果):
gswin32c.exe ^
-o my.pdf ^
-sDEVICE=pdfwrite ^
-c "/Helvetic-Oblique findfont 10 scalefont setfont 200 700 1 0 360 arc fill 0 0 moveto (test test) dup true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch 200 700 moveto rmoveto show"
在 Linux 上使用:
gs \
-o my.pdf \
-sDEVICE=pdfwrite \
-c "/Helvetic-Oblique findfont 10 scalefont setfont 200 700 1 0 360 arc fill 0 0 moveto (test test) dup true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch 200 700 moveto rmoveto show"
更好的可读形式是:
gswin32c ^
-o my.pdf ^
-sDEVICE=pdfwrite ^
-c "/Helvetic-Oblique findfont 10 scalefont setfont" ^
-c "200 700 1 0 360 arc fill 0 0 moveto (test test) dup" ^
-c "true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll" ^
-c "sub 2 div exch 200 700 moveto rmoveto show"
和
gs \
-o my.pdf \
-sDEVICE=pdfwrite \
-c "/Helvetic-Oblique findfont 10 scalefont setfont" \
-c "200 700 1 0 360 arc fill 0 0 moveto (test test) dup" \
-c "true charpath pathbbox 3 -1 roll sub 2 div neg 3 1 roll" \
-c "sub 2 div exch 200 700 moveto rmoveto show"