서양어(라틴 문자) 문장은 LaTeX에 그냥 입력하기만 해도 놀랄 만큼 정갈하게 조판됩니다. office라고 쓰면 ffi가 한 글자꼴로 녹아들고, AV 사이는 1.11084 pt 좁혀지며, 줄바꿈 위치는 문단 전체를 훑어 정해집니다. 그런데 그 자동 처리에도 구멍이 남아, wolffish를 태연히 wolff-ish로 나눠 버립니다. 게다가 고쳐 보겠다고 \/을 끼워 합자를 끊으면, 이번에는 그 낱말의 하이픈 넣기가 완전히 사라집니다. 이 페이지에서는 서양어를 조판할 때 필자가 떠맡아야 할 판단——합자를 언제 끊을지, babel에 무엇을 선언할지, 대문자와 작은대문자를 어떻게 쓸지, 그리고 일본어 원고에 서양어를 섞으면 무엇이 달라지는지——을 실측과 함께 정리합니다.
LaTeX이 만드는 합자 다섯——ff fi fl ffi ffl
합자(리가처)는 이웃한 글자를 하나의 글자꼴로 녹인 것으로, LaTeX이 기본으로 만드는 것은 ff・fi・fl・ffi・ffl 다섯입니다. 본문에 office나 fluffier를 치기만 하면 바뀌고, 원본에는 아무 표시도 남지 않습니다. 이유는 모양에 있습니다. f의 오른쪽 위 삐침이 뒤따르는 i의 점이나 l의 세로획과 부딪히기 때문에 금속활자 시절부터 f 계열 합자를 주조해 왔습니다. T1 Computer Modern 10 pt에서 실측하면 fi 합자는 5.5542 pt, 글자를 나눈 f{}i는 5.83191 pt——합자 쪽이 0.27771 pt 좁고, 그 차이가 “부딪히지 않도록 붙인” 몫입니다.
같은 구조는 약물(문장부호)에도 작동합니다. 붙임표를 둘 이어 쓴 --은 수치 범위 등에 쓰는 엔 대시가 되고, 셋 이어 쓴 ---은 삽입구에 쓰는 엠 대시가 되며, 억음 부호 둘과 뒤이어 오는 아포스트로피 둘은 각각 활자다운 여는 큰따옴표와 닫는 큰따옴표가 됩니다. 이들은 글꼴 메트릭에 새겨진 변환이라 특별한 명령이 필요 없습니다(대시와 따옴표의 선택은 “따옴표・대시” 페이지에 자세히 있습니다).
합자를 끊는 세 가지 방법——하이픈 넣기가 남는 것은 하나뿐
합자가 낱말의 짜임(형태소) 경계를 넘어서면 오히려 읽기 나빠집니다. 고전적인 예가 shelfful(shelf + ful)로, ff를 녹이면 두 부품의 이음매가 보이지 않게 됩니다. 이 낱말을 든 것은 Knuth 자신으로 『The TeXbook』 19쪽에 나오며, 지금도 selnolig 패키지 설명서가 그 출처를 밝히고 있습니다. cufflink・offload・wolffish・halflife도 같은 부류입니다. 끊는 수단은 전통적으로 셋——shelf\/ful(이탤릭 보정), shelf{}ful(빈 그룹), shelf\kern0pt ful(너비 0인 커른).
여기에 재어 봐야 비로소 드러나는 차이가 있습니다. \showhyphens으로 분할점을 살펴보면 맨 wolffish는 wolff-ish로 나뉩니다(형태소로 보면 wolf-fish여야 할 자리입니다). wolf{}fish도 똑같이 wolff-ish——하이픈 넣기는 살아 있는 채로 합자만 사라집니다. 그런데 wolf\/fish와 wolf\kern0pt fish는 둘 다 분할점이 0이 됩니다. \mbox{}을 끼운 경우도 같습니다. 이유는 단순합니다. \/과 \kern은 조판 노드를 하나 끼워 넣기 때문에 TeX이 낱말을 인식하는 훑기가 거기서 멈춥니다. {}은 아무것도 남기지 않아 낱말은 낱말 그대로——그래서 하이픈 넣기를 지키면서 합자를 끊을 수 있는 것은 {}뿐입니다.
| 표기 | 너비(10pt, T1 CM) | showhyphens 결과 |
|---|---|---|
shelfful | 30.88135 pt | shelf-ful — 합자 있음, 분할점 있음 |
shelf{}ful | 31.15906 pt | shelf-ful — 합자만 사라지고 분할점은 남음 |
shelf\kern0pt ful | 31.15906 pt | 분할점 없음 — 하이픈 넣기가 사라짐 |
shelf\/ful | 31.93665 pt | 분할점 없음. 게다가 f의 이탤릭 보정 0.77759 pt가 더해짐 |
실무의 결론은 이렇습니다. 손으로 끊는다면 {}을 씁니다. \/은 『The TeXbook』이 보인 유서 깊은 표기이고 f의 삐침만큼을 되돌린다는 뜻에서는 이치에 닿지만, 그 낱말을 줄 끝에서 나눌 수 없게 만듭니다. 짧은 낱말이라면 실해가 적지만 selffulfilling 같은 긴 합성어에서 분할점이 0이 되면 그 줄만 낱말 사이가 늘어나 문단 전체가 여위어 보입니다. LuaLaTeX을 쓸 수 있다면 selnolig이 가장 훌륭한 답으로, 영어와 독일어의 형태소를 패턴으로 갖고 있어 shelfful이나 offload의 불필요한 합자를 본문에 표시를 남기지 않고 억제합니다(TeX Live 2024 동봉은 0.302판, LuaLaTeX 전용).
% \showhyphens output, TeX Live 2024, T1 Computer Modern:
% shelfful -> shelf-ful (ligature, break point kept)
% shelf{}ful -> shelf-ful (ligature broken, break point kept)
% shelf\kern0pt ful -> shelfful (no break points)
% shelf\/ful -> shelfful (no break points)
% wolffish -> wolff-ish (a break TeX gets wrong on its own)
A shelf{}ful of books, one cuff{}link, an off{}load.
% LuaLaTeX only: handles the whole word list for you
% \usepackage{selnolig}커닝은 AV를 1.11084 pt 좁힙니다——그리고 {}은 그것도 지웁니다
커닝(kerning)은 이웃한 특정 짝의 간격을 보기에 고르도록 좁히거나 넓히는 조정입니다. AV・To・Wa・LT처럼 글자꼴이 기운 짝은 그냥 두면 사이가 비어 보입니다. T1 Computer Modern 10 pt에서 실측하면 AV는 13.8855 pt, 사이에 {}을 끼운 A{}V는 14.99634 pt——글꼴이 지시했던 1.11084 pt의 좁힘이 사라진 것입니다. 커닝 표는 글꼴 메트릭에 들어 있고(pdfLaTeX 계열이면 .tfm 파일, OpenType면 글꼴 안의 표), TeX이 그것을 읽어 자간을 정합니다. 필자는 아무것도 쓰지 않습니다.
여기서 앞 절로 되돌아오는 주의가 하나 있습니다. 합자를 {}으로 끊으면 그 자리의 커른도 함께 사라집니다. f와 f 사이에 커른이 정의되어 있었다면 그것도 잃는 셈입니다. shelf{}ful의 경우 합자의 30.88135 pt에 대해 31.15906 pt——늘어난 0.27771 pt가 그것입니다. 눈에 띌 정도는 아니지만 로고나 상표처럼 글자 맞춤을 엄밀히 하고 싶은 자리에서는 {}이 아니라 \kern에 직접 값을 주는 편이 확실합니다. 반대로 낱말 전체를 고르게 넓히고 싶을(트래킹・글자 사이 띄우기) 때는 손수 \kern을 뿌리지 말고 microtype의 \textls{...}을 씁니다. 이쪽은 하이픈 넣기를 망가뜨리지 않습니다.
하이픈 넣기는 언어마다 다릅니다——babel로 언어를 선언합니다
같은 철자라도 어디서 나뉘는지는 언어마다 다릅니다. \showhyphens으로 확인하면 signature는 영어 패턴에서 sig-na-ture, 프랑스어에서는 si-gna-ture, 스페인어에서는 sig-na-tu-re로 나뉘는 자리 자체가 달라집니다. 더 극단적인 것이 Kongress로, 영어 패턴에서는 분할점이 하나도 발견되지 않습니다. 줄이 촘촘히 차지 않는다, 낱말 사이가 늘어난다 같은 증상의 적지 않은 부분이 언어를 선언하지 않은 데서 옵니다. \usepackage[french]{babel}(XeLaTeX・LuaLaTeX이면 polyglossia)은 장식이 아니라 제대로 조판하기 위한 전제입니다.
| 낱말 | english | french | ngerman | spanish |
|---|---|---|---|---|
signature | sig-na-ture | si-gna-ture | si-gna-ture | sig-na-tu-re |
Analyse | Anal-yse | Ana-lyse | Ana-ly-se | Analy-se |
Kongress | Kongress(분할점 없음) | Kon-gress | Kon-gress | Kon-gress |
impossible | im-pos-si-ble | im-pos-sible | im-pos-si-ble | im-pos-si-ble |
transatlantique | transat-lan-tique | trans-at-lan-tique | trans-at-lan-ti-que | trans-atlan-ti-que |
언어를 선언해도 고유명사와 전문어에서는 자동 판정이 어긋납니다. 대책은 세 단계입니다. (1) 그 낱말을 늘 같은 자리에서만 나누고 싶다면 서문의 \hyphenation{...}에 허용 위치를 -로 표시한 낱말들을 공백으로 구분해 나열합니다. 기본(미국 영어) 패턴에서는 manuscript에 분할점이 하나도 없어서 \hyphenation{man-u-script}가 예로부터 정석이었습니다. (2) 한 번뿐이라면 낱말 안에 \-(임의 붙임표)를 놓습니다. 다만 \-을 넣은 낱말은 거기서만 나뉘게 됩니다. (3) 절대 나누고 싶지 않다면 \mbox{...}으로 감쌉니다. 앞의 측정대로 \mbox{}은 분할점을 모두 빼앗으므로, 여기서는 오히려 노린 대로의 쓰임입니다.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[english]{babel} % loads the English hyphenation patterns
\hyphenation{man-u-script data-base FORTRAN} % global exceptions
\begin{document}
We rewrote the manuscript in \mbox{FORTRAN} overnight,
and the data\-base held.
\end{document}
% \showhyphens{...} prints the break points to the log --
% the fastest way to see what the current patterns actually do.babel은 하이픈 넣기만이 아니라 글자 자체도 바꿉니다
babel에 언어를 넘기면 그 언어의 조판 관례까지 적용됩니다. 가장 알기 쉬운 것이 프랑스어입니다. 같은 입력 Bonjour: oui!의 너비를 재면 babel 없이 58.48572 pt, \usepackage[french]{babel}을 넣으면 62.37366 pt——3.88794 pt 늘어납니다. PDF에서 뽑아 보면 이유가 분명한데, 출력은 Bonjour : oui !입니다. 프랑스어 조판에는 높은 문장부호(: ; ! ?) 앞에 공백을 두는 규칙이 있고, babel이 그것을 자동으로 넣는 것입니다. \og ... \fg{}라고 쓰면 기유메 « » 도 나옵니다.
독일어라면 따옴표 단축 표기가 아래·위 인용부호 „ … “ 를 내고, 스페인어나 이탈리아어도 같은 방식으로 자국의 관례를 들여옵니다. 여기에 함정이 하나 있습니다. babel의 언어를 바꾸는 순간 원고를 쓸 때와 다른 자리에 공백이 들어가므로 줄 나눔이 통째로 바뀌고 판면이 움직입니다. 심사 대응 도중에 언어 옵션을 더했더니 지정한 곳과 무관한 페이지의 그림·표가 어긋났다는 사고가 이것입니다. 언어는 처음 서문에서 정하고, 여러 언어를 쓰는 문서라면 main=으로 주 언어를 분명히 밝혀 두는 편이 안전합니다.
작은대문자와 대문자——\textsc{UNESCO}는 작아지지 않습니다
서양어 본문에서 두문자어나 인명을 도드라지게 할 때는 대문자를 늘어놓는 것보다 작은대문자(small caps)가 줄의 농도를 덜 흐트러뜨립니다. 명령은 \textsc{...}인데, 여기에 흔한 착각이 있습니다. 작은대문자 서체는 “소문자 자리에 작은 대문자가 들어 있는” 서체입니다. 따라서 \textsc에 넘길 것은 소문자여야 합니다. 10 pt T1 Computer Modern에서 실측하면 \textsc{unesco}는 34.68042 pt, \textsc{UNESCO}는 46.09985 pt——뒤엣것은 보통 UNESCO(42.35077 pt)보다 큽니다. 작게 만들려다 셋 중 가장 넓어진 결과입니다.
작은대문자에는 또 하나 PDF 쪽의 대가가 있습니다. \textsc{unesco}를 조판한 PDF에서 pdftotext로 글자를 뽑으면 돌아오는 것은 unesco——소문자 그대로입니다. 글자꼴은 대문자인데 텍스트 층에는 소문자가 들어 있습니다. 기관명이나 규격명을 작은대문자로 조판한 논문은 그 낱말로 검색해도 걸리지 않을 수 있습니다. 서지 정보와 검색성을 중시한다면 두문자어는 보통 대문자로 조판하고, 정말 대비가 필요한 자리에만 \textsc을 씁니다. \MakeUppercase은 근래 커널에서 악센트를 제대로 다루어, \MakeUppercase{stra\ss e caf\'e na\"\i ve}은 STRASSE CAFÉ NAÏVE가 됩니다(ß가 SS로 펴지는 것이 관례대로입니다).
한 가지 더, 서체의 재고에도 한계가 있습니다. Computer Modern에는 이탤릭 작은대문자가 없어서 \textit{\textsc{unesco}}라고 쓰면 LaTeX Font Warning: Font shape T1/cmr/m/scit undefined이 나오고 기울인(slanted) 작은대문자로 대체됩니다. 오류가 아니라 경고이므로 알아채지 못한 채 출판까지 가기 쉽습니다. 이탤릭 작은대문자가 꼭 필요하다면 Latin Modern을 비롯한 다른 서체를 고르거나 그 조합을 포기하거나 둘 중 하나입니다.
\textsc{unesco} % 34.68042pt -- real small caps
\textsc{UNESCO} % 46.09985pt -- full-size caps in the SC font
UNESCO % 42.35077pt -- ordinary capitals
% pdftotext of the first line gives "unesco", in lowercase
\MakeUppercase{stra\ss e caf\'e} % -> STRASSE CAFÉ
% English abbreviations keep the period, and the period is not a sentence end:
e.g.\ and i.e.\ and cf.\ and et al.\ -- see the punctuation page오른쪽 여백을 다스리기——microtype과 Overfull hbox
서양어 마무리를 한 급 끌어올리는 것이 microtype 패키지입니다. \usepackage{microtype} 한 줄로 두 가지 미세 조판이 작동합니다. 글자 내밀기(protrusion)는 줄 끝의 문장부호나 o・A 같은 둥글고 기운 글자를 아주 조금 여백 밖으로 밀어내 시각적으로 고른 가장자리를 만듭니다. 글꼴 신축(expansion)은 각 줄의 글자 너비를 소수점 몇 퍼센트만큼 늘이거나 줄여 낱말 사이 글루의 일을 나눠 맡습니다. 엔진에 따라 쓸 수 있는 기능이 달라, microtype-xetex.def는 신축에 대해 Font expansion does not work with xetex, 글자 사이 띄우기에 대해 Letterspacing currently doesn't work with xetex이라는 오류를 갖고 있습니다——XeLaTeX에서는 내밀기만 쓸 수 있다고 보면 됩니다.
그래도 오른쪽 끝을 넘치는 줄은 남습니다. 로그에 나오는 Overfull \hbox가 그 신호입니다. TeX은 그 줄바꿈 위치를 문단 전체를 한 번에 저울질해 고릅니다——Knuth–Plass 알고리즘으로, Donald Knuth와 Michael Plass가 1981년 『Software: Practice and Experience』에 발표한 것입니다. 그래서 한 줄이 넘쳤다는 것은 그 줄에서 포기했다는 뜻이 아니라, 문단 전체를 두고 그보다 마음에 드는 배치를 찾지 못했다는 뜻입니다. 문단의 촘촘함은 두 선언으로 조절할 수 있어, \sloppy는 낱말 사이가 넓어지는 것을 감수하고 넘침을 피하며, \fussy(기본값)는 간격을 엄격히 지키는 대신 넘침을 허용합니다. 한 문단만 느슨하게 하려면 sloppypar 환경으로 감쌉니다. 다만 순서가 중요합니다. \sloppy로 달아나는 것은 마지막으로 하세요. 먼저 microtype을 넣고, 다음으로 어구를 한 낱말 바꾸거나 \-을 하나 더합니다——대개 그것으로 수습되고, 그편이 문단도 아름답게 남습니다.
일본어 필자가 서양어 문서를 조판할 때
일본어 환경에서 영어 논문을 쓰기 시작하면 가장 먼저 나오는 것이 이 오류입니다——! LaTeX Error: Unicode character (U+3000) not set up for use with LaTeX. 범인은 전각 공백으로, IME가 변환 도중에 남긴 것이 하나만 섞여 있어도 pdfLaTeX은 멈춥니다. ((U+FF08)와 )(U+FF09)도 같은 형태로 not set up for use with LaTeX이 됩니다. 성가신 것은 편집기 화면에서 반각 공백이나 반각 괄호와 구별이 되지 않는다는 점입니다. 영어로 원고를 시작하는 날에 전각 공백・전각 괄호・전각 쉼표를 검색해 걷어내는 수고를 한 번 들여 두면, 이후로는 이런 오류로 멈추지 않습니다.
또 하나, 문서 클래스와 엔진의 선택이 영향을 줍니다. 일본어용 클래스(jsarticle 등)나 upLaTeX으로 영어 문서를 조판하면 일본어 조판 모델이 뒤에 그대로 버티고 있어 서양어에는 불필요한 처리가 끼어듭니다. 영어만 있는 원고라면 담백하게 article + pdfLaTeX(또는 fontspec을 쓰는 LuaLaTeX)으로 옮기는 편이 확실합니다. 반대로 일본어가 주이고 서양어가 섞이는 원고라면 서양어 부분의 문장 끝 공백이 들쭉날쭉해지기 쉬우므로 \frenchspacing을 검토할 값어치가 있습니다(그 구조는 “구두점・괄호” 페이지에 자세히 있습니다). 그리고 microtype의 내밀기와 신축은 서양어를 위한 것이며, 일본어 조판은 luatexja 같은 도구가 다른 모델로 맡습니다.
- 착수하는 날 전각 문자를 청소합니다. 전각 공백 U+3000, 전각 괄호
(), 전각 쉼표를 검색해 지웁니다.not set up for use with LaTeX이 말하는 것이 이것입니다. - 쓰기 시작하기 전에 언어를 선언합니다.
\usepackage[english]{babel}을 나중에 더하면 줄 나눔이 바뀌고 그림·표의 위치까지 움직입니다. - 합자를 손으로 끊는다면
{}.\/과\kern0pt은 그 낱말의 하이픈 넣기를 없앱니다. LuaLaTeX이라면selnolig에 맡깁니다. - 두문자어는 보통 대문자로.
\textsc은 PDF 텍스트 층에 소문자를 남기므로 검색되기를 바라는 낱말에는 맞지 않습니다. \sloppy은 마지막 수단. 먼저microtype, 다음으로 어구나\-하나.Overfull \hbox은 그다음에 셉니다.