"PSTricks는 지나간 도구이고 TikZ가 현역"이라는 정리는 자주 들리지만, TeX Live 2024의 내용을 들여다보면 이야기가 뒤집힙니다. 함께 들어 있는 PSTricks는 2024년 2월 2일자 v3.19c로 지금도 새 판이 나옵니다. 반면 가환 도식의 정석으로 이름난 Xy-pic이 마지막으로 갱신된 것은 2013년 10월 6일이며, 컴파일할 때마다 그 날짜를 스스로 로그에 적습니다. 이 페이지에서는 LaTeX에서 TikZ 말고 쓸 수 있는 네 가지 그리기 시스템, 곧 PostScript를 불러 쓰는 PSTricks, 도식의 원로 Xy-pic, 독립된 언어인 Asymptote, METAFONT의 계보를 잇는 MetaPost를 각각의 출력 경로를 축으로 살펴봅니다. 실제로 선택을 가르는 것은 표현력보다 어느 엔진에서 어떻게 조판되는가이기 때문입니다.
새로 그리기 시작한다면 역시 TikZ가 맞는가
네, 거의 확실히 TikZ입니다. 이유는 기능이 아니라 마찰이 없다는 점입니다. TikZ는 pdflatex, lualatex, xelatex 어디서든 외부 프로그램 없이, 추가 컴파일 단계 없이 동작합니다. 이 페이지에서 다루는 넷은 그중 적어도 하나를 반드시 깨뜨립니다. PSTricks는 pdfLaTeX에서 바로 동작하지 않고, Asymptote는 외부 바이너리와 3단계 컴파일을 요구하며, MetaPost는 LuaLaTeX나 전용 프로그램을 전제하고, Xy-pic은 동작하지만 2013년에 갱신이 멈췄습니다. 그럼에도 다른 계통을 알아 둘 값어치가 있는 이유는 기존 문서 유지보수, 본격적인 3D, ConTeXt 같은 특정 생태계 세 가지입니다.
PSTricks — 30년이 되었지만 지금도 갱신되는 계통
PSTricks는 PostScript의 그리기 기능을 TeX/LaTeX 소스에서 직접 호출하는 매크로 묶음입니다. pstricks.tex 첫머리에 늘어선 저작권 표시가 이 계통의 내력을 그대로 말해 줍니다. Timothy Van Zandt(1993, 1994, 1999), Denis Girou(2000–2003), 그리고 Herbert Voß(2004년 이후). 세 대에 걸쳐 이어졌고, TeX Live 2024에 들어 있는 판은 v3.19c, 날짜는 2024년 2월 2일입니다. PSTricks에서 오래된 것은 설계 전제이지 관리 상태가 아닙니다.
문법은 이름만 봐도 기능을 짐작할 수 있는 편입니다. \psline은 선(또는 꺾은선), \pscircle은 원, \psframe은 직사각형을 그립니다. 좌표는 \psline(0,0)(3,2)처럼 괄호로 주고, 원은 중심과 반지름을 \pscircle(2,2){1}로 씁니다. 그림 전체는 pspicture 환경에 넣고, 열 때 왼쪽 아래와 오른쪽 위 좌표를 \begin{pspicture}(0,0)(4,3)처럼 전달합니다. 임의의 것을 좌표에 놓는 것이 \rput이고, 각도나 치우침을 더하고 싶으면 \uput입니다. 선 종류, 화살촉, 색은 대괄호 옵션에 한꺼번에 지정합니다.
\begin{pspicture}(0,0)(4,3)
\psframe(0,0)(4,3)
\psline[linewidth=1pt]{->}(0,0)(3,2)
\pscircle(2,1.5){1}
\rput(2,1.5){$O$}
\end{pspicture}이 그림은 너비 4, 높이 3의 테두리를 그리고, 원점에서 (3,2)로 화살표 선분을 뻗고, 중심 (2,1.5), 반지름 1의 원을 겹친 뒤, 원 중심에 O를 놓습니다. 파생 패키지도 풍부해서 pst-plot(함수 플롯), pst-node(노드와 연결), pst-3dplot(3D) 등이 갖춰져 있습니다. 표현력만 보면 지금도 충분히 강력합니다. 문제는 다음 절의 한 가지로 모입니다.
PSTricks를 pdfLaTeX로 조판할 때 나오는 오류와 우회책
첫 그리기 명령에서 ! Undefined control sequence.가 납니다. TeX Live 2024에서 \usepackage{pstricks}를 한 문서를 pdflatex에 통과시키자 \psframe 줄에서 이렇게 멈췄습니다. "! Undefined control sequence. \c@lor@to@ps ->\PSTricks _Not_Configured_For_This_Format" 확장 도중에 \PSTricks_Not_Configured_For_This_Format라는 표식 토큰이 나타나는데, 이는 일부러 정의하지 않은 것으로 "이 포맷은 지원하지 않는다"고 이름으로 외치고 있습니다. 성가신 점은 nonstopmode에서는 이 오류를 수십 번 뱉으면서도 PDF는 끝까지 나온다는 것입니다. 그림만 빠진 PDF가요.
원인은 출력 구조 자체에 있습니다. PSTricks는 그리기를 PostScript의 \special, 곧 DVI에 삽입되는 특수 명령으로 내보내도록 설계되었고, PDF를 바로 뱉는 pdflatex에는 그것을 받을 자리가 없습니다. 빠져나갈 길은 셋이며, 셋 모두 TeX Live 2024에서 실제로 동작함을 확인했습니다.
# route 1: the classic DVI path
latex figure.tex
dvips figure.dvi -o figure.ps
ps2pdf figure.ps
# route 2: stay in pdflatex, let auto-pst-pdf shell out
pdflatex --shell-escape figure.tex
# route 3: just use xelatex - no extra package needed
xelatex figure.tex경로 1은 고전이며 가장 확실합니다. latex로 DVI를 만들고, dvips로 PostScript로 바꾸고, ps2pdf(Ghostscript)로 PDF를 만듭니다. 여기서 실측된 주의점 하나. Ghostscript 10.03.0은 도중에 "WARNING: Transparency operations ignored - need to use -dALLOWPSTRANSPARENCY"를 출력했습니다. PSTricks의 투명도(opacity 계열)가 조용히 사라진다는 뜻이므로, 반투명 채우기를 쓴다면 결과를 반드시 눈으로 확인하세요.
경로 2는 pdflatex 흐름을 유지한 채 뒷일을 auto-pst-pdf에 맡기는 방법입니다. 구조는 소박합니다. pdflatex 실행 도중에 auto-pst-pdf가 또 하나의 LaTeX을 자식 프로세스로 띄워, PSTricks 부분만 PostScript를 거쳐 <문서명>-pics.pdf로 렌더링하고 그것을 포함합니다. 실제로 돌려 보면 로그에 "auto-pst-pdf: Auxiliary LaTeX compilation"이 찍히고, 그 뒤에서 경로 1이 돌아가는 것이 보입니다. 외부 프로세스를 띄우는 이상 --shell-escape가 필수이며, 빠뜨리면 "! Package auto-pst-pdf Error: auto-pst-pdf will not work!"라고 꽤 분명하게 혼납니다. PNG나 JPEG를 같은 문서에 섞고 싶을 때 유력한 경로입니다.
경로 3이 가장 뜻밖이면서 가장 쉽습니다. 소스를 한 글자도 바꾸지 않고 xelatex에 통과시키기만 하면 됩니다. 추가 패키지를 설치할 필요가 없습니다. TeX Live 2024의 PSTricks 본체가 tex/generic/pstricks/config/xdvipdfmx.cfg라는 설정을 함께 담고 있어서 XeLaTeX로 돌 때 자동으로 읽히기 때문입니다(실제로 로그에 그 파일 이름이 나옵니다). XeLaTeX은 내부적으로 DVI 계열 중간 형식을 거치므로 PostScript의 \special이 그대로 흘러갑니다. 문서 전체를 이미 XeLaTeX으로 조판하고 있다면, PSTricks에 "우회책"이란 존재하지 않는다고 말해도 좋습니다.
Xy-pic과 \xymatrix — 지금도 동작하지만 2013년에 멈춘 계통
Xy-pic(패키지 이름 xy)은 그래프와 도식을 조판하는 범용 패키지로, plain TeX, LaTeX, AMS-LaTeX 어디서든 동작합니다. 특별한 출력 경로가 필요 없어 pdflatex로 그대로 통과합니다. 재미있는 점은 컴파일할 때마다 자기 내력을 로그에 적는다는 것으로, TeX Live 2024에서는 " Xy-pic version 3.8.9 <2013/10/06>"이라고 나옵니다. xy.tex의 저작권 표시는 1991년부터 2013년까지, Kristoffer H. Rose 외입니다. 20년 넘게 쓰였고 10년 넘게 갱신되지 않았다는 사실이 한 줄에 압축되어 있습니다.
실무에서 많이 쓰이는 부분은 가환 도식을 위한 \xymatrix입니다. 도식을 행렬처럼 배치하는 모드로, tabular처럼 항목은 &로 나누고 행은 \\로 바꿉니다. 대상 사이의 화살표는 \ar로 그리고 목적지는 방향 키로 줍니다. [r]은 오른쪽, [l]은 왼쪽, [u]는 위, [d]는 아래이며, [rd]처럼 이으면 오른쪽 아래 이웃 칸입니다. 화살표 라벨은 수식 첨자의 표기를 재사용해 ^는 화살표 위(진행 방향에서 볼 때 왼쪽), _는 아래(오른쪽)에 놓입니다. 불러올 때는 \usepackage[all]{xy}가 정석이고, [all]이 표준 기능 묶음을 켭니다.
\usepackage[all]{xy}
% ...
\[
\xymatrix{
A \ar[r]^{f} \ar[d]_{\alpha} & B \ar[d]^{\beta} \\
C \ar[r]_{g} & D
}
\]이는 네 꼭짓점에 A, B, C, D를 둔 가환 정사각형으로, 위쪽 변에는 오른쪽을 향하는 f, 왼쪽 변에는 아래쪽 α, 오른쪽 변에는 아래쪽 β, 아래쪽 변에는 오른쪽 g가 들어갑니다. 도식 자체가 수학의 일부이므로 별행 수식 환경 안에 둡니다. 가환 도식을 새로 그린다면 오늘날 현대적인 선택은 TikZ 기반의 tikz-cd입니다. 곡선과 정교한 화살촉, 여러 줄의 복잡한 도식을 다루기 쉽고 오류 메시지도 읽힙니다. 이 절의 값어치는 이미 Xy-pic으로 쓰인 원고를 읽고 고치는 데 있습니다. 둘의 비교는 가환 도식 페이지가 담당합니다.
Asymptote — 컴파일러가 TeX Live에 함께 들어 있는 언어
외부 프로그램이 필요하다는 말에 긴장하기 쉽지만, Asymptote의 asy는 TeX Live에 들어 있습니다. TeX Live 2024의 바이너리 디렉터리를 보면 45 MB 남짓한 asy가 mpost, mf와 나란히 있고, asy --version은 "Asymptote version 2.88"이라고 답하며 활성 옵션으로 "V3D 3D vector graphics output"을 보여 줍니다. 곧 TeX Live를 설치한 시점에서 따로 구할 것 없이 Asymptote를 쓸 수 있습니다. 이것이 TeX Live에 포함되지 않아 직접 설치해야 하는 gnuplot과의 결정적 차이입니다.
Asymptote는 TeX 매크로가 아니라 독립적인 벡터 그래픽 언어입니다. C++와 비슷한 문법으로, 변수와 함수와 반복문과 타입을 갖춘 진짜 프로그래밍 언어로서 그림을 씁니다. 설계 의도도 흥미로운데, 공식 매뉴얼은 Asymptote를 MetaPost에서 영감을 받은 언어로 자리매김하면서 더 정돈된 C++풍 문법을 내세웁니다. 특히 별난 것은 치수를 정하는 방식입니다. size(6cm) 같은 전체 크기 지정이 라벨이나 화살촉처럼 함께 늘어나지 않는 요소와 충돌할 때, Asymptote는 단체법, 곧 선형 계획법으로 그 제약을 풉니다. 그림의 크기를 정하려고 선형 계획을 돌리는 작도 언어는 흔치 않습니다.
LaTeX에 삽입하려면 \usepackage{asymptote}를 불러오고 그림 코드를 asy 환경에 씁니다. 구조상 컴파일은 세 단계이며, TeX Live 2024에서 실제로 돌려 보니 이랬습니다. 먼저 pdflatex를 통과시키면 asy 환경의 내용이 <문서명>-1.asy로 쓰이고, 동시에 "Package asymptote Warning: file ... not found on input line 11."이라는 경고가 납니다. 아직 그림이 없으니 당연합니다. 다음으로 asy <문서명>-1.asy를 실행하면 <문서명>-1.pdf가 생기고, pdflatex를 한 번 더 돌리면 그 PDF가 포함됩니다. 이 세 단계를 손으로 돌리기는 번거로우므로 실무에서는 latexmk에 맡깁니다.
pdflatex document # writes document-1.asy
asy document-1.asy # produces document-1.pdf
pdflatex document # includes it
# or, in one go:
latexmk -pdf document// a standalone .asy file, run with: asy figure.asy
import three;
size(6cm);
draw(unitcube);
draw(O--X, red, Arrow3);
draw(O--Y, green, Arrow3);
draw(O--Z, blue, Arrow3);이 코드는 three 모듈(3D 기능)을 불러와 단위 정육면체를 그리고, 원점에서 x, y, z 각 축 방향으로 빨강, 초록, 파랑의 3차원 화살표를 그립니다. 그림을 문서에 삽입할 필요는 없습니다. 이처럼 독립된 .asy 파일로 써서 asy figure.asy로 단독 실행하면 PDF, EPS는 물론 SVG, WebGL, PDF에 삽입 가능한 3D 형식까지 다양하게 출력할 수 있습니다. 라벨 조판에 TeX을 쓰므로 그림 속 수식은 본문과 같은 서체가 됩니다. 좌표축이 있는 입체나 곡면 같은 본격적인 3D에서는 Asymptote가 TikZ보다 훨씬 자연스럽게 쓰입니다. 대화식으로 그리고 .asy 소스를 내보내는 GUI 프런트엔드 xasy도 함께 옵니다.
MetaPost — LuaLaTeX이라면 외부 프로그램 없이 쓸 수 있습니다
MetaPost는 John Hobby가 Knuth의 METAFONT(글꼴을 기술하기 위한 언어)를 개작해 출력을 PostScript로 바꾼 것입니다. METAFONT에서 이어받은, 점과 방향으로부터 매끄러운 곡선을 풀어 그리는 표기(Hobby 알고리즘)를 가지며, 좌표를 방정식으로 선언적으로 쓸 수 있는 것이 특징입니다. 고전적인 사용법은 독립된 언어로서, 전용 프로그램 mpost에 .mp 파일을 넘겨 EPS를 얻는 것입니다.
그런데 현대 LaTeX에서는 이 외부 호출이 필요 없습니다. luamplib 패키지를 불러오면 mplibcode 환경 안에 MetaPost를 그대로 쓸 수 있습니다. LuaTeX에는 MetaPost 엔진이 mplib 라이브러리로 내장되어 있어 mpost를 따로 띄울 필요도, --shell-escape도 필요 없습니다. TeX Live 2024에서 아래 예제를 lualatex에 통과시키자 외부 프로세스를 하나도 부르지 않고 단번에 PDF가 나왔습니다. 이 페이지에서 다루는 네 계통 가운데 추가 외부 도구를 전혀 요구하지 않는 것은 LuaLaTeX을 거친 MetaPost뿐입니다.
% compile with lualatex
\documentclass{article}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
beginfig(1);
draw fullcircle scaled 2cm withpen pencircle scaled 1pt;
draw (-1cm,0)--(1cm,0);
draw (0,-1cm)--(0,1cm);
endfig;
\end{mplibcode}
\end{document}mplibcode의 내용은 순수한 MetaPost입니다. beginfig(1) … endfig가 하나의 그림을 구분하고, 단위원을 지름 2cm로 확대한 원을 굵기 1pt 펜으로 그린 뒤 수평·수직 지름을 하나씩 긋습니다. fullcircle, pencircle, scaled는 모두 MetaPost 내장 어휘입니다. 생태계의 핵심은 MetaFun이라는 고기능 포맷이며, 조판 시스템 ConTeXt는 이를 통해 MetaPost를 깊이 통합합니다. ConTeXt를 쓴다면 MetaPost가 중심적인 작도 수단이 되고, LaTeX가 주라면 평소에는 TikZ, METAFONT 유래의 곡선 기술이 필요할 때 MetaPost라는 자리매김이 됩니다.
네 계통 비교 — 무엇을 언제 고를까
출력 경로와 엔진으로 늘어놓으면 선택 기준이 보입니다. 기존 문서 유지보수라면 그 문서가 쓰는 계통을 그대로 읽고 쓸 수 있게 하고, 3D 그림이 필요하면 Asymptote, ConTeXt를 쓴다면 MetaFun을 거친 MetaPost, 새 가환 도식이라면 Xy-pic이 아니라 tikz-cd입니다. 그리고 이 어디에도 해당하지 않는 대다수의 작도는 외부 도구도 특수 출력 경로도 필요 없는 TikZ로 처리하는 것이 가장 견실한 판단입니다.
| 계통 | 출력 경로 / 엔진 | 외부 도구 | 강점 / 주요 용도 |
|---|---|---|---|
PSTricks | latex → dvips → ps2pdf, 또는 auto-pst-pdf를 곁들인 pdfLaTeX, 또는 XeLaTeX 단독 | dvips와 Ghostscript. auto-pst-pdf 경로는 --shell-escape도 필요 | PostScript의 고품질 채움과 효과. 기존 문서가 많고, v3.19c(2024)로 관리도 현역 |
Xy-pic | 일반 LaTeX에서 동작. 특별한 경로 불필요 | 없음 | 가환 도식의 원로. 현대적 대체는 tikz-cd. 3.8.9(2013)에서 갱신 정지 |
Asymptote | latex/pdflatex → asy → 다시 latex. 또는 단독 .asy | asy는 TeX Live에 동봉. latexmk로 자동화 가능 | 본격적인 2D와 3D. 좌표축이 있는 입체와 곡면. SVG, WebGL, 3D PDF까지 출력 |
MetaPost | mpost로 .mp 처리. 또는 LuaLaTeX + luamplib의 mplibcode | LuaLaTeX 경유라면 불필요(mplib이 LuaTeX에 내장) | METAFONT에서 이어받은 곡선과 방정식으로 쓰는 좌표. ConTeXt(MetaFun)의 중심 |