Все статьи
24 сентября 2026 г.8 мин чтения

Акценты съехали после экспорта шрифта: как проверить якоря GPOS

Акценты съехали после экспорта шрифта: как проверить якоря GPOS

Если ударение, острый акцент или другой комбинируемый знак в собранном шрифте оказывается сбоку от буквы, проблема часто связана не с рисунком знака, а с позиционированием пары «основа — диакритика». В OpenType для этого служат якоря и правила GPOS. Разберите симптом, проверьте обе точки привязки и убедитесь, что нужные таблицы пережили экспорт.

Что именно делает якорь

Якорь — это координатная точка в системе дизайна шрифта. Для комбинируемого знака обычно задают точку на самой диакритике и соответствующую точку на базовой букве. При формировании строки движок совмещает эти точки; он не обязан располагать знак строго по центру или по геометрической середине контура. Такая привязка позволяет, например, ставить острый акцент над буквами разной ширины и формы.

В OpenType позиционирование комбинируемых знаков описано в таблице GPOS. Подтип MarkToBase связывает знак с базовой буквой, MarkToMark — один диакритический знак с другим, а MarkToLigature — отметку с компонентом лигатуры. Поддержка отдельного Unicode-символа сама по себе не гарантирует правильного размещения: кодовая точка может отображаться, а позиционирование останется неверным или отсутствующим.

Важно отличать две проверки. Если вместо буквы появился пустой прямоугольник, сначала ищите глиф и соответствие Unicode. Если знак виден, но налезает на букву, отрывается от неё или оказывается не с той стороны, проверяйте контуры, якоря и соответствующие lookups GPOS. Это разные слои сборки, и исправление одного не заменяет другое.

Как распознать сбой позиционирования

Сравните несколько сочетаний, а не один пример. Наберите одну и ту же отметку над узкой «i», круглой «o», широкой «m» и прописной буквой. Для нижнего знака повторите тест под буквами с плоским основанием и с нижним выносным элементом. Если расстояние или горизонтальное положение заметно ломается только на части основ, вероятно, у них нет подходящего якоря либо знак попал в неправильный класс.

Проверьте отдельно составные последовательности: основа плюс комбинируемый акцент, два последовательных акцента и заранее закодированная буква с диакритикой. Конкретный текстовый редактор может подставить готовый составной глиф по таблице GSUB или оставить сочетание из основы и отметки; результат зависит от шрифта, текста и движка. Поэтому полезно записывать, что именно набрано: например, одиночный символ «é» и последовательность «e» плюс комбинируемый острый акцент — не одно и то же для диагностики.

Если неправильное положение наблюдается только в одном приложении, ещё не делайте вывод, что экспорт повреждён. Скопируйте тот же текст в простой тестовый документ или в другое приложение, не меняя файл шрифта. Сопоставьте результат на той же системе и в том же размере. Разница между приложениями может указывать на разный путь обработки текста; одинаковый сбой в нескольких независимых просмотрщиках сильнее указывает на сам файл.

Из чего складывается позиционирование

Для MarkToBase в данных шрифта есть набор базовых глифов, набор знаков, их классы и якоря. Обычно у основы задаётся точка привязки на месте, где должен находиться знак, а на диакритике — точка, которая должна совпасть с ней. Для верхних и нижних знаков применяются разные классы. Поэтому верхний якорь акцента не должен случайно связываться с нижним якорем буквы.

Сложнее становится при нескольких знаках в одной позиции. Второй акцент не всегда можно корректно разместить, просто добавив его к тому же якорю основы: для этого может потребоваться MarkToMark, который привязывает один знак к другому. У многоэтажных сочетаний важны и свободное место, и согласованное назначение классов. Если композиция задумана для конкретного языка, проверяйте реальные последовательности этого языка, а не только изолированные диакритики.

Правило с якорями — не то же самое, что kerning. Кернинг корректирует расстояние между соседними основными глифами; MarkToBase и MarkToMark размещают отметки относительно основы или другой отметки. Поэтому наличие таблицы GPOS либо удачных пар кернинга не доказывает, что прикрепление акцентов собрано правильно. Внутри GPOS должны существовать соответствующие lookups и данные привязки.

Порядок проверки после экспорта

1. Зафиксируйте входные данные

Запишите имя файла, версию, установленный экземпляр шрифта, приложение и точную строку. Если тестируете варианты Unicode, выпишите кодовые точки или названия символов, чтобы не перепутать готовую букву с комбинируемой последовательностью. Сохраните исходный файл и отдельно создайте копию на проверку: это помогает отличить дефект сборки от неожиданной подмены установленного экземпляра.

2. Проверьте видимые глифы

В просмотрщике шрифта или редакторе убедитесь, что базовая буква и нужный знак существуют, имеют ожидаемые контуры и не содержат случайного внутреннего смещения, уже нарисованного в глифе. Проверьте таблицу соответствий символов, если знак отсутствует или выводится как пустой квадрат. При сравнении символа «é» и последовательности «e» плюс комбинируемый акцент отдельно отметьте, какой именно вариант воспроизводит ошибку.

3. Осмотрите экспортную таблицу GPOS

Откройте именно экспортированный файл инструментом, который показывает OpenType-таблицы, например `ttx` из FontTools. Проверьте наличие GPOS и наличие в ней lookups, относящихся к mark positioning. Сопоставьте список баз и знаков с тем, что присутствовало в исходном проекте. Если исходная сборка имела правила MarkToBase, а в выгруженном файле они отсутствуют, проблема вероятно возникла при конфигурации экспорта, фильтрации features или переносе исходных данных.

Команда `ttx -l font.ttf` показывает список таблиц файла; для просмотра содержимого GPOS можно выгрузить XML командой `ttx -t GPOS font.ttf`. Имена и детализация узлов зависят от формата вывода версии FontTools. Команда для просмотра сама по себе не проверяет визуальный результат и не исправляет таблицы: используйте её как диагностику. Сверяйтесь с документацией FontTools и спецификацией OpenType, если читаете структуру вручную.

4. Сравните якоря и классы

У основы проверьте наличие нужной верхней или нижней точки, а у знака — точки, которая должна с ней совпасть. Убедитесь, что пара принадлежит одной логической группе: верхние отметки не назначены в нижний класс и наоборот. При нескольких акцентах проследите цепочку: первый знак прикреплён к основе, следующий — к предыдущему знаку, если это предусмотрено дизайном.

5. Повторите визуальный тест

Удалите старый установленный экземпляр либо используйте временную копию с уникальным внутренним именем, затем загрузите экспортированный файл заново. Наберите контрольную строку в нескольких размерах и приложениях. Поменяйте только один фактор за раз: файл, последовательность символов, приложение или размер. После правки повторите ту же строку, иначе сравнение до и после будет ненадёжным.

Небольшой диагностический пример

Представьте, что «á» выглядит правильно в таблице глифов, но при наборе «a» и комбинируемого острого акцента знак оказывается далеко справа. Сначала проверьте, действительно ли тест вводит два символа, а не готовую букву. Затем проверьте, есть ли в экспортированном файле глиф острого акцента и отдельная метка в GPOS. Если mark lookup отсутствует, смещение нельзя исправить одним изменением рисунка акцента.

Если lookup присутствует, но ошибка повторяется только над «a» и «o», а над «i» всё ровно, сравните верхние anchors этих баз и координату точки на знаке. Если знак цепляется к первому акценту при последовательности из двух диакритик, проверьте MarkToMark и классы второго уровня. Такой разбор локализует участок: Unicode mapping, контур глифа, MarkToBase, MarkToMark или обработка конкретного приложения.

Чек-лист контрольной сборки

  • Запишите версию файла и точную тестовую строку, включая способ ввода комбинируемых знаков.
  • Проверьте, что все базовые глифы и диакритические знаки присутствуют в файле.
  • Убедитесь, что экспорт содержит GPOS и нужные mark lookups.
  • Сверьте верхние и нижние якоря и назначения классов у основ и отметок.
  • Проверьте связку mark-to-mark, если используются два и более знака подряд.
  • Сравните установленный файл с экспортом, исключив старую копию или подмену гарнитуры.
  • Повторите тест в нескольких приложениях и размерах, меняя по одному условию.
  • Сохраните контрольный текст и результат после каждой правки, чтобы не потерять воспроизводимость.

Частые ошибки

Проверять только заранее составную букву. Она может быть нарисована отдельным глифом и не раскрывает проблему комбинирования. Добавьте тест с базовой буквой и отдельным знаком.

Искать причину в кернинге. Позиционирование комбинируемой отметки выполняется другими правилами, даже если эти правила хранятся в общей таблице GPOS. Перестановка пар кернинга не заменит якорь.

Исправлять лишь один знак. Если у нескольких букв общая ошибка, проверьте класс якорей, набор базовых глифов и то, экспортировался ли lookup целиком. Локальный сдвиг одного акцента может временно скрыть системную ошибку и создать новый дефект на соседних буквах.

Обвинять движок по одному приложению. Сначала убедитесь, что установлен тот же файл и введена та же последовательность символов. Сравнивайте одинаковые условия в двух приложениях; фиксируйте и нормализованный состав текста.

Считать наличие GPOS достаточной проверкой. В файле может быть GPOS для кернинга или другого позиционирования, но не быть нужного MarkToBase. Проверяйте сами lookups, классы и якоря, а потом визуальный результат.

Часто задаваемые вопросы

Почему акцент смещается только над некоторыми буквами?

Якорь может отсутствовать у отдельных базовых глифов, иметь неверную координату или быть связан с неправильным классом. Сравните одинаковую отметку над несколькими буквами и проверьте их верхние либо нижние anchors в экспортированной сборке.

GPOS есть, но комбинируемый знак всё равно стоит неправильно. Почему?

Таблица GPOS содержит разные виды позиционирования. Наличие таблицы не подтверждает наличие MarkToBase или MarkToMark, относящихся к нужному сочетанию. Проверьте конкретные lookups, охват баз и знаков, классы и anchor-данные.

Нужен ли MarkToMark для одного акцента?

Обычно для связи одного комбинируемого знака с базовой буквой проверяют MarkToBase. MarkToMark нужен, когда одна отметка должна располагаться относительно другой, например при составной последовательности из нескольких знаков.

Что проверить, если буква с акцентом работает, а разложенная последовательность нет?

Проверьте способ ввода и кодовые точки. Готовая составная буква может быть отдельным глифом; комбинация из основы и отметки зависит от наличия нужных компонентов и правил позиционирования. Затем осмотрите GPOS экспортированного файла.

Можно ли диагностировать якоря только по скриншоту?

Скриншот помогает заметить ошибку, но редко объясняет её причину. Для воспроизводимой проверки запишите файл и строку, осмотрите таблицу GPOS, сравните сочетания с разными базами и повторите тест после чистой установки.

Достаточно ли посмотреть XML, чтобы подтвердить исправление?

Нет. XML показывает структуру таблиц и помогает найти пропущенное правило, но не подтверждает поведение конкретного текстового движка. После проверки таблиц нужно повторно набрать контрольные последовательности в целевых приложениях.

Вывод

Если комбинируемый знак виден, но съехал относительно буквы, разделите диагностику на наличие глифа, таблицу GPOS, пары якорей, классы и поведение приложения. Сохраните тестовую строку и проверяйте её на том же экспортированном файле после каждой правки. Когда контуры и набор символов уже готовы, создайте и соберите собственный шрифт в Fontgenerator, а затем проверьте итоговый файл в реальных текстах.

Источники