LaTeX 용어가 어려운 것은 낱말이 난해해서가 아니라, 일상어의 얼굴을 하고 속뜻만 다르기 때문입니다. “패키지”는 npm의 패키지가 아니고, “클래스”는 객체 지향의 클래스가 아니며, “글루(glue)”는 접착제가 아닙니다. 게다가 이 용어집의 주역들——엔진과 포맷, 클래스와 패키지, 상자와 글루와 커닝——은 모두 직접 확인해 볼 수 있습니다. TeX Live 2024에서 pdflatex는 pdftex를 가리키는 심볼릭 링크일 뿐이고, latex 역시 같은 pdftex를 가리킵니다. 이 용어집은 각 항목을 “초심자가 반드시 헷갈리는 지점”에서 시작해 설명합니다.
엔진과 포맷의 차이 — pdflatex가 곧 pdftex인 이유
엔진은 실제로 실행되는 프로그램이고, 포맷은 그 프로그램에 미리 읽혀 둔 매크로 덩어리입니다. 이는 추상적인 이야기가 아니라 파일 시스템에서 확인됩니다. TeX Live 2024의 bin 디렉터리를 보면 pdflatex는 pdftex를 가리키는 심볼릭 링크이고, latex도 같은 pdftex를 가리킵니다. 마찬가지로 xelatex → xetex, lualatex → luahbtex이며 platex와 uplatex는 둘 다 euptex입니다. 즉 “여섯 개의 LaTeX 명령”의 실체는 네 개의 바이너리뿐입니다. 그렇다면 latex와 pdflatex의 차이는 무엇일까요. 시작할 때 읽어 들이는 .fmt 파일——미리 처리해 굳혀 둔 매크로 덤프——뿐입니다. latex.fmt는 8,221,690바이트, pdflatex.fmt는 8,221,444바이트로 246바이트밖에 차이 나지 않습니다.
# TeX Live 2024: six commands, four binaries
$ ls -l latex pdflatex xelatex lualatex platex uplatex
latex -> pdftex
pdflatex -> pdftex
xelatex -> xetex
lualatex -> luahbtex
platex -> euptex
uplatex -> euptex| 용어 | 뜻과 헷갈리기 쉬운 지점 |
|---|---|
engine | 실제로 실행되는 프로그램(tex, pdftex, xetex, luatex, euptex). 출력 형식, 글꼴 방식, 문자 처리를 결정하는 층 |
format | 미리 읽혀 둔 매크로 체계(plain TeX, LaTeX, ConTeXt). .fmt 파일로 굳혀 둡니다 |
.fmt | 포맷의 덤프. texmf-var/web2c/<엔진 이름>/ 아래에 놓이며 fmtutil이 만듭니다 |
pdfLaTeX | 엔진 pdftex와 LaTeX 포맷의 조합. pdfLaTeX라는 프로그램은 존재하지 않습니다 |
LaTeX2e | 1994년 이후의 현행 LaTeX. 그냥 “LaTeX”이라고 하면 보통 이것을 가리킵니다 |
LaTeX3 | 커널을 다시 쓰는 장기 프로젝트. 이미 expl3으로 현행 LaTeX에 들어 있고 많은 패키지가 사용합니다 |
클래스와 패키지의 차이 — .cls와 .sty는 무엇이 다른가
클래스는 문서가 “무엇인가”를 정하고, 패키지는 문서에 기능을 “더합니다”——그리고 한 문서에 클래스는 정확히 하나, 패키지는 몇 개든 쓸 수 있습니다. 차이는 그것이 전부입니다. 기술적으로는 둘 다 매크로 정의로 가득 찬 텍스트 파일이며, .cls의 내용과 .sty의 내용 사이에 본질적인 구별은 없습니다. 둘을 가르는 것은 읽어 들이는 방식뿐이고, 문법이 그 규칙을 그대로 드러냅니다. \documentclass{article}은 한 번, \usepackage{...}는 얼마든지. 그래서 “2단으로 짜기”가 클래스의 일(\documentclass[twocolumn])인지 패키지의 일(multicol)인지 헷갈릴 때는 문서의 종류가 바뀌는지, 기능이 하나 늘 뿐인지를 물으면 됩니다. 덧붙여 .dtx는 패키지의 원고(소스와 문서가 함께 있는 형식)이고, .ins는 거기서 .sty를 뽑아내는 지시서입니다.
| 확장자 | 내용과 생기는 시점 |
|---|---|
.tex | 직접 쓰는 원고. 버전 관리에 넣어야 할 것은 이 파일입니다 |
.cls | 클래스. \documentclass로 하나만 읽어 들입니다 |
.sty | 패키지. \usepackage로 몇 개든 읽어 들입니다 |
.dtx / .ins | 패키지 작성자의 원고와, 거기서 .sty를 만들어 내는 지시서 |
.aux | 상호 참조, 목차, 인용의 메모. 이것 때문에 두 번 조판해야 합니다 |
.log | 실행의 전체 기록. Missing character 같은 경고는 여기에만 나오기도 합니다 |
.bib / .bbl | 문헌 데이터베이스와, 거기서 조판된 참고문헌 목록 |
매크로・토큰・카테고리 코드 — TeX가 문자를 읽는 순서
TeX는 문자를 문자 그대로 읽지 않습니다. 한 글자마다 0부터 15까지의 역할 번호인 “카테고리 코드”(catcode)를 붙인 뒤 다룹니다. \는 0(명령의 시작), {는 1, }는 2, $는 3, &는 4, #는 6, ^는 7, _는 8, 공백은 10, 영문자는 11(letter), 숫자와 대부분의 기호는 12(other), ~는 13(active), %는 14(comment)입니다. 문자에 카테고리 코드가 붙은 최소 단위가 토큰이고, 매크로란 토큰 목록에 붙인 이름일 뿐입니다. 이것이 실제로 걸리는 자리가 하나 있습니다. 문서 본문에서 @의 카테고리 코드는 12——곧 평범한 기호라 명령 이름의 일부가 될 수 없습니다. 그래서 \@ifnextchar 같은 내부 명령은 본문에서 부를 수 없고, \makeatletter가 @를 잠시 11로 바꿔 줍니다. 패키지(.sty) 안에서는 처음부터 11이므로 이 절차가 필요 없습니다.
% Ask TeX for the catcode of a character; the answer lands in the log.
\showthe\catcode`\@ % > 12. (in the document body: "other")
\showthe\catcode`\A % > 11. (letter)
\showthe\catcode`\~ % > 13. (active)
\makeatletter
\showthe\catcode`\@ % > 11. (now a letter, so \@ifnextchar works)
\makeatother| 용어 | 뜻과 헷갈리기 쉬운 지점 |
|---|---|
token | 문자와 카테고리 코드의 짝. TeX가 다루는 최소 단위이며, 글자가 같아도 catcode가 다르면 다른 것입니다 |
catcode | 0부터 15까지의 역할 번호. \catcode로 바꿀 수 있고, verbatim은 이것으로 명령을 무력화합니다 |
macro | 토큰 목록에 붙인 이름. \newcommand로 정의합니다. 함수 호출이 아니라 치환이라서 인수는 평가되지 않고 그대로 끼워집니다 |
expansion | 매크로를 그 내용으로 바꾸는 처리. 오류가 정의한 줄이 아니라 전개된 줄 번호로 보고되는 이유입니다 |
robust / fragile | 제목이나 각주처럼 내용이 기록되었다가 다시 읽히는 자리(이동 인수)에서 깨지지 않는 명령이 robust, 깨지는 것이 fragile입니다. 현대 LaTeX에서는 대부분 robust 처리되었습니다 |
상자・글루・커닝 — 조판을 이루는 세 부품
TeX가 보기에 조판된 페이지는 글자나 문단이 아니라 딱 세 가지로 이루어집니다. 상자와, 그 사이를 채우는 글루(glue)와 커닝(kern) 입니다. 글자는 너비・높이・깊이를 가진 작은 상자이고, 한 줄은 그것을 가로로 늘어놓은 상자(\hbox), 한 페이지는 줄을 세로로 쌓은 상자(\vbox)입니다. 상자와 상자 사이에 들어가는 것이 글루——늘어나고 줄어드는 공백입니다. 단순한 너비가 아니라 자연 너비・늘어남・줄어듦의 세 쌍으로, 10pt Computer Modern에서 단어 사이 공백은 자연 너비 3.33333pt, 늘어남 1.66666pt, 줄어듦 1.11111pt 입니다. 양끝 맞추기가 가능한 것도, TeX가 한 줄의 빽빽함(badness)을 점수로 매길 수 있는 것도 이 신축성 덕분입니다. 반면 커닝은 늘거나 줄지 않는 고정 간격이며, 줄바꿈 자리가 되지도 못합니다. 그래서 \hbox to 60pt{a\kern 10pt b}는 너비를 채우지 못해 Underfull \hbox (badness 10000)을 내보내지만, 늘어나는 글루를 넣은 같은 상자는 조용히 들어맞습니다.
| 용어 | 뜻과 헷갈리기 쉬운 지점 |
|---|---|
box | 너비・높이・깊이를 가진 사각형. \hbox는 가로로 늘어놓고 \vbox는 세로로 쌓습니다. 깊이(기준선 아래)를 따로 두는 것이 TeX의 특징입니다 |
glue | 늘고 줄어드는 공백. 자연 너비・늘어남・줄어듦의 세 쌍입니다. 줄바꿈이나 쪽 나눔의 후보 지점이 되기도 합니다 |
kern | 고정 너비의 간격. 늘지도 않고 줄바꿈 자리도 되지 않습니다. \TeX 안의 음수 커닝처럼 자간 조정에 씁니다 |
badness | 글루를 얼마나 무리하게 늘리거나 줄였는지를 재는 값. 0부터 10000까지이고 10000이 최악입니다. Underfull \hbox (badness 10000)의 그 숫자입니다 |
sp | scaled point. TeX 내부의 최소 단위로 1pt = 65536sp 입니다. 모든 길이를 이 정수로 보관하므로 반올림 오차가 쌓이지 않습니다 |
DVI란 무엇인가 — “장치 비의존”이 글꼴을 담지 않는 이유
DVI(device-independent)는 TeX가 본래 내보내도록 만들어진 출력 형식으로, “어떤 문자를, 어떤 글꼴로, 어느 좌표에 놓을지”만 적은 지시서입니다. 글자 모양 자체는 들어 있지 않습니다. 이 차이를 실측하면 극적입니다. TeX Live 2024에서 한 줄짜리 같은 문서를 조판하면 latex가 내는 DVI는 300바이트, pdflatex가 내는 PDF는 17,081바이트——쉰일곱 배가 넘습니다. DVI 안을 들여다보면 fntdef1 27: cmr10이라고 적혀 있어 글꼴이 이름으로만 참조됨을 알 수 있습니다. 반면 PDF를 pdffonts로 보면 CMR10이 emb yes sub yes——윤곽이 묻어 있고, 실제로 쓴 글자만 남기고 솎아져 있습니다. 그래서 DVI는 그 자체로는 제대로 표시되지 않고, dvipdfmx나 dvips가 글꼴을 해결해 준 뒤에야 배포물이 됩니다. 거꾸로 이 가벼움과 뒷단에 남겨 주는 자유가, 일본어의 upLaTeX → dvipdfmx 경로가 지금도 현역인 이유이기도 합니다.
| 용어 | 뜻과 헷갈리기 쉬운 지점 |
|---|---|
DVI | device-independent. 글꼴을 이름으로만 참조하는 중간 형식. 표시에도 배포에도 변환이 필요합니다 |
PDF | 배포와 인쇄를 위한 최종 형태. 글꼴이 묻히고 책갈피・링크・메타데이터도 담을 수 있습니다 |
PostScript | 페이지 기술 언어. dvips로 DVI에서 만들며, 인쇄소 입고용으로 지금도 쓰입니다 |
pt / bp | TeX의 pt는 영미식 포인트로 1in = 72.26999pt 입니다. PDF와 PostScript의 점은 bp(big point)이며 1bp = 1.00374pt. 1인치에 72점인 쪽은 후자입니다 |
MWE | minimal working example. 문제를 재현하는 가장 작은 문서. 질문할 때 가장 먼저 요구받는 것입니다 |
CTAN・TDS・texmf・kpathsea — 파일은 어디에 있는가
CTAN이 세계의 창고, TDS가 그 안의 진열 규칙, texmf가 손안의 실물, kpathsea가 그것을 찾는 장치——이 넷은 하나의 사슬로 이어집니다. CTAN(Comprehensive TeX Archive Network)에 모인 패키지는 TDS(TeX Directory Structure)라는 공통 배치 규칙에 따라 texmf 트리로 풀립니다. .sty는 tex/latex/<패키지 이름>/, 문서는 doc/latex/<패키지 이름>/에 놓입니다. 이 규칙이 있어서 어느 배포판에서도 파일의 자리가 같습니다. 다만 TeX Live 2024의 texmf-dist에는 276,953개의 파일이 놓여 있어, 실행할 때마다 디렉터리를 훑는 것은 말이 되지 않습니다. 그래서 kpathsea는 ls-R이라는 색인을 먼저 읽습니다. 패키지를 손으로 넣었는데도 찾지 못한다면 대개 이 색인이 낡았을 뿐입니다(mktexlsr로 다시 만듭니다). 실제로 어떤 파일이 쓰이는지는 kpsewhich article.cls 한 줄이면 알 수 있습니다.
| 용어 | 뜻과 헷갈리기 쉬운 지점 |
|---|---|
CTAN | 패키지의 중앙 아카이브(ctan.org). 전 세계 미러로 동기화됩니다 |
TDS | TeX Directory Structure. texmf 안의 배치를 정한 규약. 손으로 파일을 놓을 때 이것을 따릅니다 |
texmf | 실제 파일이 들어 있는 트리. 여러 개가 있고 texmf-local이 texmf-dist보다 우선합니다 |
kpathsea / ls-R | 파일 검색 라이브러리와 그 색인. kpsewhich로 조회하고 mktexlsr로 색인을 다시 만듭니다 |
TeX Live / MiKTeX | 주요 배포판 둘. TeX Live는 해마다 한 번 통째로 갱신되고, MiKTeX는 부족한 패키지를 실행 중에 가져오는 것이 특징입니다 |
tlmgr | TeX Live의 패키지 관리 명령. 개별 패키지 갱신이나 추가 설치에 씁니다 |
일본어 조판 용어 — JFM・일본어와 서양문자・금칙
일본어 TeX에는 서양 문자만 다루어서는 마주치지 않는 어휘가 있습니다. 그 중심에는 일본어 문자와 서양 문자를 완전히 별개의 계통으로 다룬다는 설계가 있습니다. pTeX 계열 엔진은 한자와 가나를 일본어 글꼴로, 라틴 문자를 서양 글꼴로 조판하고, 그 경계에 자동으로 4분의 1 em 공백(\xkanjiskip)을 넣습니다. 일본어 글꼴의 치수를 기술하는 것이 JFM(Japanese Font Metric)이며, 여기에는 글자 너비뿐 아니라 “약물이 나란히 놓였을 때 얼마나 좁힐지”까지 적혀 있습니다. 줄 첫머리에 마침표가 오지 않고 줄 끝에 여는 괄호가 오지 않게 하는 규칙이 금칙 처리이며, TeX에서는 이를 페널티 값으로 표현합니다. 루비(본문 위의 발음 표기)와 세로쓰기 역시 일본어 고유의 요구이고, 둘 다 클래스나 패키지가 맡습니다. 이 도구들을 실제로 어떻게 골라 쓰는지는 일본어 조판 페이지들이 담당합니다.
| 용어 | 뜻과 헷갈리기 쉬운 지점 |
|---|---|
JFM | Japanese Font Metric. 일본어 글꼴의 치수 정의로, 글자 너비 외에 약물을 좁히는 규칙도 담습니다 |
pTeX / upTeX | 일본어 조판에 대응한 TeX 엔진. upTeX은 내부를 Unicode로 바꾼 후속입니다 |
kinsoku | 금칙 처리. 줄 처음이나 끝에 놓을 수 없는 문자의 규칙으로, TeX에서는 페널티 값으로 나타냅니다 |
\xkanjiskip | 일본어와 서양 문자의 경계에 자동으로 들어가는 공백. 기본값은 약 4분의 1 em이고 값을 바꿀 수 있습니다 |
ruby | 본문 위(세로쓰기에서는 오른쪽)에 작게 다는 발음 표기. 클래스나 패키지가 제공합니다 |