Почему выносные элементы букв обрезаются после экспорта: проверяем метрики шрифта

После экспорта у букв рукописного шрифта могут исчезать хвосты, верхние штрихи или точки: «у» выглядит укороченной, «д» теряет нижнюю часть, а «й» прижимается к соседней строке. Сначала выясните, где именно проходит обрезка: по контуру глифа, по метрикам самого файла или по границам строки в приложении. Эта проверка помогает исправить причину, а не маскировать её большим межстрочным интервалом.
У шрифта есть контуры отдельных знаков и вертикальные метрики, которые описывают пространство вокруг строки. Приложение использует их, чтобы расположить текст и определить доступную область отрисовки. Если хвост «у» выходит ниже заданного спуска, а приложение ограничивает область строкой, часть контура не попадёт на экран или в печать. Похожий эффект возникает, когда сам контур не был корректно экспортирован.
Это разные неисправности. Если в предпросмотре глифа хвоста уже нет, проблема находится в рисунке или сборке знака. Если отдельный глиф выглядит целым, но исчезает в строке, проверьте метрики шрифта и межстрочное пространство в приложении. Если текст целиком обрезан прямоугольной рамкой, причиной может быть высота текстового блока, а не файл шрифта.
Вертикальные метрики — не одна универсальная пара чисел. В OpenType есть, например, sTypoAscender, sTypoDescender и sTypoLineGap в таблице OS/2, а также ascender, descender и lineGap в hhea. В Windows-метриках usWinAscent и usWinDescent используются, в частности, для определения границ отсечения в старом GDI-рендеринге. Разные приложения и платформы могут обращаться к разным полям, поэтому одинаковый файл иногда ведёт себя не одинаково. Спецификация Microsoft описывает назначение этих полей и совместимость.
До правки откройте экспортированный файл в редакторе шрифтов и отдельно посмотрите глифы. Проверьте верхние и нижние элементы, которые чаще выходят за среднюю высоту: «б», «й», «ё», «у», «р», «д», «ц», «щ», а также «ф», если у неё есть высокая верхушка и глубокий нижний вынос. Сравните контуры с исходным рисунком. Если нужная часть отсутствует в самом глифе, править метрики бессмысленно.
Затем наберите диагностические строки, чтобы проверить знаки по одному и в окружении соседей:
У Й Ё й ё— верхние элементы и точки;рудуцщ— нижние выносные штрихи;фуфу фуджи— высокие и глубокие части рядом;Ночь, ёж, ручей.— сочетание кириллицы, пунктуации и обычного текста.
Сохраните один и тот же текст в тестовом документе и посмотрите на него в нескольких местах: в предпросмотре редактора шрифтов, в текстовом редакторе, в PDF после экспорта и, если файл готовится для сайта, в браузере. Не меняйте между сравнениями размер, насыщенность, масштаб просмотра и интерлиньяж. Иначе будет трудно понять, изменился ли шрифт или условия отображения.
Зафиксируйте, что происходит: пропал только хвост конкретной буквы, обрезаются все знаки ниже базовой линии, верх строки сталкивается с предыдущей строкой или текст исчезает у края контейнера. Эта заметка сразу сужает поиск. Например, если в редакторе шрифта контур цел, а в PDF обрезаны все хвосты, ищите проблему в метриках или в настройках документа; если пострадал только один знак уже в редакторе глифов, возвращайтесь к его контуру.
Первый технический вопрос: входит ли край рисунка в пространство, описанное файлом. В редакторе шрифтов откройте свойства глифа и проверьте его верхнюю и нижнюю координаты. Затем сравните их с вертикальными метриками шрифта. Если нижний контур «у» глубже, чем рассчитанный спуск, или акцент «й» выше верхнего ограничения, некоторые растеризаторы могут обрезать пиксели.
Не путайте высоту видимого рисунка с межстрочным расстоянием. Ascender и descender описывают вертикальную протяжённость относительно базовой линии; line gap добавляет рекомендуемое расстояние между строками. Увеличение line gap может раздвинуть строки, но не обязательно расширит прямоугольник отсечения вокруг глифа. И наоборот, завышенные метрики способны создать огромные промежутки, хотя ни один знак не обрезается.
У шрифта должны быть осмысленные значения в поддерживаемых наборах метрик. В документации Microsoft указано, что usWinAscent и usWinDescent могут задавать границу отсечения в Windows GDI; при нежелательном отсечении верхнее и нижнее значения должны покрывать экстремумы контуров. Документация также описывает sTypo* как поля для типографически корректной и переносимой межстрочной компоновки. Не копируйте эти значения наугад из другого шрифта: проверьте фактические экстремумы собственных букв и языки, для которых предназначен набор.
Для Web текст размещается по метрикам шрифта, а высота строки дополнительно зависит от CSS. Спецификация CSS Inline рекомендует для OpenType/TrueType брать sTypoAscender и sTypoDescender из OS/2 для метрик ascent и descent, масштабируя их под текущий размер; line gap может задаваться sTypoLineGap или hhea.lineGap. Это рекомендация для реализации CSS, но поведение конкретных браузеров и стилей нужно проверять на целевой странице. См. раздел о метриках в CSS Inline Layout.
Если проблема видна только в одной программе, не меняйте сразу все поля файла. Сначала создайте контроль: наберите тот же набор символов стандартным шрифтом в том же блоке и с теми же размерами. Если контроль тоже обрезается, вероятнее всего, ограничена рамка текстового блока или неверно задано межстрочное расстояние. Если стандартный шрифт отображается нормально, а рукописный нет, подозрение возвращается к контурам и метрикам экспортированного файла.
Сравните ту же сборку в другом приложении на том же устройстве. Различие между программами говорит о том, что они могут по-разному использовать поля шрифта или строить линию. Если дефект возникает лишь в браузере, посмотрите на line-height, высоту контейнера, overflow и масштабирование элемента. Если он появляется только после печати или сохранения в PDF, проверьте, какой файл фактически попал в документ и не произошло ли подмены гарнитуры. Встроенный PDF-шрифт и отображение на экране также могут вести себя по-разному.
Для веб-страницы полезен временный диагностический стиль: увеличьте line-height, уберите обрезку контейнера и задайте тексту свободную высоту. Если после этого хвосты видны, геометрия блока участвовала в проблеме. Это не обязательно финальное исправление. Такой приём проверяет гипотезу; дальше нужно решить, соответствует ли межстрочный интервал замыслу дизайна и корректны ли метрики файла.
Если симптом плавает между устройствами, проверьте, что во всех случаях загружен один и тот же файл. Имя семейства само по себе не гарантирует, что приложение выбрало последнюю версию: старая установленная копия или кэш способны исказить сравнение. В тесте используйте отдельное имя семейства либо временно удалите прежний экземпляр, затем перезапустите приложение. Это контроль чистоты эксперимента, а не замена исправлению экспортированного файла.
- **Сохраните исходник и копию сборки.** Не правьте единственный файл. Запишите версии исходного проекта и экспортированного шрифта, чтобы можно было сравнить результат.
- **Определите крайние глифы.** Проверьте верхнюю точку и нижнюю точку среди всех нарисованных знаков, включая ударения, диакритические знаки и комбинированные символы, если они поддерживаются.
- **Откройте вертикальные поля.** В панели метрик редактора найдите значения ascender, descender и line gap, а также соответствующие параметры Windows/OS/2 и hhea, если редактор их показывает.
- **Исправляйте значение, которое отвечает за дефект.** При обрезке рисунка проверьте экстремумы и поле отсечения; при слишком тесной строке проверьте метрики строки и настройки line-height. Согласуйте связанные поля по документации используемого редактора и формата.
- **Переэкспортируйте в новый файл.** Используйте новое имя файла и, если возможно, временное имя семейства, чтобы отличить свежую сборку от уже установленной.
- **Повторите тот же прогон.** Установите тестовую версию, закройте и снова откройте приложения, затем воспроизведите исходный пример с теми же параметрами и сравните все контрольные среды.
Веб-стили могут визуально решить проблему на одной странице: автор может изменить line-height, добавить внутреннее пространство или убрать overflow: hidden. Такой CSS не меняет метрики файла и не исправит обрезку в настольном редакторе или PDF. Используйте его только после того, как проверили, что это именно граница элемента, а не недостаточная область отсечения шрифта.
- Откройте все крайние по высоте глифы, а не только строчные без выносных элементов.
- Убедитесь, что контур полного знака сохранён в исходнике и в экспортированном экземпляре.
- Сравните верхний и нижний экстремумы глифов с полями шрифта.
- Проверьте
OS/2иhhea, не копируя числа из чужого файла. - Наберите одну и ту же контрольную строку минимум в двух приложениях.
- Проверьте PDF или целевую страницу с теми же размером и межстрочным интервалом, что будут у пользователя.
- Удостоверьтесь, что открыта новая версия файла, а не кэшированная копия.
- Сохраните исходный проект и параметры сборки рядом с финальным экспортом.
**Увеличивать межстрочный интервал до исчезновения обрезки.** Это может скрыть пересечение строк, но не расширить область отсечения отдельного символа; соседние абзацы и интерфейсы по-прежнему могут обрезать штрихи.
**Подгонять метрики по одной букве.** Значение, выбранное для длинного хвоста «у», должно учитывать и остальные глифы, иначе акценты или прописные могут стать новой проблемой.
**Править только одно поле.** Разные приложения могут учитывать разные наборы метрик. Смотрите на согласованность OS/2 и hhea, ориентируясь на спецификацию, платформу и редактор, а не на универсальную формулу из случайного совета.
**Проверять в одном окне.** Окно предпросмотра показывает контур, но не гарантирует, что файл будет хорошо размещён в PDF, текстовом блоке или браузере.
**Считать CSS исправлением шрифта.** Отступ и line-height относятся к конкретному макету. Исправленная страница не доказывает, что сам файл правильно собран.
У конкретного глифа может быть самый глубокий нижний вынос. Проверьте его контур и координату нижней точки, а затем сравните с метрикой descender и областью отсечения. Если в редакторе шрифтов контур цел, проверьте ту же строку в другом приложении.
Иногда больший line-height устраняет столкновение соседних строк или ограничение текстового контейнера. Он не гарантирует расширение области отсечения глифа в самом шрифте. Сначала установите, обрезается ли строка целиком или исчезает часть отдельного контура.
Универсального ответа для каждого приложения нет: платформы и программы используют разные поля для компоновки строки или границ отсечения. Сверьте поля, проверьте рекомендации спецификации OpenType и протестируйте сборку в целевых приложениях.
Предпросмотр глифа показывает контур, а текстовое приложение дополнительно размещает его по метрикам шрифта и границам строки. Проверьте метрики, размер блока, межстрочный интервал и то, что приложение использует свежую версию файла.
Только если контур неполон, неверно расположен или сам рисунок выходит за задуманные границы. Если глиф в редакторе цел, а обрезается лишь после набора, сначала исследуйте вертикальные метрики и настройки текстового блока.
Повторите тот же контрольный текст в каждой целевой среде с прежними размером и интервалом. Убедитесь, что верхние и нижние элементы видны, строки не сталкиваются, а тестовая сборка загружена вместо прежней копии.
Обрезанный штрих после экспорта — это диагностическая задача на границе контура, метрик шрифта и текстового блока. Сравните глиф отдельно и в строке, проверьте крайние вертикальные координаты и релевантные поля OpenType, затем повторите тест в целевых приложениях. Когда проверка пройдена, можно создавать собственный почерк в Fontgenerator и оценивать шрифт на том же контрольном наборе.