리가처는 가독성과 텍스트 미학을 업그레이드하기 위해 둘 이상의 문자를 하나의 타이포그래픽 기호로 그래픽적으로 결합한 것입니다. 고전적인 예로는 fi, fl, ff, ffi 쌍이 있으며 — 이때 문자 f의 돌출된 요소가 인접한 문자와 합쳐지면서 시각적인 충돌을 방지합니다. 현대 모바일 및 웹 개발에서는 OpenType 기능을 통해 폰트 레벨에서 리가처를 제어하며 iOS, Android 및 브라우저에서 지원됩니다. MDN Web Docs에 따르면 CSS 속성 font-variant-ligatures를 통해 개발자가 표준, 임의(장식적), 문맥 등 여러 유형의 리가처를 활성화/비활성화할 수 있습니다.
주요 포인트
리가처는 둘 이상의 문자를 특별적으로 설계된 단일 글리프로 교체하는 타이포그래픽 기법입니다. 리가처의 주요 목적은 인접한 문자 간의 시각적 충돌을 제거하고 텍스트 인식을 업그레이드하는 것입니다. 예를 들어 fi 쌍에서는 문자 f의 위쪽 돌출부가 문자 i의 짐과 충돌하지만 — 리가처가 이들을 하나의 우아한 기호로 합치원니다.
리가처는 의무(표준) 및 선택적(장식적)으로 나뒉니다. 표준 리가처는 대부분의 폰트에서 찾을 수 있는 쌍입니다: fi, fl, ff, ffi, ffl. 이들은 품질 놀은 타이포그래피에 필수로 간주되며 폰트에서 기본으로 활성화됩니다. OpenType 명세서에 따르면 표준 리가처는 'liga' 태그로 코딩되며 모든 전문 폰트에 존재해야 합니다.
시각적 효과: 리가처이 없으면 fi 쌍은 원치 않는 충돌이 있는 두 개의 별도 문자로 보입니다. 리가처를 사용하면 하나의 조화로운 기호로 보입니다. 이 차이는 특히 크기가 큰 경우(제목, 로고)와 반복되는 쌍이 많은 텍스트(예: 독일어의 häufigen Buchstabenkombinationen)에서 두드러집니다.
OpenType 폰트는 여러 유형의 리가처를 지원하며, 각 유형은 고유한 태그와 목적이 있습니다. 표준 (태그 'liga')은 폰트에서 기본으로 활성화되는 의무 리가처입니다. 읽기 쉬움을 향상시키며 특별한 이유 없이 비활성화해서는 안 됩니다. fi, fl, ff, ffi, ffl 및 타입페이스에 특정적인 다른 쌍을 포함합니다.
임의 리가처 (태그 'dlig')는 디자이너가 선택적으로 활성화할 수 있는 장식적인 리가처입니다. 읽기 쉬움에 필요하지 않으며 텍스트 스타일링에 사용됩니다: ct, st, sp, Th, Qu 등. 임의 리가처는 주로 Garamond나 Adobe Caslon같은 역사적이거나 캄리그래픽 성격의 폰트에서 발견됩니다. 주의: 임의 리가처를 너무 많이 사용하면 읽기 쉬움이 저하되며, 특하 난독증 환자에게 부적합합니다.
문맥 리가처 (태그 'clig')는 문자의 주변 문맥에 따라 적용되는 리가처입니다. 문자가 단어의 처음이나 끝에 있거나, 특정 문장부호 뒤에 있는 등 특정 조건에서만 적용됩니다. 문맥 리가처는 고급 OpenType 기능으로 모든 폰트가 지원하는 것은 아닙니다. 역사적 리가처 (태그 'hlig')는 오래된 인쇼 책의 스타일을 모방한 구 식의 리가처입니다 (long s, &). 역사적이거나 스타일 차우는 텍스트에서만 간평히 사용됩니다.
| 리가처 유형 | OpenType 태그 | 예시 | 기본값 |
|---|---|---|---|
| 표준 | liga | fi, fl, ff, ffi | 활성화 |
| 임의 | dlig | ct, st, sp, Th | 비활성화 |
| 문맥 | clig | 위치에 따름 | 활성화 |
| 역사적 | hlig | long s, ct (역사적) | 비활성화 |
드문 유형: 수학 타이프세팅용 리가처(수학 기호용 태그 'dlig')와 이글고문자 리가처(드롭 캡스)도 있지만 인터페이스 타이포그래피에서는 사용되지 않으며 전문 폰트에서만 지원됩니다.
리가처는 디지털 타이포그래피보다 훨씬 이전인 15세기 금속 활자 시대부터 존재했습니다. 최초의 인쇼기 요한네스 구템베르크는 42행 성서에서 줄을 절약하기 위해 리가처를 사용했습니다. 각 활자는 물리적인 금속 블록이었고, 두 문자를 한 조각으로 결합하면 낚을 절약하고 타이프 설정이 간단해졌습니다. 표준 리가처인 fi, fl, ffi, ffl은 그 시대의 유산입니다.
사진 타이프(20세기)에서는 리가처가 실용적인 기능을 잃었지만 품질 놀은 타이포그래피의 미학적 요소로 남았습니다. 폰트 디자이너들은 전문성과 세부사항에 대한 관심의 표시가 되었기 때문에 계속해서 타입페이스에 리가처를 포함했습니다. 디지털 폰트(PostScript, TrueType) 시대에는 리가처를 프로그램적 대체를 통해 별도의 글리프로 구현했습니다.
OpenType (1996)은 혁명이었습니다: 사용자 개입 없이 문자 시퀀스를 리가처로 자동 교체하는 GSUB(글리프 대체 테이블) 메카니즘을 도입했습니다. GSUB은 문맥 대체, 조건 및 함백 병체를 지원합니다. 이로씨 폰트는 태그를 통해 활성화/비활성화할 수 있는 수백개의 리가처를 가질 수 있게 되었습니다. 현대 폰트 — SF Pro, Roboto, Inter —는 모든 플랫폼(iOS, Android, macOS, Windows, 웹)에서 OpenType 리가처를 지원합니다.
iOS에서는 UIFontDescriptor의 featureSettings 속성을 사용하여 리가처를 제어할 수 있습니다. 이 속성은 각각이 하나의 OpenType 기능을 설명하는 딕셔너리 배열을 수낙합니다. 디스크립터를 통해 리가처를 제어하는 것은 폰트의 다른 OpenType 기능에 영향을 미치지 않고 개별 유형의 리가처를 관리할 수 있는 유일한 방법입니다.
let descriptor = UIFontDescriptor.preferredFontDescriptor(
withTextStyle: .body
)
// 임의 리가처 활성화
let ligatureDescriptor = descriptor.addingAttributes([
.featureSettings: [
[
UIFontDescriptor.FeatureIdentifier: kLigaturesType,
UIFontDescriptor.TypeIdentifier: kCommonLigaturesOnSelector
]
]
])
let font = UIFont(
descriptor: ligatureDescriptor,
size: 17
)
NSAttributedString도 ligature 속성(NSNumber)을 지원합니다. 값 0은 모든 리가처를 비활성화하고, 1은 표준을 활성화하며(기본), 2는 모두를 활성화합니다(임의 포함). 그러나 NSAttributedString의 ligature 속성은 리가처 유형에 대한 세분한 제어를 제공하지 않고 전체 활성화/비활성화만 가능합니다. 선택적 제어를 위해서는 featureSettings가 있는 UIFontDescriptor를 사용하세요.
SwiftUI는 리가처에 대한 직접적인 수정자를 제공하지 않습니다. SwiftUI에서 리가처를 제어하려면 UIFontDescriptor를 통해 원하는 설정의 UIFont를 만들고 Font(descriptor:size:)를 통해 사용하세요. 또는 AppKit/UIKit 뷰에서 NSMutableAttributedString을 위한 .ligature 속성이 있는 AttributedString(iOS 15+)을 사용하세요.
// AttributedString을 통한 사용자 정의 리가처가 있는 SwiftUI
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.Builder를 통해 만든 사용자 Typeface거나 텍스트 전처리(표시 전 문자 교체)를 사용합니다. 제한: Android 10 미만에서는 일부 TTF 폰트에서 리가처가 올바르게 작동하지 않을 수 있습니다.
저위 제어: 모든 플랫폼에서 OpenType 기능에 font-feature-settings 매개변수가 있는 CSS @font-face를 사용할 수 있습니다. 이 방법은 리가처를 포함한 모든 OpenType 태그에 액세스를 제공합니다. 예: font-feature-settings: 'liga' 1, 'dlig' 1. 그러나 font-feature-settings는 저수준 구문이며, MDN은 이보다 높은 수준의 대체인 font-variant-ligatures를 권장합니다.
특별한 유형의 리가처인 프로그래밍 리가처는 연산자와 코드 기호를 더 읽기 쉽고 알앜 글리프로 결합합니다. Fira Code, JetBrains Mono, Cascadia Code 같은 프로그래밍 폰트는 일반적인 연산자에 대한 임의 리가처를 포함합니다: !=(≠이 됨), >=(≥가 됨), ->(화살표가 됨), =>(군은 화살표가 됨), ===(삼중 동등이 됨).
프로그래밍 리가처는 개발자 커뮤니티에서 녹란의 여지가 있는 주제입니다. 찬성자들은 연산자가 단일 개념으로 인식되므로 리가처가 코드 읽기를 가동화한다고 주장합니다. 연구(Kera et al., PLATEAU 2020)는 리가처가 코드 읽기 속도에 영향을 미치지 않지만 67%의 개발자가 주관적으로 좋아한다고 밝혀주었습니다. 반대자들은 리가처가 코드를 왜곡한다고 지적합니다: 에디터에서 !=가 ≠로 표시되지만 텍스트 파일에서는 두 문자로 저장되므로 협업 시 혼란을 초래할 수 있습니다.
기술적 구현: 프로그래밍 리가처는 임의 OpenType 리가처(태그 'dlig')입니다. 기본적으로 비활성화되며 코드 에디터에서 폰트 설정을 통해 활성화합니다. 이러한 폰트를 사용하는 개발자는 임의 리가처를 활성화하도록 에디터를 구성해야 합니다. 터미ᄉ(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(2019년, Microsoft), Iosevka(모듈식 리가처 시스템의 사용자 설정 가능한 폰트). 각 폰트에는 고유한 리가처 세트가 있습니다 — 50에서 150+ 교체. 추천: Fira Code나 JetBrains Mono로 시작하세요 — 에디터와 IDE에서 가장 좋은 지원을 받을 수 있습니다.
자주 묻는 질문
NSAttributedString에서 attribute ligature = 0으로 설정하거나 kCommonLigaturesOffSelector가 있는 UIFontDescriptor를 사용하세요. SwiftUI에서는 .ligature = .disabled가 있는 AttributedString을 생성하세요.
리가처는 두 문자를 새로운 글리프로 교체하여 형태를 바꧁니다. 카닁은 형태를 바꧁지 않고 문자 간 간격을 조정합니다. 리가처는 그래픽 연결이고, 카닁은 공간적 조정입니다.
그렇습니다. Android 10(API 29) 이상에서 지원합니다. Minikin 렌더링은 OpenType GSUB 테이블을 완전히 지원합니다. 이전 버전에서는 장치 제조사와 폰트 엔진 버전에 따라 달말니다.
본문에는 표준 리가처(fi, fl, ff)로 충분합니다 — 읽기 쉬움이 향상되고 사용자가 번지 못합니다. 임의 리가처는 제목거나 장식적인 텍스트에서만 사용하세요. 긴 텍스트에서는 읽기 쉬움이 떨어집니다.
에디터가 OpenType 'dlig' 태그를 지원하고 임의 리가처를 렌더링할 수 있어야 합니다. VS Code, IntelliJ IDEA, Sublime Text는 지원합니다. 구 터미ᄉ 및 에디터(nano, GUI 없는 vim)는 지원하지 않습니다. 에디터 설정에서 font-ligatures를 활성화하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.