Ligatura — matnning o'qiluvchanligi va estetikasini yaxshilash uchun ikki yoki undan ortiq belgini bitta tipografik belgiga grafik birlashtirishdir. Klassik misollar fi, fl, ff, ffi juftliklarini o'z ichiga oladi — bu yerda f harfining chiqib turgan elementi qo'shni belgi bilan qo'shilib, vizual ziddiyatni oldini oladi. Zamonaviy mobil va veb-ishlanmada ligaturalar shrift darajasida OpenType xususiyatlari orqali boshqariladi va iOS, Android va brauzerlarda qo'llab-quvvatlanadi. MDN Web Docs ma'lumotlariga ko'ra, font-variant-ligatures CSS xususiyati dasturchiga turli xil ligatura turlarini yoqish va o'chirish imkonini beradi: standart, discretionary (dekorativ) va kontekstual.
Asosiy ma'lumotlar
Ligatura — bu ikki yoki undan ortiq belgi maxsus ishlab chiqilgan bitta belgi bilan almashtiriladigan tipografik usuldir. Ligaturaning asosiy maqsadi qo'shni belgilar orasidagi vizual ziddiyatlarni bartaraf etish va matnni idrok etishni yaxshilashdir. Fi juftligida, masalan, f harfining yuqori chiqishi i harfining nuqtasi bilan to'qnashadi — ligatura ularni bitta nafis belgida birlashtiradi.
Ligaturalar majburiy (standart) va ixtiyoriy (dekorativ) ga bo'linadi. Standart ligaturalar — aksariyat shriftlarda uchraydigan juftliklar: fi, fl, ff, ffi, ffl. Ular sifatli tipografiya uchun zarur deb hisoblanadi va shriftda sukut bo'yicha yoqilgan. OpenType Spetsifikatsiyasiga ko'ra, standart ligaturalar 'liga' tegi bilan kodlangan va har qanday professional shriftda yoqilgan bo'lishi kerak.
Vizual effekt: ligaturasiz fi juftligi istalmagan aloqasi bo'lgan ikkita alohida belgi kabi ko'rinadi. Ligatura bilan — bitta uyg'un belgi kabi. Farq ayniqsa katta o'lchamlarda (sarlavhalar, logotiplar) va ko'p miqdorda takrorlanuvchi juftliklari bo'lgan matnda (masalan, nemis tilida häufigen Buchstabenkombinationen) sezilarli.
OpenType shriftlari bir nechta ligatura turlarini qo'llab-quvvatlaydi, har biri o'z tegi va maqsadi bilan. Standart (teg 'liga') — shriftda sukut bo'yicha yoqilgan majburiy ligaturalar. Ular o'qiluvchanlikni yaxshilaydi va jiddiy sababsiz o'chirilmasligi kerak. fi, fl, ff, ffi, ffl juftliklarini va garnitura uchun xos bo'lgan boshqalarni o'z ichiga oladi.
Discretionary ligaturalar (teg 'dlig') — dizaynerning ixtiyoriga ko'ra ixtiyoriy ravishda yoqiladigan dekorativ ligaturalar. Ular o'qiluvchanlik uchun majburiy emas va matnni stilizatsiya qilish uchun ishlatiladi: ct, st, sp, Th, Qu va boshqalar. Discretionary ligaturalar ko'pincha tarixiy yoki kalligrafik xarakterdagi shriftlarda — masalan, Garamond yoki Adobe Caslon da uchraydi. Ogohlantirish: discretionary ligaturalarning haddan tashqari ko'pligi o'qiluvchanlikni yomonlashtiradi, ayniqsa disleksiyasi bo'lgan foydalanuvchilar uchun.
Kontekstual ligaturalar (teg 'clig') — belgining atrof-muhitiga bog'liq bo'lgan ligaturalar. Ular faqat ma'lum shartlarda qo'llaniladi: agar belgi so'zning boshida yoki oxirida bo'lsa, ma'lum bir tinish belgisidan keyin va hokazo. Kontekstual ligaturalar — barcha shriftlar tomonidan qo'llab-quvvatlanmaydigan ilg'or OpenType xususiyati. Tarixiy ligaturalar (teg 'hlig') — eski bosma kitoblar uslubini taqlid qiluvchi eskirgan ligaturalar (long s, &). Kamdan-kam qo'llaniladi, faqat tarixiy yoki stilizatsiya qilingan matnlarda.
| Ligatura turi | OpenType tegi | Misollar | Sukut bo'yicha |
|---|---|---|---|
| Standart | liga | fi, fl, ff, ffi | Yoqilgan |
| Discretionary | dlig | ct, st, sp, Th | O'chirilgan |
| Kontekstual | clig | Pozitsiyaga bog'liq | Yoqilgan |
| Tarixiy | hlig | long s, ct (tarixiy) | O'chirilgan |
Nodir turlar: matematik to'plam uchun ligaturalar (teg 'dlig' matematik belgilar uchun) va bosh harf ligaturalari (drop caps) ham mavjud — ammo ular interfeys tipografiyasida ishlatilmaydi va faqat ixtisoslashtirilgan shriftlar tomonidan qo'llab-quvvatlanadi.
Ligaturalar raqamli tipografiyadan ancha oldin — hali XV asrda metall terim davrida paydo bo'lgan. Matbaachi Iogann Gutenberg 42 qatorli Injilining satrlarida joy tejash uchun ligaturalardan foydalangan. Har bir harf jismoniy metall blok edi va ikki belgini bitta harfda birlashtirish qo'rg'oshinni tejab, terimni soddalashtirgan. Standart ligaturalar fi, fl, ffi, ffl o'sha davrning merosidir.
Fototerimda (XX asr) ligaturalar amaliy funktsiyasini yo'qotdi, ammo sifatli tipografiyaning estetik elementi sifatida qoldi. Shrift dizaynerlari ligaturalarni o'z garnituralariga kiritishda davom etdilar, chunki ular professionallik va tafsilotlarga e'tibor belgisiga aylandi. Raqamli shriftlar davrida (PostScript, TrueType) ligaturalar dasturiy almashtirish bilan alohida gliflar sifatida amalga oshirilgan.
OpenType (1996) inqilob bo'ldi: u foydalanuvchi aralashuvisiz belgilar ketma-ketligini avtomatik ravishda ligatura bilan almashtiradigan GSUB (Glyph Substitution Table) mexanizmini joriy qildi. GSUB kontekstual almashtirishlar, shartlar va fallback-variantlarni qo'llab-quvvatlaydi. Bu shriftlarga teglar orqali yoqiladigan/o'chiriladigan yuzlab ligaturalarga ega bo'lish imkonini berdi. Zamonaviy shriftlar — SF Pro, Roboto, Inter — OpenType ligaturalarini barcha platformalarda qo'llab-quvvatlaydi: iOS, Android, macOS, Windows, veb.
iOS da ligaturalarni UIFontDescriptor orqali featureSettings atributidan foydalanib boshqarish mumkin. Bu atribut har biri bitta OpenType xususiyatini tavsiflovchi lug'atlar massivini qabul qiladi. Ligaturalarni deskriptor orqali boshqarish shriftning boshqa OpenType xususiyatlariga ta'sir qilmasdan alohida ligatura turlarini nazorat qilishning yagona usulidir.
let descriptor = UIFontDescriptor.preferredFontDescriptor(
withTextStyle: .body
)
// Discretionary ligaturalarni yoqish
let ligatureDescriptor = descriptor.addingAttributes([
.featureSettings: [
[
UIFontDescriptor.FeatureIdentifier: kLigaturesType,
UIFontDescriptor.TypeIdentifier: kCommonLigaturesOnSelector
]
]
])
let font = UIFont(
descriptor: ligatureDescriptor,
size: 17
)
NSAttributedString ham ligature: NSNumber atributini qo'llab-quvvatlaydi. Qiymat 0 — barcha ligaturalarni o'chirish, 1 — standartlarni yoqish (sukut bo'yicha), 2 — barchasini yoqish (discretionary ni ham). Biroq NSAttributedString dagi ligature atributi ligatura turlari ustida nozik nazorat bermaydi — faqat global yoqish/o'chirish. Tanlab boshqarish uchun featureSettings bilan UIFontDescriptor dan foydalaning.
SwiftUI ligaturalar uchun to'g'ridan-to'g'ri modifikatorni taqdim etmaydi. SwiftUI da ligaturalarni boshqarish uchun UIFontDescriptor orqali kerakli sozlamalar bilan UIFont yarating va uni Font(descriptor:size:) orqali ishlating. Alternativ — AppKit/UIKit ko'rinishlarida NSMutableAttributedString uchun .ligature atributi bilan AttributedString (iOS 15+) dan foydalaning.
// AttributedString orqali maxsus ligaturalar bilan SwiftUI
var attributedText: AttributedString {
var text = AttributedString(
"Effective typography with ligatures"
)
// Butun matn uchun barcha ligaturalarni yoqish
text.ligature = .all
return text
}
var body: some View {
Text(attributedText)
}
Vebda ligaturalar font-variant-ligatures CSS xususiyati orqali boshqariladi, u kalit so'zlarni qabul qiladi: common-ligatures (standart yoqilgan), no-common-ligatures (standart o'chirilgan), discretionary-ligatures, no-discretionary-ligatures, contextual, no-contextual. Xususiyat 2015 yildan beri barcha zamonaviy brauzerlar tomonidan qo'llab-quvvatlanadi. Brauzerlar sukut bo'yicha standart va kontekstual ligaturalarni yoqadi.
/* 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 ligaturalarni boshqarish uchun to'g'ridan-to'g'ri API ga ega emas. Android da ligaturalar shrift darajasida va Minikin (Android 10+) render dvigateli darajasida boshqariladi. Agar shrift OpenType GSUB jadvalini o'z ichiga olsa, ligaturalar avtomatik ravishda qo'llaniladi. Android da ligaturalarni o'chirish uchun Typeface.Builder orqali yaratilgan maxsus Typeface yoki matnni qayta ishlash (ko'rsatishdan oldin belgilarni almashtirish) ishlatiladi. Cheklov: Android 10 dan past versiyalarda ligaturalar ba'zi TTF shriftlari bilan noto'g'ri ishlashi mumkin.
Past darajadagi nazorat: barcha platformalarda OpenType xususiyatlari uchun font-feature-settings parametri bilan CSS @font-face ishlatish mumkin. Bu usul ligaturalarni ham o'z ichiga olgan har qanday OpenType teglariga kirish imkonini beradi. Misol: font-feature-settings: 'liga' 1, 'dlig' 1. Biroq font-feature-settings past darajadagi sintaksis va MDN yuqori darajadagi muqobil sifatida font-variant-ligatures dan foydalanishni tavsiya qiladi.
Ligaturalarning maxsus sinfi — operatorlar va kod belgilarini o'qiladigan belgilarda birlashtiradigan dasturlash ligaturalari. Fira Code, JetBrains Mono, Cascadia Code kabi dasturlash shriftlari keng tarqalgan operatorlar uchun discretionary ligaturalarni o'z ichiga oladi: != (≠ ga aylanadi), >= (≥ ga aylanadi), -> (o'qga aylanadi), => (qalin o'qga aylanadi), === (uch karra tengga aylanadi).
Dasturlash ligaturalari dasturchilar jamoasida munozarali mavzudir. Tarafdorlar ligaturalar kodni o'qishni tezlashtiradi, deb ta'kidlaydilar, chunki operatorlar yagona tushunchalar sifatida qabul qilinadi. Tadqiqot (Kera et al., PLATEAU 2020) ligaturalar kodni o'qish tezligiga ta'sir qilmasligini, ammo subyektiv ravishda dasturchilarning 67 foiziga yoqishini ko'rsatdi. Ligaturalarning muxoliflari ular kodni buzib ko'rsatishini ta'kidlaydilar: != belgisi muharrirda ≠ sifatida ko'rsatiladi, ammo matn faylida ikkita belgi sifatida saqlanadi, bu hamkorlikda chalkashlikka olib kelishi mumkin.
Texnik amalga oshirish: dasturlash ligaturalari discretionary OpenType ligaturalaridir (teg 'dlig'). Ular sukut bo'yicha o'chirilgan va kod muharririda shrift sozlamalari orqali yoqiladi. Bunday shriftlardan foydalanadigan dasturchilar muharrirni discretionary ligaturalarni yoqishga sozlashlari kerak. Terminalda (iTerm2, Windows Terminal) ligaturalar ham shrift sozlamalari orqali qo'llab-quvvatlanadi. Moslik: barcha muharrirlar va terminallar OpenType ligaturalarini qo'llab-quvvatlamaydi. Shriftni tanlashdan oldin asbobingiz bilan mosligini tekshiring.
// Misol: JetBrains Mono da operator ligaturalari
val isEqual = a != b // != ≠ sifatida ko'rsatiladi
val arrow = x -> x + 1 // -> → sifatida ko'rsatiladi
val range = 1 .. 10 // .. diapazon sifatida ko'rsatiladi
Mashhur shriftlar dasturlash ligaturalari bilan: Fira Code (ligaturalari bo'lgan birinchi ommaviy shrift, 2015), JetBrains Mono (kodni o'qish uchun optimallashtirilgan, 2020), Cascadia Code (Microsoft dan, 2019), Iosevka (modulli ligatura tizimi bilan sozlanishi shrift). Har bir shrift o'z ligatura to'plamiga ega — 50 dan 150+ gacha almashtirish. Tavsiya: Fira Code yoki JetBrains Mono dan boshlang — ular muharrirlar va IDE larda eng yaxshi qo'llab-quvvatlanadi.
Tez-tez so'raladigan savollar
NSAttributedString da ligature = 0 atributini o'rnating yoki kCommonLigaturesOffSelector bilan UIFontDescriptor dan foydalaning. SwiftUI da .ligature = .disabled bilan AttributedString yarating.
Ligatura ikkita belgini shaklini o'zgartiruvchi bitta yangi belgi bilan almashtiradi. Kerning belgilar orasidagi masofani ularning shaklini o'zgartirmasdan tartibga soladi. Ligatura grafik birlashma, kerning fazoviy tuzatishdir.
Ha, Android 10 (API 29) dan boshlab. Minikin renderlash OpenType GSUB jadvallarini to'liq qo'llab-quvvatlaydi. Oldingi versiyalarda qo'llab-quvvatlash qurilma ishlab chiqaruvchisiga va shrift dvigateli versiyasiga bog'liq.
Asosiy matn uchun standart ligaturalar (fi, fl, ff) yetarli — ular o'qiluvchanlikni yaxshilaydi va foydalanuvchiga ko'rinmaydi. Discretionary ligaturalarni faqat sarlavhalarda yoki dekorativ matnda ishlating, chunki ular uzoq matnlarning o'qiluvchanligini pasaytiradi.
Muharrir OpenType 'dlig' tegini qo'llab-quvvatlashi va discretionary ligaturalarni ko'rsata olishi kerak. VS Code, IntelliJ IDEA, Sublime Text qo'llab-quvvatlaydi. Eski terminallar va muharrirlar (nano, vim GUI siz) — yo'q. Muharrir sozlamalarini tekshiring: font-ligatures ni yoqing.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.