您熟悉您使用的 PostScript 代码吗?还是只是从某个地方盲目复制和粘贴?如果你想了解它,你应该在谷歌上搜索“PostScript Language Reference”或“Red Book”或“PLRM”。这些资源以 PDF 格式从 Adobe 提供。
您的 PostScript sn-p 使用以下步骤:
-
(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"
要了解我的更改,请查看红皮书中 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"