Лигатура е графично свързване на два или повече символа в един типографски знак за подобряване на четливостта и естетиката на текста. Класически примери включват двойките 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 спецификацията, стандартните лигатури са кодирани с етикет 'liga' и трябва да бъдат включени във всеки професионален шрифт.
Визуален ефект: без лигатура двойката fi изглежда като два отделни символа с нежелателно докосване. С лигатура — като един хармоничен символ. Разликата е особено забележима при големи размери (заглавия, лога) и в текст с голям брой повтарящи се двойки (например в немския език с häufigen Buchstabenkombinationen).
OpenType шрифтовете поддържат няколко вида лигатури, всеки със свой етикет и предназначение. Стандартни (етикет 'liga') — задължителни лигатури, включени по подразбиране в шрифта. Те подобряват четливостта и не трябва да се изключват без основателна причина. Съдържат двойките fi, fl, ff, ffi, ffl и други, специфични за шрифта.
Discretionary лигатури (етикет 'dlig') — декоративни лигатури, които се включват по избор според преценката на дизайнера. Те не са задължителни за четливост и се използват за стилизиране на текст: ct, st, sp, Th, Qu и други. Discretionary лигатури често се срещат в шрифтове с исторически или калиграфски характер — например в Garamond или Adobe Caslon. Предупреждение: прекомерното количество discretionary лигатури влошава четливостта, особено за потребители с дислексия.
Контекстни лигатури (етикет 'clig') — лигатури, които зависят от обкръжението на символа. Те се прилагат само при определени условия: ако символът е в началото или края на думата, след определен препинателен знак и т.н. Контекстните лигатури са разширена OpenType функция, която не се поддържа от всички шрифтове. Исторически лигатури (етикет 'hlig') — остарели лигатури, имитиращи стила на старопечатните книги (long s, &). Използват се рядко, само в исторически или стилизирани текстове.
| Вид лигатура | OpenType етикет | Примери | По подразбиране |
|---|---|---|---|
| Стандартни | liga | fi, fl, ff, ffi | Включени |
| Discretionary | dlig | ct, st, sp, Th | Изключени |
| Контекстни | clig | Зависи от позиция | Включени |
| Исторически | hlig | long s, ct (истор.) | Изключени |
Редки видове: съществуват също лигатури за математически набор (етикет '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
)
// Активиране на discretionary лигатури
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 с персонализирани лигатури чрез AttributedString
var attributedText: AttributedString {
var text = AttributedString(
"Effective typography with ligatures"
)
// Активиране на всички лигатури за целия текст
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 лигатури. Преди избор на шрифт проверете съвместимостта с вашия инструмент.
// Пример: операторни лигатури в JetBrains Mono
val isEqual = a != b // != се рендира като ≠
val arrow = x -> x + 1 // -> се рендира като →
val range = 1 .. 10 // .. се рендира като диапазон
Популярни шрифтове с програмистки лигатури: Fira Code (първият масов шрифт с лигатури, 2015), JetBrains Mono (оптимизиран за четене на код, 2020), Cascadia Code (от Microsoft, 2019), Iosevka (конфигурируем шрифт с модулна система от лигатури). Всеки шрифт има свой набор от лигатури — от 50 до 150+ замени. Препоръка: започнете с Fira Code или JetBrains Mono — те имат най-добра поддръжка в редактори и IDE.
Често задавани въпроси
Задайте атрибут 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също