Лигатура в мобильной разработке — основы и применение символьных соединений

Автор: IT Sectr Опубликовано: 2026-07-24 Время чтения: 9 мин

Лигатура — это графическое соединение двух или более символов в один типографский знак для улучшения читаемости и эстетики текста. Классические примеры включают пары fi, fl, ff, ffi — где выступающий элемент буквы f сливается с соседним символом, предотвращая визуальный конфликт. В современной мобильной и веб-разработке лигатуры управляются на уровне шрифта через OpenType-фичи и поддерживаются на iOS, Android и в браузерах. По данным MDN Web Docs, CSS-свойство font-variant-ligatures позволяет разработчику включать и отключать различные типы лигатур: стандартные, discretionary (декоративные) и контекстные.

Главное

  • Лигатура — объединение нескольких символов в один графический элемент для улучшения читаемости
  • Стандартные лигатуры (fi, fl, ff) включены по умолчанию в профессиональных шрифтах
  • Discretionary лигатуры (ct, st, sp) — декоративные, включаются опционально
  • На iOS управляются через UIFontDescriptor с featureSettings для OpenType-фич
  • В шрифтах для программирования лигатуры объединяют операторы: !=, >=, ->, =>

Что такое лигатура в типографике

Лигатура — это типографский приём, при котором два или более символа заменяются на один специально спроектированный знак. Основная цель лигатуры — устранить визуальные конфликты между соседними символами и улучшить восприятие текста. В паре fi, например, верхний выступ буквы f сталкивается с точкой буквы i — лигатура объединяет их в единый изящный символ.

Лигатуры делятся на обязательные (стандартные) и опциональные (декоративные). Стандартные лигатуры — это пары, которые встречаются в большинстве шрифтов: fi, fl, ff, ffi, ffl. Они считаются необходимыми для качественной типографики и включены в шрифт по умолчанию. По данным OpenType Specification, стандартные лигатуры кодируются тегом 'liga' и должны быть включены в любом профессиональном шрифте.

Визуальный эффект: без лигатуры пара fi выглядит как два отдельных символа с нежелательным соприкосновением. С лигатурой — как один гармоничный символ. Разница особенно заметна в крупных кеглях (заголовки, логотипы) и в тексте с большим количеством повторяющихся пар (например, в немецком языке с häufigen Buchstabenkombinationen).

Типы лигатур: стандартные, discretionary, контекстные

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 тегПримерыПо умолчанию
Стандартныеligafi, fl, ff, ffiВключены
Discretionarydligct, st, sp, ThОтключены
КонтекстныеcligЗависит от позицииВключены
Историческиеhliglong 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

На iOS лигатурами можно управлять через UIFontDescriptor с использованием атрибута featureSettings. Этот атрибут принимает массив словарей, каждый из которых описывает одну OpenType-фичу. Управление лигатурами через дескриптор — единственный способ контролировать отдельные типы лигатур, не затрагивая другие OpenType-фичи шрифта.

swift
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-представлениях.

swift
// 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 и на Android

В вебе лигатуры управляются через CSS-свойство font-variant-ligatures, которое принимает ключевые слова: common-ligatures (стандартные включены), no-common-ligatures (стандартные отключены), discretionary-ligatures, no-discretionary-ligatures, contextual, no-contextual. Свойство поддерживается всеми современными браузерами с 2015 года. По умолчанию браузеры включают стандартные и контекстные лигатуры.

css
/* 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-лигатуры. Перед выбором шрифта проверьте совместимость с вашим инструментарием.

kotlin
// 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.

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

Как отключить лигатуры на iOS?

Установите attribute ligature = 0 в NSAttributedString или используйте UIFontDescriptor с kCommonLigaturesOffSelector. В SwiftUI — создайте AttributedString с .ligature = .disabled.

Чем лигатура отличается от кернинга?

Лигатура заменяет два символа на один новый знак, меняя форму. Кернинг регулирует расстояние между символами, не меняя их форму. Лигатура — графическое соединение, кернинг — пространственная корректировка.

Поддерживает ли Android лигатуры?

Да, начиная с 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.

Итоги

  • Лигатура — объединение нескольких символов в один графический элемент для эстетики и читаемости
  • Стандартные лигатуры (fi, fl, ff) включены по умолчанию в профессиональных шрифтах
  • Discretionary лигатуры (ct, st, sp) — декоративные, включаются через CSS font-variant-ligatures
  • На iOS управляются через UIFontDescriptor с featureSettings или атрибут ligature
  • В вебе управляются через font-variant-ligatures или font-feature-settings ('liga', 'dlig')
  • Программистские лигатуры (Fira Code, JetBrains Mono) объединяют операторы: !=, >=, ->
  • Для интерфейсной типографики используйте только стандартные лигатуры — discretionary снижают читаемость

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также