TeX2img(이미지로 내보내기)

수식이나 그림을 이미지 파일로 내보내는 일은 LaTeX가 가장 서툰 일입니다. 이유는 단순합니다. LaTeX의 출력 단위가 “페이지”이기 때문입니다. 실제로 재 보면 A4는 595 × 842 pt인데, 그 위에 놓인 가우스 적분 한 줄은 86 × 28 pt밖에 되지 않습니다. 차이의 99 % 이상이 아무도 원하지 않는 빈 종이입니다. PowerPoint나 Keynote, Word, 웹 페이지에 수식 하나 붙이려던 것뿐인데, 여백과의 싸움이 시작됩니다. 이 페이지는 그 싸움에서 이기는 세 도구, 즉 LaTeX 안에서 잘라 내는 standalone 클래스, 이미 만들어진 PDF를 잘라 내는 pdfcrop, SVG로 바꾸는 dvisvgm과, 이 모두를 GUI로 한꺼번에 처리하는 TeX2img를 다룹니다.

standalone 클래스 — LaTeX 안에서 내용에 딱 맞게 잘라 내기

가장 솔직한 답은 standalone 클래스입니다. \documentclass{article} 대신 \documentclass{standalone}이라고 쓰기만 하면 페이지가 본문의 바운딩 박스까지 줄어들어 내용에 딱 맞는 1페이지 PDF가 나옵니다. 이 페이지 첫머리의 가우스 적분을 border=2pt와 함께 조판한 결과는 85.8 × 28.0 pt로, A4의 595 × 842 pt에서 필요 없는 종이가 말끔히 사라졌습니다. 작성자는 Martin Scharrer이고, TeX Live 2024에 들어 있는 것은 v1.3b(2022/10/10)입니다.

figure.tex
% pdflatex figure.tex  ->  a one-page PDF cropped to the formula
\documentclass[border=2pt]{standalone}
\usepackage{amsmath}
\begin{document}
$\displaystyle \int_{-\infty}^{\infty} e^{-x^2}\,dx = \sqrt{\pi}$
\end{document}

여기서, 널리 베껴 쓰이지만 아무 의미 없는 지정을 하나 정리하고 갑니다. \documentclass[preview]{standalone}은 아무것도 바꾸지 않습니다. previewstandalone의 기본값이기 때문입니다. 클래스 파일을 읽어 보면 옵션 처리 전에 이미 preview가 참으로 되어 있고, 의미가 있는 쪽은 반대편의 crop입니다. (crop을 지정하면 preview가 거짓이 되어 preview 패키지를 쓰지 않는 방식으로 잘라 냅니다. XeLaTeX에서 preview가 말썽을 부릴 때의 탈출구입니다.) 여백은 border=로 지정하며, 값이 하나면 네 변 공통, 둘이면 “좌우/상하”, 넷이면 왼쪽·아래·오른쪽·위 순서입니다. 기본값은 0.50001 bp이므로 기본 상태에서도 아주 얇은 여백이 붙습니다.

preview의 출처가 은근히 흥미롭습니다. standalone은 내부에서 preview 패키지를 읽어 들여 잘라 내기를 실현하는데, 이 preview.styAUCTeX / preview-latex의 일부입니다. 곧 Emacs가 편집 중인 버퍼에 수식 미리보기를 겹쳐 보여 주는 그 구조와 같은 코드입니다. 편집기 안에서 수식을 오려 내려고 만든 장치가, 그대로 슬라이드용 이미지를 오려 내는 데 쓰이는 셈입니다. TeX Live 2024에 들어 있는 것은 v13.3(2024/01/17)입니다.

standalone에는 알아 두면 이득인 옵션이 둘 더 있습니다. varwidth=<너비>를 붙이면 본문이 줄바꿈될 수 있어 캡션처럼 여러 줄인 텍스트도 이미지로 만들 수 있습니다(기본값에서는 한 줄로 계속 늘어납니다). multi=<환경 이름>은 한 파일에 둔 여러 tikzpicture각각 별도의 페이지로 잘라 냅니다. 그림을 한데 모아 관리하고 필요한 페이지만 가져다 쓰는 방식입니다. 그리고 같은 이름의 standalone 패키지를 본문 쪽에서 읽어 들이면 \includestandalone{figure}로 그림 파일을 가져올 수 있습니다. 소스로 가져올지 이미 만들어 둔 PDF로 가져올지 전환할 수 있어서, 초고 때는 빠른 쪽을, 제출 때는 확실한 쪽을 쓸 수 있습니다.

pdfcrop — 이미 있는 PDF의 여백 잘라 내기(쪽번호에 주의)

소스에 손댈 수 없을 때 쓰는 도구가 pdfcrop입니다. 이미 완성된 PDF를 넘기면 각 페이지의 여백을 재어 잘라 낸 새 PDF를 씁니다. \documentclass를 고칠 수 없는 공저 원고나, 남에게 받은 그림 PDF를 잘라 낼 때 씁니다. TeX Live에 동봉되어 있고, 작성자는 Heiko Oberdiek이며 TeX Live 2024의 버전은 1.42(2023/04/15)입니다. 여백을 조금 남기고 싶으면 --margins "2"(단위는 bp)처럼 지정합니다.

terminal
pdfcrop page.pdf out.pdf              # trim all margins
pdfcrop --margins "2" page.pdf out.pdf # leave 2 bp on every side
pdfcrop --margins "5 2 5 2" a.pdf b.pdf  # left bottom right top
pdfcrop --hires --clip a.pdf b.pdf     # HiResBoundingBox, and clip the content

작동 방식을 알아 두면 동작을 읽을 수 있습니다. pdfcropPDF를 스스로 해석하지 않습니다. 바운딩 박스는 Ghostscript에 물어보고, 그 결과를 바탕으로 pdfTeX을 한 번 더 실행해(또는 --xetex / --luatex로 XeTeX / LuaTeX을 써서) 새 판형으로 페이지를 다시 짭니다. 즉 PDF를 자르는 데 TeX이 돕니다. Ghostscript가 없으면 동작하지 않고, --gscmd로 그 호출 이름을 지정할 수 있는 것도 이 때문입니다.

그리고 가장 자주 밟는 지뢰가 이것입니다. pdfcrop은 페이지 위의 모든 잉크를 내용으로 간주하므로, article의 기본값처럼 쪽 아래에 쪽번호가 찍혀 있으면 거기까지 포함한 세로로 긴 상자가 됩니다. 실제로 \[ E = mc^2 \]만 있는 A4 한 장을 잘라 내면 43 × 559 pt가 나옵니다. 수식은 위쪽 끝에, 쪽번호는 아래쪽 끝에, 사이는 공백입니다. \pagestyle{empty}를 넣고 같은 일을 하면 43 × 13 pt가 됩니다. “잘라 냈는데 유난히 길쭉하다”의 열에 아홉은 이것입니다.

SVG로 내보내기 — dvisvgm과, 글자를 아웃라인화할지 남길지

웹 페이지나 SVG를 다룰 수 있는 그리기 앱에 넘길 거라면 dvisvgm이 정석입니다. DVI·EPS·PDF를 SVG로 변환하는 프로그램으로, TeX Live에 동봉되어 있고 Martin Gieseking이 2005년부터 개발해 오고 있습니다(TeX Live 2024의 버전은 3.2.2). 가장 확실한 경로는 latex로 DVI를 만들고 그것을 dvisvgm에 넘기는 것입니다. 수식 하나를 넘기면 변환하면서 graphic size: 81.5pt x 23.4pt처럼 실제 크기를 보고해 주므로, 붙일 곳에서 몇 배로 키워야 할지도 그 자리에서 알 수 있습니다.

terminal
latex figure.tex                            # produce figure.dvi
dvisvgm --no-fonts --exact-bbox figure.dvi  # glyphs as paths, tight box
dvisvgm --font-format=woff2 figure.dvi      # keep real text, web font
dvisvgm --eps figure.eps                    # EPS input
dvisvgm --pdf figure.pdf                    # PDF input: needs gs or mutool

선택이 갈리는 지점은 글자를 아웃라인화할지 여부입니다. --no-fonts를 붙이면 글리프가 path 요소로 그려져 상대 환경에 글꼴이 없어도 모양이 완전히 재현됩니다. 대신 SVG 안의 텍스트는 검색도 선택도 되지 않고 파일이 다소 커집니다. 반대로 글자로 남기려면 --font-format=woff2 등으로 글꼴을 임베드합니다. 웹의 수식이라면 아웃라인화가 무난하고, 본문과 함께 검색되게 하고 싶다면 글꼴 임베드입니다. 잘라 내는 정밀도를 높이고 싶을 때는 --exact-bbox를 붙이면 글리프의 실제 윤곽에서 바운딩 박스를 계산합니다.

주의점이 하나. PDF를 입력으로 받는 --pdfdvisvgm 단독으로는 동작하지 않습니다. PDF 해석에는 Ghostscript나 MuPDF의 mutool이 필요하고, 둘 다 없으면 ERROR: can't retrieve number of pages from file에서 멈춥니다. TeX Live에는 mutool이 동봉되어 있지 않으므로, 이 경로를 쓰려면 따로 설치하거나 그냥 DVI 경로를 고르세요. (dvisvgm 자체의 자세한 내용은 DVI 변환 도구 페이지가 담당합니다.)

PNG 같은 래스터가 필요할 때 — 해상도와 투명도

붙일 곳이 벡터(PDF·SVG·EPS)를 받아 준다면 반드시 벡터를 고르세요. 확대해도 윤곽이 무너지지 않아 인쇄에서도 슬라이드에서도 선이 선명합니다. 래스터(PNG·JPEG)가 필요한 것은 붙일 곳이 벡터를 받지 않을 때, 또는 상대 환경에서도 확실히 같은 모습을 보장하고 싶을 때입니다. 래스터로 간다면 해상도를 먼저 정하는 것이 철칙이며, 슬라이드에 전체 화면으로 띄울 것이라면 300~600 dpi 상당은 잡아 둡니다. 나중에 확대해도 정보가 늘지는 않습니다.

standalone에는 이 용도를 위한 convert 옵션이 있어서, 컴파일 흐름 안에서 그대로 래스터 이미지까지 만들 수 있습니다. 외부 변환 도구를 부르므로 -shell-escape가 필요합니다. 투명 배경을 원하면 PNG를 고르고, 여백을 0으로 하지 말고 border를 조금 남겨 두면 슬라이드의 배경색에 자연스럽게 어울립니다. JPEG는 사진용 압축이라 수식이나 선화에 쓰면 윤곽 주위에 잡티가 생깁니다. 수식에 JPEG는 고르지 않는 것이 정답입니다.

TeX2img — 컴파일부터 내보내기까지 GUI로 한 번에

여기까지의 도구를 하나의 앱으로 묶은 것이 TeX2img입니다. 수식이나 그림 조각을 창에 붙여 넣고 엔진과 출력 형식을 고른 뒤 누르기만 하면, 컴파일·잘라 내기·내보내기가 한 번에 이어집니다. 일본 TeX 커뮤니티에서 나온 도구로, 데라다 유스케(Yusuke Terada)가 버전 1.2까지 개발했고, 이후 Windows판은 아베 노리유키(Noriyuki Abe)가, macOS판은 데라다가 각각 독립적으로 개발하고 있습니다. 웹 서비스가 아니라 로컬에서 실행되는 앱이므로, 자기 환경에 설치한 사용자 스타일 파일과 글꼴을 그대로 쓸 수 있다는 것이 강점입니다.

내부에서 하는 일은 지금까지 본 것들의 조합입니다. 먼저 고른 엔진(pdflatex, platex, uplatex, lualatex, xelatex 등)으로 조각을 컴파일하고, platex / uplatex처럼 DVI를 거치는 경로에서는 dvipdfmxdvips를 끼우며, 마지막에 Ghostscript(버전 9 이상)로 바운딩 박스에 맞춰 잘라 내 지정한 형식으로 씁니다. 따라서 동작하는 TeX 환경과 Ghostscript가 전제입니다. Windows판에서 SVG를 내려면 MuPDF가 따로 필요한데, 앞 절에서 dvisvgm --pdfmutool을 요구한 것과 같은 사정입니다. 엔진을 직접 고를 수 있으므로 일본어 수식이나 일본어 글꼴이 든 조각도 평소 품질 그대로 이미지로 만들 수 있습니다.

내보낼 수 있는 형식은 폭이 넓어서, 벡터인 EPS·PDF·SVG(및 SVGZ)·EMF와 래스터인 PNG·JPEG·GIF·TIFF·BMP를 고를 수 있습니다. EMF는 Windows용 Office에 붙여 넣기 위한 벡터 형식이며 Windows판에서만 쓸 수 있습니다. 여백·해상도·배경 투명도는 각각 설정할 수 있고, GUI에서는 미리보기를 보며 조정할 수 있습니다. 수식을 대량으로 일괄 변환하거나 빌드에 통합하고 싶을 때를 위해 명령줄 버전도 준비되어 있으며, Windows에서는 TeX2imgc.exe가 GUI를 CUI 모드로 실행합니다. 형식은 “옵션을 먼저 쓰고, 입력과 출력을 쌍으로 늘어놓는” 모양입니다.

terminal
TeX2imgc.exe /transparent /resolution=600 equation.tex equation.png
TeX2imgc.exe /latex=uplatex /gs=gswin64c formula.tex formula.svg

실제로 쓸 때 효과가 나는 세부가 셋 있습니다. 첫째, \documentclass를 뺀 본문만 붙여 넣으면 됩니다. TeX2img가 템플릿으로 감싼 뒤 컴파일하므로, 수식 한 줄을 시험하려고 앞뒤 골격을 쓸 필요가 없습니다. 물론 자체 프리앰블을 가진 완전한 조각도 넘길 수 있고, 기존 .tex 파일이나 이미 만들어진 PDF·PS·EPS를 입력으로 받아 이미지로 만들 수도 있습니다. 둘째, PDF와 SVG에서는 글자를 아웃라인화할지, 문자 정보로 남길지 고를 수 있습니다(앞 절의 dvisvgm --no-fonts와 같은 판단입니다). 셋째, macOS판에는 생성 결과를 Illustrator·Word·PowerPoint 등에 바로 붙여 넣는 기능이 있어, 파일을 거치지 않고 슬라이드에 올릴 수 있습니다.

붙일 곳으로 정하기 — Word·PowerPoint·Keynote·웹·인쇄

형식 선택은 취향이 아니라 붙일 곳의 사정으로 정해집니다. 아래 표가 그 대응입니다. 원칙적으로 벡터를 첫 번째 후보로 두고, 받아 주지 않는 상대에게만 래스터를 씁니다. 그리고 잊기 쉬운 점 하나. 이미지가 된 수식은 나중에 고칠 수 없습니다. 논문 본문처럼 식이 계속 바뀌는 것은 이미지로 만들지 말고 LaTeX 그대로 두고, 이미지화는 “더 이상 바뀌지 않을 것”과 “LaTeX을 쓸 수 없는 곳에 둘 것”으로 좁히는 편이 안전합니다. 원래의 .tex 조각은 반드시 남겨 두세요.

형식종류적합한 대상
PDF벡터LaTeX 문서 재삽입, 인쇄, Keynote. 첫 번째 선택
SVG벡터웹 페이지, Figma나 Illustrator 같은 그리기 앱
EPS벡터기존 인쇄 입고 흐름, EPS를 요구하는 출판사
EMF벡터Windows의 Word / PowerPoint. TeX2img는 Windows판만 지원
PNG래스터슬라이드 전반, 채팅, 투명도가 필요한 곳. 해상도를 먼저 정할 것
JPEG래스터사진과 섞는 경우에만. 수식·선화에는 쓰지 않기

끝으로 도구의 분담을 정리합니다. LaTeX 문서 안에서 끝내려면 standalone 클래스입니다. 그림을 별도 파일로 두고 \includestandalone으로 가져오는 운용이 정석입니다. 소스를 건드릴 수 없는 PDF를 잘라 내려면 pdfcrop. SVG가 필요하면 dvisvgm. 그리고 여러 판을 시험해 보며 눈으로 형식을 정하고 싶거나, 일본어 환경까지 GUI로 다루고 싶다면 TeX2img가 가장 빠릅니다. 그림 자체를 그리는 방법은 TikZ 페이지가, 만들어진 이미지를 문서에 넣는 방법은 이미지 삽입 페이지가 담당합니다.