용어집

LaTeX 용어가 어려운 것은 낱말이 난해해서가 아니라, 일상어의 얼굴을 하고 속뜻만 다르기 때문입니다. “패키지”는 npm의 패키지가 아니고, “클래스”는 객체 지향의 클래스가 아니며, “글루(glue)”는 접착제가 아닙니다. 게다가 이 용어집의 주역들——엔진과 포맷, 클래스와 패키지, 상자와 글루와 커닝——은 모두 직접 확인해 볼 수 있습니다. TeX Live 2024에서 pdflatexpdftex를 가리키는 심볼릭 링크일 뿐이고, latex 역시 같은 pdftex를 가리킵니다. 이 용어집은 각 항목을 “초심자가 반드시 헷갈리는 지점”에서 시작해 설명합니다.

엔진과 포맷의 차이 — pdflatex가 곧 pdftex인 이유

엔진은 실제로 실행되는 프로그램이고, 포맷은 그 프로그램에 미리 읽혀 둔 매크로 덩어리입니다. 이는 추상적인 이야기가 아니라 파일 시스템에서 확인됩니다. TeX Live 2024의 bin 디렉터리를 보면 pdflatexpdftex를 가리키는 심볼릭 링크이고, latex도 같은 pdftex를 가리킵니다. 마찬가지로 xelatex → xetex, lualatex → luahbtex이며 platexuplatex는 둘 다 euptex입니다. 즉 “여섯 개의 LaTeX 명령”의 실체는 네 개의 바이너리뿐입니다. 그렇다면 latexpdflatex의 차이는 무엇일까요. 시작할 때 읽어 들이는 .fmt 파일——미리 처리해 굳혀 둔 매크로 덤프——뿐입니다. latex.fmt는 8,221,690바이트, pdflatex.fmt는 8,221,444바이트로 246바이트밖에 차이 나지 않습니다.

shell
# 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라는 프로그램은 존재하지 않습니다
LaTeX2e1994년 이후의 현행 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이므로 이 절차가 필요 없습니다.

latex
% 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가 다르면 다른 것입니다
catcode0부터 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)의 그 숫자입니다
spscaled 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로 보면 CMR10emb yes sub yes——윤곽이 묻어 있고, 실제로 쓴 글자만 남기고 솎아져 있습니다. 그래서 DVI는 그 자체로는 제대로 표시되지 않고, dvipdfmxdvips가 글꼴을 해결해 준 뒤에야 배포물이 됩니다. 거꾸로 이 가벼움과 뒷단에 남겨 주는 자유가, 일본어의 upLaTeX → dvipdfmx 경로가 지금도 현역인 이유이기도 합니다.

용어뜻과 헷갈리기 쉬운 지점
DVIdevice-independent. 글꼴을 이름으로만 참조하는 중간 형식. 표시에도 배포에도 변환이 필요합니다
PDF배포와 인쇄를 위한 최종 형태. 글꼴이 묻히고 책갈피・링크・메타데이터도 담을 수 있습니다
PostScript페이지 기술 언어. dvips로 DVI에서 만들며, 인쇄소 입고용으로 지금도 쓰입니다
pt / bpTeX의 pt는 영미식 포인트로 1in = 72.26999pt 입니다. PDF와 PostScript의 점은 bp(big point)이며 1bp = 1.00374pt. 1인치에 72점인 쪽은 후자입니다
MWEminimal working example. 문제를 재현하는 가장 작은 문서. 질문할 때 가장 먼저 요구받는 것입니다

CTAN・TDS・texmf・kpathsea — 파일은 어디에 있는가

CTAN이 세계의 창고, TDS가 그 안의 진열 규칙, texmf가 손안의 실물, kpathsea가 그것을 찾는 장치——이 넷은 하나의 사슬로 이어집니다. CTAN(Comprehensive TeX Archive Network)에 모인 패키지는 TDS(TeX Directory Structure)라는 공통 배치 규칙에 따라 texmf 트리로 풀립니다. .stytex/latex/<패키지 이름>/, 문서는 doc/latex/<패키지 이름>/에 놓입니다. 이 규칙이 있어서 어느 배포판에서도 파일의 자리가 같습니다. 다만 TeX Live 2024의 texmf-dist에는 276,953개의 파일이 놓여 있어, 실행할 때마다 디렉터리를 훑는 것은 말이 되지 않습니다. 그래서 kpathseals-R이라는 색인을 먼저 읽습니다. 패키지를 손으로 넣었는데도 찾지 못한다면 대개 이 색인이 낡았을 뿐입니다(mktexlsr로 다시 만듭니다). 실제로 어떤 파일이 쓰이는지는 kpsewhich article.cls 한 줄이면 알 수 있습니다.

용어뜻과 헷갈리기 쉬운 지점
CTAN패키지의 중앙 아카이브(ctan.org). 전 세계 미러로 동기화됩니다
TDSTeX Directory Structure. texmf 안의 배치를 정한 규약. 손으로 파일을 놓을 때 이것을 따릅니다
texmf실제 파일이 들어 있는 트리. 여러 개가 있고 texmf-localtexmf-dist보다 우선합니다
kpathsea / ls-R파일 검색 라이브러리와 그 색인. kpsewhich로 조회하고 mktexlsr로 색인을 다시 만듭니다
TeX Live / MiKTeX주요 배포판 둘. TeX Live는 해마다 한 번 통째로 갱신되고, MiKTeX는 부족한 패키지를 실행 중에 가져오는 것이 특징입니다
tlmgrTeX Live의 패키지 관리 명령. 개별 패키지 갱신이나 추가 설치에 씁니다

일본어 조판 용어 — JFM・일본어와 서양문자・금칙

일본어 TeX에는 서양 문자만 다루어서는 마주치지 않는 어휘가 있습니다. 그 중심에는 일본어 문자와 서양 문자를 완전히 별개의 계통으로 다룬다는 설계가 있습니다. pTeX 계열 엔진은 한자와 가나를 일본어 글꼴로, 라틴 문자를 서양 글꼴로 조판하고, 그 경계에 자동으로 4분의 1 em 공백(\xkanjiskip)을 넣습니다. 일본어 글꼴의 치수를 기술하는 것이 JFM(Japanese Font Metric)이며, 여기에는 글자 너비뿐 아니라 “약물이 나란히 놓였을 때 얼마나 좁힐지”까지 적혀 있습니다. 줄 첫머리에 마침표가 오지 않고 줄 끝에 여는 괄호가 오지 않게 하는 규칙이 금칙 처리이며, TeX에서는 이를 페널티 값으로 표현합니다. 루비(본문 위의 발음 표기)와 세로쓰기 역시 일본어 고유의 요구이고, 둘 다 클래스나 패키지가 맡습니다. 이 도구들을 실제로 어떻게 골라 쓰는지는 일본어 조판 페이지들이 담당합니다.

용어뜻과 헷갈리기 쉬운 지점
JFMJapanese Font Metric. 일본어 글꼴의 치수 정의로, 글자 너비 외에 약물을 좁히는 규칙도 담습니다
pTeX / upTeX일본어 조판에 대응한 TeX 엔진. upTeX은 내부를 Unicode로 바꾼 후속입니다
kinsoku금칙 처리. 줄 처음이나 끝에 놓을 수 없는 문자의 규칙으로, TeX에서는 페널티 값으로 나타냅니다
\xkanjiskip일본어와 서양 문자의 경계에 자동으로 들어가는 공백. 기본값은 약 4분의 1 em이고 값을 바꿀 수 있습니다
ruby본문 위(세로쓰기에서는 오른쪽)에 작게 다는 발음 표기. 클래스나 패키지가 제공합니다