您是否熟悉您正在使用的PostScript代码?还是只是从某个地方盲目复制粘贴的?如果您想了解它,应该谷歌搜索“PostScript语言参考”或“红皮书”或“PLRM”。这些资源可以作为Adobe的PDF文件获得。
您的PostScript片段使用以下步骤:
1.
(test)
将字符串“test”放置在堆栈顶部。
2.
dup
复制堆栈上最顶部的项目。(现在您在堆栈上有两个相同的字符串。)
3.
stringwidth
。执行此运算符后,最顶部的“test”字符串将被消耗,并且将添加两个值到堆栈中:字符串的高度(最顶部)和字符串的宽度(次顶部)。[更新:实际上,“字符串的高度”并不完全正确 - 它实际上是绘制字符串后当前点的垂直偏移量...]
4. 接下来,您使用
pop
。这只是删除堆栈上最顶部的值。现在堆栈顶部仅剩字符串的宽度。
5.
2 div
将该值除以2,并留下结果(字符串宽度的一半)。
6.
neg
取反堆栈上最顶部的值。现在,负值位于堆栈顶部。
7.
0
将值“0”放置在堆栈顶部。
8.
rmoveto
然后消耗堆栈上最顶部的两个值,并将当前点移动该距离(字符串宽度的一半)向左。
9.
show
消耗了始终保留在堆栈底部的第一个“test”字符串,并“显示”它。
那么如何考虑字符串的高度才能起作用?尝试将以下行作为最后一行:
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"
要理解我的更改,请查阅《红皮书》中的
charpath
、
div
、
exch
、
pathbbox
、
roll
和
sub
运算符的含义。
此命令在Windows上使用Ghostscript从代码创建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"