Лекция 10 Текст и шрифты Текст и шрифт • Печать текстов – это главная задача любой печатающей системы. Прежде чем печатать текст в ПостСкрипте мы должны установить шрифт. Для этого нужно выполнить несколько действий. Начнем с этих действий, еще не объяснив даже, что такое шрифт (а поанглийски font) • Во-первых, нужно найти шрифт по его имени или имени файла, в котором он содержится • /Times-Roman findfont • (times.pfb) findfont • Первый вариант использования – основной, он относится к шрифтам, которые известны мащине. • Второй работает не всегда, но в GS работает. Шкалирование и установка шрифта • Найденный шрифт можно запомнить для будущего использования. • /TR /Times-Roman findfont def • Но это только для того, чтобы больше шрифт не искать. Для использования с ним нужно выполнить еще две операции. • Шкалирование снимает со стека шрифт и размер и определяет новый шрифт нужного размера. Например, • /TR 12 scalefont • /Helvetica findfont 10 scalefont • Исходный шрифт имеет размер 1000. • Найденный или шкалированный шрифт можно установить командой setfont • /TR 12 scalefont setfont Использование установленного шрифта • Основная «печатающая» команда называется show. Она требует, чтобы был установлен шрифт, чтобы была определена текущая точка и чтобы в стеке лежала печатаемая строка. • Печатаемый текст пишется в круглых скобках. Например, • (Мы хотим сказать) show • (иногда текст (его часть) содержит скобки) show • (если скобки парные \(сбалансированные) show • (вхождения\), то это не страшно) show • • • • Специальные знаки в строках \ddd – символ, задаваемый восьмеричным номером \\ - backslash После выполнения команды show текущая точка определена и находится за напечатанным текстом. Ширина строки и ее использование • При выравнивании текста нужно использовать ширину печатаемой строки (которая, конечно, зависит от параметров шрифта). Команда stringwidth снимает со стека строку и кладет в стек координаты x и y ширины (обычно y=0). Вот примеры использования ширины • \rshow{dup stringwidth pop neg hrm show}def • \censhow{dup stringwidth pop –0.5 mul hrm show} def • Первая из этих процедур печатает текст справа от текущей точки, а вторая центрует его по текущей точке. Варианты команды show • Команда show имеет несколько вариантов, которые разрешают в промежутках между рисованием отдельных символов строки выполнять те или иные действия. Пример • Как, например, сделать надпись в форме спирали Решение • • • • • • • • • • %! /Times-ET findfont 20 scalefont setfont 350 450 translate 3 3 scale /text (The name of Kees van der Laan gi\ ves us a much longer example) def -100 0 moveto 50 rotate {-10 rotate 3 0 rmoveto 0.99 0.99 scale} text kshow showpage quit Объяснение команды kshow • Аргументами этой команды являются блок действий и печатаемая строка. При печати строки (как в show) между каждыми двумя печатями символов выполняется блок действий • {-10 rotate 3 0 rmoveto • 0.99 0.99 scale} % Это блок действий • text % это строка • kshow • Другие команды • ashow, cshow, xshow, yshow, xyshow, widthshow, awidthshow Контур печатаемой строки • Для некоторых целей может захотеться получить контур печатаемой строки. Например, для того, чтобы залить буквы одним цветом или закрасить другим, или для того, чтобы использовать контур для вырезания части рисунка. • Такие возможности предоставляет команды charpath. Она использует кроме строки еще логический параметр, определяющий дальнейшее использование пути. • string bool charpath – • Если логическое значение – истина, то путь годится для заливки или вырезания, а если ложь, то только для обвода. Пример (из поздравления проф. В.Н.Малоземову) Как программировалась буквица • • • • • • • • • • • • • • /letbox{/Izhitsa findfont 84 scalefont setfont lmarg vpos m -27 mm -20 mm rm GS bs hrl bs vrl bs neg hrl CL % letter box ready GS RED 0 LW clip lmarg vpos m -27 mm -20 mm rm OX OY rm /a -1 def 40 {GS bs 2 mul bs a mul /a a .1 add def rl S GR} repeat GR % rays inside box S GR}def /oshow{false charpath S}def % only to strike! /letend{dup GS 1 setgray show GR 0 LW oshow}def /letM{/OX -60 def /OY 30 def GS (М) letbox -2 6 rm 0.83 1 scale letend GR }def Шрифты • Шрифты бывают фирменные (в файлах) и самодельные. Фирменные шрифты имеют расширения • pfb Postscript Font Binary • pfa Postscript Font Alphabetic. • Самодельный шрифт описывается прямо в программе. На самодельных шрифтах хорошо показывать, как шрифт устроен. • Я увидел как-то шрифт, изготовленный для штрихового кода «3 из 9» и по аналогии с ним сделал шрифт Брайля, который используют слепые. Посмотрим, как он устроен. Шрифт Брайля (что это такое) • Шрифт Брайля предназначен для слепых. Каждый знак кодируется, говоря по-нашему, шестеркой битов, которые занумерованы от 1 до 6 вот так: • 1 4 • 2 5 • 3 6 • Слепые кодируют единицы выпуклыми точками и различают их наощупь. На следующем слайде показан полностью латинский алфавит. • Шрифт, которым набран этот алфавит, мы и хотим показать. Шрифт Брайля (алфавит) Шрифт Брайля (общая структура описания) • Описание состоит из задания для создаваемого шрифта специального информационного объекта — словаря и его заполнения. Словарь вводится так • /braille 10 dict def • Слово dict создает словарь, а 10 — это его первоначальная емкость. В каких единицах? В «элементах словаря», а как они определяются, будет видно при заполнении. Заполнение происходит внутри «операторных скобок» • braille begin • . . . . . • end • В основном заполнение состоит из обычных описаний обязательных параметров шрифта. Шрифт Брайля (обязательные параметры) • /FontType 3 def %тип шрифта (3 для пользовательских) • /FontMatrix [.01 0 0 .01 0 0] def • Таблица пересчета изображаемого знака в шрифт размера 1000 пунктов. При выполнении scalefont эта матрица просто заменяется другой, соответствующей требуемому размеру. • /FontBBox [0 0 60 100] def • Задание прямоугольника, объемлющего все символы данного шрифта. • /Encoding 256 array def • Массив для связи кодов символов с ключами слов, изображающих эти символы. Слова находятся в словаре • /CharProcs 3 dict def • /BuildChar • Процедура, исполняемая при печати каждого символа данного шрифта. Шрифт Брайля (заполнение массива) • Массив заполняется в два приема. Сначала во все его клеточки пишется невозможный символ .notdef (это делается обычным циклом), • 0 1 255 {Encoding exch /.notdef put} for • а затем каждый нужный символ заполняется отдельно, например, • Encoding 98 /b put • Encoding 44 /comma put • (так в элемент 98, а это код ASCII буквы b, помещается ключ /b, а в элемент 44 помещается ключ /comma, чтобы рисовать запятую). Шрифт Брайля (заполнение словаря) • Словарь /CharProcs заполняется внутри операторных скобок. Мы уже знаем про эти скобки и можем кое-что записать внутрь. • CharProcs begin • /b {1 1 0 0 0 0 bc } def • /comma {0 1 0 0 0 0 bc } def • /space {0 0 0 0 0 0 bc } def • /.notdef {} def • end • Для примера взято четыре символа. Они будут печататься так: в стек помещается шесть символов, единиц для черных точек и нулей для белых, и вызывается рисующая процедура bc (она еще появится). Убедитесь в правильном задании буквы. Важно, что пробел задается как буква — набором из шести белых точек. В описание входит и определение пустого символа .notdef. Шрифт Брайля (вспомогательная процедура bc) • /bc { 6 3 roll /w 30 def /wr 12 def • 0 0 m GS col w 0 rm col GR} def Рисуется сначала левый столбец, а затем правый. Поэтому начинаем с перестановки данных о столбцах. Вводим шаг между «точками» и размер точки. Встаем в начало координат (оно перенесено в опорную точку символа), рисуем левый столбец, сдвигаемся вправо и рисуем правый столбец. Рационально рисование столбца сделать специальной процедурой. • /col {GS 0 LW • 3 {GS CP T wr 0 rm wr wr wr -90 270 arc • 1 eq {fill} {stroke} ifelse • GR 0 w rm} repeat GR} def • Основная часть col — троекратное повторение действия, которое само состоит из трех шагов: рисование кружка, в зависимости от числа в стеке закраска его или обводка, сдвиг вверх. Шрифт Брайля (процедура рисования символа) • /BuildChar {% stack has font char • /col {. . .} def • /bc { . . .} def • 80 0 % width • 0 0 60 100 % bounding box • setcachedevice • exch begin % font begin • Encoding exch get % index by char in Encoding • CharProcs exch get % lookup name in CharProcs • end • exec % execute char procdure • } def Шрифт Брайля (использование) • • • • • • • • • • • • • /Braille braille definefont pop % подключ.шрифта 100 100 T % использ. шрифта /Braille findfont 36 scalefont setfont 0 162 m (abcdefghij) show 0 102 m (klmnopqrst) show 0 42 m (uvxyz w) show /Courier findfont 14 scalefont setfont 5 150 m (abcdefghij) [ 30 30 28 30 30 26 30 30 26 ] xshow 5 90 m (klmnopqrst) [ 32 26 30 28 29 30 30 28 30 ] xshow 5 30 m (uvxyzw) [ 30 29 30 28 86 ] xshow showpage Включение шрифтов в систему • В системе GhostScript имеется файл Fontmap, который связывает имена шрифтов с файлами. Если вам нужно добавить шрифты в свою систему, просто добавьте строки. • Вот так: • • • • • • • • • /American-Uncial /Cloister_Black-Light /Cyrillic-Narrow /Izhitsa /Kimberly /Osiris /TimesET /Symbol /ZapfDingbats (america_.pfb) (cloister.pfb) (cyrnarrw.pfb) (izhitsa.pfb) (kimberly.pfb) (osiris.pfb) (tet.pfb) (sy.pfb) (zd______.pfb) ; ; ; ; ; ; ; ; ; Образцы использования шрифтов (1) • Вот примеры упомянутых выше шрифтов • /TimesET • /Symbol • /ZapfDingbats Образцы использования шрифтов (2) • Вот примеры приведенных нами шрифтов • /American-Uncial • /Cloister_Black-Light • /Izhitsa Образцы использования шрифтов (3) • Вот примеры приведенных нами шрифтов • /Cyrillic-Narrow • /Kimberly • /Osiris Программа FontLab Программа FontLab (контроль) Хорошая книга о шрифтах • Книга издана в СПб в 1994 г. Ее автор — один из основных (может быть, самый основной) разработчиков программы FontLab. • Уж он-то знает про шрифты. • ISBN 5-85237-015-0 • УДК 681.3.06