В предыдущей статье я писал, что PostScript стековый язык программирования, но не форт. Строго говоря, это так. Но разница между ними невелика. Эта статья больше памятка для себя, чем толковое описание PostScript.
Postscript — весьма старый язык программирования. И, строго говоря, это не совсем язык программирования. Он был создан в середине 80-х годов фирмой Adobe как универсальный язык управления абстрактным графическим устройством, реальным прототипом которого выступал лазерный принтер. Необходимость такого языка объяснялась маленькой мощностью компьютеров того времени и медленными интерфейсами передачи данных. Сегодня можно сформировать всю страницу для печати на компьютере и передать на печать как растровую картинку. Это почти не нагрузит ни компьютер ни увеличит время печати. Разве что чуть-чуть. Но в те времена у среднего компьютера просто не хватало оперативной памяти, чтобы прорисовать страницу для печати в цвете и с высоким разрешением.
Язык Postscript просто позволял переложить эту работу на специализированный контроллер принтера. Для нас ва жно то, что Postscript не просто язык управления принтером, а язык программирования на котором пишутся программы для принтера. Например, если нужно выполнить простейшую задачу и напечатать лист с линейной разметкой. Язык управления принтером должен направить принтеру указание напечатать столько-то линий на таком-то расстоянии друг от друга. При этом программа на Postscript может просто запустить на принтере цикл и напечатать линовку не отвлекая компьютер.
Одно из важных преимуществ Форта — этот язык одновременно и интерпретируемый и компилируемый. Программировать можно в диалоговом режиме, постепенно развивая словарь для создания нужной программы. Как это делается в других интерпретируемых языках. В качестве среды исполнения программ я использую Ghostscript. Файл “gswin64.exe” как раз запускает интерпретатор языка PostScript
При этом открывается окно Ghostscript Image куда будут выводиться результаты выполнения программы. Я не буду касаться того, как работают стековые языки, а сразу приступлю к описанию параллелей между Форт и Postscript.
Базовые понятия
Path
Я не буду переводить это на русский язык, хорошего аналога нет. Самый подходящий перевод — “контур”, но это слово нигде не используется. Path — это совокупность графических примитивов (линий, дуг, текстовых строк и т.п.). Path группирует эти графические элементы, так что с ними можно проводить общие операции. Например, чтобы нарисовать квадрат, нужно собрать четыре линии образующие стороны квадрата внутри path, тогда для них можно задать единую ширину линий, сделать заливку и т.п. Если каждая линия будет в собственном path, то параметры каждой линии придётсяс задавать отдельно, а выполнить заливку и вовсе не получится.
Есть также специальный clipping path, это path, который задаёт границы в которых можно рисовать. Всё, что рисуется за границами clipping path просто не будет отображаться. По умолчанию clipping path соответствует границам листа. Но это поведение можно и переопределить. В типографском деле clipping path называют “обтравочный контур”, это неплхо знать, но я так называть не буду.
Система коодинат
Язык Postscript изначально предназначен для создания изображений, поэтому система координат — одна из базовых вещей языка. Ситема координат — аппаратно независимая. Например, при рисовании на экране система координат обычно аппаратно-зависимая, т.к. рисование зависит от количества пикселей на области рисования, её разрешающей способности. Используются декартовы координаты, начало координат слева внизу, ось X идёт направо, ось Y — вверх. Базовая единица измерений — “пункт”, равный 1/72 дюйма. Это типографская мера длины. Систему координат можно менять, масштабировать, вращать и т.п. средствами самого языка. Иногда это создаёт удобство при рисовании
Арифметические операции
Арифметические операции задаются словами, а не знаками арифметики. Знаки арифметических операций не рабтают, хотя никто не мешает переопределить слова, чтобы делать операции в привычном виде.
add
— сложение;
sub
— вычитание;
div
— деление. Важное отличие Postscript от Форт в том, что в Postscript базовая арифметика — числа с плавающей точкой. При этом второй элемент стека делится на первый элемент стека.
idiv
— целочисленное деление;
mod
— целочисленный остаток от деления;
neg
— изменение знака числа.
В Postscript используется обратная польская нотация, так что арифметические операции работают в точности так же, как в Форте.
Операции над стеком
Стек — это основная особенность стековых языков программирования, которые включают в себя Форт, Postscript и некоторые другие. Как и в большинстве языков стек используется в режиме LIFO (последним пришёл, первым вышел). Стек используется для хранения данных. Все слова (операторы языка) используют данные, хранимые на стеке. Стек переводится на русский, как стопка. И это лучшая иллюстрация идеи. Представьте, что у вас стопка бумаг, на которых записаны значения, с которыми работает язык. Слово последовательно берёт из этой стопки бумажки, начиная с верхней, прводит необходимые операции и результат этих операций снова записывается на бумажки, которые складываются в стопку. Таким образом, операция
Приведёт к тому, что два числа со стека будут умножены друг на друга, а вместо них будет записан результат умножения 5×100.
clear
— очистка стека;
dup
— удвоение числа на вершине стека;
pop
— удаление числа на вершине стека;
exch
— меняет местами два верхних элемента стека;
roll
— прокручивание стека, при этом два верхних элемента стека — это аргументы операции, верхнее число задаёт сколько элементов и в каком направлении прокручивать, второе число — сколько элементов прокручивать. Таким образом:
7 8 9 3 1 roll --> 9 7 8
7 8 9 3 -1 roll --> 8 9 7
pstack
— печать всего содержимого стека, при этом стек сохраняется;
==
— печать верхнего элемента стека, при этом он удаляется.
Базовые графические операции
Графика в языке Postscript рисуется невидимым “карандашом”. Каждая линия при рисовании — вектор с координатами начала и конца. Но в Postscript принято указывать две координаты — координаты конца линии. Начальная позиция соответсвует последней точке, на которой закончилось рисование предыдущей линии. Слова fill
, stroke
и некоторые другие сбрасывают эту позицию и её нужно задавать заново.
newpath
— этим оператором создаётся новый элемент для рисования, аналог canvas во многих графических средах;
moveto
— позицию начала рисования в координаты x y, координаты берутся с вершины стека. То есть:
144 72 moveto
lineto
— чертит линию в абсолютные координаты x, y заданные на вершине стека.
rlineto
— чертит линию в относительные координаты x, y заданные на вершине стека. Координаты задаются относительно последней точки заданной предыдущими командами графических примитивов или moveto.
setlinewidth
— задаёт ширину линий в пунктах. Пункт — типографская мера длины, 1/72 дюйма.
closepath
— проводит линию от текущей точки рисования до последней точки, заданной оператором moveto. Это позволяет строить аккуратные замкнутые фигуры.
stroke
— отображает всё, что быо нарисовано в newpath, т.к. предыдущие операторы задают графические примитвы, но не отображают их до этой команды;
fill
— делает заливку текущего path.
setgray
— устанавливает цвета в градациях серого.
showpage
— печатает страницу. Это команда для принтера, которая говорит, что вся страница сформирована и пора печатать. Если достаточно посмотреть содержимое страницы на экране — showpage не нужен, а в Encapsulated postscript, который и предназначен для показа на экране, эта команда запрещена. Поскольку мои примеры для вывода на экран, а не на принтер — я не привожу команду showpage дальше по тексту. Просто знайте, если отправляете файл на принтер — showpage добавить нужно.
Таким образом, простейшая программа для рисования квадрата будет такой.
newpath
270 360 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
closepath
4 setlinewidth
stroke
Операции с текстом
Язык Postscript и создавался для операций с текстом. Его возможности очень обширны и только некоторые из них будут приведены здесь. Текстовые строки в этом языке обрабатываются как любая другая графика. Ниже приведено несколько примеров по работе с текстом.
Изменение системы координат
Так как в Postscript используется пользовательская система координат — её тоже можно менять.
translate
— переносит начало системы координат в новую точку.
rotate
— позволяет повернуть оси системы координат на заданный угол, он отсчитывается от вертикальной оси против часовой стрелки.
scale
— позволяет изменить масштаб по каждой из координатных осей отдельно, поэтому параметра 2, scaleX и scaleY, масштаб по осям x и y соответственно.
Эта страница даже не пытается быть учебником по языку программирования Postscript. Для этого есть другие ресурсы, где можно найти куда больше информации.
- PostScript Tutorial — на английском языке, но очень краткое и на простом языке. Хотел бы я научиться так писать краткие пособия. Оно написано в 1998 году, но даёт всё необходимую информацию для начала работы.
- Mathematical illustrations — этой книгой можно было бы и ограничиться. Это именно учебник по компьютерной графике на Postscript. от основ языка до трёхмерной графики на Postscript. В книге рассматривается и теория, т.е. уравнения двух и трёх-мерной графики. При этом объём каждой главы довольно невелик, а английский довольно несложен.
- POSTSCRIPT УМЕР ДА ЗДРАВСТВУЕТ PDF?! — статья, где хорошо описана история создания Postscript и его дальнейшая судьба. В статье довольно много информации о недостатках Postscript, но они специфичны для издательского дела. На русском языке.
- Стековые языки — публикация в блоге, которая полностью соответствует названию, она описывает стековые языки. Маленькая статья, но приводит краткие сведения о многих стековых языках. На русском языке.
- Getting started with postscript — хорошее вводное руководство по языку Postscript с полезными сслылками. Документ изначально на английском языке, но поддерживается автоперевод на другие языки, включая русский. Качеество страдает.
- Русскоязычный сайт с материалами о Postscript. Он давно не обновляется, но работает и содержит все необходимые сведения на русском языке.
Подборка исчерпывающая. Из этих ресурсов мы можете узнать о Postscript больше, чем когда-либо хотели бы знать.
Предисловие
Когда-то у меня было желание написать книгу, посвященную
языкам описания страниц (PDL). Начал я с языка PostScript, как наиболее важного интересного в этой группе. Так в журнале PC Magazine/RE появилась серия статей под названием «Семь уроков по PostScript». К сожалению, их электронный вариант в редакции журнала не сохранился, однако у меня остались предшествующие версии, которые объединены в этом файле и предлагаются вашему вниманию. Утрачены тексты некоторых примеров и картинки с результатами исполнения примеров. Так как, похоже, что я из-за нехватки времени уже никогда не напишу задуманную книгу, то…
Этот текст может свободно использоваться, модифицироваться и распространяться в любой форме. Автор же не несет за него ни малейшей ответственности.
Занятие первое
Есть два подхода к описанию языка PostScript: как к обычному языку программирования и как к языку описания страниц. В статье использован, в основном, первый подход, поэтому предполагается, что читатель имеет хоть какой-то опыт программирования.
Язык PostScript был разработан Джоном Уорноком (John Warnock) в фирме Adobe Systems в 1982 г. История создания языка описана в предисловии одного из его авторов к «Справочному руководству по языку PostScript». PostScript создавался в качестве простого стандартного языка для описания вида текста, чертежей и простых изображений на печатаемой странице, что наложило определенный отпечаток на используемые в PostScript конструкции. Язык содержит около 250 операторов, что позволяет одни и те же действия запрограммировать самыми разными способами. С другой стороны разработчики не предполагали, что программы на PostScript будут большими, поэтому средства структуризации в языке не сильно развиты. Треть языка PostScript посвящена графике, остальное — это обычный процедурный язык программирования, который включает в себя элементы из многих других языков, но наиболее близок к языку Форт. Очень важно, что описание страниц на PostScript не зависит от устройства, на котором страница будет воспроизведена. Как правило программы на PostScript генерируются приложениями, например текстовыми процессорами, программами для настольных издательских систем, в частности CorelDrow, однако, как вы убедитесь сами, в ряде случаев знание этого языка может быть весьма полезным.
Основные понятия
Одной из причин, вызвавшей появление и расцвет языка PostScript является необходимость выводить текст и изображения на растровые внешние устройства: матричные, струйные и лазерные принтеры, а также экраны мониторов. Основное свойство таких устройств заключается в том, что изображение на них строится из массива прямоугольных элементов, называемых пикселами (от picture element — элемент изображения). Каждый пиксел имеет в этом массиве свой адрес — номер строки и номер столбца, где он расположен, а также цвет: у обычных матричных принтеров пикселы могут быть либо черного цвета, либо белого (в этом случае их часто называют точками); у лазерных принтеров пикселы имеют до 256 градаций серого цвета, у цветных мониторов — до сотен тысяч цветов. Устанавливая определенные пикселы в нужные цвета, мы получаем на экране текст и графические изображения.
Так как у каждого растрового устройства пикселы имеют физические размеры, зависящие, например, от размера печатающих иголок матричного принтера или сетки на экране монитора, то число элементов изображения на единицу длины (обычно дюйм) называется разрешением растрового выводного устройства. В зависимости от этой характеристики устройства делятся на устройства с низким, средним и высоким разрешением. Для лазерных принтеров это соответственно до 300, 300-600 и более 600 dpi (точек на дюйм). Для каждого типа устройств границы этих классов свои, так для 14″ мониторов разрешение более 50 dpi будет уже высоким. Чем выше разрешение, тем лучше качество изображения.
PostScript-устройство (принтер, монитор) — это устройство, в котором имеется интерпретатор языка PostScript. Интерпретатор PostScript принимает из компьютера текстовый файл с описанием страницы и преобразует его в растровую форму, которая и выводится на печать или на экран. (С этим и связана близкая к языку Форт структура PostScript — она обеспечивает наименьший размер интерпретатора). Во время преобразования описания интерпретатор выполняет различные действия, зависящие от типа устройства. Так если на черно-белое печатающее устройство выводится полутоновое изображение, то интерпретатор PostScript этого устройство выполняет разбиение полутоновых областей на зоны с определенным уровнем серого цвета и заполняет каждую зону черными точками с плотностью, зависящей от этого уровня, что создает иллюзию полутонов на результирующем изображении.
Передача описания страницы по многим причинам более выгодна, чем передача сразу всего массива составляющих страницу пикселов (растрового образа страницы). Во-первых, описание во много раз компактнее даже сильно сжатого изображения. Во-вторых, процесс подготовки печатной страницы требует значительного времени: если пересылается описание, то подготовкой к печати занимается процессор принтера или дисплейный процессор, что освобождает процессор персонального компьютера (ПК) для выполнения другой работы и тем самым повышает его производительность. И наконец, самое важное преимущество — это независимость описания от типа устройства.
(Однако с интерпретатором языка PostScript можно работать и на самом ПК как работаем мы с Бейсиком или любым другим языком. Есть различные реализации интерпретаторов PostScript, но лучше воспользоваться общедоступной программой Gnostscript, работающей как под DOS, так и в Windows. Её можно, в частности, поискать в Internet. )
Чтобы обеспечить независимость описания страницы от всего разнообразия внешних растровых устройств в языке PostScript введено понятие текущей страницы.
Текущая страница — «идеальная» страница в памяти, на которой рисует PostScript. Она не зависит от физических характеристик принтера, на который страница будет вводиться. В начале работы программы это совершенно чистая страница. Когда текущая страница полностью описана, она посылается на принтер, который распечатывает ее с таким качеством, которое способен обеспечить.
Текущий путь (current path) — это набор соединенных между собой отдельных точек, линий, кривых, которые вместе описывают фигуры и их положение. На текущий путь не накладывается никаких ограничений (он может пересекать сам себя и т. д.) Элементы текущего пути задаются их позициями на текущей странице.
Текущий путь обрезки (Current clipping path) — это границы области, в которой может быть нарисовано изображение.
Набор символов Все виды скобок (круглые, квадратные, фигурные, угловые) и знак процента являются для PostScript специальными знаками. Остальные символы — подмножество кода ASCII используются в программе без ограничений и называются регулярными символами.
Стек. PostScript резервирует для обрабатываемых данных часть памяти именуемую стеком. Данные, помещаемые в стек, извлекаются из него в обратном порядке, т. е. последнее записанное туда число удаляется первым. Такая дисциплина обслуживания называется LIFO. На самом деле PostScript оперирует четырьмя различными стеками: операндов, словарей, выполнения и состояния графики.
Стек операндов — содержит собственно объекты PostScript и результаты действий над ними. Операторы PostScript получают операнды только через стек.
Типы данных. Как и другие распространенные языки программирования PostScript поддерживает различные типы данных, включая integer, real, boolean, массивы и строки. В нём определяются также объекты типа mark (отметка, метка) и dictionary (словарь).
Примеры записи целых чисел:
345 -87 38554 0 +57
Если величина числа превышает предел для представления целых чисел, оно автоматически конвертируется интерпретатором в число типа real.
Примеры записи действительных чисел:
-2.0 12.3 2E-5 0.0 345.6e8 -.025
Беззнаковые целые числа могут быть записаны в любой из 35 систем счисления с использование префикса в виде:
база#число
где:
база — основание системы счисления, десятичное целое число от 2 до 36;
число — представление числа в системе в указанной префиксом системе счисления. Цифры в системах счисления по основанию больше 10 представляются буквами латинского алфавита от A до Z.
Например:
16#cb2e 2#11001011 8#377
Строка — это последовательность символов, заключенная в круглые скобки.
Система координат.
Позиция элемента на странице описывается парой координат х,у. Каждое выходное устройство имеет встроенную систему координат, с помощью которой адресуются точки на странице. Эту систему будем называть пространством устройства (device space). Оно отличается от устройства к устройству. Нет единообразия в расположении начала координат, а также масштабов по вертикальной и горизонтальной осям.
Позиция на текущей PostScript-странице описывается в системе координат пользователя (или в пространстве пользователя), которая не зависит от пространства устройства. Координаты PostScript-программе перед печатью текущей страницы автоматически преобразуются из пространства пользователя в пространство устройства. Пространство пользователя таким образом представляет систему координат, внутри которой страница может быть описана независимо от конкретной машины, где эта страница будет напечатана.
Пространство пользователя может быть изменено тремя способами:
- начало его системы координат может быть перенесено в любую точку пространства пользователя;
- оси могут быть повернуты в любом направлении;
- масштаб по каждой оси может быть произвольно изменен, т. е. может быть задано любое линейное преобразование из пространства пользователя в пространство устройства.
Постфиксная нотация (обратная польская запись).
Операции над данными в PostScript требуют, чтобы их операнды сначала были помещены в стек. Такой стиль программирования, при котором операнды задаются до операции над ними (оператора) называется постфиксной нотацией. Так запись операции сложения двух чисел, допустим 4+5, в PostScript будет выглядеть так:
4 5 add
О гибкости языка.
Несмотря на большое количество встроенных операторов в PostScript нет зарезервированных слов. Любое слово переопределяемо. Программа в PostScript может рассматриваться как данные и это сближает его с языками типа Лисп.
Переносимость программ.
Программы на PostScript записываются с использованием только печатаемых символов кода ASCII, что позволяет обращаться с ними, как с обычными файлами, т. е. не возникает никаких проблем при пересылке таких файлов по сетям.
Стек и арифметические операции
Элементы данных в языке PostScript называются объектами (числа, массивы, строки, символы). Над объектами можно производить различные действия, но если в других языках объекты помещаются в переменные и адресуются указанием имени переменной, то PostScript работает с данными напрямую, используя механизм стека.
Занесение чисел в стек.
Любое число, появившееся в исходном файле PostScript-программы заносится в стек. Например, строку:
-8 10.4 +77
интерпретатор по мере ее чтения слева направо выполнит следующие действия:
- Заносит в стек число -8; перемещает указатель на следующую свободную позицию.
- Заносит в стек число 10.4; перемещает указатель на следующую позицию и т. д.
Стек будет иметь вид:
77 10.4 -8
На вершине стека число 77 и оно может быть использовано первым в какой-либо операции. Остальные числа используются в порядке обратном порядку их занесения в стек.
Таким же образом в стек могут быть занесены PostScript-объекты любого вида: массивы, строки и такие экзотические объекты этого языка как словари.
Для упрощения объяснений рассмотрим сначала операции в стеке над числами. Обратите внимание, что пробелы, символы табуляции и новой строки являются в PostScript-программе разделителями объектов, другие символы типа круглых и квадратных скобок в некоторых случаях также могут быть разделителями.
Арифметические операторы
Оператор в PostScript — это слово, заставляющее интерпретатор выполнять те или иные действия. Он эквивалентен командам или процедурам в других языках программирования. Когда интерпретатор встречает слово в PostScript-программе, он просматривает свой внутренний словарь и пытается определить, является ли это слово именем оператора. Если оно в словаре найдено, то выполняются все связанные с ним действия, а затем переходит к следующему слову в исходном файле.
add и sub. Операторы смотрят находятся ли в стеке их операнды. В общем случае оператор удаляет их из стека и помещает туда результат выполнения своих действий. Например, оператор add (сложение) удаляет из стека два верхних числа, складывает их и оставляет сумму в стеке. Так строка программы, приведенная ниже, будет влиять на стек как показано на рисунке. Аналогично работает оператор sub, вычитающий число, находящееся в вершине стека, из числа, лежащего в стеке следующим.
Другие арифметические операторы:
div — деление. Второе число делится на число в вершине стека.
13 8 div -> 1.625
idiv — целочисленное деление.
25 3 idiv -> 8
mod — второе число делится на число в вершине стека, сохраняя остаток от деления.
7 5 mod -> 8
Операнды операторов mod и idiv должны быть целыми числами.
mul — перемножает два числа в вершине стека, помещая вместо них их произведение.
8 9 mul -> 72
neg — изменяет знак числа, находящегося в вершине стека.
-37 neg -> 37
Запись арифметических выражений.
Выражение 5+(8/2) на языке PostScript можно представить несколькими способами:
8 2 div 5 add
либо
5 8 2 div add
Чуть более сложный случай, выражение 9-(4*7), можно записать минимум двумя способами:
9 4 7 mul sub
4 7 mul 9 exch sub
Во втором способе введен новый оператор exch. Он меняет местами положение двух верхних чисел в вершине стека.
Применение оператора exch вызвано тем, что sub вычитает число в вершине стека из следующего за ним, что без exch приводит к неверному порядку действий.
Действия над стеком.
Эта группа операторов, представителем которой был exch добавляет, удаляет и изменяет порядок следования элементов в стеке.
clear очистка стека — удаляет из стека все элементы
а1...аn clear -
11 6 17 clear -> -
count число элементов в стеке.
a1...an count a1...an n
dup дублирует в стеке его верхний элемент
a1 dup a1 a1
8 dup -> 8 8
popудаляет из стека его верхний элемент
an...a2 a1 pop an...a2
25 31 4 pop -> 25 31
roll вращает элементы стека, из стека извлекаются два числа. Верхнее говорит сколько раз и в каком направлении вращать элементы стека, второе — сколько элементов вращать.
7 8 9 3 1 roll -> 9 7 8
7 8 9 3 -1 roll -> 8 9 7
copy дублирует n верхних элементов стеков
a1...an n copy a1...an a1...an
Существует еще ряд более специального вида операторов, работающих со стеком, они будут рассмотрены по мере изложения.
Ряд принтеров, например Apple LaserWriter, позволяет интерактивно с ними взаимодействовать. Вот операторы для этого:
== удаляет элемент из вершины стека и отображает его на экране.
Pstack — печатает все содержимое стека, не изменяя его.
Pstack и == являются полиморфными операторами, так как они в качестве операндов принимают объекты многих типов.
Начала графики
Язык PostScript был разработан для получения графических изображений, для этого у него имеется большой набор операторов.
Рисование в PostScript начинается с конструирования пути на идеальной поверхности, называемой текущей страницей. Путь — набор прямых и кривых линий, определяющих область, которая будет заполнена, или траекторию, которая будет нарисована на текущей странице.
Конструируя путь, необходимо решить, что с ним делать: мы можем нарисовать линию заданной толщины или заполнить его, чтобы создать непрерывное изображение.
После того, как заполнение текущей страницы закончено, ее можно распечатать на физическом листе бумаги.
Начнем с простой задачи: нарисуем вертикальную линию длиной 5″ (дюймов). Это выполнит следующая программа:
newpath 144 72 moveto 144 432 lineto stroke showpage
Разберем этот пример строка за строкой. Оператор newpath читает текущую страницу и объявляет, что начато рисование новой страницы. Конструирование пути начинается переносом воображаемого пера в заданную точку. Это перо при его переносах не оставляет «следа» на бумаге. Положение пера в каждый конкретный момент называется текущей точкой на текущем пути.
Оператор movedo переносит перо в точку, координаты которой заданы его операндами. он извлекает из стека два числа и рассматривает их как координаты х и у точки, которая становится текущей.
В системе координат, принятой в PostScript по умолчанию, начало координат находится в нижнем левом углу страницы. Координата х увеличивается вправо, а у — при движении вверх. Единица длины в этой системе равна 1/72 дюйма. Таким образом, оператор moveto переместит текущую точку (на рисунке — точка А) на два дюйма вправо (144/78) и один дюйм вверх (72/72).
y | | .А | x o-------->
Оператор lineto добавит сегмент к текущему пути, нарисуя линию между текущей точкой и точкой, координаты которой заданы его операндами, в данном случае 144 и 432. Точка, заданная как операнд lineto становиться текущей точкой. Обратите внимание, что lineto в действительности не рисует ничего на текущей странице. Он просто добавляет сегмент линии к текущему пути. Позже эту линию можно будет нарисовать, но это не происходит автоматически.
Оператор stroke вызывает рисование сконструированного нами пути на текущей странице. Теперь этот путь становится видимой линией.
И, наконец, оператор showpage печатает текущую страницу (отправляет ее на печать).
Таким образом можно выделить 3 этапа построения:
- Конструирование пути (newpath, moveto, lineto);
- нанесение его на текущую страницу (stroke);
- вывод текущей страницы (showpage).
Попробуйте написать программу, которая строит квадрат со стороной 1 см (1 дюйм = 2.54 см).
15.11.2001
замечания
PostScript — это реверсивный полигон, динамически типизированный, динамический интерфейс имен, язык сценариев со встроенными примитивами для генерации визуализированных изображений из векторных описаний. PostScript использует ту же «Adobe Image Model», что и формат PDF-файла.
PostScript используется в качестве выходного формата для многих программ, поскольку он предназначен для простого машинного генерирования.
Как и LISP, PostScript является homoiconic, а код и данные имеют одинаковое представление. Процедуры могут принимать процедуры в качестве данных и давать процедуры в качестве результатов, предоставляя также методы из конкатенативного программирования .
Установка или настройка
Аутентичные интерпретаторы Adobe PostScript доступны в высококачественных принтерах, продукте Display PostScript (DPS) и продукте Acrobat Distiller. Как авторы стандарта, эти продукты считаются «стандартной реализацией» с целью описания различий между реализациями PostScript.
Стандартный интерфейс к интерпретатору, определенному в PLRM, представляет собой программный поток, который может быть текстовым или двоичным в зависимости от деталей базового канала или ОС / контроллера. Acrobat Distiller имеет интерфейс GUI для выбора входной программы постскриптума и вывода ее в виде pdf. Distiller также имеет ограниченную поддержку для использования текстового потока вывода для сообщения об ошибках и других выходных данных программы. GSView предоставляет аналогичный графический интерфейс для аналогичного рабочего процесса, используя Ghostscript в качестве интерпретатора.
Ghostscript и Xpost работают в режиме командной строки. Файл программы postscript для запуска можно xpost program.ps
в командной строке ( gs program.ps
xpost program.ps
или xpost program.ps
), которая откроет графическое окно для отображения графического вывода. Параметры могут использоваться для рендеринга графики в другом месте, например, на диске, или полностью отключить графику и использовать постскриптум, как язык текстовых сценариев.
У разных переводчиков есть свои инструкции по установке и настройке, и для их воспроизводства они были бы расточительными (и склонными к падению).
-
Ghostscript доступен для всех основных платформ и дистрибутивов Linux в исходной или двоичной форме в соответствии с лицензией GNU или по другим соглашениям с авторами, программным обеспечением Artifex . Ghostscript реализует полный стандарт PostScript 3.
-
Xpost доступен в исходной форме для всех основных платформ в соответствии с лицензией BSD-3. Он реализует стандарт уровня 1 с некоторыми расширениями уровня 2 и некоторыми расширениями DPS.
Общее описание PostScript
PostScript — это полный язык программирования Turing, разработанный и разработанный Adobe Systems. Многие идеи, которые расцвели в PostScript, были культивированы в проектах для Xerox и Evans & Sutherland.
Его основное приложение в реальном мире исторически относится к языку описания страниц или в одностраничной форме EPS — это векторный графический язык описания образов. Он динамически типизирован, динамически-скопирован и основан на стеке, что приводит к преимущественно синтаксису Reverse Polish.
Существует три основных выпуска PostScript.
- PostScript Level 1 — это было выпущено на рынок в 1984 году как резидентная операционная система лазерного принтера Apple LaserWriter, открывающая эпоху настольных издательских систем.
- PostScript Level 2, выпущенный в 1991 году, содержал несколько важных улучшений уровня 1, включая поддержку декомпрессии изображений, разделение RIP, словари для автоматического выращивания, сбор мусора, именованные ресурсы, двоичные кодировки самого потока программы PostScript.
- PostScript 3 — последняя и, возможно, наиболее широко распространенная версия, была выпущена в 1997 году. Она также содержит несколько улучшений импорта по сравнению с уровнем 2, например Smooth Shading. Термин «уровень» был отброшен.
Хотя PostScript обычно используется в качестве языка описания страниц, и поэтому он реализуется внутри многих принтеров для создания растровых изображений — его также можно использовать для других целей. Как быстрый калькулятор с обратной полярностью с более запоминающимися именами операторов, чем bc
. В качестве выходного формата, сгенерированного другой программой (обычно на каком-то другом языке).
Хотя файл PostScript обычно является 7-битным чистым ASCII, существует несколько видов двоичной кодировки, описанных в стандарте уровня 2. И, будучи программируемым, программа может реализовать свою собственную схему произвольно сложного кодирования для себя. Существует международный конкурс по изучению окутанных поскриптов, несколько менее активный, чем C.
Интернет-ссылки
-
Индексные страницы документации Adobe:
https://www.adobe.com/products/postscript/resources.html
http://www.adobe.com/devnet/postscript.html
http://www.adobe.com/devnet/font.html -
Справочное руководство по языку PostScript , 3ed — стандарт PostScript 3. (7.41MB pdf)
( Дополнение , Исправление ) -
Справочное руководство по языку PostScript, 2ed — стандарт PostScript Level 2. (включает в себя документацию Display PostScript.) (3.29MB pdf)
-
Постскриптум и Поваренная книга — Синяя книга. (847 КБ pdf)
-
Дизайн программы Postscript — Зеленая книга. (911 КБ pdf)
-
Мышление в Postscript — автор книги «Зеленая книга» и учебник по сине-книгам. (826 КБ pdf)
-
Спецификации структурирования документов PostScript Language Specification 3.0 (521KB pdf)
-
Формат шрифта Adobe Type 1 (444 КБ pdf)
-
Инкапсулированный формат файла формата PostScript 3.0 (185 КБ pdf)
-
PostScript Printer Описание Формат файла 4.3 (186KB pdf) ( обновление )
-
Устранение ошибок PostScript — Советы по отладке. (158 КБ html)
-
Acumen Journal — Архив статей статей Postscript и PDF. (html-каталог сжатых pdf-файлов)
-
Математические иллюстрации: руководство по геометрии и постскриптуму — Биллом Кассельманом. (html-каталог разделов pdf и загрузки кода)
-
Тема с множеством алгоритмов сортировки (архив Usenet)
-
Страницы Гуру Дон Ланкастера
-
Прямое использование Anastigmatix языка Postscript
-
Поэтапный отладчик с открытым исходным кодом для кода Postscript
Вопросы и ответы
-
Часто задаваемые вопросы Usenet (около 1995)
-
Часто задаваемые вопросы по Wikibooks
-
SO PostScript-вопросы, отсортированные наиболее часто просматриваемыми
книги
-
PostScript Language Reference Manual, 1ed, 1985. Рекомендуется для небольшого размера и простого указателя оператора из итоговых страниц (отсутствует в последующих выпусках).
-
Реальный мир Postscript. Главы разных авторов по различным темам, в том числе превосходное освещение полутонов.
Локальные пространства имен для функций
Postscript — это динамический язык имен или язык LISP 1 . Но он предоставляет инструменты для реализации локальных переменных в процедурах и других эффектах, необходимых для реализации алгоритмов.
Для локальных имен в процедуре создайте новый словарь в начале и поместите его в конец.
/myproc {
10 dict begin
%... useful code ...
end
} def
Вы также можете сочетать это с ярлыком, чтобы определить аргументы функции как переменные.
% a b c myproc result
/myproc {
10 dict begin
{/c /b /a} {exch def} forall
%... useful code yielding result ...
end
} def
Если вам необходимо обновить * «глобальный» * переменной , а локальный словарь сверху, использование store
вместо def
.
Пример Hello World
Выберите шрифт и шрифт, выберите местоположение, строку show
.
%!PS
/Palatino-Roman 20 selectfont
300 400 moveto
(Hello, World!) show
showpage
Примечания и общие ошибки:
-
Невозможность установить шрифт (в результате не будет текстового или стандартного (уродливого) шрифта)
-
С помощью
findfont
иsetfont
но забывая оscalefont
между ними. Использование level-2selectfont
позволяет избежать этой проблемы и является более кратким. -
moveto
установить точку сmoveto
или установить точку за пределами страницы. Для бумажной бумаги в США 8.5×11 — 792×612 пс точек. Так что легко запомнить примерно 800×600 (но более короткий и более широкий). Таким образом,300 400
— это примерно центр страницы (немного высокий, немного слева). -
Не
showpage
вызватьshowpage
. Если вы просматриваете программу ps с помощьюgs
и она не заканчиваетсяshowpage
,gs
может отображать изображение для вас. И все же, файл будет таинственным образом не производить какой-либо выход, когда вы пытаетесь преобразовать в PDF или что-то еще.
учебный план
Прочтите документацию в этом порядке, чтобы легко изучить постскриптум:
-
Отличный учебник Paul Bourke: http://paulbourke.net/dataformats/postscript/
-
Синяя книга, первая половина, оригинальный официальный учебник:
http://www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF -
Зеленая книга, как эффективно использовать постскриптум:
http://www-cdf.fnal.gov/offline/PostScript/GREENBK.PDF -
Мышление в Postscript, ’nuff сказал: http://wwwcdf.pd.infn.it/localdoc/tips.pdf
-
Математические иллюстрации . Начать небольшой, построить большой. Математика за кривыми Безье. Алгоритм обрезки полигона Ходжмана-Сазерленда. Аффинные преобразования и нелинейные преобразования пути. 3D-рисунок и затенение Гуро. Из предисловия:
Который [из многих инструментов, чтобы помочь изготовить математическую графику], по-видимому, подразумевает компромисс между простотой и качеством, в котором большинство из них стремится к тому, что они считают простотой. Правда в том, что компромисс не нужен — как только вы сделали небольшую начальную инвестицию усилий, на сегодняшний день лучше всего делать в большинстве ситуаций — написать программу на графическом языке программирования PostScript. Практически нет предела качеству вывода программы PostScript, и по мере приобретения опыта трудности в использовании языка быстро уменьшаются. Очевидная сложность, связанная с созданием простых фигур при программировании в PostScript, как я надеюсь, эта книга продемонстрирует, в значительной степени иллюзия. И объем работы, связанной с созданием более сложных фигур, обычно не будет ни больше, ни меньше того, что необходимо.
PostScript is a reverse-polish stack-based, dynamically-typed, dynamic-namespacing, scripting language with built-in primitives for generating rendered images from vector descriptions. PostScript employs the same «Adobe Image Model» as the PDF file format.
PostScript is used as an output format by many programs since it is designed to be easily machine-generated.
Like LISP, PostScript is homoiconic and code and data share the same representation. Procedures can take procedures as data and yield procedures as results, lending itself to techniques from concatenative-programming as well.
Curriculum
Read the documentation in this order to easily learn postscript:
-
Paul Bourke’s excellent tutorial: http://paulbourke.net/dataformats/postscript/
-
Blue Book, first half, the original official tutorial:
http://www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF -
Green Book, how to use postscript effectively:
http://www-cdf.fnal.gov/offline/PostScript/GREENBK.PDF -
Thinking in Postscript, ’nuff said: http://wwwcdf.pd.infn.it/localdoc/tips.pdf
-
Mathematical Illustrations. Start small, build big. The math behind Bezier Curves. The Hodgman-Sutherland polygon clipping
algorithm. Affine transformations and non-linear transformations of the path. 3D drawing and Gouraud shading. From the preface:
Which [of the many tools to help one produce mathematical graphics] to choose apparently involves a trade-off between simplicity and quality, in which most go for what they perceive to be simplicity. The truth is that the trade-off is unnecessary — once one has made a small initial investment of effort, by far the best thing to do in most situations is to write a program in the graphics programming language PostScript. There is practically no limit to the quality of the output of a PostScript program, and as one acquires experience the difficulties of using the language decrease rapidly. The apparent complexity involved in producing simple figures by programming in PostScript, as I hope this book will demonstrate, is largely an illusion. And the amount of work involved in producing more complicated figures will usually be neither more nor less than what is necessary.
General Description of PostScript
PostScript is a Turing-complete general programming language, designed and developed by Adobe Systems. Many of the ideas which blossomed in PostScript had been cultivated in projects for Xerox and Evans & Sutherland.
Its main real-world application historically is as a page description language, or in its single-page EPS form a vector-graphics image-description language. It is dynamically-typed, dynamically-scoped, and stack-based which leads to a mostly Reverse Polish syntax.
There are three major releases of PostScript.
- PostScript Level 1 — this was released to the market in 1984 as the resident operating system of the Apple LaserWriter laser printer, inaugurating the Desktop Publishing Era.
- PostScript Level 2 — released in 1991, this contained several important improvements to Level 1, including support for image decompression, in-RIP separation, auto-growing dictionaries, garbage collection, Named Resources, binary encodings of the PostScript program stream itself.
- PostScript 3 — the latest and perhaps most widely adopted version was released in 1997. It too contains several import improvements over Level 2 such as Smooth Shading. The term “level” has been dropped.
Though PostScript is typically used as a page description language — and therefore is implemented inside many printers to generate raster images — it can also be used for other purposes. As a quick reverse-polish calculator with more memorable operator names than bc
. As an output format generated by another program (usually in some other language).
Though PostScript file are typically 7-bit-clean ASCII, there exist several kinds of binary encoding described in the level 2 standard. And being programmable, a program may implement its own arbitrarily-complex encoding scheme for itself. There is an International Obfuscated Postscript Competition, somewhat less active than the C one.
Online References
-
Index Pages of Adobe Documentation:
https://www.adobe.com/products/postscript/resources.html
http://www.adobe.com/devnet/postscript.html
http://www.adobe.com/devnet/font.html -
PostScript Language Reference Manual, 3ed — The PostScript 3 standard.
(7.41MB pdf)
(Supplement,
Errata) -
PostScript Language Reference Manual, 2ed — The PostScript Level 2 standard.
(includes Display PostScript documentation.) (3.29MB pdf) -
Postscript Tutorial and Cookbook — The blue book. (847KB pdf)
-
Postscript Language Program Design — The green book. (911KB pdf)
-
Thinking in Postscript — By the author of the green book and the blue-book’s tutorial. (826KB pdf)
-
PostScript Language Document Structuring Conventions Specification 3.0
(521KB pdf) -
Adobe Type 1 Font Format
(444KB pdf) -
Encapsulated PostScript File Format Specification 3.0 (185KB pdf)
-
PostScript Printer Description File Format Specification
4.3
(186KB pdf)
(Update)
-
Troubleshoot PostScript errors — Debugging tips. (158KB html)
-
Acumen Journal — Archive of Postscript and PDF programming articles. (html directory of zipped pdfs)
-
Mathematical Illustrations: A Manual of Geometry and Postscript — by Bill Casselman. (html directory of pdf chapters and code downloads)
-
Thread with many sorting algorithm implementations (usenet archive)
-
Don Lancaster’s Guru Pages
-
Anastigmatix’s Direct use of the Postscript Language
-
Open-source step-wise Debugger for Postscript Code
FAQs
-
Usenet FAQ (circa 1995)
-
Wikibooks PostScript FAQ
-
SO PostScript questions sorted by most-frequently viewed
Books
-
Postscript Language Reference Manual, 1ed, 1985. Recommended for its small size, and easy operator index from the summary pages (missing from later editions).
-
Real World Postscript. Chapters by various authors on various topics, including excellent coverage of halftoning.
Hello World example
Select a font and fontsize, select location, show
string.
%!PS
/Palatino-Roman 20 selectfont
300 400 moveto
(Hello, World!) show
showpage
Notes and common pitfalls:
-
Failing to set a font (resulting in either no text or a default (ugly) font)
-
Using
findfont
andsetfont
but forgetting toscalefont
in between. Using the level-2selectfont
avoids this problem and is more concise. -
Failing to set a point with
moveto
, or setting the point outside of the page. For US letter paper 8.5×11 is 792×612 ps points. So it’s easy to remember roughly 800×600 (but a smidge shorter and wider). So300 400
is roughly the center of the page (little high, little left). -
Forgetting to call
showpage
. If you preview a ps program withgs
and it does not end inshowpage
,gs
may display an image for you. And yet, the file will mysteriously fail to produce any output when you try to convert to pdf or something else.
Installation or Setup
The authentic Adobe PostScript interpreters are available in high-end printers, the Display PostScript (DPS) product, and the Acrobat Distiller product. As authors of the standard, these products are considered «the standard implementation» for the purpose of describing differences among PostScript implementations.
The Standard interface to the interpreter defined in the PLRM is the program-stream which may be either text or binary depending upon the details of the underlying channel or OS/controller. Acrobat Distiller has a GUI front-end to select the input postscript program and render its output as a pdf. Distiller also has some limited support for using the output text stream for reporting errors and other program output. GSView provides a similar GUI front-end for a similar workflow using Ghostscript as the interpreter.
Ghostscript and Xpost both work in a command-line mode. The postscript program file to run can be mentioned on the command-line (gs program.ps
or xpost program.ps
) which will open a graphics window to display the graphical output. Options may be used to render the graphics somewhere else like a disk file or suppress the graphics entirely and use postscript just as a text scripting language.
The various interpreters each have their own installation and setup instructions and it would be wasteful (and prone to falling out-of-date) to reproduce them here.
Freely-available PostScript interpreters
-
Ghostscript is available for all major platforms and Linux distributions, in source or binary form, under the GNU license or under other license arrangements with the authors, Artifex software. Ghostscript implements the full PostScript 3 standard.
-
Xpost is available in source form for all major platforms, under the BSD-3-clause license. It implements the Level-1 standard with some Level-2 extensions and some DPS extensions.
Local namespaces for functions
Postscript is a dynamic-namespacing or LISP 1 language. But it provides the tools to implement local variables in procedures and other effects needed to implement algorithms.
For local names in a procedure, make a new dictionary at the start and pop it at the end.
/myproc {
10 dict begin
%... useful code ...
end
} def
You can also combine this nicely with a shortcut to define the function’s arguments as variables.
% a b c myproc result
/myproc {
10 dict begin
{/c /b /a} {exch def} forall
%... useful code yielding result ...
end
} def
If you need to update a *»global» * variable while the local dictionary is on top, use store
instead of def
.
Reprinted from: https://www.cnblogs.com/ansing/tag/postscript%e8%AF%AD%E8%A8%80 %E6%95%99%E7%A8%8B/
First, introduction
PostScript language is a programming language for printer page magic. He has a wide range of graphics and can include any combination of variables, functions, and processes in any way.
The PostScript page description is a program (GS) running by the parser, and the PostScript program is usually generated by other applications.
1.1, postscript as page language
PostScript has a large number of graphics operators that describe your page more detailed.
Text font, location, direction, size.
The size, direction, width, straight line and curve of the geometric pattern, the space filled with any size shape color.
1.2, postscript as programming language
Second, stacks and operations
The PostScript programming language is the same as other programming languages, for a wide variety of data, such as numbers, arrays, strings, and characters. This method of processing data is referred to as a PostScript object.
There are a variety of ways to operate data, such as: putting data into a variable name, processed by variable name. The PostScript language has a variable, but it can also be done directly by stack.
2.1, postscript stack
The stack is a memory used to handle the data, which is a storage principle that is advanced.
Put the numbers:12 6.3 -99
Description:
1. Put 12 in the stack 2. Will 6.3, into the stack, 12 stack 3. Push -99 into the stack, the first two
2.2, operation
Calculate | Code example | result |
plus | 5 27 add | 32 |
Less | 8.3 6.6 sub | 1.7 |
except | 13 8 div | 1.625 |
In addition to returning an integer | 25 3 idiv | 8 |
In addition to returning | 12 10 mod | 2 |
Multiply | 6 8 mul | 48 |
Negate | -27 neg | 27 |
Combination operation:
6 + (3 ÷ 8)
1. 3 8 div 6 add
3, 8 into the stack, except for operation, 0.375, then talk about 6 in the stack, add the boss, 6.375
2. 6 3 8 div add
6, 3, 8, the stack, 8 is the top of the stack, take 3, 8, and perform the calculation, the result is added to 6
8 — (7 × 3)
1. 7 3 mul 8 exch sub
2. 8 7 3 mul sub
Exch: The first two space data of the swap stack
Clear all stack data: 6 8 12 32 Clear =>
Copy data on top of the stack: 6 dup => 6 6
Delete the top of the stack: 17 8 POP => 17
Rotating data: 7 8 9 3 1 roll => 9 7 8: 789 in turn, 1 representative from top to bottom, 798,978
7 8 9 3 -1 roll => 897: -1 Representative From the low end to the top, 879, 897
2.3, interactive operator
== Print the data at the top of the stack and delete it.
PSTack keeps the data in the entire stack, reserves the data.
Third, drawing
3.1, Picture
line:
newpath 144 72 moveto 144 432 lineto stroke showpage
Description:
We first call NewPath, initialize the status of the brush.
X Y Moveto, move the brush to x, y
X Y LineTo, the end of the end of X, Y
Stroke will build the path to the current page
Showpage prints the current page
Intersection:
newpath 72 360 moveto 144 72 rlineto 144 432 moveto 0 -246 rlineto storke showpage
Description:
X y rlineto: Positioning the pen position with x, y
square:
newpath 270 360 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto 4 setlinewidth stroke showpage
Description:
SetLineWidth: Set the width of the line
newpath 270 360 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto closepath 4 setlinewidth stroke showpage
Closepath: Closing graphics (a small gap will appear in the corner when not in use)
3.2, filling graphics
newpath 270 360 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto closepath fill showpage
Fill: Fill graphics
newpath 270 360 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto closepath .5 setgray fill showpage
Gray: Setting transparency
Multi-map stack:
newpath 252 324 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto closepath .5 setgray fill showpage newpath 270 360 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto closepath .5 setgray fill showpage newpath 288 396 moveto 0 72 rlineto 72 0 rlineto 0 -72 rlineto -72 0 rlineto closepath .5 setgray fill showpage
3.3, summary
ClosePath closed graphics
Lineto draws straight line
Moveto sets the starting point of drawing
NewPath initialization drawing method
Rlineto mobile
Fill draws padding graphics
Setgray Setting Transparency
SetLineWIDTH set line width
Stoke Drawing Path
Showpage prints the current page
Fourth, the program variable is used
4.1, variable definition
Postscript variable
The definition of variables is to associate variable names and values with DEF:
/ PPI 75 DEF% Define PPI as 75 / PPI PPI 1 Add DEF% Define the value of PPI + 1 as PPI PPI = 75 + 1 = 86
PostScript block:
4.2, usage procedures and variables
Square:
/box { 72 0 rlineto 0 72 rlineto -72 0 rlineto closepath }def newpath 252 324 moveto box .4 setgray fill
/inch {72 mul}def /box { newpath moveto 1 inch 0 rlineto 0 1 inch rlineto -1 inch 0 rlineto closepath }def /fillbox { setgray fill }def 3.5 inch 4.5 inch box 0 fillbox 2.75 inch 5 inch box .4 fillbox
V. Text printing
5.1, postscript font
The font is a character set with a unified specification. These include hundreds of character sets, including familiar Times and Helvetica
Use PostScript font
Before you print text, you need to specify the font needed, this process requires three steps:
- Find information about the font. Save in the current environment, he is used to provide the shape and information of a particular font.
- Scalable the font.
- Set the zoomed font to the current font, then print it out
%!PS-Adobe-3.0 /Times-Roman findfont 15 scalefont setfont 72 200 moveto (typography) show showpage
/Times-Roman findfont
Find the font name called Times-Roman and save it to the current program
15 scalefont
Set the font size of the Times-Roman font on the 15th
setfont
Set the font according to the already saved specifications
5.2, dynamically set font size
%!PS-Adobe-3.0 /scaleTimes % stack:scale { /Times-Roman findfont each scalefont setfont }def 6 scaleTimes 72 200 moveto (typography) show showpage
/ Times-Roman FindFont Add Stack
Each Scalefont SetFont Add
6 scaletimes meaning
6 /Times-Roman findfont each scalefont setfont
Each will switch between 6 and / Times-Roman
/Times-Roman findfont 6 scalefont setfont
Bird fonts supported by default:
Times-Roman
Times-Bold
Times-Italic
Times-Boldltalic
Helvetica
Helvetica-Bold
Helvetica-Oblique
Helvetica-Boldltalic
Courier
Courier-Bold
Courier-Oblique
Courier-BoldOblique
%!PS-Adobe-3.0 /MainFont /STSong-Light--GB-EUC-H findfont 15 scalefont def /SloganFont /Helvetica-Oblique findfont 7 scalefont def /OwnerFont /Helvetica findfont 10 scalefont def /rightshow { dup stringwidth pop 150 exch sub 0 rmoveto show }def /CardOutline { newpath 90 90 moveto 0 144 rlineto 252 0 rlineto 0 -144 rlineto closepath .5 setlinewidth stroke }def /doBorder { 99 99 moveto 0 126 rlineto 234 0 rlineto 0 -126 rlineto closepath 2 setlinewidth stroke }def /Diamond { newpath 207 216 moveto 36 -54 rlineto -36 -54 rlineto -36 54 rlineto closepath .8 setgray fill }def /doText { 0 setgray 90 180 moveto MainFont setfont (AAA, death Liu) Rightshow 90 168 moveto SloganFont setfont ("The Club of Lonely Hearts") rightshow 216 126 moveto OwnerFont setfont (Sam Spade) show 216 111 moveto (Owner) show }def CardOutline doBorder Diamond doText showpage
/ Stsong-light — GB-EUC-H is Chinese printing (Note: The file format is required to be GB2312 in Chinese printing, otherwise the font is not recognized, printing out is garbled)
StringWidth Gets the width of the current string, registered as a string width, string content, width at the top
dup stringwidth pop 150 exch sub 0 rmoveto show
Significance:
Get the string width and shift (value of 150 — string width, 0), ie, the print string is aligned at the right end of 150.