Ответ 1
Вы знакомы с кодом 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"