LaTeX → HTML(tex4ht/make4ht/lwarp/LaTeXML)

2023년 12월, arXiv는 접수한 논문의 HTML 판을 함께 내놓기 시작했습니다. 30년 넘게 PDF 하나로 버티던 프리프린트 서버가 방침을 바꾼 이유는 접근성이었고, 변환을 맡은 것은 LaTeXML입니다. LaTeX를 HTML로 바꾸는 길은 이 밖에도 make4ht(tex4ht), lwarp, pandoc이 있는데, 선택은 사실 한 가지 질문으로 결정됩니다. 그 도구가 진짜 TeX 엔진을 돌리는가, 아니면 스스로 LaTeX를 해석하는가. 여기가 정해지면 직접 만든 매크로가 살아남는지, 수식이 MathML이 되는지 그림이 되는지, TikZ 그림은 어떻게 되는지가 줄줄이 따라옵니다.

LaTeX → HTML 변환기는 두 계통뿐입니다

한쪽은 TeX를 실행하는 계통으로 tex4ht(프런트엔드는 make4ht)와 lwarp가 여기에 속합니다. 다른 한쪽은 LaTeX를 스스로 해석하는 계통으로 LaTeXMLpandoc이 여기에 있습니다. 이 차이는 구현 취향이 아니라 변환 품질을 직접 결정합니다. TeX를 실행하는 쪽은 사용자가 쓴 \newcommand를 TeX 자신에게 전개시키므로 직접 만든 매크로나 낯선 패키지도 대체로 통과합니다. 대신 조판 과정을 옆에서 들여다보며 HTML을 조립한다는 곡예가 필요하고, 도구 구성이 무거워집니다. 스스로 해석하는 쪽은 빠르고 출력이 정갈하며 의미 태그도 잘 붙이지만, 모르는 명령은 끝내 모릅니다. arXiv가 LaTeXML을 고른 것은 투고된 LaTeX의 의미 구조——정리, 참조, 수식의 구조——를 그대로 HTML과 MathML로 옮기고 싶었기 때문이지, 지면의 겉모습을 재현하려던 것이 아닙니다.

도구TeX 실행 여부기본 수식 출력입수처
make4ht예, htlatex를 거칩니다인라인은 HTML, 별행은 SVG 이미지TeX Live에 포함
lwarp예, pdflatex 빌드를 두 갈래로 돌립니다SVG 이미지. mathjax 옵션이면 MathJaxTeX Live에 포함
latexml아니요, Perl 파서입니다MathMLPerl 프로그램. TeX Live에는 없습니다
pandoc아니요, 자체 AST로 옮깁니다--mathml 또는 --mathjax로 선택Haskell 프로그램. TeX Live에는 없습니다

make4ht와 tex4ht: 조판을 옆에서 훔쳐보는 발명

문서가 이미 있고 어떻게든 HTML이 필요하다면 첫수는 make4ht file.tex입니다. 따로 설치할 것이 없고 TeX Live에 처음부터 들어 있습니다. 방식은 과감합니다. tex4ht는 문서를 평소대로 TeX에게 조판시키면서 DVI 흐름에 몰래 끼워 넣은 훅으로 HTML 태그를 함께 뱉어 냅니다. 그래서 컴파일되는 문서는 대개 변환도 됩니다. \newcommand로 직접 정의한 명령도 마찬가지인데, 전개는 TeX가 해 주므로 변환기는 그런 명령이 있었다는 사실조차 알 필요가 없습니다. \newcommand{\stress}[1]{\textbf{\itshape #1}}를 정의한 시험 문서를 통과시키자 HTML 쪽에 굵은 이탤릭에 해당하는 span이 제대로 나왔습니다. tex4ht를 쓴 사람은 오하이오 주립대학의 Eitan Gurari(1947–2009)로, 1996년부터 혼자 키워 온 작업입니다. 2009년 갑작스러운 죽음 이후 Michal Hoftich와 Karl Berry 등이 이어받았습니다. TeX Live 2024에 들어 있는 README에는 지금도 이 문서가 원작자 Gurari가 쓴 것이며 그의 사후 거의 손대지 않았다고 적혀 있습니다.

terminal
# the friendly front-end: HTML5 by default, no options needed
make4ht file.tex

# the classic driver, still what make4ht calls underneath
htlatex file.tex "html5,charset=utf-8" " -cunihtf -utf8"

htlatex를 직접 두드리는 형태는 오래된 해설에 자주 나오지만, 요즘 정석은 make4ht입니다. Michal Hoftich가 Lua로 만든 빌드 프런트엔드로, HTML5가 기본이고 bibtex이나 makeindex 실행, 생성된 HTML의 후처리, 이미지 변환까지 명령 하나에 묶어 줍니다. 세밀한 조정은 Lua 빌드 파일에 적으면 됩니다. 그래도 tex4ht의 출력은 HTML이라기보다 조판 결과를 HTML로 사생한 것처럼 보일 때가 있습니다. 기본값에서는 TeX의 폰트 이름이 그대로 CSS 클래스가 되기 때문인데, 본문 곳곳에 cmr-12, cmmi-10 같은 이름이 붙습니다. 웹에 올릴 생각이라면 doc.css를 갈아 끼우거나 자기 스타일시트를 덧씌울 것을 전제로 삼는 편이 낫습니다. 패키지별 변환 규칙은 .4ht 설정 파일에 들어 있고, TeX Live 2024의 tex4ht에는 496개가 함께 실려 있습니다.

수식은 MathML인가, 이미지인가, MathJax인가

기본값인 make4ht file.tex는 인라인 수식을 HTML 문자열로, 별행 수식을 SVG 이미지로 만듭니다. TeX Live 2024에서 실제로 돌려 보니 $f\colon \R \to \R$가 든 평범한 텍스트가 되었고, \begin{equation}의 내용만 doc0x.svg라는 이미지가 되어 alt 속성에는 수식을 아스키 아트로 근사한 문자열이 들어갔습니다. 이 기본값은 읽히기는 하지만 확대하면 거칠고, 복사도 안 되며, 검색에도 걸리지 않습니다. 수식이 주인공인 문서라면 옵션으로 출력을 바꿔야 합니다. make4ht -u file.tex "mathml"을 쓰면 별행 수식까지 MathML이 되고 이미지는 TikZ 그림 하나만 남았습니다. make4ht -u file.tex "mathjax"면 수식이 LaTeX 그대로 HTML에 박히고 headwindow.MathJax 설정과 MathJax 3 로더가 들어갑니다.

terminal
# display math as an SVG image (the default)
make4ht file.tex

# display math as MathML — only TikZ pictures stay images
make4ht -u file.tex "mathml"

# leave the math as LaTeX and let MathJax 3 render it in the browser
make4ht -u file.tex "mathjax"

여기에 mathjax를 고른 사람만 밟는 함정이 있습니다. 직접 만든 매크로가 전개되지 않습니다. MathML과 이미지는 TeX가 조판한 결과이므로 \newcommand는 당연히 이미 적용되어 있지만, mathjax는 수식을 원본 그대로 써 내보내는 방식입니다. 실측해 보니 \newcommand{\R}{\mathbb{R}}를 정의한 문서의 HTML에는 \(f\colon \R \to \R \)가 글자 그대로 들어갔고, \newcommand 정의는 하나도 함께 나오지 않았습니다. 브라우저의 MathJax는 \R을 모르니 그 수식만 빨간 미정의 오류가 됩니다. 해결책은 MathJax 설정에 같은 매크로를 다시 적어 주는 것입니다(window.MathJax 안의 tex.macros). 뒤집어 말하면, 자작 매크로를 많이 쓰는 문서에는 mathml 쪽이 안전합니다. 접근성 면에서도 화면 낭독기는 이미지가 아니라 MathML을 읽습니다.

lwarp: HTML을 PDF로 조판한 뒤 pdftotext로 꺼냅니다

Brian Dunn의 lwarp는 같은 문제를 전혀 다른 각도에서 풉니다. lwarp가 쓰는 것은 LaTeX의 출력 기구 그 자체로, pdflatex에게 HTML 소스 코드를 본문처럼 조판시킨 뒤 완성된 PDF에서 pdftotext로 글자를 뽑아 .html로 만듭니다. 믿기 어렵지만 TeX Live에 들어 있는 lwarpmk.lua를 열어 보면 pdftotext -enc UTF-8 -nopgbrk -layout을 부르는 줄이 실제로 있습니다. 여기서 시험한 네 절짜리 문서에서도 HTML 생성용 중간 PDF는 16쪽이 되었습니다. 이렇게 돌아가는 데에는 이유가 있습니다. LaTeX의 상호 참조, 목차, 색인, 문헌 목록 기구를 그대로 쓸 수 있기 때문입니다. lwarp는 지원하는 패키지마다 HTML 쪽 대체 구현을 갖고 있고, TeX Live 2024에는 lwarp-*.sty593개 들어 있습니다.

latex
% lwarp must be loaded BEFORE anything that pulls in color, graphics or hyperref
\documentclass{article}
\usepackage{lwarp}
\usepackage{amsmath,amssymb}
\usepackage{tikz}
\usepackage{hyperref}

% repeat your own macros for MathJax mode:
% \CustomizeMathJax{\newcommand{\R}{\mathbb{R}}}
terminal
pdflatex doc.tex     # first pass writes lwarpmk.conf and doc_html.tex
lwarpmk html         # build the HTML
lwarpmk limages      # render the math and picture images

실제로 돌려 보면 가장 먼저 부딪히는 것은 읽어 들이는 순서입니다. \usepackage{lwarp}tikz 뒤에 두었더니 ! Package lwarp Error: Package color, or one which uses color, must be loaded after Lwarp.로 멈췄습니다. lwarp는 거의 모든 패키지보다 먼저 불러야 합니다. 기존 문서에 나중에 붙일 때의 가장 큰 장애물이 바로 여기입니다. 수식은 기본적으로 SVG 이미지가 되지만 alt 속성에는 LaTeX 소스가 그대로 들어가고 요소에는 role="math"가 붙습니다(\usepackage[mathjax]{lwarp}로 하면 MathJax로 바뀌고, 자작 매크로는 \CustomizeMathJax로 보충합니다). 이미지는 lwarpmk limages라는 별도 단계에서 만들어지는데, 내부에서는 pdfseparatepdfcroppdftocairo -svg 순으로 돕니다. 이 사이트의 이미지 내보내기 페이지에서 설명하는 것과 똑같은 흐름입니다.

LaTeXML과 arXiv의 HTML 판

LaTeXML은 미국 국립표준기술연구소(NIST)의 Bruce Miller가 만든 Perl 변환기로, LaTeX를 먼저 의미적 XML로 낮춘 뒤 HTML5와 MathML, ePub, JATS 등으로 써 냅니다. 처리는 두 단계입니다. latexml이 XML을 만들고 latexmlpost가 그것을 HTML로 바꿉니다. 이 분업 덕분에 해석과 표현이 떨어져 나가고, 같은 XML에서 여러 출력 형식을 얻을 수 있습니다. arXiv가 2023년 12월부터 HTML 판을 내보낼 수 있었던 것도 같은 계보의 연장으로, 앞서 있던 arXivLabs 프로젝트 ar5iv가 LaTeXML로 전체 논문을 HTML로 바꿔 온 축적이 바탕이 되었습니다. 수식이 많고 의미 구조와 접근성이 중요하다면 첫 번째 후보입니다. 다만 LaTeXML은 TeX Live에 들어 있지 않습니다. Perl 배포판으로 따로 설치해야 하며, 이 글을 쓴 환경에도 latexml이 없었기 때문에 위의 두 단계 설명은 공식 문서에 근거한 것이지 직접 실행한 결과가 아닙니다.

terminal
# LaTeXML is a separate Perl install, not part of TeX Live
latexml --dest=file.xml file.tex
latexmlpost --dest=file.html file.xml   # HTML5 + MathML

자작 매크로와 TikZ는 어디까지 통과할까요

솔직히 적자면, 자작 매크로와 TikZ에 기댄 문서는 깔끔하게 변환되지 않습니다. 자작 매크로에서는 TeX를 실행하는 계통(tex4ht, lwarp)이 유리합니다. TeX가 전개해 버리므로 변환기는 원래 명령을 보지도 못합니다. 하지만 전개가 남기는 것은 굵게, 기울임 같은 겉모습 지시일 뿐 의미가 아니어서 의미에 대응하는 HTML 태그는 붙지 않습니다. \newcommand{\keyterm}[1]{\textbf{#1}}<b>에 해당하는 결과는 되어도 <dfn>은 되지 않습니다. TikZ는 더 분명한 타협이 필요합니다. tex4ht도 lwarp도 같은 결론에 이르러 그림을 이미지로 붙입니다. 여기서 한 실험에서도 TikZ 그래프는 doc0x.svg라는 SVG 한 장이 되었고 alt에는 노드 라벨만 늘어섰습니다. HTML로서 의미 있는 그림을 원한다면 변환기에 기대기보다 그림만 따로 내보내고 alt를 직접 적는 편이 결국 빠릅니다.

무엇을 고를까: 용도별 결론

  • 어쨌든 HTML이 필요하고 환경은 늘리기 싫다make4ht file.tex. TeX Live에 들어 있고 문서를 손대지 않아도 돌아갑니다.
  • 수식을 MathML로 하고 싶다(낭독・검색・확대에 강함) → make4ht -u file.tex "mathml" 또는 LaTeXML.
  • LaTeX 기능을 최대한 살린 제대로 된 웹판이 필요하다lwarp. 단 \usepackage{lwarp}를 맨 앞에 둘 수 있는 문서에 한합니다.
  • 논문을 arXiv식 의미적 HTML로 만들고 싶다LaTeXML(Perl. TeX Live와 별도로 설치).
  • 원본이 Markdown이고 출력은 가벼워도 된다pandoc(Haskell. 별도 설치). LaTeX 입력 지원 범위는 제한적입니다.
  • TikZ 그림이 주인공이다 → 변환기에 맡기지 말고 그림마다 따로 SVG로 내보낸 뒤 alt를 직접 씁니다.