같은 원고를 두 번 조판해 봅니다. 11pt article, 행 길이 180pt, lipsum 문단 100개. microtype 없이는 1731행이 되고 오버풀 박스가 117개 나옵니다. 프리앰블에 \usepackage{microtype} 한 줄을 더하면 1702행, 오버풀은 6개입니다. 마이크로타이포그래피란 구두점을 머리카락 한 올만큼 여백으로 내보내고, 글리프 폭을 1퍼센트도 안 되게 늘이거나 줄이는 것, 그게 전부입니다. 이 페이지에서는 LaTeX의 microtype이 실제로 무엇을 하는지 — protrusion(돌출), font expansion(신축), tracking — 을 측정한 숫자와 함께 살펴봅니다.
microtype은 무엇을 하는가
microtype 자체는 조판을 하지 않습니다. pdfTeX이 도입하고 이후 일부가 LuaTeX와 XeTeX으로 퍼진 마이크로타이포그래피 기능에 대한 통일된 LaTeX 인터페이스입니다. 작성자는 R. Schlicht입니다. 중심에는 문자 protrusion(margin kerning이라고도 함)과 font expansion 두 가지가 있고, 이어서 tracking(자간 벌리기), 합자 비활성화, 단어 사이 간격과 추가 커닝의 조정이 따릅니다. protrusion과 expansion은 해당 엔진에서 안전하게 동작한다고 판단되면 기본으로 켜집니다.
이 두 기능의 출처는 분명히 기록되어 있습니다. Hàn Thế Thành 이 2000년 브르노의 마사리크 대학교에 제출한 박사 논문 「Micro-typographic extensions to the TeX typesetting system」에서 pdfTeX에 구현한 것으로, 이 논문은 TUGboat 제21권 4호 317–434쪽으로 공간되었습니다. 같은 논문은 기계적으로 맞춘 행 끝이 눈에는 오히려 들쭉날쭉해 보이기 때문에 시각적 정렬을 위해 margin kerning이 필요하다고 설명하고, font expansion을 “느슨한 행에서는 더 넓은 변형을, 빽빽한 행에서는 더 좁은 변형을 써서 단어 사이 간격의 신축량을 줄이는 방법”으로 정의합니다. 다시 말해 microtype이 구현하는 것은 사람의 눈이 곧은 가장자리를 어떻게 착각하는가라는 관찰에서 출발한 장치입니다.
범위를 한 번 짚어 두면, 이것들은 서양어(라틴 문자) 텍스트를 위한 마감입니다. 일본어에는 돌출이나 신축과는 다른 조판 모델 — 행 머리와 행 끝의 금칙, 일본어와 서양문자 사이의 간격 — 이 있고 luatexja 같은 도구가 맡습니다. microtype을 읽어들여도 일본어 조판의 모양새는 달라지지 않습니다. 합자나 커닝 같은 더 기본적인 서양어 자동 처리는 자매 페이지에 맡깁니다.
microtype의 효과는 얼마나 되는가 — 실측
행 길이가 좁을수록 효과가 큽니다. TeX Live 2024에서 11pt article에 \usepackage[T1]{fontenc}, 행 길이 180pt(2단 조판의 한 단에 가까운 폭)로 lipsum 문단 100개를 조판하고 행수와 Overfull \hbox 건수를 셌습니다. 결과는 아래 표와 같습니다. microtype을 더하면 총 행수는 1731 → 1702(−1.7 %), 삐져나옴은 117 → 6이 되었습니다. 같은 측정을 345pt(a4paper article의 본문 폭에 가까움)에서 하면 차이가 줄어 921 → 909행(−1.3 %) 입니다. 효과는 분명히 있지만 “획기적으로 짧아진다”고 할 정도는 아닙니다.
| 설정 | 총 행수(180pt 폭, 100문단) | Overfull hbox 건수 |
|---|---|---|
(package not loaded) | 1731 | 117 |
expansion=false | 1718(protrusion만) | 102 |
protrusion=false | 1711(expansion만) | 9 |
\usepackage{microtype} | 1702(둘 다, 기본값) | 6 |
이 분해가 알려 주는 것은 두 기능이 하는 일이 다르다는 사실입니다. 행수를 가장 많이 줄이는 것은 expansion(1731 → 1711)이지만, protrusion도 13행을 기여합니다. 반면 오버풀 박스를 없애는 일은 거의 전적으로 expansion의 단독 작업입니다. 117개가 9개까지 떨어지는 반면 protrusion만으로는 102개까지밖에 줄지 않습니다. 행이 여백으로 삐져나와 곤란하다면 expansion이 듣고, 행 끝이 들쭉날쭉해 보이는 게 불만이라면 protrusion이 듣습니다. 어느 쪽을 끌지 망설일 때 쓸 만한 판단 기준입니다. 참고로 microtype을 넣으면 \pdfprotrudechars와 \pdfadjustspacing이 둘 다 2가 됩니다(없으면 둘 다 0). 실제로 켜졌는지는 이 둘을 \the로 들여다보면 확인할 수 있습니다.
문자 protrusion — 시각적 착시를 상쇄하기
Protrusion(margin kerning)은 행 머리와 행 끝의 문자를 여백 밖으로 아주 조금 내보내는 기능이며, 목적은 착시의 상쇄입니다. 마침표나 쉼표, 하이픈, 또는 o, A, v처럼 둥글거나 기울어진 윤곽을 가진 글자를 텍스트 가장자리에 딱 맞추면 그 글리프의 좌우 여백 때문에 가장자리가 안쪽으로 꺼져 보입니다. 조금만 밖으로 내보내면 가장자리는 시각적으로 곧게 정렬됩니다. 내보내는 양은 글자마다 달라서 구두점은 크고, 둥근 글자는 작고, H처럼 직선인 글자는 0입니다. microtype은 이런 값을 담은 설정 파일을 글꼴마다 준비해 두고 있습니다.
돌출량을 전체적으로 늘리거나 줄이려면 factor 옵션을 씁니다(factor=1100이면 기본값의 1.1배). 또한 protrusion은 TeX이 보기에 “여백”이 아닌 곳 — itemize의 항목이나 tabular 셀의 가장자리 — 에서는 작동하지 않습니다. 그런 자리를 위해 \leftprotrusion과 \rightprotrusion이 마련되어 있어, 그 위치의 첫 글자나 마지막 글자를 마치 보통의 바깥 여백에 있는 것처럼 내보낼 수 있습니다. 왼쪽 열이 괄호나 인용 부호로 시작하는 표라면, 이것만 넣어도 보이는 모습이 달라집니다.
Font expansion — 글리프 폭이 단어 사이 간격의 일을 대신하기
Font expansion은 각 행의 글리프를 가로로 아주 조금 — 보통 퍼센트의 일부에서 몇 퍼센트까지 — 늘이거나 줄여 행폭을 맞추는 기능입니다. 양쪽 정렬에서는 원래 행폭을 단어 사이 글루(interword glue) 의 신축만으로 만듭니다. 그 일의 일부를 글리프 폭이 대신하면 단어 사이 간격의 변동이 작아져 행마다의 공백 편차가 줄고 문단 전체의 농담(조판에서 말하는 “색”)이 고르게 됩니다. 위의 실측에서 오버풀 박스를 117개에서 9개까지 떨어뜨린 것이 이 기능입니다. 신축의 상한은 stretch / shrink, 눈금은 step으로 조정할 수 있지만 기본값 그대로도 대개 문제없습니다.
여기에 움직일 수 없는 제약이 하나 있습니다. expansion은 pdfTeX과 LuaTeX에서만 쓸 수 있고 XeTeX에서는 쓸 수 없습니다. 옵션 없이 XeLaTeX에서 microtype을 읽어들이는 것만으로는 오류가 나지 않습니다. 패키지가 안전하게 동작하는 기능만 켜기 때문에 protrusion과 tracking은 작동하고 expansion만 조용히 꺼집니다. 그러나 \usepackage[expansion=true]{microtype}처럼 명시하면 다음 오류로 멈춥니다.
$ xelatex xe.tex
! Package microtype Error: Font expansion does not work with xetex.
See the microtype package documentation for explanation.
% The reason is one missing primitive. Asking each engine directly:
% pdftex : has \efcode, has \lpcode
% xetex : NO \efcode, has \lpcode
% luatex : has \efcode, has \lpcode
% XeTeX can shift glyphs into the margin, but it cannot scale their widths.이유는 엔진 프리미티브 하나의 유무로 환원됩니다. 돌출에 쓰는 \lpcode / \rpcode(좌우 돌출량)는 세 엔진 모두 가지고 있지만, 신축에 필요한 \efcode는 XeTeX에 존재하지 않습니다(pdfTeX과 LuaTeX에는 있습니다). 즉 XeTeX은 글자를 여백으로 밀어낼 수는 있어도 글자 폭 자체를 확대·축소할 수단이 없습니다. XeTeX에서 신축까지 포함한 마감을 원한다면 LuaTeX으로 옮기는 것이 이치에 맞는 선택입니다.
Tracking(\textls) — 하이픈 처리를 깨뜨리지 않는 자간 벌리기
Tracking(자간) 혹은 letterspacing은 글자 사이 간격을 고르게 벌리는 조정입니다. microtype의 방식이 뛰어난 까닭은 글자와 글자 사이에 공백을 끼워 넣는 것이 아니라 글꼴 쪽 글리프 폭을 넓힌 사본을 만들어 쓴다는 데 있습니다. 그래서 단어는 여전히 한 덩어리로 남고 하이픈 처리가 깨지지 않습니다. 단어 중간에 \kern을 손으로 뿌리는 고전적인 방법을 쓰면 그 단어는 다시는 행 끝에서 나뉘지 못합니다. 그때그때의 자간 벌리기에는 \textls{...} 를, 그 뒤의 모든 글자에 적용하려면 \lsstyle을 쓰며 후자는 그룹이 끝날 때까지 유효합니다. 제목처럼 앞뒤에 여분의 커닝을 더하고 싶지 않을 때는 별표를 붙인 \textls*{...} 가 편리합니다.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{microtype}
% Space out small caps by 40/1000 em wherever they appear
\SetTracking{encoding = *, shape = sc}{40}
\begin{document}
\textsc{Small Caps}, and an ad-hoc \textls[200]{wide run of letters}.
% \lsstyle stays on until the end of the group
{\lsstyle everything here is letterspaced}
% The starred form adds no kerning before or after - good for headings
\section*{\textls*{Chapter Title}}
\end{document}벌리는 양은 1000분율이며, microtype 매뉴얼에 따르면 기본값은 100/1000 em = 0.1 em입니다. \textls[200]{...} 처럼 선택 인수로 개별 지정하거나, 글꼴 집합에 대해서는 프리앰블에서 \SetTracking{encoding=*, shape=sc}{40} 처럼 선언합니다(이 예는 작은 대문자를 40/1000 벌리는 지정입니다). 여기서 주의가 필요합니다. 매뉴얼 자신이 소문자 텍스트의 자간 벌리기는 “is held in abhorrence”라고 적고, 무엇을 하는지 확실히 알고 있는 것이 아니라면 대문자나 작은 대문자에만 자간을 주어야 한다고 못 박습니다. Tracking은 pdfTeX과 LuaTeX에서 쓸 수 있습니다(microtype의 README가 버전 조건까지 명시합니다). plain TeX에서도 필요하다면 자간 벌리기만 떼어 낸 letterspace 패키지가 있습니다.
합자 끄기와 간격 손대기 — \DisableLigatures와 kerning / spacing
합자를 꺼야 할 상황은 드물지만 닥치면 절실합니다. 코드를 보여 주는 문장에서 -- 가 en 대시로 합쳐져 버리는 경우 같은 것입니다. \DisableLigatures 는 지정한 글꼴 집합에 대해 합자를 무효화합니다. \DisableLigatures{encoding = T1, family = tt*} 라면 T1의 타자체만 해당됩니다. 다만 글꼴의 모든 합자를 무효화하면 그 글꼴의 커닝도 함께 꺼진다는 점에 유의하세요(매뉴얼이 명시합니다). 합자를 시작하는 문자를 선택 인수에 나열하면 \DisableLigatures[?,!]{encoding = T1} 처럼 노린 합자만 멈출 수 있습니다. 이 명령은 프리앰블에서만, 그것도 한 번만 쓸 수 있습니다.
kerning과 spacing 옵션은 각각 추가 커닝과 단어 사이 간격의 미세 조정을 켜지만, 이들은 pdfTeX 전용입니다(LuaTeX・XeTeX에서는 듣지 않습니다). 둘 다 기본은 꺼짐이므로 필요할 때만 명시합니다. 읽어들인 뒤 설정을 바꾸려면 \microtypesetup{...} 입니다. 예컨대 목차를 만드는 동안만 protrusion을 끄고 싶다면 앞뒤를 \microtypesetup{protrusion=false} 와 \microtypesetup{protrusion=true} 로 감쌉니다. 문서의 일부만 다른 설정으로 하고 싶다면 \microtypecontext{...}(또는 microtypecontext 환경)로 문맥을 전환할 수 있습니다. draft를 주면 마이크로타이포그래피를 한꺼번에 끌 수 있고, final은 반대로 문서 클래스가 draft 모드여도 강제로 켭니다. 전후 비교 실험에 이 둘이 유용합니다.
엔진마다 쓸 수 있는 기능이 다르다
기억할 것은 둘입니다. expansion은 XeTeX에서 쓸 수 없다, 그리고 단어 사이 간격과 추가 커닝은 pdfTeX 전용이다. 따라서 가장 기능이 많은 것은 pdfTeX(protrusion + expansion + tracking + kerning + spacing), 그다음이 LuaTeX(protrusion + expansion + tracking)이며, XeTeX은 protrusion과 tracking뿐입니다. microtype은 엔진에서 안전하게 동작하는 기능만 자동으로 켜므로 인수 없이 읽어들이는 한 오류는 나지 않습니다. 바로 그 때문에 무엇이 듣지 않고 있는지는 스스로 파악해 두어야 합니다.
| 기능 | pdfTeX / LuaTeX / XeTeX | 비고 |
|---|---|---|
protrusion | ○ / ○ / ○ | 셋 다 \lpcode와 \rpcode를 가지고 있습니다. 기본 활성 |
expansion | ○ / ○ / × | XeTeX에는 \efcode가 없습니다. 명시하면 Package microtype Error |
tracking | ○ / ○ / ○ | \textls와 \lsstyle. 기본은 꺼짐이며 tracking으로 켭니다 |
kerning | ○ / × / × | pdfTeX 전용. 기본은 꺼짐 |
spacing | ○ / × / × | pdfTeX 전용. 단어 사이 간격의 미세 조정 |
실제 프리앰블에 어떻게 쓸 것인가
기본은 \usepackage{microtype} 한 줄뿐입니다. 이것만으로 protrusion과 expansion(엔진이 지원한다면)이 기본으로 켜지고, 대부분의 문서는 이것만으로도 충분히 좋아집니다. microtype은 안정적이고 부작용이 거의 없어 추가해서 곤란해질 일은 좀처럼 없습니다. pdfTeX 계열이라면 \usepackage[T1]{fontenc}와 함께 쓰는 것이 정석인데, 이는 protrusion・expansion의 설정 파일이 인코딩 단위로 마련되어 있기 때문이기도 합니다. 아래는 조금 더 나아간 예로, protrusion과 expansion을 명시적으로 켜고, 작은 대문자의 자간을 가볍게 벌리며, 코드 표시용 타자체에만 합자를 끕니다.
\documentclass{article}
\usepackage[T1]{fontenc}
% protrusion and expansion explicitly on;
% "final" forces them on even when the class is in draft mode
\usepackage[activate={true,nocompatibility},final]{microtype}
% letterspace small caps a little (40/1000 em)
\SetTracking{encoding = *, shape = sc}{40}
% no ligatures in the typewriter family, so "--" stays two hyphens
\DisableLigatures{encoding = T1, family = tt*}
\begin{document}
% turn protrusion off just while the table of contents is built
\microtypesetup{protrusion=false}
\tableofcontents
\microtypesetup{protrusion=true}
\end{document}마지막으로 기대치를 한 번 조정해 둡니다. 이런 조정은 조심스러워서 한 쪽만 보아서는 알 수 없을 때도 있습니다. 실측에서도 좁은 행 길이에서 총 행수가 1.7퍼센트 줄었을 뿐입니다. 그럼에도 일상적인 집필에서는 오버풀 박스가 117개에서 6개로 떨어진 것이 더 크게 작용합니다. 삐져나오는 행이 하나 줄 때마다, 들어맞게 하려고 문장을 고쳐 쓰는 수고도 하나 사라지기 때문입니다. microtype의 값어치는 “짧아진다”보다 손으로 고치는 횟수가 줄어든다는 데 있습니다.