Лигатура — это графическое соединение двух или более символов в один типографский знак для улучшения читаемости и эстетики текста. Классические примеры включают пары fi, fl, ff, ffi — где выступающий элемент буквы f сливается с соседним символом, предотвращая визуальный конфликт. В современной мобильной и веб-разработке лигатуры управляются на уровне шрифта через OpenType-фичи и поддерживаются на iOS, Android и в браузерах. По данным MDN Web Docs, CSS-свойство font-variant-ligatures позволяет разработчику включать и отключать различные типы лигатур: стандартные, discretionary (декоративные) и контекстные.
Главное
Лигатура — это типографский приём, при котором два или более символа заменяются на один специально спроектированный знак. Основная цель лигатуры — устранить визуальные конфликты между соседними символами и улучшить восприятие текста. В паре fi, например, верхний выступ буквы f сталкивается с точкой буквы i — лигатура объединяет их в единый изящный символ.
Лигатуры делятся на обязательные (стандартные) и опциональные (декоративные). Стандартные лигатуры — это пары, которые встречаются в большинстве шрифтов: fi, fl, ff, ffi, ffl. Они считаются необходимыми для качественной типографики и включены в шрифт по умолчанию. По данным OpenType Specification, стандартные лигатуры кодируются тегом 'liga' и должны быть включены в любом профессиональном шрифте.
Визуальный эффект: без лигатуры пара fi выглядит как два отдельных символа с нежелательным соприкосновением. С лигатурой — как один гармоничный символ. Разница особенно заметна в крупных кеглях (заголовки, логотипы) и в тексте с большим количеством повторяющихся пар (например, в немецком языке с häufigen Buchstabenkombinationen).
OpenType-шрифты поддерживают несколько типов лигатур, каждый со своим тегом и назначением. Стандартные (tag 'liga') — обязательные лигатуры, включённые в шрифт по умолчанию. Они улучшают читаемость и не должны отключаться без веской причины. Содержат пары fi, fl, ff, ffi, ffl и другие, специфичные для гарнитуры.
Discretionary лигатуры (tag 'dlig') — декоративные лигатуры, которые включаются опционально по усмотрению дизайнера. Они не обязательны для читаемости и используются для стилизации текста: ct, st, sp, Th, Qu и другие. Discretionary лигатуры часто встречаются в шрифтах с историческим или каллиграфическим характером — например, в Garamond или Adobe Caslon. Предостережение: избыток discretionary лигатур ухудшает читаемость, особенно для пользователей с дислексией.
Контекстные лигатуры (tag 'clig') — лигатуры, которые зависят от окружения символа. Они применяются только при определённых условиях: если символ стоит в начале или конце слова, после определённого знака препинания и так далее. Контекстные лигатуры — продвинутая OpenType-фича, поддерживаемая не всеми шрифтами. Исторические лигатуры (tag 'hlig') — устаревшие лигатуры, имитирующие стиль старопечатных книг (long s, &). Используются редко, только в исторических или стилизованных текстах.
| Тип лигатуры | OpenType тег | Примеры | По умолчанию |
|---|---|---|---|
| Стандартные | liga | fi, fl, ff, ffi | Включены |
| Discretionary | dlig | ct, st, sp, Th | Отключены |
| Контекстные | clig | Зависит от позиции | Включены |
| Исторические | hlig | long s, ct (историч.) | Отключены |
Редкие типы: существуют также лигатуры для математического набора (tag 'dlig' для математических символов) и лигатуры инициалов (drop caps) — но они не используются в интерфейсной типографике и поддерживаются только специализированными шрифтами.
Лигатуры появились задолго до цифровой типографики — ещё в эпоху металлического набора в XV веке. Первопечатник Иоганн Гутенберг использовал лигатуры для экономии места в строках своей 42-строчной Библии. Каждая литера была физическим металлическим блоком, и объединение двух символов в одну литеру экономило свинец и упрощало набор. Стандартные лигатуры fi, fl, ffi, ffl — наследие той эпохи.
В фотонаборе (XX век) лигатуры утратили практическую функцию, но сохранились как эстетический элемент качественной типографики. Дизайнеры шрифтов продолжали включать лигатуры в свои гарнитуры, так как они стали признаком профессионализма и внимания к деталям. В эпоху цифровых шрифтов (PostScript, TrueType) лигатуры реализовывались как отдельные глифы с программной заменой.
OpenType (1996) стал революцией: он ввёл механизм GSUB (Glyph Substitution Table), который позволяет автоматически заменять последовательность символов на лигатуру без вмешательства пользователя. GSUB поддерживает контекстные замены, условия и fallback-варианты. Это позволило шрифтам иметь сотни лигатур, которые включаются/отключаются через теги. Современные шрифты — SF Pro, Roboto, Inter — поддерживают OpenType-лигатуры на всех платформах: iOS, Android, macOS, Windows, веб.
На iOS лигатурами можно управлять через UIFontDescriptor с использованием атрибута featureSettings. Этот атрибут принимает массив словарей, каждый из которых описывает одну OpenType-фичу. Управление лигатурами через дескриптор — единственный способ контролировать отдельные типы лигатур, не затрагивая другие OpenType-фичи шрифта.
let descriptor = UIFontDescriptor.preferredFontDescriptor(
withTextStyle: .body
)
// Enable discretionary ligatures
let ligatureDescriptor = descriptor.addingAttributes([
.featureSettings: [
[
UIFontDescriptor.FeatureIdentifier: kLigaturesType,
UIFontDescriptor.TypeIdentifier: kCommonLigaturesOnSelector
]
]
])
let font = UIFont(
descriptor: ligatureDescriptor,
size: 17
)
NSAttributedString также поддерживает атрибут ligature: NSNumber. Значение 0 — отключить все лигатуры, 1 — включить стандартные (по умолчанию), 2 — включить все (включая discretionary). Однако атрибут ligature в NSAttributedString не даёт тонкого контроля над типами лигатур — только глобальное включение/отключение. Для выборочного управления используйте UIFontDescriptor с featureSettings.
SwiftUI не предоставляет прямого модификатора для лигатур. Для управления лигатурами в SwiftUI создайте UIFont с нужными настройками через UIFontDescriptor и используйте его через Font(descriptor:size:). Альтернативно — используйте AttributedString (iOS 15+) с атрибутом .ligature для NSMutableAttributedString в AppKit/UIKit-представлениях.
// SwiftUI with custom ligatures via AttributedString
var attributedText: AttributedString {
var text = AttributedString(
"Effective typography with ligatures"
)
// Enable all ligatures for whole text
text.ligature = .all
return text
}
var body: some View {
Text(attributedText)
}
В вебе лигатуры управляются через CSS-свойство font-variant-ligatures, которое принимает ключевые слова: common-ligatures (стандартные включены), no-common-ligatures (стандартные отключены), discretionary-ligatures, no-discretionary-ligatures, contextual, no-contextual. Свойство поддерживается всеми современными браузерами с 2015 года. По умолчанию браузеры включают стандартные и контекстные лигатуры.
/* Disable all ligatures for monospace */
code, pre {
font-variant-ligatures: none;
}
/* Enable discretionary ligatures for headings */
.title-fancy {
font-variant-ligatures:
common-ligatures
discretionary-ligatures
contextual;
}
Android не имеет прямого API для управления лигатурами. В Android лигатуры управляются на уровне шрифта и движка рендеринга Minikin (Android 10+). Если шрифт содержит OpenType-таблицу GSUB, лигатуры применяются автоматически. Для отключения лигатур в Android используются кастомные Typeface, созданные через Typeface.Builder, или препроцессинг текста (замена символов до отображения). Ограничение: на Android ниже 10 лигатуры могут работать некорректно с некоторыми TTF-шрифтами.
Низкоуровневый контроль: на всех платформах можно использовать CSS @font-face с параметром font-feature-settings для OpenType-фич. Этот метод даёт доступ к любым OpenType-тегам, включая лигатуры. Пример: font-feature-settings: 'liga' 1, 'dlig' 1. Однако font-feature-settings — низкоуровневый синтаксис, и MDN рекомендует использовать font-variant-ligatures как более высокоуровневую альтернативу.
Особый класс лигатур — программистские лигатуры, которые объединяют операторы и символы кода в более читаемые знаки. Шрифты для программирования, такие как Fira Code, JetBrains Mono, Cascadia Code, включают discretionary лигатуры для распространённых операторов: != (становится ≠), >= (становится ≥), -> (становится стрелкой), => (становится толстой стрелкой), === (становится тройным равно).
Программистские лигатуры — спорная тема в сообществе разработчиков. Сторонники утверждают, что лигатуры ускоряют чтение кода, так как операторы воспринимаются как единые концепты. Исследование (Kera et al., PLATEAU 2020) показало, что лигатуры не влияют на скорость чтения кода, но субъективно нравятся 67% разработчиков. Противники лигатур отмечают, что они искажают код: символ != в редакторе отображается как ≠, но в текстовом файле хранится как два символа, что может запутывать при коллаборации.
Техническая реализация: программистские лигатуры — это discretionary OpenType-лигатуры (тег 'dlig'). Они отключены по умолчанию и включаются в редакторе кода через настройки шрифта. Разработчики, использующие такие шрифты, должны настраивать редактор на включение discretionary лигатур. В терминале (iTerm2, Windows Terminal) лигатуры также поддерживаются через настройки шрифта. Совместимость: не все редакторы и терминалы поддерживают OpenType-лигатуры. Перед выбором шрифта проверьте совместимость с вашим инструментарием.
// Example: operator ligatures in JetBrains Mono
val isEqual = a != b // != rendered as ≠
val arrow = x -> x + 1 // -> rendered as →
val range = 1 .. 10 // .. rendered as range
Популярные шрифты с программистскими лигатурами: Fira Code (первый массовый шрифт с лигатурами, 2015), JetBrains Mono (оптимизирован для чтения кода, 2020), Cascadia Code (от Microsoft, 2019), Iosevka (настраиваемый шрифт с модульной системой лигатур). Каждый шрифт имеет свой набор лигатур — от 50 до 150+ замен. Рекомендация: начинайте с Fira Code или JetBrains Mono — они имеют наилучшую поддержку в редакторах и IDE.
Часто задаваемые вопросы
Установите attribute ligature = 0 в NSAttributedString или используйте UIFontDescriptor с kCommonLigaturesOffSelector. В SwiftUI — создайте AttributedString с .ligature = .disabled.
Лигатура заменяет два символа на один новый знак, меняя форму. Кернинг регулирует расстояние между символами, не меняя их форму. Лигатура — графическое соединение, кернинг — пространственная корректировка.
Да, начиная с Android 10 (API 29). Minikin-рендеринг полностью поддерживает OpenType GSUB-таблицы. На более ранних версиях поддержка зависит от производителя устройства и версии шрифтового движка.
Для основного текста достаточно стандартных лигатур (fi, fl, ff) — они улучшают читаемость и незаметны пользователю. Discretionary лигатуры используйте только в заголовках или декоративном тексте, так как они снижают читаемость длинных текстов.
Редактор должен поддерживать OpenType-тег 'dlig' и уметь отображать discretionary лигатуры. VS Code, IntelliJ IDEA, Sublime Text поддерживают. Старые терминалы и редакторы (nano, vim без GUI) — нет. Проверьте настройки редактора: включите font-ligatures.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также