standalone은 그림, TikZ 그림, 표처럼 하나의 구성 요소만을 독립된 문서로 조판하기 위한 클래스입니다. 출력은 내용에 딱 맞게 잘리므로 주변 페이지, 페이지 번호, 여백 없이 그림 자체만 담긴 PDF가 됩니다. 같은 이름의 패키지와 함께 쓰면 그 그림 파일을 그대로 \input으로 본문 문서에 가져올 수 있습니다. Martin Scharrer가 만든 대표적인 패키지로, 한 그림을 단독 파일로도, 큰 문서의 일부로도 재사용하게 해 줍니다.
standalone의 용도
큰 문서를 쓰다 보면 그림이나 TikZ 그림을 별도 파일로 빼고 본문에서 불러오고 싶어집니다. 하지만 그런 그림 파일만 따로 컴파일해 확인하려면 매번 \documentclass, \begin{document} 같은 틀을 덧붙여야 하고, 출력도 큰 흰 본문 페이지 한쪽에 그림이 놓인 모양이 됩니다. standalone 클래스는 이 두 문제를 모두 해결합니다. 그림 파일 맨 앞에 \documentclass{standalone}을 쓰면 그 조각만 따로 컴파일할 수 있고, 출력은 내용 크기에 딱 맞게 잘린 PDF(또는 DVI/PS)가 되며 페이지 번호, 머리말, 꼬리말도 없습니다.
standalone에는 두 얼굴이 있습니다. 하나는 그림 파일 쪽에서 쓰는 클래스(\documentclass{standalone})이고, 다른 하나는 본문 문서 쪽에서 불러오는 패키지(\usepackage{standalone})입니다. 클래스는 “한 조각을 단독으로 조판”하는 역할을, 패키지는 “그 조각을 본문 문서에 포함”하는 역할을 맡아 둘이 한 쌍을 이룹니다. 먼저 클래스부터 보겠습니다.
standalone 클래스와 패키지는 모두 xkeyval 패키지를 필요로 합니다. 또한 패키지 쪽은 포함한 파일 이름을 추적하기 위해 currfile(내부적으로 filehook 사용)을, 이미지로 빌드하는 기능을 위해 gincltex와 filemod를 필요로 합니다. 이들은 모두 TeX Live와 MiKTeX에 포함되어 있습니다.
클래스로 쓰기
사용법은 보통 LaTeX 문서와 같습니다. \documentclass{standalone}으로 클래스를 고르고, 프리앰블에서 그 그림에 필요한 패키지(TikZ라면 tikz 등)를 불러온 뒤, \begin{document}와 \end{document} 사이에 내용을 직접 씁니다. 이 클래스는 기본적으로 crop 옵션(아래 설명)을 켜서 출력을 내용 크기에 맞게 자릅니다.
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw (0,0) rectangle (2,1) node[midway] {Example};
\end{tikzpicture}
\end{document}이 파일만 컴파일하면 사각형 그림만 담기고 바깥둘레에 딱 맞게 잘린 한 페이지 PDF가 나옵니다. 작성할 때는 두 가지를 조심해야 합니다. 내용 앞뒤에 빈 줄을 두지 말 것, 그리고 \begin{document}와 \end{document}를 각각 독립된 줄에 둘 것입니다. standalone 클래스는 전체 내용을 하나의 덩어리로 다루므로 끝의 빈 줄이 폭 \linewidth인 문단으로 읽혀 그림 오른쪽에 불필요한 여백이 생길 수 있습니다.
TikZ 그림이라면 \documentclass[tikz]{standalone}처럼 tikz 옵션을 붙이는 것이 편합니다. 이 옵션은 tikz 패키지를 불러오고, tikzpicture 환경을 한 페이지로 잘라내도록 설정까지 해 줍니다(내부적으로 multi=tikzpicture와 varwidth=false를 설정). PSTricks 그림에는 대응하는 pstricks 옵션이 있습니다.
주요 클래스 옵션
옵션은 대괄호 안에 쉼표로 구분해 나열합니다. standalone 옵션 대부분은 불리언입니다. 값을 생략하면 true가 되고, 특별한 지정이 없으면 초기값은 false입니다. 이 옵션들은 하위 클래스(기본값은 article)로 전달되지 않고, 이름 충돌을 피하기 위해 standalone 자체가 해석합니다. 대표적인 것은 다음과 같습니다.
| 옵션 | 효과 | 기본값 |
|---|---|---|
crop | 내용을 상자에 넣고 페이지를 내용 크기와 지정 여백에 맞게 자름 | true(v1.0 이후) |
border | 자를 때 붙이는 여백(별칭 margin). 값 1개=네 변, 2개=좌우/상하, 4개=왼쪽/아래/오른쪽/위 | 0pt |
varwidth | 내용을 varwidth 환경으로 감싸 문단이 포함된 내용도 자연스러운 폭을 갖게 함; varwidth=<width>로 최대폭 지정 | off |
tikz | tikz를 불러오고 각 tikzpicture를 한 페이지로 자름(multi=tikzpicture, varwidth=false 설정) | off |
multi | 내용을 여러 페이지로 나눌 수 있게 함. 각 페이지는 별도로 잘리며, 페이지를 표시할 환경 이름을 지정할 수 있음 | off |
class | 아래에서 불러올 클래스를 선택(예: class=report) | article |
preview | preview 패키지로 자르는 예전 방식. crop과는 함께 쓸 수 없으며, TikZ 셰이딩에 문제가 있을 때 대안으로 사용 | off |
beamer | 자르기를 끄고 내용을 빈 beamer 프레임 한 장으로 조판 | off |
가장 자주 쓰는 것은 border입니다. \documentclass[border=5pt]{standalone}라고 하면 잘린 그림의 네 변에 5pt 여백이 붙습니다. 공백으로 구분한 여러 값을 넘길 때는 값 전체를 중괄호로 감싸 border={10pt 5pt}처럼 씁니다. border와 varwidth는 문서 전체에 작용하는 설정이 아니므로, 프리앰블에서 또는 multi가 켜져 있으면 문서 중간에서도 \standaloneconfig{...}로 나중에 바꿀 수 있습니다.
역사적인 주의점이 하나 있습니다. v1.0 이전에는 preview 옵션이 기본이었고 기본 여백도 약 0.5bp였습니다. v1.0 이후에는 crop이 기본이 되었고 여백은 0pt로 바뀌었습니다. 예전 동작으로 되돌리고 싶다면 설정 파일에 \standaloneconfig{preview,border=0.50001bp}를 쓰거나 옵션으로 명시합니다.
패키지로 본문에 포함하기
패키지는 standalone의 또 다른 얼굴입니다. 본문 문서의 프리앰블에서 가능한 한 이른 시점에 \usepackage{standalone}을 불러오면, 이 패키지는 \documentclass를 재정의해 \input으로 가져온 그림 파일의 \documentclass부터 \begin{document}까지를 건너뛰게 합니다. 그림 파일의 document 환경은 단순한 TeX 그룹으로 취급되고, 본문 쪽의 실제 document 환경은 그대로 동작합니다(\end{document} 뒤의 내용도 무시됩니다). 즉 포함할 때 그림 파일의 프리앰블은 제거되고, \input{figure}만 써도 내용만 본문으로 흘러 들어옵니다.
전제는 그림 파일이 필요로 하는 모든 패키지를 본문 문서 쪽에서도 직접 불러와야 한다는 것입니다. 그림 파일의 프리앰블은 포함할 때 건너뛰므로, tikz 같은 패키지는 본문 문서가 불러와야 합니다. 다음은 본문 문서가 standalone 패키지를 불러오고 figure 환경 안에서 \input으로 그림을 포함하는 공식 예입니다.
\documentclass{article}
% load the standalone package early
\usepackage{standalone}
% load everything the sub-files need
\usepackage{tikz}
\begin{document}
% ...
\begin{figure}
\input{figure}% the standalone file from above
\caption{A sub-file}
\end{figure}
% ...
\end{document}핵심은 같은 figure.tex가 단독으로도 본문을 통해서도 한 글자도 바꾸지 않고 동작한다는 점입니다. 단독으로 컴파일하면 잘린 한 페이지 PDF가 되고, 본문 문서에서 \input하면 그림만 본문에 들어갑니다. 플로트는 본문 문서에서 관리하는 것이 권장됩니다. figure 환경, 캡션, 레이블은 본문에 두고 standalone 파일에는 내용만 둡니다(standalone 클래스에서는 crop/preview가 동작하도록 float의 기본값이 false입니다).
본문 쪽에서 그림 파일의 프리앰블을 자동으로 모으고 싶다면 \usepackage[subpreambles=true]{standalone}처럼 불러옵니다. 그러면 각 그림 파일의 프리앰블이 보조 파일에 모이고, 다음 처리 때 본문 문서로 가져와집니다. 여기에 sort 옵션을 더하면 각 그림이 불러온 패키지와 옵션이 중복 없이 모이며, \PassOptionsToPackage를 통해 옵션 충돌을 피하면서 로드됩니다. 손으로 본문 프리앰블에 옮기고 싶다면 print 옵션이 목록을 출력합니다.
이미지로 빌드하기와 비슷한 방식
standalone에는 소스를 포함하는 대신 그림을 이미지로 구워 포함하는 기능도 있습니다. 본문 문서에서 \input{figure} 대신 \includestandalone{figure}를 쓰면, 필요할 때 그림 파일을 별도로 컴파일해 이미지(PDF 등)를 만들고 이를 \includegraphics로 가져옵니다. 복잡한 그림을 매번 다시 컴파일하지 않아도 되어 본문 빌드가 빨라지는 것이 장점입니다. 다만 이 기능은 외부 명령을 호출하므로 컴파일 시 -shell-escape 옵션이 필요합니다.
또 convert, png, jpg, svg 같은 옵션을 쓰면 standalone 파일 자체를 이미지로 내보내는 변환 기능도 사용할 수 있습니다(외부 변환 도구 필요). 그림을 PNG나 SVG로 단독 배포하고 싶을 때 편리합니다.
비슷한 목적의 방식으로 subfiles와 TikZ의 external 라이브러리가 있습니다. subfiles는 방향이 반대입니다. 하위 파일이 *본문* 문서의 프리앰블을 가져오는 반면, standalone은 하위 파일의 프리앰블을 *본문* 문서 쪽으로 가져올 수 있습니다. 그래서 standalone은 논문, 발표자료, 학위논문처럼 하나의 그림을 여러 문서에서 재사용하는 데 맞고, subfiles는 본문과 하위 파일이 일대일인 관계에 맞습니다. TikZ의 external은 본문 파일에서 임시 이미지를 써 내는 방식이라 standalone과 반대 방향으로 동작합니다.
본문에 넣기 전 점검
standalone 파일은 “단독으로 컴파일된다”는 점이 가치이므로, 본문에 넣기 전에 그림 파일만 한 번 빌드하고 PDF를 직접 확인합니다. 졸업논문이나 논문에서는 그림만 교체하는 일이 많으므로 figures/experiment-flow.tex처럼 그림의 의미로 이름을 붙이고, 본문 쪽은 \input{figures/experiment-flow}만 쓰게 해 두면 교체, 재사용, 검토가 쉬워집니다.
- 여백을 확인합니다. 가장자리가 잘렸다면
border=2pt나border=5pt를 더하고, 여백이 너무 넓다면 끝의 빈 줄이나 불필요한\par를 의심합니다. - 프리앰블을 맞춥니다. 그림에서 쓰는
tikz, 색, 글꼴 설정은 본문 문서에도 같은 것을 불러와야 합니다. 하위 파일의 프리앰블은 포함할 때 보통 건너뜁니다. - 플로트는 본문 파일에 둡니다.
figure환경, 캡션, 레이블은 본문 문서에 두고, standalone 파일에는 그림 자체만 남깁니다. - 제출 전 다시 빌드합니다.
\includestandalone이나 이미지 변환을 쓴다면, 제출 전 한 번 깨끗하게 빌드해 오래된 캐시 PDF나 PNG가 섞이지 않게 합니다.
프로젝트에 넣는 방식
실제 논문이나 기술 문서에서는 standalone 파일을 그림의 소스로 다루고, 본문과 따로 점검할 수 있는 형태로 두면 좋습니다. 예를 들어 본문은 paper.tex, 그림은 figures/ 아래에 두고, 본문에는 \input{figures/energy-flow}만 씁니다. 그러면 그림을 고치는 사람은 figures/energy-flow.tex만 단독으로 컴파일해 확인할 수 있고, 본문 쪽에서는 캡션, 번호, 참조만 관리하면 됩니다. 검토할 때는 이 단독 PDF를 첨부해 “그림만 보는” 검토를 만들면, 전체 원고의 재빌드를 기다리지 않고 그림 품질을 높일 수 있습니다.
paper.tex
figures/
energy-flow.tex
apparatus-layout.tex
timing-diagram.tex제출 직전의 선택도 여기서 명확히 정합니다. 소스를 그냥 \input하기만 한다면 외부 명령은 필요 없고 일반 LaTeX 빌드로 충분합니다. \includestandalone으로 그림을 별도 빌드해 이미지로 포함한다면 빌드 설정에 -shell-escape와 생성물 정리 규칙까지 넣습니다. 공동 작업에서는 생성된 PDF를 저장소에 넣을지 여부도 명시해 두면 오래된 그림이 최종 빌드에 섞이는 사고를 막을 수 있습니다.