"LaTeX 엔진은 어느 것을 써야 하는가" —— pdfLaTeX, XeLaTeX, LuaLaTeX, upLaTeX 넷 사이에서 망설일 때를 위한, 결론부터 적는 판단 안내입니다. 먼저 답을 말하면 서구어라면 pdflatex, 시스템 글꼴이나 다국어가 필요하면 xelatex이나 lualatex, 일본어라면 uplatex이나 lualatex입니다. 다만 이 넷은 동등한 선택지가 아닙니다. 모두 같은 LaTeX 포맷을 돌리고 있고, 다른 것은 그 아래의 엔진뿐입니다. 아래에서는 XeLaTeX과 LuaLaTeX의 정면 대결, 일본어에서 답이 달라지는 이유, 그리고 갈아탔을 때 실제로 깨지는 것들을 차례로 살펴봅니다.
용도별로 가장 짧은 답
대다수 사람에게는 이 네 줄이면 충분합니다. 여기서 말하는 이름은 엔진(실행되는 프로그램) × 포맷(LaTeX이라는 명령 체계)의 조합이며, 실제로 치는 명령 이름으로 적었습니다. 망설여지면 먼저 투고처나 템플릿이 지정하는 것을 따르세요. 지정이 없을 때만 아래의 갈래를 씁니다.
- 서구어(영어・유럽 언어)를 가장 확실하게 → pdfLaTeX(
pdflatex). LaTeX의 사실상 표준으로, 자료도 선례도 가장 많습니다. 미세 조판 기능이 빠짐없이 작동하는 유일한 엔진이기도 합니다. - 운영체제의 글꼴을 그대로 쓰고 싶다, 여러 언어를 섞고 싶다, 설정은 가볍게 → XeLaTeX(
xelatex).fontspec으로\setmainfont{...}이라고 쓰면 끝입니다. - 거기에 더해 프로그램으로 조판을 제어하고 싶다/장기적으로 안전한 쪽에 서고 싶다 → LuaLaTeX(
lualatex). Lua로 조판에 개입할 수 있고, 커널의 엔진별 새 기능도 대개 여기에 먼저 들어옵니다(ltnews34의 LuaTeX 콜백 항목 등). - 일본어 → upLaTeX(
uplatex)이 안정된 주류이고, LuaLaTeX +luatexja가 유니코드 네이티브한 현대적 경로입니다. 여기서 XeLaTeX은 권하지 않습니다(이유는 뒤에).jlreq클래스는 앞의 둘 어느 쪽에서도 동작합니다.
XeLaTeX과 LuaLaTeX 중 어느 쪽을 고를까
이 둘은 "둘 다 유니코드와 시스템 글꼴을 쓸 수 있다"는 데까지 같아서 가장 많이 망설이게 됩니다. 판단은 한 줄로 끝납니다. 지금 손에 있는 문서를 가볍고 빠르게 마무리하고 싶다면 XeLaTeX, 앞으로 오래 키워 갈 문서라면 LuaLaTeX. 둘의 차이는 기능표의 승패가 아니라 치르는 비용의 종류입니다. XeLaTeX은 설정과 기다림이 싸고, LuaLaTeX은 미래와 확장성이 쌉니다. 아래 표를 이 관점에서 읽어 주세요.
| 비교 항목 | XeLaTeX | LuaLaTeX |
|---|---|---|
fontspec | 쓸 수 있습니다. OS의 글꼴 이름을 그대로 넘길 수 있어 이름을 시험해 가며 맞추기가 빠릅니다 | 쓸 수 있습니다. 글꼴 해석은 luaotfload가 맡고, 지정하는 방식이 더 엄격합니다 |
microtype | 글자 내밀기(protrusion)만. 글꼴 신축도, 낱말 사이 조정도, 자간(letterspacing)도 듣지 않습니다 | 내밀기와 글꼴 신축 둘 다. 자간도 듣고, 서구어 결과물은 pdfLaTeX에 가깝습니다 |
speed | 중간. 시작도 조판도 LuaLaTeX보다 가볍습니다 | 가장 느립니다. 큰 문서에서는 pdfLaTeX의 몇 배가 걸리기도 합니다 |
programmability | TeX 매크로뿐. 엔진에 손댈 창구가 없습니다 | Lua가 안에 들어 있습니다. \directlua와 콜백으로 조판 처리 자체에 개입할 수 있습니다 |
output-route | 중간에 .xdv를 거쳐, 내장된 xdvipdfmx가 PDF로 만듭니다 | PDF를 직접 써 냅니다. 중간 파일이 없습니다 |
japanese | 실용적인 선택지가 아닙니다. jlreq는 애초에 XeLaTeX을 받지 않습니다 | luatexja로 본격적으로 조판할 수 있습니다. jlreq도 lualatex 옵션으로 대응합니다 |
pstricks | DVI 계열 경로를 지나므로 동작합니다. 기존 PSTricks 자산이 있다면 이쪽입니다 | 기본적으로 동작하지 않습니다. PSTricks 그림은 이식이 필요합니다 |
development | 꾸준히 유지되고 있지만 새 기능의 중심은 아닙니다 | 커널의 엔진별 새 기능은 대개 여기에 먼저 들어옵니다 |
이 표에서 실무적인 선을 그을 수 있습니다. XeLaTeX을 고르는 때는—— 손안의 글꼴을 이름으로 지정해 바로 조판하고 싶을 때, 여러 문자 체계를 섞는 것이 주된 목적이고 서구어 미세 조판에 강한 집착이 없을 때, 기존 PSTricks 그림을 안고 있을 때, 그리고 컴파일 대기 시간이 체감될 만큼 자주 돌릴 때입니다. LuaLaTeX을 고르는 때는—— 서구어 결과물을 끝까지 다듬고 싶을 때(microtype의 글꼴 신축이 필요할 때), 일본어를 유니코드로 다루고 싶을 때, 외부 데이터를 읽어 표를 짜는 등 조판 자체를 프로그래밍하고 싶을 때, 그리고 몇 해 단위로 유지할 문서일 때입니다. 한편 일본어에서는 이 양자택일에 XeLaTeX이 끼어들지 않습니다.
일본어에서는 어느 엔진을 고를까 — 답이 달라지는 이유
일본어에서는 uplatex이냐 lualatex이냐의 양자택일이고, XeLaTeX은 빠집니다. 영어권 글에서는 "유니코드와 시스템 글꼴이라면 XeLaTeX이나 LuaLaTeX"으로 이야기가 끝나지만, 일본어에서는 그 등식이 성립하지 않습니다. 일본어 조판이 "유니코드 글자를 낼 수 있다"는 것보다 훨씬 많은 것을 요구하기 때문입니다. 금칙 처리, 일본어와 서구어 사이의 사분 여백, 세로쓰기, 루비, 그리고 일본어 전용 글꼴 메트릭(JFM). 이를 구현한 층이 필요하고, 그 층은 pTeX 계열 엔진과 LuaTeX용 luatexja에만 존재합니다.
이 사실은 클래스 파일 쪽에서도 확인됩니다. JIS X 4051을 따르는 일본어 조판 클래스 jlreq는 엔진을 옵션으로 받는데, jlreq.cls가 인정하는 것은 platex・uplatex・lualatex 셋뿐이고 xelatex은 선택지에 들어 있지 않습니다. XeLaTeX으로 일본어를 다루는 길이 전무한 것은 아니어서 zxjatype 같은 패키지는 존재합니다. 그러나 주요 일본어 클래스와 축적된 문헌은 위 셋에 몰려 있고, 투고처가 마련하는 일본어 템플릿도 대개 이 범위입니다. 실무적 결론은 이렇습니다. 일본어가 들어간다면 XeLaTeX을 첫 후보로 삼지 않는다.
그렇다면 uplatex과 lualatex 중 어느 쪽일까요. 기존 자산이 있다면 uplatex, 새로 시작해 오래 쓸 것이라면 lualatex이 자연스러운 선 긋기입니다. uplatex은 빠르고 일본어 조판 규칙이 잘 무르익어 있으며, 학회와 출판사가 배포하는 클래스 상당수가 이를 전제합니다. 다만 출력은 반드시 DVI이므로 dvipdfmx를 거치는 2단 구성이 되고, 글꼴도 전통 방식으로 지정합니다. lualatex + luatexja는 유니코드와 시스템 글꼴을 그대로 쓸 수 있고 luatexja-fontspec으로 일본어 글꼴을 이름으로 지정할 수 있지만, 조판 시간은 눈에 띄게 길어집니다. 참고로 일본어 글꼴 지정에 맨 fontspec을 쓰지는 않습니다.
판단을 가르는 축
빠른 답이 맞지 않을 때, 혹은 이유를 알고 싶을 때를 위해 축을 하나씩 살펴봅니다. 대부분의 축은 결국 그 엔진이 글꼴과 문자 코드를 어떻게 다루는가로 귀착합니다.
글꼴. pdfTeX은 TeX 전통의 글꼴 모델, 곧 TFM(TeX Font Metric)과 Type1/PK 글꼴을 씁니다. OS에 설치된 글꼴을 그대로 가리킬 수는 없습니다. XeTeX과 LuaTeX이 가장 날카롭게 갈리는 곳이 여기로, 둘은 시스템에 들어 있는 TrueType / OpenType 글꼴을 직접 쓸 수 있고, fontspec 패키지로 \setmainfont{Times New Roman}처럼 이름으로 지정합니다. 뒤집어 말하면 fontspec은 XeTeX이나 LuaTeX을 필요로 하며 pdfLaTeX에서는 동작하지 않습니다.
입력 문자 코드. XeTeX과 LuaTeX은 내부가 유니코드 네이티브여서 UTF-8 소스를 그대로 받습니다. pdfTeX도 2018년의 LaTeX 릴리스 이후 UTF-8이 기본 입력 인코딩이 되어 \usepackage[utf8]{inputenc}을 쓸 필요가 없어졌습니다. 그러나 내부에서는 여전히 8비트 글꼴 인코딩(T1 등)으로 사상하므로, 어떤 글자가 나오는지는 fontenc과 글꼴에 달려 있고 임의의 유니코드나 CJK를 그대로 칠 수는 없습니다. 다국어 문자와 기호를 부담 없이 치고 싶다면 XeTeX / LuaTeX이 유리합니다.
패키지 호환성. 실무에서 가장 자주 놓치는 함정이 여기입니다. 엔진 전용 패키지가 있습니다. fontspec과 unicode-math는 XeTeX / LuaTeX 전용입니다. 반대로 pstricks는 DVI 경로를 지나는 pdfLaTeX과 XeLaTeX에서는 동작하지만 LuaLaTeX에서는 원칙적으로 동작하지 않습니다. 반대 방향의 비호환도 있어, 오래된 튜토리얼을 따라 쓴 소스가 새 엔진에서 통과하지 않기도 합니다. 무엇보다 먼저 템플릿이나 투고처의 클래스가 어느 엔진을 요구하는지 확인하는 것이 철칙입니다.
속도. 차이는 실재하고 체감됩니다. 순서는 pdfTeX이 가장 빠르고, XeTeX이 중간, LuaTeX이 가장 느립니다. 다만 차이가 벌어지는 곳은 시작이 아니라 조판량에 비례하는 부분입니다. 거의 비어 있는 1쪽짜리 문서에서는 셋이 거의 구별되지 않지만, 수백 쪽 규모가 되면 LuaLaTeX은 pdfLaTeX의 몇 배 시간을 씁니다(실측값은 LuaTeX 페이지에 실려 있습니다). 원고를 쓰는 동안의 재컴파일은 수백 번에 이르므로 이 차이는 쌓입니다. 뒤집어 말하면, 십수 쪽짜리 논문에서는 신경 쓸 필요가 없습니다.
미세 조판(microtype). 서구어의 겉모습을 확실히 끌어올리는 것은 microtype의 글자 내밀기(protrusion)와 글꼴 신축(expansion)입니다. 여기서의 엔진 차이는 크고, microtype 자신의 README에 명시되어 있습니다. 내밀기는 pdfTeX・LuaTeX・XeTeX 셋 모두에서 듣지만, 글꼴 신축은 pdfTeX과 LuaTeX에서만 듣고 XeTeX에서는 듣지 않습니다. 나아가 낱말 사이 간격과 추가 커닝의 조정은 pdfTeX 전용이고, 합자 비활성화와 자간(letterspacing)은 pdfTeX 또는 LuaTeX을 요구합니다. 서구어 마무리를 최우선한다면 pdfLaTeX, 그다음이 LuaLaTeX이 안전한 선택입니다.
그림과 프로그래밍 가능성. PNG・JPEG・PDF 넣기는 어느 엔진에서든 graphicx의 \includegraphics로 거의 같게 쓸 수 있습니다(pdfLaTeX은 EPS를 자동 변환합니다). 차이가 나는 곳은 LuaTeX 고유의 Lua를 통한 제어입니다. 조판의 각 단계에 훅을 걸거나, 외부 데이터를 읽어 표를 짜는 등 매크로로는 쓰기 어려운 처리를 쓸 수 있습니다. fontspec이나 unicode-math를 포함한 현대적 패키지 무리와도 궁합이 좋아, 이것이 "미래에 강하다"고 말하는 근거입니다.
네 선택지를 나란히 놓은 비교표
판단의 축에 맞춰 네 가지 주요 선택지를 나란히 놓았습니다. 첫 열은 실제로 치는 명령 이름이고, microtype은 내밀기와 신축을 나누어 표시했습니다. 표는 참고이지 판결이 아닙니다. pdfLaTeX도 \usepackage[T1]{fontenc}과 알맞은 서구어 글꼴 패키지를 곁들이면 여러 유럽 언어를 아름답게 조판하고, XeLaTeX에서도 내밀기는 듣습니다. "된다/안 된다"의 이분법이 아니라 품과 마무리의 균형으로 읽어 주세요.
| 명령 | 유니코드 / 시스템 글꼴 | microtype | 속도 | 주된 용도 |
|---|---|---|---|---|
pdflatex | 불가(TFM/Type1. UTF-8 입력은 되지만 8비트로 사상) | 내밀기 가능 / 신축 가능 | 가장 빠름 | 서구어의 기본. 호환성이 가장 넓습니다 |
xelatex | 가능(fontspec으로 OpenType을 직접) | 내밀기 가능 / 신축 불가 | 중간 | 다국어와 OpenType을 손쉽게 |
lualatex | 가능(fontspec에 더해 Lua를 통한 제어) | 내밀기 가능 / 신축 가능 | 가장 느림 | 현대적・장기용. 일본어는 luatexja로 |
uplatex | 일본어는 JFM(DVI 경로). UTF-8 입력은 가능 | 서구어 부분에 한정됩니다 | 빠름 | 일본어 논문. 안정된 기본값 |
작은 시험 파일로 정하기
쓰기 시작하기 전에, 후보 엔진들을 1쪽짜리 시험 파일로 돌려 보세요. 학위 논문이나 투고 원고 도중에 엔진을 바꾸면 글꼴・그림・참고문헌・줄바꿈 위치가 한꺼번에 움직여, 무엇 때문에 무너졌는지 알 수 없게 됩니다. 볼 것은 "통과하느냐"만이 아닙니다. 로그의 경고, PDF의 글꼴 임베딩, 그림의 처리, 그리고 협업자가 같은 절차를 재현할 수 있는지——이 네 가지입니다.
# Western candidates: same source, three engines.
$ pdflatex engine-test.tex
$ xelatex engine-test.tex
$ lualatex engine-test.tex
# Japanese candidate: upLaTeX writes DVI, dvipdfmx makes the PDF.
$ uplatex engine-test.tex
$ dvipdfmx engine-test.dvi
# Then compare what actually came out.
$ pdffonts engine-test.pdf # are all fonts embedded?
$ grep -i warning engine-test.log- 투고처의 템플릿이 있다면 그 템플릿으로 시험합니다. 빈 파일이 통과해도 제출용 설정이 통과한다는 증거는 되지 않습니다.
- 그림 한 장, 별행 수식 하나, 참고문헌 한 건을 넣습니다. 본 원고의 축소판이 아니면 시험의 의미가 없습니다.
- 문헌과 색인 도구도 함께 확인합니다. BibTeX이냐 Biber냐,
mendex냐upmendex냐에 따라latexmk설정이 달라집니다. 엔진만 정해서는 부족합니다. 이쪽이 맞물리지 않으면 빌드는 여전히 실패합니다. - 정했으면
.latexmkrc나 README에 엔진을 적어 두어, 이후 무심코 다른 엔진으로 컴파일하지 않게 합니다. - PDF를 견주어 봅니다. 줄바꿈 위치나 글꼴이 다르다면, 왜 그 엔진을 골랐는지를 프로젝트 안에 남겨 둡니다.
엔진을 갈아탈 때 깨지는 것들
같은 소스라도 엔진을 바꾸면 결과가 달라집니다. 실제로 자주 밟는 지뢰는 다음 넷입니다.
글꼴과 인코딩 설정이 바뀝니다. pdfLaTeX의 정석이던 \usepackage[utf8]{inputenc}과 \usepackage[T1]{fontenc}은 XeLaTeX / LuaLaTeX에서는 필요 없고 보통 쓰지 않습니다(내부가 유니코드이기 때문입니다). 대신 fontspec과 \setmainfont을 씁니다. pdfLaTeX의 프리앰블을 그대로 가져오면 경고나 글꼴 관련 오류가 나기도 합니다.
% For pdfLaTeX (traditional; both lines are optional on current LaTeX)
% \usepackage[utf8]{inputenc}
% \usepackage[T1]{fontenc}
% For XeLaTeX / LuaLaTeX: name an OS or TeX font instead
\usepackage{fontspec}
\setmainfont{TeX Gyre Termes}microtype이 듣는 방식이 바뀝니다. 같은 \usepackage{microtype}이라도 엔진에 따라 실제로 작동하는 기능이 다릅니다. XeLaTeX에서는 글꼴 신축이 그냥 꺼져 있습니다. 그래서 pdfLaTeX에서 다듬어 둔 조판을 옮기면 행 길이와 줄바꿈 위치가 조금씩 어긋납니다. 수십 쪽짜리 문서에서는 쪽수가 한 쪽 늘거나 줄어드는 일도 드물지 않습니다.
쓸 수 있는 패키지가 바뀝니다. 옮겨 간 곳에서 동작하지 않게 되는 것도, 거꾸로 비로소 쓸 수 있게 되는 것도 있습니다. PSTricks로 그린 그림은 LuaLaTeX으로 가져가면 동작하지 않습니다(pstricks를 지원하지 않습니다). 반대로 fontspec과 unicode-math는 pdfLaTeX에서 쓸 수 없습니다. 학회나 출판사의 템플릿은 대개 특정 엔진을 전제하므로, 먼저 그것을 따르는 편이 안전합니다.
일본어에서는 일본어 글꼴 설정이 통째로 바뀝니다. upLaTeX(pTeX 계열)과 LuaLaTeX + luatexja는 일본어 글꼴을 지정하는 방식도, PDF에 묻어 넣는 방식도 다릅니다. 서구어 문서보다 이전의 고통이 크다고 잡아 두세요. 구체적인 명령 대응은 "컴파일 명령" 페이지에 정리되어 있습니다.