لیگاتور در توسعه موبایل — مبانی و کاربرد اتصالات نمادی

نویسنده: 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، لیگاتورهای استاندارد با تگ 'liga' کدگذاری می‌شوند و باید در هر فونت حرفه‌ای فعال باشند.

اثر بصری: بدون لیگاتور، جفت fi مانند دو نماد جداگانه با تماس ناخواسته به نظر می‌رسد. با لیگاتور — مانند یک نماد هماهنگ. تفاوت به ویژه در اندازه‌های بزرگ (عنوان‌ها، لوگوها) و در متن با تعداد زیادی جفت تکراری (به عنوان مثال، در زبان آلمانی با häufigen Buchstabenkombinationen) قابل توجه است.

انواع لیگاتورها: استاندارد، discretionary، متنی

فونت‌های 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مثال‌هاپیش‌فرض
استانداردligafi, fl, ff, ffiفعال
Discretionarydligct, st, sp, Thغیرفعال
متنیcligبستگی به موقعیت داردفعال
تاریخیhliglong 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

در iOS می‌توان لیگاتورها را از طریق UIFontDescriptor با استفاده از ویژگی featureSettings مدیریت کرد. این ویژگی یک آرایه از دیکشنری‌ها را می‌پذیرد که هر کدام یک ویژگی OpenType را توصیف می‌کنند. مدیریت لیگاتورها از طریق توصیفگر تنها راه کنترل انواع جداگانه لیگاتورها بدون تأثیر بر سایر ویژگی‌های OpenType فونت است.

swift
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 استفاده کنید.

swift
// SwiftUI با لیگاتورهای سفارشی از طریق AttributedString
var attributedText: AttributedString {
    var text = AttributedString(
        "Effective typography with ligatures"
    )

    // فعال کردن همه لیگاتورها برای کل متن
    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. این ویژگی از سال ۲۰۱۵ توسط همه مرورگرهای مدرن پشتیبانی می‌شود. مرورگرها به طور پیش‌فرض لیگاتورهای استاندارد و متنی را فعال می‌کنند.

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 پایین‌تر از ۱۰، لیگاتورها ممکن است با برخی فونت‌های 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 پشتیبانی نمی‌کنند. قبل از انتخاب فونت، سازگاری با ابزار خود را بررسی کنید.

kotlin
// مثال: لیگاتورهای عملگر در 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ها دارند.

سوالات متداول

چگونه لیگاتورها را در iOS غیرفعال کنیم؟

ویژگی 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 از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید