E N D
Лекция 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
Аргументами этой команды являются блок действий и печатаемая строка. При печати строки (как в show) между каждыми двумя печатями символов выполняется блок действий {-10 rotate 3 0 rmoveto 0.99 0.99 scale} % Это блок действий text % это строка kshow Другие команды ashow, cshow, xshow, yshow, xyshow, widthshow, awidthshow Объяснение командыkshow
Контур печатаемой строки • Для некоторых целей может захотеться получить контур печатаемой строки. Например, для того, чтобы залить буквы одним цветом или закрасить другим, или для того, чтобы использовать контур для вырезания части рисунка. • Такие возможности предоставляет команды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 • OXOY 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 (america_.pfb) ; • /Cloister_Black-Light (cloister.pfb) ; • /Cyrillic-Narrow (cyrnarrw.pfb) ; • /Izhitsa (izhitsa.pfb) ; • /Kimberly (kimberly.pfb) ; • /Osiris (osiris.pfb) ; • /TimesET (tet.pfb) ; • /Symbol (sy.pfb) ; • /ZapfDingbats (zd______.pfb) ;
Образцы использования шрифтов (1) • Вот примеры упомянутых выше шрифтов • /TimesET • /Symbol • /ZapfDingbats
Образцы использования шрифтов (2) • Вот примеры приведенных нами шрифтов • /American-Uncial • /Cloister_Black-Light • /Izhitsa
Образцы использования шрифтов (3) • Вот примеры приведенных нами шрифтов • /Cyrillic-Narrow • /Kimberly • /Osiris
Хорошая книга о шрифтах • Книга издана в СПб в 1994 г. Ее автор — один из основных (может быть, самый основной) разработчиков программы FontLab. • Уж он-то знает про шрифты. • ISBN 5-85237-015-0 • УДК 681.3.06