Юрий Гордон
Барокко Мортале

Опус 14
Даешь calt
Рассказывает Денис Сериков [ДС]
Комментирует Юрий Гордон [ЮГ]
|
ДС: Начну с ответа на вопрос Юрия: «зачем так много кернинговых классов шрифту, в котором совсем нет кернинга?» :-)
Во-первых, без образования классов было бы проблематично писать фичи, слишком уж большой и запутанный получается код. Во-вторых, поскольку практически любой шрифт нуждается в кернинге, я принял решение использовать не OpenType, а kerning классы, дабы вложить в шрифт возможность создания кернинговых пар без серьёзной переделки кода. Впрочем, кернинговые пары останутся только в файле .vfb, так как при отсутствии кернинга они будут преобразованы в OpenType классы при генерации шрифта.
ЮГ: Спасибо, Денис! Как я ни стараюсь обойтись в БМ одним кальтом (см. ниже), от кернинга не удастся отвертеться. И тут классы, содержащие все варианты букв, станут просто незаменимы.
ДС: Посмотрев свежим взглядом на шрифт, понимаю, что альтернативные символы, а их у нас предостаточно, в кернинговые классы не вошли.
Вот они, лишенцы:

Надо исправить. Беру и перетаскиваю однотипные символы в соответствующий класс, восставляя их по возрастанию префикса (.alt, .alt1, .alt2…). Теперь класс, например для [g], выглядит так:
_g: g' g.1falt g.1malt g.1palt g.1salt g.init g.fina g.alt g.alt1 g.alt2 g.alt3 g.alt4
Повторяю эту операцию для всех строчных знаков шрифта.
До сих пор я собирал классы только из строчных, но пора переходить к прописным. Буду строить классы только из тех символов, у которых есть альтернативные начертания.
ЮГ: В прихотливом составе Барокко Мортале далеко не все буквы имеют альтернейты. Зато некоторые знаки (не только буквенные — например, параграф и амперсанд) представлены в нескольких вариациях.
ДС: Логика построения та же, что и у строчных, сначала символ с основного набора, потом альтернативные. Вот, что получилось у меня для латинской [G]:
_G: G' G.alt G.alt1
Пожалуй, с классами всё. Если чего-то не хватит, соберу по мере написания фич.
Перехожу к фиче ‘calt’.
ЮГ: Внимание! Начинается самое главное. Фича calt (contextual alternates) заведует автоматической подстановкой вариантов знаков, соответствующих определенным позициям втексте. В Барокко Мортале кальт подставляет альтернейты с хвостиками, цепляющимися за соседнюю букву так, чтобы скрипт выглядел связным. Мы с Денисом решили поэкспериментировать с кальтом во время работы над шрифтом Always Radio.
ДС: Открываю панель OpenType. Жму на кнопку add feature (кнопка с плюсом), FontLab создаёт стандартный шаблон:
feature xxxx {
sub by ;
} xxxx;
Переправляю хххх на calt, захожу в меню панели Opentype, выбираю пункт Import FontLab classes. В нижней части панели появляются созданные мной классы. Этим действием я облегчаю себе работу, так как теперь для того, что бы увидеть состав класса, мне достаточно будет посмотреть в нижнюю часть панели OpenType.
Для того, что бы данная фича работала, мне необходимо написать правило (условия) по которым будут подменяться те или иные символы, Юрий определил следующие наборы символов для фичи ‘calt’:
1. ‘х.init’ (начальная форма строчного символа)
2. ‘х.1falt’ (строчные, стоящие перед латинской [f])
3. ‘х.1malt’ (строчные, стоящие перед латинской [m])
4. ‘x.1palt’ (строчные, стоящие перед латинской [p])
5. ‘x.1salt’ (строчные, стоящие перед латинской [s])
6. ‘х.1afii10074alt’ (строчные, стоящие перед кириллической [и])
7. ‘х.1afii10076alt’ (строчные, стоящие перед кириллической [к])
8. ‘х.1afii10068alt’ (строчные, стоящие перед кириллической [г])
9. ‘х.1afii10077alt’ (строчные, стоящие перед кириллической [л])
10. ‘x.fina’ (финальная форма строчного символа)
ЮГ: каждая из перечисленных «вторых» букв [f, m, p, s, и, к, г, л] предсталяет определенный тип соединения:
Также, как вождь класса [f], прицепляются к впередистоящим [i], [j], [t] [u], [v], [w], [y]:
Для прочих букв-лидеров классов есть свой набор «однохвостников». В исходном файле, который я передал Денису, остальные члены группы были промаркированы тем же цветом, что и лидер — видите, вся группа, однотипная [f], помечена зеленым:
Увы, я, кажется, забыл об этом предупредить Дениса. Начиная писать правила для calt, он считал, что они должны касаться только [f, m, p, s, и, к, г, л].
ДС: Начинаю с начальной формы. Опять открываю панель Classes, создаю новый OpenType класс, называю его caltInit. Теперь тяну в окно следующие символы: space, hyphen, slash, bracketleft, underscore, parenleft, quoteleft, quotedblleft, endash, emdash, guillemotleft. Эти символы — пробел, знак переноса, слэш, подчеркивание, левые кавычки (разных видов), оба тире, открывающие скобки — все, что может стоять перед началом слова. Жму Accept.
Возвращаюсь в панель OpenType, в фичу ‘calt’, и пишу следующий код:
sub @caltInit a' by a.init;
Теперь, при встрече знаков space, hyphen, slash, bracketleft, underscore, parenleft, quoteleft, quotedblleft, endash, emdash, guillemotleft, с латинской [a], произойдёт замена [a] на начальную форму. Для остальных строчных символов проделываю тоже самое, придерживаясь данной схемы. Получился вот такой код:
26+33: все строчные латинские и русские буквы.
(Да, чуть не забыл: по мере создания новых классов, для перенесения их в нижнюю часть панели OpenType, необходимо повторять команду Import FontLab classes).
Далее, пишу условие для строчных стоящих перед латинской [f]:
sub a' f by a.1falt;
Всё вроде бы интуитивно понятно: «в паре [af] замени обычную [a] на [а] с хвостом, подходящим к [f]»?
Но не всё так просто. Работать эта команда будет, но только до тех пор, пока на месте [a], не окажется любая альтернативная [a].
Смотрю в нижнюю часть панели OpenType, на импортированные классы.
Дописываю:
@_a=[a a.1falt a.1malt a.1palt a.1salt a.init a.fina];
Теперь для кальта [а] — это не только основной вариант, но и все дополнительные.
Так, сейчас поправим:
sub @_a' f by a.1falt;
Или по-русски: «в паре [af] замени любую [а] на [а] с хвостом, подходящим к [f]». Теперь, порядок?
Хм, а если на месте [f] окажется альтернативный символ?
Пожалуй, так будет гораздо лучше:
sub @_a' @_f by a.1falt;
Переводим на человеческий: «в паре [af] замени любую [а] на [а] с хвостом, подходящим к любой [f]».
Теперь при встрече любого знака из класса @_a с любым знаком класса @_f все символы класса @_a изменятся на [a.1falt]. Хвостики сомкнутся:
Повторяю конструкцию для остальных латинских строчных.
Уф, большая работа. Жму кнопку Save, и вдруг...
Внимательно рассматриваю рисунок латинских знаков и начинаю понимать, что работа только начинается. Cоединение [i], [j], [t], [u], [v], [w], [y], аналогично [f], значит данный блок кода нужно написать и для этих символов. Надо быть внимательнее, пишу…
sub @_a' @_i by a.1falt;
sub @_a' @_j by a.1falt;
sub @_a' @_t by a.1falt;
и так далее до конца. Ну вот, с группой [f], наконец-то, порядок.
Повторяю эту конструкцию для остальных символов из списка, не забывая при этом о символах с похожим типом соединения.
Для всех, кроме финальной формы. Для работы строчных финальной формы необходим ещё один класс —
caltFina. В него входят: space, parenright ,comma, hyphen, period, slash, bracketright, underscore, quoteright, quotedblright, endash, emdash, guillemotright. (пробел, знак переноса, точка, подчеркивание, правые кавычки, оба тире, закрывающие скобки — все, что может стоять по окончании слова).
Не буду описывать, как я его создавал :-)
Пишу:
sub @_a' @caltFina by a.fina;
Всё, надо только дописать код для остальных финальных символов.
Фича почти закончена, осталось только поделить весь код на блоки, с помощью оператора lookup.
Если этого не сделать, часть символов в фиче может не работать.
Выглядеть конструкция будет примерно так:
feature calt { # Contextual Alternates
# Latin
lookup calt2 {
…тут будет код для начальных форм строчных символов
} calt2
lookup calt3 {
…тут будет код для средних форм строчных символов
} calt3
lookup calt4 {
…тут будет код для конечных форм строчных символов
} calt4
script cyrl; # Cyrillic
lookup calt2;
lookup calt3;
lookup calt4;
} calt;
Для того, что бы не писать код и всю конструкцию ещё раз, но уже для кириллической части, использую скрипт:
script cyrl; # Cyrillic
Далее просто указываю, какие именно блоки должны работать под локализованной, русской ОС:
lookup calt2;
lookup calt3;
lookup calt4;
Жму Save.
В довершение рассказанного я прикрепил код фичи 'calt'. Можно воочию посмотреть, что получилось.
В следующей части расскажу о построении фичи Stylistic Set.

|
|
|