Notes/2_all

tu 1_math 2_all 3_charts 4_i3 5_bash 6_avia 7_js 8_Dia23 9_prog_short Archive Barahlo Life nu

Postscript

Если нужно НАПИСАТЬ postscipt, то первое, что надо знать: это можно сделать только в ПРОСТОМ случае. Дальше - обычно: изучаете язык и пишете. ПС использует СТЕК данных и команд, что формирует обратную польскую нотацию: сначала пишутся данные, потом команда, говорящая, что с ними надо сделать. Например, сложение чисел выглядит так:
	1 2 +
- интуитивно, не правда ли?

Заголовок файла

Первой строкой надо написать местный "ша-банг", только "ша" здесь - это "%", а не решетка. Кроме того, машина не поедет, если не указать вектор сдвига и размер холста:
	%!PS
	%%BoundingBox: 0 0 400 400
Видим ДВА знака "%" в начале второй строчки, так надо. Размеры по умолчанию - в типографских пунктах, ось Оу направлена ВВЕРХ.

Сокращения

ПС ориентирован на большие объемы кода, записанного текстовыми командами. Как следствие - активное применений сокращений. Базовый синтаксис:
	/sc { some_command } bind def
Это снижает человекочитаемость кода, но в простых случаях пережить можно.

Контур создается из кусочков прямых и кривых, если контур замкнутый, его можно залить чем-нибудь. Сам по себе контур невидим, если нам нужно его увидеть, его необходимо ОБВЕСТИ чем-то вроде кисточки с краской, у которой указана ширина линии, цвет, параметры пунктира, если он есть и т.д. Обводка:

	stroke 
Согласно концепции стека, эта команда дается последней: "А теперь рисуй!"

Заливка:

	fill 
Эта команда тоже дается последней. Спросите: а как же обводка? - хм, удачи!

Ширина линии, например, в 2 пункта:

	2 setlinewidth 
Если установить другие единицы измерения, то "2" будет означать две заданные единицы.

Цвет (показан черный):

	0 0 0 setrgbcolor 
Оттенки серого (тот же черный):
	0 setgrey
Цвет устанавливается одинаковыми командами и для заливки, и для обводки.

Для создания контура применяется узнаваемая "черепаха" - начинаем с установки карандашика в начальную точку:

	x0 y0 moveto 
Радуемся, что есть возможность использования относительных координат, от последней точки:
	x0 y0 rmoveto 

Далее от начальной точки тянем линию контура. Отрезок прямой линии тянется в конечную точку отрезка:

	x1 y1 lineto 
или в относительных координатах:
	x1 y1 rlineto 
Насущных знаний нам достаточно, чтобы нарисовать синий квадратик 10х10 в центре маленького холста размером 20х20:
	%!PS
	%%BoundingBox: 0 0 20 20
	/RL { rlineto } bind def
	0 0 1 setrgbcolor
	5 5 moveto 0 10 RL 10 0 RL 0 -10 RL -10 0 RL  fill
Вытягивать все команды последней строки в одну строку необязательно, интерпретатору вообще по барабану. Мы тут просто место экономим. Но это логично, что вся отрисовка контура, от начала до конца, написана в одной строке. Итак, начали с того, что из нижнего левого угла (0,0) холста перешли в точку (5,5), оттуда, не смещаясь по горизонтали, протянули невидимую вертикальную линию на 10 единиц вверх, потом - на 10 вправо, так же вниз и налево, чем замкнули контур, и в конце залили его синим цветом. Можете использовать этот рисунок в качестве пиктограммы на вашем сайте.

Этот рисунок вообще не открылся в GIMP, немного некорректно открылся в Inkscape - не определился размер холста, полностью корректно открылся в evince и корректно вставляется в LaTeX.

Замыкания

Программеры, молчать! - сходите выпейте пива. Замыкание незамкнутого контура идет по прямой от точки, где мы остановились, к началу контура:
	closepath 
- так делать более грамотно, чем в примере выше. Исправленный пример:
	%!PS
	%%BoundingBox: 0 0 20 20
	/RL { rlineto } bind def
	0 0 1 setrgbcolor
	5 5 moveto 0 10 RL 10 0 RL 0 -10 RL closepath fill

Кривые

Безье с 1 тангентой:
	x0 y0   x1 y1   x2 y2   x3 y3 curveto 
Указываются 4 точки, крайние - начало и конец кривой, средние - начало и конец тангенты:
	0 10 moveto 0 10   10 20   10 0   20 10 curveto

Не забудьте вашу мать в конце написать "stroke", иначе вашу кривую вы не увидите!

Запятых нет, пары (х,у) разбиты более широкими промежутками для наглядности, интерпретатору это не нужно, и зачем-то в начале кривой нужно повторять координаты начальной точки, иначе не работает. От последней точки кривую можно протягивать дальше, как это было с контуром из прямых отрезков, тогда между сегментами кривой будет происходить плавная сшивка, то есть получится сплайн:
	0 10 moveto 0 10   5 20   5 0   10 10 curveto 10 10    15 20   15 0   20 10 curveto 
Конец в начале, как видим, каждый раз надо повторять, такие правила.

Дуга или сектор окружности:

	x y R a1 a2 arc 
Все логично: координаты центра, радиус, начальный и конечный угол. Пример:
	5 10 moveto 5 10 10 -45 45 arc fill
Углы откладываются от положительного направления оси Ох - все, как в школе. Как видите, координаты начальной точки опять приходится писать дважды.

Все, можно рисовать сердечки, ромашки и прочий клипарт.

Текст

	/Font_name findfont Font_size scalefont setfont x y moveto (Your_genial_text) show 
Например:
	%!PS
	%%BoundingBox: 0 0 20 20
	/12pt { findfont 12 scalefont setfont } bind def
	3 8 moveto /Serif 12pt (yo!) show
Для греческих букв есть специальный шрифт "Symbol", скобки необходимо экранировать
	%!PS
	%%BoundingBox: 0 0 20 20
	/12pt { findfont 10 scalefont setfont } bind def
        1 8 moveto /Symbol 12pt (yo:\)) show

Поворот

	a rotate 
Указывается угол "a" в градусах, от положительного направления оси Ох.

Пунктирная линия

	[a b] c setdash 
"a" - длина штриха, "b" - расстояние между штрихами, "c" - начальное смещение ВЛЕВО. Пример с пунктиром и поворотом:
	%!PS
	%%BoundingBox: 0 0 20 20
	45 rotate
        [3 7] -2 setdash
        0 0 moveto 30 0 lineto stroke