공저자에게서 “그냥 Word로 보내 주세요”라는 말을 듣는 순간 LaTeX 사용자의 하루는 끝납니다. 다리를 놓는 정석은 pandoc——Markdown, LaTeX, .docx 사이를 오가는 변환기입니다. 그런데 두 방향의 성질은 전혀 다릅니다. Word → LaTeX는 원래 없던 구조를 만들어 내는 작업이라 잃을 것이 없습니다. LaTeX → Word는 반대로, 공들여 쌓은 구조를 평평하게 눌러 버립니다. \label과 \ref의 대응, \newcommand의 의미, 수식의 구조가 그렇습니다. LaTeX는 프로그램이고 .docx는 완성된 결과의 기록입니다. 프로그램을 돌려 결과를 남길 수는 있어도 결과에서 프로그램을 되살릴 수는 없습니다. 이 비대칭이 이 페이지의 뼈대입니다.
왜 LaTeX → Word 쪽이 더 많이 잃을까요
답은 단순합니다. 도착지에 받아 줄 그릇이 없기 때문입니다. .docx는 본질적으로 문단과 문자 서식과 스타일 이름을 담는 그릇이라 \newcommand에 해당하는 장치도, \ref가 가리키는 번호를 다시 계산하는 장치도 없습니다. 그래서 pandoc은 Word의 어휘가 닿는 데까지 의도를 옮기고 닿지 않는 부분은 버립니다. 번호는 그때 계산된 숫자로 굳고, 상호 참조는 살아 있는 링크가 아니라 그냥 글자가 됩니다. 반대 방향은 훨씬 편합니다. Word 문서에는 제목 수준과 목록과 굵게 정도 말고는 구조가 없어서 pandoc은 그것을 \section이나 itemize로 옮기기만 하면 됩니다. 정보는 늘어날 수는 있어도 줄지는 않습니다. 이 비대칭은 pandoc 자신의 역사에도 새겨져 있습니다. .docx 쓰기는 2012년 pandoc 1.9에서 가능해졌고, 변경 내용 추적까지 이해하는 .docx 읽기는 2014년에 Jesse Rosenthal이 더한 것으로, 프로젝트 시작으로부터 각각 6년과 8년이 지난 뒤였습니다.
pandoc의 기본: -f와 -t, 그리고 --pdf-engine
pandoc의 사용법은 입력 형식을 -f(--from), 출력 형식을 -t(--to)로 지정하는 것이 전부입니다. 가운데에 추상 구문 트리(AST) 하나를 두고 입력 쪽 reader가 AST를 만들고 출력 쪽 writer가 써 냅니다. 이 구조 덕분에 형식 조합이 늘어도 구현량이 곱셈으로 불어나지 않습니다. 만든 사람인 John MacFarlane은 캘리포니아 대학교 버클리의 철학 교수로, Haskell을 익히려고 이 프로젝트를 시작했습니다. 2006년 8월 3일에 공개된 첫 판은 약 3,000줄이었는데도 이미 Markdown, reStructuredText, HTML, LaTeX 사이를 오갈 수 있었습니다. 지금은 입력 50종 이상, 출력 70종 이상을 다룰 만큼 자랐습니다. --pdf-engine=lualatex를 붙이면 LaTeX 엔진을 거쳐 PDF까지 한 번에 뽑을 수 있지만, pandoc은 TeX Live에 들어 있지 않습니다. Haskell로 쓰인 독립 프로그램이라 따로 설치해야 합니다.
pandoc -f markdown -t latex in.md -o out.tex # Markdown to LaTeX
pandoc in.md -o out.pdf --pdf-engine=lualatex # Markdown straight to PDF
pandoc in.tex -o out.docx # LaTeX to Word
pandoc in.docx -o out.tex # Word to LaTeX출력을 세밀하게 다듬는 통로도 둘 마련되어 있습니다. --template은 문자 기반 출력 형식(latex, html 등)의 바깥 틀을 갈아 끼우는 것으로, 프리앰블이나 \documentclass를 자기 투고용 템플릿으로 바꿀 수 있습니다. .docx 같은 이진 형식에는 듣지 않으며, 그쪽은 앞서 말한 --reference-doc이 담당합니다. 다른 하나는 Lua 필터(--lua-filter)로, 읽어 들인 뒤 써 내기 전의 AST를 직접 고쳐 씁니다. “특정 환경을 다른 제목으로 바꾼다”, “\todo{...}를 모두 지운다” 같은 작업은 정규식으로 LaTeX 소스를 건드리는 것보다 이 단계에서 하는 편이 훨씬 안전합니다.
pandoc이 읽는 LaTeX, 읽지 못하는 LaTeX: 경고는 나올까요
pandoc은 LaTeX의 일부만 이해하지만, 그렇다고 완전히 입을 다물지도 않습니다. 수식의 경우 해석할 수 없는 것을 만나면 Could not convert TeX math라는 경고를 내놓고 그 수식을 LaTeX 그대로 출력에 남깁니다. 버리는 것이 아니라 그대로 넘기는 설계입니다. 자작 매크로도 생각보다 강해서, latex_macros 확장이 켜져 있으면 pandoc은 공식 매뉴얼의 표현대로 LaTeX 매크로 정의를 해석하고 그 매크로를 모든 LaTeX 수식과 생 LaTeX에 적용합니다. 그래서 \newcommand{\R}{\mathbb{R}} 정도는 통과합니다. 정말 조용히 사라지는 것은 그 너머입니다. pandoc이 생 LaTeX으로 판정한 블록(예컨대 tikzpicture 환경)은 AST에 raw로 남지만 docx와 HTML writer는 그것을 써 내지 않습니다. 수식 때처럼 경고가 나오지 않으므로, Word에서 열어 보고서야 그림이 통째로 사라진 것을 알게 되는 사고가 벌어집니다.
--reference-doc로 Word의 체재를 정합니다
내보낸 .docx의 겉모습이 마음에 들지 않을 때 손대야 할 것은 템플릿이 아니라 --reference-doc입니다. 공식 매뉴얼은 구조를 이렇게 설명합니다. 참조 docx의 내용은 무시되고, 그 스타일시트와 문서 속성——여백, 용지 크기, 머리글, 바닥글을 포함——만 새 docx에 쓰입니다. 즉 참조 파일은 “백지 서식 견본”이지 원고 틀이 아닙니다. 그래서 올바른 만드는 법은, 먼저 pandoc에서 기본 참조 파일을 꺼내 Word나 LibreOffice에서 열고 스타일(Heading 1, Body Text, Table Caption 등)을 투고 규정대로 고친 뒤 저장해 두고 돌려쓰는 것입니다. 매뉴얼은 참조 docx가 pandoc이 만든 docx를 고친 것일 때 결과가 가장 좋다고도 적고 있습니다. 꺼내는 명령에서는 -o를 --print-default-data-file보다 앞에 두어야 합니다.
# 1. extract the default reference file (-o must come first)
pandoc -o custom-reference.docx --print-default-data-file reference.docx
# 2. edit the STYLES in Word or LibreOffice, then save
# 3. reuse it for every export
pandoc in.tex -o out.docx --reference-doc=custom-reference.docxWord → LaTeX에서 실제로 효과가 있는 옵션
.docx는 실체가 XML을 담은 ZIP 압축 파일이라 pandoc이 직접 읽을 수 있습니다. 가져올 때 가장 먼저 붙여야 할 것은 --extract-media=media로, 공식 매뉴얼의 설명대로 문서에 들어 있거나 링크된 이미지와 미디어를 지정한 디렉터리로 꺼내고 이미지 참조를 꺼낸 파일에 맞춰 고쳐 줍니다. 이것을 빠뜨리면 그림이 아무 데도 나오지 않습니다. 공저자에게서 돌아온 파일에는 변경 내용 추적이 남아 있기 마련인데, --track-changes=accept(적용) / reject(거부) / all(모두 span으로 보존)로 처리를 정할 수 있습니다. 이 옵션은 docx reader에만 적용됩니다. 문헌은 --citeproc와 .bib의 조합으로 처리하고, CSL 스타일은 --csl로 지정합니다. 출력에서 문단이 강제로 접히는 것이 거슬리면 --wrap=none을 더하세요. Word의 문단 스타일은 custom-style로 남으므로, 저자가 쓰던 자체 스타일을 LaTeX 환경에 대응시키는 실마리가 됩니다.
pandoc in.docx -o out.tex \
--extract-media=media \
--track-changes=accept \
--wrap=none
# with a bibliography and a journal style
pandoc in.docx -o out.tex --citeproc --bibliography=refs.bib --csl=apa.cslpandoc 없이 Word로 건네기: tex4ht의 ODT 출력
널리 알려져 있지는 않지만 TeX Live만으로도 워드프로세서 형식까지 낼 수 있습니다. make4ht -f odt file.tex를 실행하면 .odt(OpenDocument 텍스트)가 만들어집니다. 열어 보면 그림을 붙여 넣은 것이 아니었습니다. 수식이 application/vnd.oasis.opendocument.formula라는 ODF 수식 객체로 박혀 있고, 그 안에 든 것은 MathML입니다. 즉 워드프로세서 쪽에서도 수식이 수식으로 살아 있습니다. mk4ht oolatex file.tex도 같은 경로를 탑니다(오래된 글에는 oolatex라는 단독 명령이 나오지만, TeX Live 2024에서는 mk4ht의 작업 이름으로 부릅니다). Word는 OpenDocument 텍스트를 열 수 있고, 확실히 하려면 LibreOffice에서 열어 .docx로 다시 저장하면 됩니다. 편집 가능한 수식을 그대로 건네는 것이 목적이라면 pandoc 경로보다 결과가 좋을 때가 있습니다.
# LaTeX to OpenDocument text, using only TeX Live
make4ht -f odt file.tex
# the same route under its historical name
mk4ht oolatex file.tex다른 도구도 이름만은 적어 둡니다. writer2latex는 LibreOffice/OpenOffice 문서를 LaTeX로 바꾸는 오픈 소스 Java 도구이고, GrindEQ는 Word ↔ LaTeX 상용 변환기로 MathType 수식을 잘 다루는 것으로 알려져 있습니다. 둘 다 TeX Live에 들어 있지 않고 이 글을 쓴 환경에도 설치되어 있지 않아 동작을 확인하지 않았습니다. 도입한다면 먼저 실제 파일의 작은 부분으로 시험해서 수식과 그림이 살아남는지 직접 눈으로 확인하십시오.
Word를 요구하는 공저자와 어떻게 지낼까
- LaTeX을 원본으로 삼습니다.
.docx는 출력물이지 작업 파일이 아닙니다. Word에서 직접 고친 판을 원본으로 삼는 순간, 오갈 때마다 열화가 시작됩니다. - 절 단위로 건넵니다. 전문을 하나의
.docx로 만드는 것보다, 의견이 필요한 절만 건네는 편이 돌아왔을 때 합치기가 훨씬 쉽습니다. - 돌아오면 먼저
--track-changes=all로 읽습니다. 무엇이 바뀌었는지 보고 나서accept로 가져오거나, 바뀐 곳만 손으로 본문에 옮깁니다. - 그림은 처음부터 이미지 파일로 둡니다. TikZ는 pandoc을 지나며 사라지므로, 그림을 SVG나 PDF로 내보내
\includegraphics로 참조하는 구성이면 변환할 때마다 깨지지 않습니다. - 수식을 편집하게 하려면 ODT 경로도 시험해 보십시오.
make4ht -f odt는 수식을 MathML 수식 객체로 남깁니다. - 투고 규정은
--reference-doc안에 가둡니다. 여백과 스타일을 매번 Word에서 손으로 고치는 일은 두 번째부터 반드시 잊습니다.