밑줄은 조판을 아는 사람이 가장 먼저 쓰지 말라고 하는 서식입니다. 취향의 문제가 아닙니다. 타자기에는 이탤릭 활자가 없었기 때문에 낱말을 두드러지게 하는 유일한 방법은 캐리지를 되돌려 글자 아래에 밑줄 문자를 덧쳐 넣는 것이었습니다. 인쇄소로 넘기는 원고에서 낱말 아래 그은 한 줄은 식자공에게 보내는 지시, 곧 “이 말은 이탤릭으로 짜라”는 뜻이었습니다. 밑줄은 서식이 아니라 서식을 가리키는 기호였던 것입니다. LaTeX은 이 내력을 두 겹으로 물려받았습니다. \underline은 본디 수식용 명령이라 긴 구절을 넘기면 줄을 바꾸지 않고 오른쪽 여백으로 밀고 나가며, 그것을 고치려고 모두가 불러오는 ulem 패키지는 CTAN의 설명에서 자기 목적을 “출력이 타자기로 친 것처럼 보이게 하는 것”이라고 밝히고 있습니다. 이 페이지에서는 \underline·\uline·\ul의 쓰임, ulem과 soul의 차이, 그리고 정작 필요한 것이 \emph였던 경우를 다룹니다.
\underline이 줄을 바꾸지 않고 여백으로 넘치는 이유
\underline이 본디 수식 명령이고, 인수를 나눌 수 없는 상자 하나로 조판하기 때문입니다. 패키지 없이 쓸 수 있고 본문에서도 수식에서도 작동하지만, 제자리는 수식 모드입니다. $\underline{x}$처럼 변수 아래에 선을 긋는 도구인 것입니다. 문장 속에서 쓰면 LaTeX은 인수 둘레에서 조용히 수식 모드로 들어가 전체를 수평 상자 하나로 짜고 그 아래에 선을 긋습니다. 상자 안에는 줄을 바꿀 자리가 없으므로, 구절이 판면 너비보다 넓으면 TeX은 끊을 곳을 찾지 못하고 오른쪽 여백 밖으로 흘려보냅니다.
% fine for a single short word
This word is \underline{underlined} in running text.
% the box has no break points, so TeX pushes it into the margin
\underline{a phrase far too long to fit on one line of this measure}로그에 나타나는 증상은 기억해 둘 만합니다. 오류가 아니라 경고이며, Overfull \hbox (…pt too wide) in paragraph at lines …로 나옵니다. 함께 찍히는 조각은 []$[]$ 형태로 보이는데, 이 달러 기호 두 개가 결정적인 증거입니다. 밑줄을 긋기 위해 LaTeX이 문장을 수식 모드로 감쌌다고 스스로 밝히는 셈입니다. 두 번째 결함은 더 조용합니다. 선의 위치입니다. \underline은 위쪽 글자를 보지 않고 정해진 깊이에 선을 놓기 때문에, g나 p처럼 아래로 내려가는 획이 있으면 선이 글자를 자르는 것처럼 보입니다.
따라서 역할 분담은 이렇게 됩니다. \underline은 수식용입니다. 인수가 어차피 기호 하나이고 수식 안에 들어 있기 때문입니다. 선이 문장 속에 놓여야 하는 순간부터는 패키지로 바꿉니다. 그 일을 맡는 패키지는 둘이며, 서로 대체되지 않습니다. ulem은 줄 끝에서 나뉘는 밑줄과 취소선을, soul은 형광펜과 자간 조정을 제공합니다. 다만 어느 쪽을 부르기 전이든 밑줄이 본래 무엇을 뜻했는지 알아 둘 값어치가 있습니다. 대개 그것으로 밑줄이 정말 필요한지가 판가름 나기 때문입니다.
조판을 아는 사람이 밑줄을 말리는 이유
밑줄은 대용품이고, 그것이 대신하던 것이 지금은 손 안에 있기 때문입니다. 타자기에는 굵은 글씨도 이탤릭도 없었습니다. 낱말을 표시하는 유일한 방법은 캐리지를 되돌려 이미 찍은 글자 아래에 밑줄 문자를 덧쳐 넣는 것이었습니다. 인쇄 현장에서 같은 선은 또 다른 일을 맡았습니다. 지정을 넣은 타자 원고에서 밑줄은 식자공에게 보내는 지시였습니다. 낱말 아래 곧은 선 하나는 이탤릭, 물결선은 굵은 글씨, 두 줄은 작은대문자, 세 줄은 모두 대문자를 뜻했습니다. 저자가 밑줄을 그은 것은 이탤릭을 짤 수 없었기 때문이고, 짤 수 있었던 식자공은 그 선을 읽고 버렸습니다.
그래서 밑줄은 소프트웨어 안에서는 살아남고 조판 교과서에서는 사라집니다. 워드프로세서는 타자기의 자판을 그대로 물려받았지만, 활자 조판에는 애초에 밑줄이라는 선택지가 없었기 때문입니다. LaTeX 쪽 도구도 그 내력을 감추지 않습니다. Donald Arseneau의 ulem은 저작권 표시가 1989년부터 시작하는 패키지인데, CTAN의 설명에는 \em과 \emph를 밑줄로 바꾸는 것이 “출력이 타자기로 친 것처럼 보이게 하기 위함”이라고 적혀 있고, 딸린 설명서는 “출판사에 제출하는 원고에서 밑줄을 그어야 하는” 글에 알맞다고 밝힙니다. ulem은 완성된 PDF를 꾸미려고 만든 것이 아니라 타자 원고를 만들려고 쓴 패키지입니다.
실무 지침은 여기서 그대로 나옵니다. 독자가 어떤 낱말에 힘을 주어 읽기를 바랄 뿐이라면 \emph{...}라고 쓰고, 강조가 어떻게 보일지는 문서 클래스에 맡깁니다. 대부분의 클래스에서는 이탤릭이 되고, 강조 안에 강조가 겹치면 정자로 알맞게 되돌아옵니다. 진짜 밑줄은 선이 어조가 아니라 정보를 담는 자리에 남겨 둡니다. 교정지의 삭제, 서명란, 채워 넣을 빈칸, 링크가 그렇습니다. 아래 내용은 모두 그런 이유가 있다는 전제에서 읽어 주십시오.
ulem — 줄 끝에서 나뉘는 밑줄과 취소선
\usepackage[normalem]{ulem}을 불러오고, \underline{...}이라고 쓰던 자리에 \uline{...}이라고 씁니다. 이제 선은 줄 끝에서 나뉘고 낱말 사이 공백 위로도 이어지며 중간에 하이픈이 들어가도 괜찮습니다. 이 패키지에는 교정 부호의 어휘가 통째로 들어 있습니다. 두 줄, 물결선, 낱말을 관통하는 선, 비스듬한 빗금, 파선, 점선입니다. 지정을 넣은 원고에 필요한 어휘가 바로 그것이기 때문입니다. 수식 모드 안에서는 \uline이 조용히 \underline에게 일을 넘기므로 어디에서 써도 안전합니다.
| 명령 | 그어지는 선 |
|---|---|
\uline | 밑줄. 줄 끝에서 나뉩니다 |
\uuline | 이중 밑줄. 교정 부호로는 작은대문자 지정 |
\uwave | 물결 밑줄. 교정 부호로는 굵은 글씨 지정 |
\sout | 취소선. 낱말 가운데를 가로지르는 선 |
\xout | 말소선. /를 되풀이해 덧찍어 지웁니다 |
\dashuline | 파선 밑줄 |
\dotuline | 점선 밑줄 |
선을 좌우하는 매개변수는 둘인데, 설정 방법이 서로 달라서 여기서 자주 걸립니다. \ULthickness는 굵기이고 기본값은 .4pt이지만, 길이가 아니라 매크로이므로 \renewcommand{\ULthickness}{0.8pt}처럼 씁니다. \setlength는 듣지 않습니다. \ULdepth는 기준선에서 선까지의 깊이이고 진짜 길이여서 \setlength로 설정합니다. 기본값은 \maxdimen이라는 표지 값인데, 이 값이 들어 있으면 ulem은 깊이를 현재 글꼴에서 계산합니다. 이 두 손잡이는 보기보다 훨씬 많은 것을 설명해 줍니다. \sout의 정의가 바로 \ULdepth를 -.55ex로 놓은 밑줄이기 때문입니다. 깊이가 음수가 되면 선은 기준선 위로 올라와 낱말 한가운데를 지나갑니다. ulem의 취소선은 일부러 엉뚱한 자리에 그은 밑줄이었던 셈입니다. \xout은 더 소박해서, /를 되풀이해 덧찍을 뿐입니다.
\usepackage[normalem]{ulem}
\renewcommand{\ULthickness}{0.8pt} % a macro, so \renewcommand
\setlength{\ULdepth}{1.8pt} % a length, so \setlength
\uline{important} \uuline{urgent} \uwave{boat}
\sout{wrong} \xout{removed}
\dashuline{dashing} \dotuline{dotty}\emph이 갑자기 밑줄이 될 때 — normalem 옵션
\usepackage{ulem}이라고만 쓰면 패키지가 강조의 정의를 바꿔 버리기 때문입니다. 설명서는 이를 숨기지 않습니다. “In LaTeX ulem replaces italics with underlining in text emphasized by \em or \emph.” 결함이 아니라 이 패키지의 본래 목적입니다. 무엇을 만들려고 쓰였는지 떠올려 보십시오. 다만 그 결과, 이백 쪽 내내 \emph를 편안히 써 온 문서가 낱말 하나에 밑줄을 긋겠다고 패키지를 부르는 순간 모든 강조 아래에 선이 돋습니다. 겹쳐 쓰면 더 나빠집니다. 보통의 \emph는 겹칠 때 이탤릭과 정자를 번갈아 쓰지만, ulem 판은 설명서의 표현대로 “generates multiple underlining; it does not alternate on and off”, 곧 선이 겹겹이 쌓이기만 합니다.
해결책은 옵션 한 단어입니다. \usepackage[normalem]{ulem}. 그러면 강조는 평소대로 돌아오고, 선은 \uline과 그 형제들을 직접 쓴 자리에만 나타납니다. 같은 전환이 선언으로도 있습니다. \normalem은 치환을 끄고 \ULforem은 다시 켭니다. 정말로 타자 원고를 만드는 중이라면 문서 도중에도 바꿀 수 있습니다. 실무에서는 그러지 않을 이유를 소리 내어 말할 수 없다면 ulem을 언제나 [normalem]과 함께 부르십시오.
\usepackage[normalem]{ulem}
% \emph keeps its italics; a rule appears only where you ask for one
This is \emph{emphasis}, and this is \uline{underlined}.
% \ULforem brings the substitution back, \normalem switches it off againsoul — \hl 형광펜과 \so 자간 넓히기
원하는 것이 노란 형광펜 자국이거나 강조를 위해 벌려 놓은 글자라면, 쓸 패키지는 soul이고, 이 패키지는 전혀 다른 길로 목적지에 닿습니다. 텍스트를 TeX의 하이픈 넣기 기구에 넘겨 음절과 글자를 돌려받은 뒤, 그 사이 틈에서 일을 합니다. 그래서 낱말의 자간을 벌리면서도 그 낱말 안에서 줄을 바꿀 수 있습니다. 지은이 Melchior Franz는 이름에 대한 뻔한 추측을 설명서에서 미리 막아 둡니다. “the package name soul is only a combination of the two macro names \so (space out) and \ul (underline)—nothing poetic at all.” 지금은 Oberdiek Package Support Group이 관리하며, 버전 3부터 옛 soulutf8을 흡수해 UTF-8 입력에 따로 부를 것이 없습니다.
| 명령 | 효과 |
|---|---|
\so | 자간 넓히기. 글자 사이를 벌립니다 |
\caps | 대문자·작은대문자 구간에 맞춘 자간 조정 |
\ul | 밑줄. 줄 끝에서 나뉩니다 |
\st | 취소선(겹쳐 찍기) |
\hl | 형광펜 강조. 기본값은 노랑이며 color 또는 xcolor가 필요합니다 |
색은 효과별로 설정합니다. 밑줄은 \setulcolor, 취소선은 \setstcolor, 형광펜은 \sethlcolor이고, 인수를 비우면 색칠을 끕니다. 기본값은 형광펜이 노랑, 두 선은 검정입니다. 분명히 적어 둘 함정이 하나 있습니다. \hl이 색을 칠하는 것은 color나 xcolor를 불러온 때뿐입니다. 없으면 이 명령은 아무 말 없이 밑줄로 물러나는데, 화면에서는 형광펜이 그저 나오지 않은 것처럼 보입니다. 원하는 색은 \definecolor로 만들어 \sethlcolor에 넘깁니다.
\usepackage{color,soul}
\definecolor{lightblue}{rgb}{.90,.95,1}
\sethlcolor{lightblue}
\so{letterspacing} \ul{underlining} \st{overstriking}
\hl{this is highlighted in light blue}
\ul{Auf{}lage} % {} keeps the fl ligature from forming
\so{foo \mbox{little} bar} % \mbox, not bare braces, around hyphenable text글자 단위로 분석하는 기구의 값은, 인수가 더 이상 보통의 LaTeX이 아니라는 점입니다. soul은 TeX의 문단 조립보다 먼저 모든 토큰을 읽어야 하므로 몇 가지 표현이 금지되어 있습니다. 게다가 실패는 요란합니다. Package soul error: Reconstruction failed가 뜨고, 출력의 해당 위치에는 검은 사각형이 남아 지면에서 어디가 문제인지 바로 보입니다. 외워 둘 만한 규칙은 다음과 같습니다.
- 수식은
$...$로. 달러 기호로 감싸면 되지만, LaTeX 방식\(...\)은 통하지 않습니다. - 중괄호는 묶는 용도이며, 줄바꿈 자리를 감추면 안 됩니다.
\so{foo {little} bar}은Reconstruction failed를 냅니다. 묶음 안에 하이픈 자리가 있기 때문이고, 공백도 그 하나로 셉니다.\so{foo \mbox{little} bar}라고 씁니다. - 겹쳐 쓸 수 없습니다.
\ul{foo \so{bar} baz}은 허용되지 않습니다. 꼭 필요하면 안쪽을 먼저 상자에 넣고, 그 상자가 나뉘지 않는다는 점을 감수합니다. - 합자는 손으로 나눕니다.
\ul,\st,\hl안에서 합자가 생기면 안 되는 자리에{}나\null을 끼웁니다(\ul{Auf{}lage}). \verb, 환경, 명령 정의는 넣을 수 없습니다. 손대지 않고 그대로 통과시켜야 하는 자료에는\soulomit{...}이라는 우회로가 있습니다.
ulem과 soul의 차이와 선택 기준
교정 부호가 필요하면 ulem, 형광펜이 필요하면 soul입니다. 둘 다 필요하면 둘 다 불러도 됩니다. ulem이 주는 것은 \uline, soul이 주는 것은 \ul이라 명령 이름이 부딪히지 않습니다. 둘 중 너그러운 쪽은 ulem입니다. 인수에 거의 무엇이든 넣을 수 있고, 보기 좋지 않게라도 어쨌든 줄을 나눕니다. soul은 선을 글자 모양에 더 정성껏 맞추고 같은 호출로 \hl과 \so까지 딸려 오지만, 인수는 위 목록대로 제한된 언어입니다. “여기를 지우고 바꾼 말에 밑줄”이 필요한 원고라면 [normalem]을 붙인 ulem이 가장 짧은 길이고, 심사자에게 노란 표시를 남겨야 하는 원고라면 후보는 하나뿐입니다. ulem에는 형광펜이 아예 없기 때문입니다.
초고에서 삭제와 추가를 표시하는 방법
\sout과 \uline의 가장 떳떳한 쓰임새는 무엇이 바뀌었는지 보여야 하는 초고입니다. 다만 선 명령을 본문에 직접 쓰지는 마십시오. 뜻하는 바를 쓰고, 어떻게 인쇄될지는 매크로에 맡깁니다. 스위치를 단 \deleted{...}과 \added{...}은 서문 세 줄이면 되고, 제출 전에 하나하나 찾아 지우는 작업을 통째로 없애 줍니다. 원본이 읽기 쉬워지는 덤도 있습니다. \deleted{옛 추정값}은 무언가를 말해 주지만 \sout{옛 추정값}은 그렇지 않기 때문입니다.
\usepackage[normalem]{ulem}
\newif\ifrevisions
\revisionstrue % final version: \revisionsfalse
\newcommand{\deleted}[1]{\ifrevisions\sout{#1}\fi}
\newcommand{\added}[1]{\ifrevisions\uline{#1}\else #1\fi}
% The estimate was \deleted{0.42} \added{0.51}.사고를 막는 습관은 둘입니다. 교정 표시와 강조의 어휘를 갈라 두는 것입니다. 어조는 \emph, 이력은 \deleted와 \added가 맡으면 스위치를 내려도 본문의 뜻에는 손대지 않습니다. 다른 하나는 제출 점검표에 “스위치를 내리고 한 번 더 조판해 PDF를 눈으로 확인”을 넣어 두는 것입니다. 최종 파일에 남은 취소선은 인쇄되기 전까지 아무도 알아차리지 못하는 종류의 사고이기 때문입니다.
CJK 문장의 밑줄, 그리고 태그된 PDF 문제
마음을 정하기 전에 알아 둘 한계가 둘 있습니다. 첫째, 두 패키지 모두 로마자 조판을 염두에 두고 쓰였습니다. ulem과 soul은 낱말, 하이픈 자리, 낱말 사이 공백을 실마리로 삼는데, 한국어·일본어·중국어의 연속된 글자는 그 어느 것도 내주지 않습니다. 그래서 긴 CJK 밑줄은 엉뚱한 자리에서 끊기거나 아예 끊기지 않기 일쑤입니다. 일본어 TeX 쪽은 자체 패키지로 이에 답하는데, \Underline·\Midline·\Overline을 갖춘 jumoline이 흔히 권해집니다(CTAN 밖에서 배포되며 기본 TeX Live에는 들어 있지 않습니다). 둘째, CTAN은 ulem과 soul을 모두 “tagged PDF incompatible” 주제로 분류해 두었습니다. LaTeX이 접근성 있는 출력으로 향하는 지금 이 점은 무게가 있습니다. 게다가 화면에서는 고운 노란 \hl도 흑백 인쇄에서는 회색 얼룩이 됩니다. 둘 다 마감 뒤가 아니라 마감 전에 확인하십시오.