لیگاتور — یک اتصال گرافیکی دو یا چند نماد به یک علامت تایپوگرافی برای بهبود خوانایی و زیبایی متن است. مثالهای کلاسیک شامل جفتهای 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) نیز وجود دارند — اما در تایپوگرافی رابط کاربری استفاده نمیشوند و فقط توسط فونتهای تخصصی پشتیبانی میشوند.
لیگاتورها مدتها قبل از تایپوگرافی دیجیتال — هنوز در دوران حروفچینی فلزی در قرن پانزدهم ظاهر شدند. چاپگر یوهانس گوتنبرگ برای صرفهجویی در فضای خطوط کتاب مقدس ۴۲ خطی خود از لیگاتورها استفاده میکرد. هر حرف یک بلوک فلزی فیزیکی بود و ترکیب دو نماد در یک حرف در سرب صرفهجویی میکرد و حروفچینی را سادهتر مینمود. لیگاتورهای استاندارد fi, fl, ffi, ffl میراث آن دوران هستند.
در حروفچینی نوری (قرن بیستم) لیگاتورها کاربرد عملی خود را از دست دادند، اما به عنوان عنصر زیباییشناختی تایپوگرافی با کیفیت باقی ماندند. طراحان فونت همچنان لیگاتورها را در قلمهای خود قرار میدادند، زیرا آنها نشانه حرفهایگری و توجه به جزئیات شده بودند. در دوران فونتهای دیجیتال (PostScript، TrueType) لیگاتورها به عنوان گلیفهای جداگانه با جایگزینی برنامهای پیادهسازی میشدند.
OpenType (1996) انقلابی بود: مکانیزم GSUB (Glyph Substitution Table) را معرفی کرد که به طور خودکار دنبالهای از نمادها را بدون دخالت کاربر با لیگاتور جایگزین میکند. GSUB از جایگزینی متنی، شرایط و گزینههای بازگشتی پشتیبانی میکند. این امر به فونتها اجازه داد تا صدها لیگاتور داشته باشند که از طریق تگها فعال/غیرفعال میشوند. فونتهای مدرن — 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. این ویژگی از سال ۲۰۱۵ توسط همه مرورگرهای مدرن پشتیبانی میشود. مرورگرها به طور پیشفرض لیگاتورهای استاندارد و متنی را فعال میکنند.
/* 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 پایینتر از ۱۰، لیگاتورها ممکن است با برخی فونتهای 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) نشان داد که لیگاتورها بر سرعت خواندن کد تأثیر نمیگذارند، اما به طور ذهنی مورد پسند ۶۷٪ توسعهدهندگان هستند. مخالفان لیگاتورها خاطرنشان میکنند که آنها کد را تحریف میکنند: نماد != در ویرایشگر به صورت ≠ نمایش داده میشود، اما در فایل متنی به عنوان دو نماد ذخیره میشود که میتواند هنگام همکاری گیجکننده باشد.
پیادهسازی فنی: لیگاتورهای برنامهنویسی لیگاتورهای 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 (اولین فونت انبوه با لیگاتورها، ۲۰۱۵)، JetBrains Mono (بهینه شده برای خواندن کد، ۲۰۲۰)، Cascadia Code (از Microsoft، ۲۰۱۹)، Iosevka (فونت قابل تنظیم با سیستم لیگاتور ماژولار). هر فونت مجموعه لیگاتورهای خاص خود را دارد — از ۵۰ تا ۱۵۰+ جایگزینی. توصیه: با 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید