입력한 문자를 한 글자도 바꾸지 않고 그대로 지면에 내보내야 할 때가 있습니다. 명령, 주석, 특수문자의 의미를 모두 끄고 등폭(typewriter) 글꼴로 인쇄하는 방식이 verbatim 입니다. 이 페이지에서는 행 안의 \verb, 블록 형태의 verbatim 환경, 파일 전체를 넣는 \verbatiminput, 그리고 “다른 명령의 인수 안에서는 쓸 수 없다”는 중요한 제약과 우회법을 살펴봅니다. 이어서 일부 명령을 살려 둘 수 있는 alltt, 행 번호와 프레임을 붙일 수 있는 fancyvrb 까지 다룹니다.
verbatim 환경과 \verb
문자 그대로 출력하는 기본은 LaTeX에 처음부터 들어 있는 verbatim 환경 입니다. \begin{verbatim}과 \end{verbatim} 사이에 쓴 것은 입력한 그대로 출력됩니다. 백슬래시는 명령을 시작하지 않고 \로 인쇄되고, %는 주석이 되지 않으며, 공백과 줄바꿈도 그대로 남고, 전체가 typewriter 글꼴(\tt)로 조판됩니다. 프로그램 소스나 $, &가 많이 들어간 문자열을 보여 주기에 적합합니다.
\begin{verbatim}
for i in range(3):
print("100% & $5") # nothing here is interpreted
\end{verbatim}지켜야 할 제약은 하나입니다. 환경 안에 문자열 \end{verbatim}을 그대로 쓸 수 없습니다. LaTeX는 그 문자열을 발견하는 순간 환경의 끝으로 판단하기 때문입니다. verbatim 안에서 \end{verbatim}이라는 문자열 자체를 보여 주고 싶다면 뒤에서 다루는 fancyvrb로 종료 문자열을 바꾸거나, \verb로 그 부분만 따로 피합니다.
줄 중간 에 조금만 verbatim을 넣고 싶다면 행내용 형태인 \verb 를 씁니다. 작성법은 \verb 바로 뒤에 구분 문자 하나를 두고, 그대로 출력할 문자열을 넣은 뒤 같은 구분 문자로 닫는 것입니다. 구분 문자는 본문에 나타나지 않는 임의의 비문자 를 고를 수 있습니다. 흔히 \verb|...|를 쓰지만 내용에 |가 들어 있으면 \verb!...!나 \verb+...+처럼 다른 문자를 고릅니다. \verb와 구분 문자 사이에는 공백을 넣지 않습니다.
The macro \verb|\textbf{...}| sets bold text, and
the pipe itself is shown with \verb!a|b! instead.별표가 붙은 \verb* 는 내부 공백을 보이는 공백 문자(␣)로 인쇄합니다. 공백 개수를 정확히 보여 주어야 하는 코드 예시에 유용합니다. 마찬가지로 verbatim* 환경도 블록 안의 공백을 ␣로 표시합니다.
다만 URL처럼 ~, #, %, _가 들어가기 쉬운 문자열만 목적이라면, url 또는 hyperref package의 \url{...}가 더 다루기 쉬울 수 있습니다. 적절한 위치에서 줄바꿈도 해 주기 때문입니다.
파일 전체 출력하기(\verbatiminput)
외부 파일의 내용을 그대로 붙이고 싶을 때는 verbatim package(LaTeX required tools에 포함)가 제공하는 \verbatiminput{filename} 이 편리합니다. 프리앰블에서 \usepackage{verbatim}을 불러온 뒤 본문에 \verbatiminput{program.py}처럼 쓰면 그 파일의 모든 줄이 verbatim으로 조판됩니다. 원고에 직접 복사하는 것과 달리 원본 파일을 수정하면 출력도 자동으로 따라가므로 코드와 문서를 이중으로 관리하지 않아도 됩니다.
\usepackage{verbatim}
% ...
\verbatiminput{hello.py}같은 verbatim package는 \begin{comment}부터 \end{comment}까지를 통째로 무시하는 comment 환경 도 추가합니다. 이는 verbatim 출력이 아니라 *아예 출력하지 않기* 위한 용도이며, 초안 일부를 임시로 빼 둘 때 유용합니다.
명령 인수 안에서는 쓸 수 없음
이 부분이 verbatim에서 가장 자주 막히는 지점입니다. \verb와 verbatim 환경은 다른 명령의 인수 안에 쓸 수 없습니다. 예를 들어 \section{\verb|code|}, \footnote{...}, 표 셀, \caption{...} 안이 그렇습니다. 이유는 category code(catcode, 각 문자의 역할)에 있습니다. \verb는 자기 인수를 읽기 직전에 catcode를 바꾸지만, 명령의 인수는 명령이 호출된 시점에 이미 일반 catcode로 token list로 변환되어 있습니다. 따라서 \verb가 바꾸기 전에 해석이 끝나 버립니다. 이렇게 쓰면 대부분 오류가 납니다.
우회책은 두 가지입니다. 하나는 cprotect package 입니다. 보호하려는 명령 앞에 \cprotect를 붙이기만 하면 인수 안의 verbatim이 통과합니다. 예를 들어 \cprotect\section{\verb"foo"}처럼 씁니다. 환경의 \begin을 보호하는 \cprotEnv도 준비되어 있습니다.
다른 하나는 뒤에서 다룰 fancyvrb 의 \SaveVerb / \UseVerb 입니다. 먼저 verbatim 텍스트를 이름을 붙여 저장해 두고, 인수 안에서는 그 이름만 호출하는 두 단계 방식입니다. \SaveVerb{label}|verbatim text|로 저장하고 \UseVerb{label}로 꺼냅니다.
% Workaround 1: cprotect
\usepackage{cprotect}
\cprotect\section{The \verb|\foo| command}
% Workaround 2: fancyvrb SaveVerb / UseVerb
\usepackage{fancyvrb}
\SaveVerb{cmd}|\foo|
\section{The \UseVerb{cmd} command}alltt로 명령 살리기
일반 verbatim에서는 코드 예시의 일부만 강조하거나 색을 칠하고 싶어도 명령이 꺼져 있어 할 수 없습니다. 이때 alltt package(이것도 LaTeX 표준 배포판에 포함)의 alltt 환경 이 도움이 됩니다. alltt는 verbatim과 거의 같이 등폭으로 입력한 대로 조판하지만, 백슬래시 \와 중괄호 {, }만은 일반적인 의미를 유지합니다. 즉 verbatim 같은 모양을 유지하면서 내부에서 LaTeX 명령을 쓸 수 있습니다.
\usepackage{alltt}
% ...
\begin{alltt}
def \textbf{greet}(name):
return "Hi, " + name \textit{# a comment}
\end{alltt}이 예에서는 함수 이름 greet가 굵게, 주석 부분이 기울임으로 나오고 나머지는 모두 입력한 그대로 남습니다. 대신 \, {, } 세 문자를 문자 그대로 출력하려면 \textbackslash, \{, \}처럼 명시해야 합니다(verbatim 환경이라면 그대로 나옵니다). 손으로 가볍게 꾸미고 싶으면 alltt, 완전히 그대로 내고 싶으면 verbatim을 쓰면 됩니다.
fancyvrb로 행 번호와 프레임 붙이기
내장 verbatim에는 행 번호도 프레임도 붙일 수 없습니다. 더 기능이 많은 선택지는 fancyvrb package 이며, 중심은 대문자 V로 시작하는 Verbatim 환경(소문자 verbatim과는 별개)입니다. 옵션은 \begin{Verbatim}[key=value, ...]처럼 환경마다 지정하거나, 프리앰블에서 \fvset{key=value, ...}로 일괄 설정합니다.
자주 쓰는 옵션은 다음과 같습니다. numbers=left(또는 right)로 행 번호를 붙이고, frame=single로 전체를 프레임으로 감싸며, fontsize=\small처럼 글자 크기를 지정합니다. 또한 commandchars를 쓰면 verbatim 안에서도 일부 명령을 살릴 수 있습니다.
| 옵션 | 주요 값 | 역할 |
|---|---|---|
numbers | none / left / right | 행 번호 위치(기본 none) |
frame | none / single / lines / leftline / topline / bottomline | 프레임 종류(기본 none) |
fontsize | \small, \footnotesize 등 | 글자 크기(기본은 본문과 같음) |
commandchars | 예: \\\{\} | escape 문자와 그룹 시작/끝 문자 세 개를 지정해 명령을 활성화 |
다음 예는 왼쪽에 행 번호를 붙이고, 단일 프레임으로 감싸며, 글자를 조금 작게 한 Verbatim 블록입니다.
\usepackage{fancyvrb}
% ...
\begin{Verbatim}[numbers=left, frame=single, fontsize=\small]
def greet(name):
return "Hello, " + name
\end{Verbatim}commandchars=\\\{\}를 지정하면 verbatim 안에서도 \, {, }가 각각 escape 문자와 그룹 구분자로 작동하여 alltt처럼 명령을 삽입할 수 있습니다. 파일 전체를 가져오는 \VerbatimInput[options]{filename} 도 있으며, \verbatiminput과 달리 위 옵션을 그대로 넘길 수 있습니다. 또한 앞서 본 \SaveVerb / \UseVerb를 통해 명령 인수 안에서도 verbatim을 쓸 수 있습니다.
마지막으로 한 가지 주의할 점이 있습니다. 여기서 다룬 것은 어디까지나 텍스트를 그대로 출력 하기 위한 장치이며, 키워드 색상 같은 구문 강조 는 하지 않습니다. 프로그램 소스를 색과 서식까지 갖춰 싣고 싶다면 전용 listings package나 Python의 Pygments를 사용하는 minted 가 알맞습니다. 이는 “소스 코드 게재” 페이지에서 다룹니다.