Текст и шрифты Лекция 10

advertisement
Лекция 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
Download