LaTeX의 다국어 문서에 관해 가장 흔히 보는 조언은 “pdfLaTeX이면 babel, XeLaTeX이면 polyglossia”입니다. 이 조언은 이미 낡았습니다. TeX Live 2024에 들어 있는 babel은 2024년 2월판으로, pdfTeX・XeTeX・LuaTeX 모두를 지원하고 \babelfont로 언어마다 시스템 글꼴을 배정하며, LuaTeX에서는 Unicode 양방향 알고리즘을 자체 구현해 갖추고 있습니다. 손안의 TeX Live에서 세어 보면 babel의 로케일 정의는 297개의 언어 디렉터리와 387개의 .ini 파일 입니다. 반면 polyglossia는 fontspec에 의존하기 때문에 pdfLaTeX에서는 시작조차 하지 못합니다. 이 페이지에서는 여러 문자 체계가 섞인 문서를 조판하기 위해 둘 중 무엇을 고를지, 언어를 어떻게 전환할지, 하이픈 처리와 글꼴이 어디서 조용히 무너지는지를 실제 메시지와 함께 살펴봅니다.
babel과 polyglossia의 차이 — 어느 쪽을 써야 하나
특별한 이유가 없다면 babel 입니다. 엔진을 가리지 않고, 로케일 수에서도 앞서며, 둘 중 가장 활발히 개발되고 있습니다. TeX Live 2024 동봉 babel은 2024/02/07 v24.2——버전 번호가 연도인 것은 한 해에 여러 번 나오기 때문입니다. 만든 사람은 Johannes Braams이고 현재 유지보수는 Javier Bezos가 이어받았습니다. 이에 대해 polyglossia는 2024/03/07 v2.1이며, 자신의 패키지 설명줄에서 “XeLaTeX과 LuaLaTeX을 위한 현대적 다국어 조판”이라 밝히고, README에서는 “그 두 엔진 사용자를 위한 babel의 대안”이라고 자기소개합니다. 즉 둘은 동등한 선택지가 아니라 babel이 전역을 덮고 polyglossia는 Unicode 엔진만 덮는 포함 관계입니다. pdfLaTeX에서 polyglossia를 불러오면 polyglossia 자신이 아니라 의존 패키지인 fontspec이 ! Fatal Package fontspec Error: The fontspec package requires either XeTeX or LuaTeX. 를 던지며 멈춥니다.
| 항목 | babel | polyglossia |
|---|---|---|
engines | pdfTeX・XeTeX・LuaTeX 모두 | XeTeX과 LuaTeX만(fontspec 필수) |
locale data | 297개 언어 디렉터리와 387개 .ini(TeX Live 2024 실측) | 242개 gloss 파일. 80개 이상 언어를 표방 |
declaring | \usepackage[french,english]{babel}. 마지막이 주 언어 | \setmainlanguage{...}와 \setotherlanguage{...}. 보조 언어는 명시 필요 |
switching | \selectlanguage{...}(문단 단위)와 \foreignlanguage{...}{...}(문장 중간) | 같은 둘에 더해 \textgreek{...} 처럼 \text + 언어 이름 |
fonts | \babelfont{rm}{...}으로 언어・문자 체계별 배정(Unicode 엔진 전용) | fontspec의 \newfontfamily\greekfont{...} 등을 사용 |
bidi | LuaTeX에서는 bidi=basic이 babel 자체 Unicode 구현. XeTeX에서는 bidi 패키지에 위임 | 방향 제어를 bidi(XeTeX)와 luabidi(LuaTeX)에 전적으로 위임 |
license | LPPL(유지보수 상태 maintained, 현 유지보수자 Javier Bezos) | MIT 라이선스 |
언어를 전환하기 — selectlanguage와 foreignlanguage
덩어리진 범위에는 \selectlanguage{french}, 문장 속 한마디에는 \foreignlanguage{french}{...} 를 나누어 씁니다. 앞의 것은 그 뒤로 계속 유효하고, 뒤의 것은 인수 안에서만 적용됩니다. 바뀌는 것은 하이픈 규칙만이 아닙니다. \tableofcontents는 “Table des matières”가 되고, 장 번호 앞 낱말은 “Chapitre”가 됩니다——이것이 문서 문자열(document strings) 의 번역이며, babel의 실무적 가치는 바로 여기에 있습니다. 더 인상적인 것은 조판되는 글자 자체가 달라진다는 점입니다. 서양 문자 조판 페이지에서 실측한 바에 따르면 Bonjour: oui!는 아무 설정 없이 58.48572pt이지만 [french]{babel} 아래에서는 62.37366pt로 늘어나고, pdftotext로 뽑으면 Bonjour : oui ! 가 돌아옵니다. 프랑스어에서 높은 위치의 약물 앞에 얇은 공백을 두는 조판 규칙이, 콜론과 느낌표 앞에 실제 공백으로 들어간 것입니다. babel은 “언어에 이름표를 붙이는” 도구가 아니라 그 언어의 조판 관습을 적용하는 도구라고 생각하십시오.
% babel: the LAST option is the main language of the document
\usepackage[russian,french,english]{babel}
...
\foreignlanguage{french}{Bonjour : oui !} % inline, one phrase
\selectlanguage{french} % from here on
\tableofcontents % now "Table des matieres"
% polyglossia (XeLaTeX / LuaLaTeX only)
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage{greek} % secondary languages must be declared
\textgreek{...} % \text + language name하이픈 패턴이 없으면 어떻게 되는가
오류가 아니라 경고가 나오고, 그대로 영어 규칙으로 분철됩니다. 하이픈 패턴은 실행 중에 읽어 들일 수 없고 포맷을 만드는 단계에서 구워 넣는다는 TeX의 제약 때문입니다. TeX Live 2024의 language.dat에 실린 언어는 별칭 줄을 뺀 실수로 87개이지만, babel이 .ldf를 갖춘 언어는 그보다 많아 둘 사이에 어긋남이 생깁니다. 예를 들어 \usepackage[albanian,english]{babel}로 알바니아어를 고르면 Package babel Warning: No hyphenation patterns were preloaded for the language 'Albanian' into the format. 에 이어 Now I will use the patterns preloaded for \language=0 instead 가 나옵니다. \language=0은 커누스의 원조 hyphen.tex, 곧 미국 영어입니다. PDF는 문제없이 생성되고 종료 코드도 0——알바니아어 단어가 영어 규칙으로 잘리고 있을 뿐입니다. 로그를 보지 않는 한 알아차릴 수 없습니다. 대처는 그 언어의 패턴을 담은 패키지를 넣고 fmtutil로 포맷을 다시 만들거나, Unicode 엔진에서 \babelprovide[import]{...}를 쓰는 것입니다.
문자 체계별로 글꼴을 바꾸기 — 가장 흔한 실패
언어를 선언한다고 글꼴이 따라오지는 않습니다. 다국어 문서에서 가장 흔한 사고가 이것입니다. XeLaTeX에서 \setotherlanguage{russian}이라고 선언하고 \textrussian{Русский}라고 써도, 기본 Latin Modern에는 키릴 문자가 없어 그 부분은 지면에서 사라집니다. 오류는 나지 않습니다. 로그에만 글자마다 한 줄씩 Missing character: There is no Р (U+0420) in font [lmroman10-regular] 같은 줄이 늘어섭니다. 종료 코드는 0, PDF도 만들어지고, 다만 러시아어만 비어 있습니다——알아차리기 어렵기로는 단연 으뜸입니다. 대책은 문자 체계별로 글꼴을 배정하는 것이며, babel이면 \babelfont[russian]{rm}{...}, polyglossia면 fontspec의 \newfontfamily\russianfont{...}를 씁니다. 다만 \babelfont는 Unicode 엔진 전용이라, pdfLaTeX에서 부르면 \babelfont ->\bbl@error@ {only-lua-xe} 라는 정의되지 않은 제어 시퀀스 오류가 납니다. pdfLaTeX에서 라틴이 아닌 문자를 다루려면 글꼴이 아니라 fontenc의 인코딩을 맞추는 길——키릴이면 T2A, 그리스어면 LGR——이 됩니다.
% XeLaTeX / LuaLaTeX: give each script a font that actually has it
\usepackage[russian,greek,english]{babel}
\babelfont{rm}{Latin Modern Roman}
\babelfont[russian]{rm}{Times New Roman}
\babelfont[greek]{rm}{Times New Roman}
% pdfLaTeX has no \babelfont: match the encoding instead
% \usepackage[T2A,LGR,T1]{fontenc} % Cyrillic, Greek, Latin
% Without this the text is simply absent and the log says:
% Missing character: There is no Р (U+0420) in font [lmroman10-regular]오른쪽에서 왼쪽(RTL) — 아랍어・히브리어에는 LuaLaTeX
양방향 조판을 제대로 하려면 LuaLaTeX 하나뿐입니다. 이는 취향이 아니라 기능이 어디에 있느냐의 문제입니다. babel은 양방향 처리를 bidi= 옵션으로 고르는데, babel 자신이 Unicode 양방향 알고리즘을 구현한 bidi=basic은 LuaTeX에서만 동작합니다. XeLaTeX에서 지정하면 결과가 틀릴 것이라고 대놓고 알려 줍니다. ! Package babel Error: The bidi method 'basic' is available only in luatex. I'll continue with 'bidi=default', so expect wrong results. XeLaTeX 쪽 선택지는 외부 bidi 패키지에 위임하는 bidi=bidi인데, 이쪽은 불러오는 것만으로 Package babel Warning: Some functions for 'bidi=bidi' are tentative. They might not work as expected and their behavior could change in the future. 라는 경고가 나옵니다. polyglossia도 방향 제어를 bidi・luabidi에 맡기므로 사정은 같습니다. LuaLaTeX에서 \babelprovide[import, main]{arabic}과 \babelfont{rm}{...}을 함께 쓰면 아랍어와 영어가 섞인 문서가 경고 하나 없이 통과합니다.
bidi 패키지 자체를 직접 쓸 수도 있어서, \setRTL(별칭 \setRL)로 이후를 오른쪽→왼쪽으로, \setLTR(별칭 \setLR)로 다시 왼쪽→오른쪽으로 돌립니다. XeTeX에서는 방향 전환을 자동 판정에 기댈 수 없어 LR과 RL이 섞이는 자리마다 명시적 마크업이 필요합니다——손으로 표시해야 하는 그 양이 실제로 힘든 부분입니다. LuaTeX의 bidi=basic은 그 경계를 Unicode 규칙으로 자동 판정하고, 표나 여백 같은 레이아웃의 좌우도 뒤집습니다. 페르시아어처럼 RTL이면서 숫자 처리가 독특한 언어에는 babel의 bidi.mapdigits 같은 세밀한 조정도 마련되어 있습니다. 정리하면 이렇습니다. 아랍어・히브리어・페르시아어가 들어가는 문서는 처음부터 LuaLaTeX으로 시작하는 편이 결국 가장 빠릅니다.
% LuaLaTeX: babel handles direction with its own Unicode implementation
\usepackage[bidi=basic]{babel}
\babelprovide[import, main]{arabic}
\babelfont{rm}{Geeza Pro}
% mixed Arabic and English needs no manual direction marks here
% XeLaTeX must delegate to the bidi package, which babel calls tentative
% \usepackage[bidi=bidi]{babel}
% \setRTL % or \setRL -- switch the flow right-to-left
% \setLTR % or \setLR -- switch it back그래서 어떻게 골라야 하나
판단은 “어떤 언어를 섞을까”가 아니라 “어떤 엔진으로 조판할까”에서 먼저 정해집니다. 라틴 문자에 키릴 문자와 그리스 문자 정도가 섞이는 수준이라면 pdfLaTeX + babel + fontenc로도 충분히 통과합니다. 다만 시스템 글꼴을 쓰고 싶거나 아랍어・히브리어・인도계 문자가 들어간다면 Unicode 엔진이 필요합니다. 그리고 Unicode 엔진을 고른 뒤에야 비로소 babel이냐 polyglossia냐 하는 물음이 생깁니다. CJK는 별개의 이야기로, 일본어는 pTeX 계열 엔진과 클래스가 담당하고, pTeX 세계 밖의 중국어・한국어・일본어는 CJKutf8, xeCJK, ctex, kotex의 영역입니다——둘 다 전용 페이지가 있습니다.
- 라틴 문자 중심에 키릴・그리스 문자가 조금 섞이는 경우 → pdfLaTeX +
babel+fontenc(T2A/LGR). 기존 작업 흐름을 바꾸지 않아도 됩니다. - 시스템 글꼴을 쓰고 싶거나 여러 문자 체계가 섞이는 경우 → XeLaTeX이나 LuaLaTeX +
babel+\babelfont. - 아랍어・히브리어・페르시아어(RTL)가 들어가는 경우 → LuaLaTeX + babel의
bidi=basic. 이 모드는 XeLaTeX에서 쓸 수 없습니다. - polyglossia를 고를 이유 → 이미 polyglossia로 쓰인 문서가 있거나, 필요한 언어를 그쪽에서만 지원할 때. 새로 시작한다면 babel이 무난합니다.
- 일본어・중국어・한국어 → 전용 경로(일본어 조판 페이지들과 CJK 페이지).