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를 붙여 이스케이프합니다.
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 환경을 사용합니다.
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{...}가 알맞습니다. 내부의 예약 문자를 자동으로 처리하고, 고정폭으로 조판하며, 적절한 위치에서 줄을 나누어 주므로 수동 이스케이프가 필요 없습니다.
\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{...}로 나눕니다.
% 表へ貼る前に、データ中の & と % を確認する
% 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 표시로 분류합니다.