특수 문자

LaTeX에는 그대로 입력해도 문자로 나오지 않는 문자가 10개 있습니다. # $ % & _ { } ~ ^ \ 이 10자이며, 각각 “주석”, “수식 시작”, “명령 시작” 같은 특별한 역할을 하기 때문입니다. 이 페이지에서는 각 문자가 무엇을 하는지와 문자 자체를 출력하는 방법을 정리합니다.

10개의 예약 문자

예약 문자란 LaTeX가 구문의 일부로 사용하기 때문에 본문에 그대로 쓰면 출력되지 않고 다른 동작을 하는 문자입니다. 예를 들어 %를 입력하면 그 줄의 나머지가 통째로 주석으로 사라집니다. $를 입력하면 그 지점부터 수식 모드가 시작됩니다. 이런 문자를 지면에 문자 자체로 내보내려면 약간의 처리가 필요합니다.

각각의 역할은 다음과 같습니다. #는 매크로 정의에서 인수를 나타내고, $는 수식 모드의 시작과 끝, %는 주석의 시작(그 줄의 나머지를 무시), &는 표나 정렬 환경에서 열(셀)을 구분합니다. _^는 수식에서 아래첨자와 위첨자를 도입하고, {}는 인수나 그룹의 범위를 구분합니다. ~는 줄바꿈되지 않는 단어 사이 공백을 만들며, \(backslash)는 모든 명령의 맨 앞에 옵니다.

문자특별한 역할
#매크로 정의의 인수(#1, #2, …)
$수식 모드 시작과 종료
%주석 시작(그 줄의 나머지 무시)
&표와 정렬 환경의 열(셀) 구분자
_수식 모드의 아래첨자
^수식 모드의 위첨자
{인수 또는 그룹 시작
}인수 또는 그룹 종료
~줄바꿈되지 않는 단어 사이 공백
\명령 시작

문자 자체 출력하기

10개 중 7개는 간단합니다. 앞에 backslash 하나만 붙이면 됩니다. 즉 \#, \$, \%, \&, \_, \{, \}입니다. 예를 들어 \$1.23이라고 쓰면 $1.23이 출력됩니다. backslash는 “다음 한 문자는 명령이 아니라 그 문자 자체”라는 신호가 됩니다.

남은 3개는 조금 더 까다롭습니다. ~\textasciitilde(또는 \~{}), ^\textasciicircum(또는 \^{})으로 냅니다. \~\^를 단독으로 쓰면 *악센트* 명령으로 해석되어 바로 뒤 문자 위에 틸드나 hat을 올리므로, 빈 {}를 붙여 “올릴 대상이 없는 악센트”로 만들어 기호 자체만 남깁니다.

마지막으로 backslash 자체입니다. 이는 \textbackslash로 출력합니다. \\를 쓰면 안 됩니다. 그것은 backslash 두 개가 아니라 줄바꿈 명령이기 때문입니다. 아주 흔히 틀리는 함정입니다.

입력출력비고
\##앞에 backslash 하나
\$$같음
\%%같음
\&&같음
\__같음
\{{같음
\}}같음
\textasciitilde~\~{}도 가능; \~ 단독은 악센트
\textasciicircum^\^{}도 가능; \^ 단독은 악센트
\textbackslash\\\는 줄바꿈 명령이므로 안 됨

\textbackslash, \textasciitilde, \textasciicircum 명령은 현재 LaTeX 커널에 포함되어 있어 추가 패키지 없이 사용할 수 있습니다(예전에는 textcomp 패키지에서 왔습니다). 다만 일부 영문 글꼴은 본문용 자형에 독립된 틸드나 캐럿 글리프가 없으므로, 그런 글꼴에서는 이 텍스트 기호 명령을 쓰는 것이 확실합니다.

실례

100% & $5 cost #1처럼 예약 문자가 많이 들어간 문장을 출력해 봅시다. %, &, $, #는 모두 앞에 backslash를 붙여 이스케이프합니다.

latex
100\% \& \$5 cost \#1

% backslash, tilde and caret need their own commands:
A path: C:\textbackslash Users \\
Math symbols out of math: \textasciitilde{} and \textasciicircum{}

첫 줄은 100% & $5 cost #1로 조판됩니다. 이어지는 부분에서는 Windows식 경로에 backslash(\textbackslash)를 쓰고, 독립된 틸드와 캐럿에는 \textasciitilde{}\textasciicircum{}를 씁니다(줄 끝의 \\는 출력을 줄바꿈하는 명령이지 backslash를 출력하는 것이 아닙니다).

기호가 많거나 URL을 쓸 때

예약 문자가 빽빽한 코드 조각이나 기호열을 하나씩 이스케이프하는 것은 번거롭습니다. 이럴 때는 verbatim 방식이 편리합니다. 행 안에서는 \verb|...|처럼 내부에 나오지 않는 한 문자(여기서는 |)로 둘러싸면, 그 내용이 타자체로 그대로 출력되고 예약 문자의 의미도 사라집니다. 여러 줄이라면 verbatim 환경을 사용합니다.

latex
Use \verb|a_b^c & d%| to show specials literally.

\begin{verbatim}
foo_bar = 100% & #1   % all printed as-is
\end{verbatim}

URL처럼 ~, #, %, _가 들어가기 쉬운 문자열에는 url(또는 hyperref) 패키지의 \url{...}가 알맞습니다. 내부의 예약 문자를 자동으로 처리하고, 고정폭으로 조판하며, 적절한 위치에서 줄을 나누어 주므로 수동 이스케이프가 필요 없습니다.

latex
\usepackage{hyperref}
% ...
See \url{https://example.com/path?id=1#sec_2~ok}

정리하면, 단발성 기호는 표처럼 이스케이프하고, 코드 조각이나 기호 덩어리는 \verb / verbatim에 맡기며, URL은 \url{}에 맡긴다고 기억하면 충분합니다. 문법 자체의 넓은 논리는 “문법 규칙”에서, 본문에서 사용할 수 있는 여러 기호는 “텍스트 기호” 페이지에서 자세히 다룹니다.

실패하기 쉬운 입력을 먼저 나누기

보고서나 기술 문서에서는 본문보다 파일 이름, URL, 타입 이름, 표 셀에 들어 있는 _, %, & 때문에 멈추는 일이 많습니다. 원고를 시작할 때 “자연문으로 읽을 것”, “코드로 그대로 보여 줄 것”, “링크로 처리할 것”을 나누어 두면 특수 문자를 어떻게 이스케이프할지도 자연스럽게 정해집니다.

상황사용 도구판단
price\$, \% 같은 단일 이스케이프본문 속 일반 문장으로 읽게 할 때
code\verb 또는 verbatim소스 코드, 터미널 출력, 짧은 경로를 그대로 보여 줄 때
url\url{...}(보통 hyperref와 함께)긴 URL을 줄바꿈 가능한 링크로 조판

특히 표에서는 &가 셀 구분자가 되므로, 회사명이나 논문 제목에 들어 있는 ampersand를 이스케이프하지 않으면 열 수가 어긋납니다. 외부에서 표 데이터를 붙여 넣을 때는 먼저 &%를 검색하고, 각각이 본문 기호인지 LaTeX 구문인지 하나씩 정한 뒤 컴파일하면 원인 모를 표 깨짐을 피할 수 있습니다.

외부 데이터를 붙여 넣기 전 처리

실제 원고에서는 특수 문자가 직접 입력한 것보다 CSV, 웹 페이지, 메일, PDF에서 붙여 넣은 문자열로 섞여 들어오는 경우가 많습니다. 붙인 뒤 오류를 추적하는 것보다 붙이기 전에 용도별로 받을 형식을 정해 두는 편이 빠르고 확실합니다. 본문으로 읽을 값은 필요한 문자만 이스케이프하고, 코드와 로그는 verbatim 계열로, URL은 \url{...}로 나눕니다.

latex
% 表へ貼る前に、データ中の & と % を確認する
% before pasting into a table, inspect & and % in the data

\begin{tabular}{ll}
  Smith \& Wesson & company name \\
  95\% & reported rate \\
\end{tabular}

% URL は手で _ や # を逃がさず \url に任せる
\url{https://example.com/report?id=95#table_1}

“표가 한 열 밀린다”, “행의 뒷부분이 사라진다”, “Missing $ inserted가 갑자기 나온다” 같은 증상은 대개 &, %, _ 중 하나가 원인입니다. 먼저 붙여 넣은 범위만 검색한 뒤, 문자로 필요하면 \&, \%, \_로 이스케이프하고, 구문으로 쓰는 것이라면 그대로 두며, URL이면 \url, 코드이면 verbatim 표시로 분류합니다.