Вы знакомы с кодом PostScript, который вы используете? Или это просто слепо скопировано и вставлено откуда-то? Если вы хотите понять это, вам следует поискать в «Справочнике по языку PostScript», «Красной книге» или «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"
Чтобы понять мои изменения, посмотрите значение операторов charpath
, div
, exch
, pathbbox
, roll
и sub
в Красной книге.
Эта команда использует Ghostscript для создания PDF-файла в Windows из кода (проще просматривать и проверять результаты):
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"