LaTeX으로 파인만 도표를 그리는 고전적인 방법에서는 도표 하나가 글꼴의 문자 하나가 됩니다. 비유가 아닙니다. TeX Live 2024에서 feynmf의 도표를 METAFONT에 통과시키면 "Font metrics written on myfd.tfm"에 이어 "Output written on myfd.600gf (1 character, 4340 bytes)"라고 보고합니다. 문자 수 1. 산란 과정의 그림이 글자폭 표까지 갖춘 활자로 주조된 것입니다. 과학 분야의 그림에는 분야마다 고유한 "그리는 문법"이 있고, 전용 패키지는 그 문법을 그대로 입력으로 받습니다. 이 페이지에서는 화학의 mhchem, chemfig, XyMTeX, 물리의 tikz-feynman, feynmf, 그리고 분자 궤도 도표의 modiagram을 무엇을 만드는 도구인가와 어느 엔진에서 도는가라는 두 축으로 정리합니다.
같은 "화학ㆍ물리 그림"이라도 만들려는 대상에 따라 도구가 뚜렷이 갈립니다. 먼저 대응표로 전체를 잡고 하나씩 살펴보겠습니다.
| 패키지 | 분야 | 만들 수 있는 것 | 엔진 / 패스 |
|---|---|---|---|
mhchem | 화학 | 문자로 조판하는 화학식과 반응식(H2O, 2H2+O2 -> 2H2O) | 어느 엔진이든. 1패스 |
chemfig | 화학 | 구조식ㆍ골격식ㆍ반응 스킴 | TikZ 기반. pdf/lua/xe 모두 |
xymtex | 화학 | 구조식. 고리와 골격을 명령으로 호출 | 표준 LaTeX. PostScript / PDF 모드도 지원 |
tikz-feynman | 물리 | 파인만 도표. 꼭짓점을 적으면 자동 배치 | LuaLaTeX 전제. 다른 엔진에서는 배치가 퇴화 |
feynmf / feynmp | 물리 | 파인만 도표. 각 도표가 글꼴 글리프나 MetaPost 그림이 됨 | 2패스. mf 또는 mpost를 따로 실행 |
modiagram | 화학ㆍ물리 | 분자 궤도(에너지 준위) 도표 | TikZ 기반. 1패스 |
본문에 화학식과 반응식을 쓰기 — mhchem의 \ce{}
mhchem은 구조를 그리는 도구가 아니라 화학식과 반응식을 문자로 조판하는 패키지입니다. \usepackage[version=4]{mhchem}로 불러오고, 핵심 명령 \ce{...}(chemical equation) 안에 식을 씁니다. 영리한 점은 자연스럽게 입력하기만 해도 화학 표기가 된다는 것입니다. 원소 기호 바로 뒤의 숫자는 자동으로 아래 첨자가 되고(\ce{H2O}), ^를 붙인 숫자나 기호는 전하 위 첨자가 됩니다(\ce{SO4^2-}). 화살표는 ->(정반응), <=>(평형), <-(역반응)를 그대로 칠 수 있고, +는 반응물의 덧셈으로 알맞은 간격을 두고 조판됩니다.
\usepackage[version=4]{mhchem}
% ...
\ce{2 H2 + O2 -> 2 H2O}
\ce{CO2 + C ->[\Delta] 2 CO}
\ce{H2O <=> H+ + OH-}
\ce{Ba^2+ + SO4^2- -> BaSO4 v}
\ce{C\bond{-}C}이들은 순서대로 물의 생성(계수와 아래 첨자가 알아서 정렬됨), 가열(->[\Delta]가 화살표 위에 조건 라벨을 올림. ->[위][아래]로 두 개를 쓸 수도 있습니다), 물의 전리 평형(양방향 평형 화살표), 황산 바륨의 침전(끝의 v가 아래쪽 화살표가 됨. 발생 기체는 ^), 그리고 \bond로 나타낸 단일 결합 기호로 조판됩니다. \ce{}는 본문에서도 $...$ 수식 안에서도 씁니다. 다만 구조식은 그릴 수 없습니다. 결합선이나 고리는 범위 밖입니다. 골격 그림이 필요하다면 다음의 chemfig 차례입니다. 같은 목표의 후발 패키지로 chemformula가 있으며, 그쪽은 \ch{...}를 씁니다.
구조식을 한붓그리기로 — chemfig의 결합 기호와 각도
chemfig는 분자의 구조식(골격도)을 그리는 대표 도구로, TikZ를 바탕으로 "결합과 분기의 미니 언어"로 분자를 기술합니다. 불러오기는 \usepackage{chemfig}뿐이고, 핵심 명령은 \chemfig{...}입니다. 문법의 핵심은 결합 기호와 각도 둘입니다. 결합은 -(단일), =(이중), ~(삼중)을 원자 사이에 두고, 방향은 바로 뒤의 대괄호로 지정합니다. [2]처럼 0~7의 숫자는 45° 간격의 미리 정해진 방향이며, [0]은 동쪽(오른쪽), 반시계 방향으로 [2]는 바로 위, [4]는 서쪽, [6]은 바로 아래입니다. 임의 각도는 [:30]처럼 콜론을 붙여 절대 각도로 씁니다. 괄호 (...)는 주 사슬에서 가지를 냅니다.
\usepackage{chemfig}
% ...
% methane: hydrogens west, up, down, east
\chemfig{H-C(-[2]H)(-[6]H)-H}
% benzene: alternating bonds, then the inscribed-circle form
\chemfig{*6(=-=-=-)}
\chemfig{**6(------)}메테인 예에서는 먼저 H-C로 탄소의 서쪽에 수소를 두고, 이어지는 가지 (-[2]H)와 (-[6]H)로 바로 위와 바로 아래에 수소를, 마지막 -H로 동쪽(기본 방향)에 수소를 뻗어 십자 모양의 CH4가 됩니다. 벤젠에서는 *6(...)이 6원자 고리를 뜻하고, 괄호 안의 =-=-=-가 단일 결합과 이중 결합을 번갈아 놓습니다. *는 보통 고리를, 두 번 겹친 **는 안쪽에 원을 그린 방향족 고리 표현을 만듭니다. chemfig는 반응 스킴도 그립니다. \schemestart ... \schemestop으로 감싸고 분자를 늘어놓은 뒤 \arrow로 화살표를 넣습니다. \arrow{->[시약]}으로 화살표 위에 시약이나 조건을 쓸 수 있고, \arrow{<=>}는 평형 화살표가 됩니다.
\schemestart
\chemfig{H-C(-[2]H)(-[6]H)-H}
\arrow{->[\small oxidation]}
\chemfig{O=C(-[2]H)-[6]H}
\schemestop이는 메테인의 구조식에서 산화를 나타내는 라벨 달린 화살표를 거쳐 포름알데하이드의 구조식으로 이어지는 가로 방향 스킴입니다. chemfig는 TikZ 위에 있으므로 pdfLaTeX, LuaLaTeX, XeLaTeX 어디서든 동작하고 보통 추가 드라이버 설정이 필요 없습니다(DVI 경유 pLaTeX에서는 dvipdfmx를 지정). TeX Live 2024에 들어 있는 것은 1.66(2023년 12월 28일)이며 작성자는 Christian Tellechea입니다.
고리를 명령으로 호출하기 — XyMTeX
구조식을 그리는 또 하나의 원로가 XyMTeX(후지타 신사쿠 제작)이며, 발상이 chemfig와 정반대입니다. chemfig가 "결합을 한붓그리기"라면, XyMTeX는 고리나 골격 자체를 명령으로 호출하고 치환기를 인수로 넘깁니다. 예컨대 \bzdrv{1==Cl;4==OH}라고 쓰면 벤젠 고리의 1번 자리에 Cl, 4번 자리에 OH가 붙은 구조가 나옵니다. 무엇이 어디에 붙는지를 위치 번호로 지정하는, 화학 명명법 그대로의 표기입니다. 복잡한 축합 다환과 치환 패턴을 정형화된 명령으로 안정적으로 조판할 수 있다는 점이 강점입니다.
\usepackage{xymtex}
% ...
% benzene with Cl at position 1 and OH at position 4
\bzdrv{1==Cl;4==OH}새로 쓰기 시작한다면 표기가 더 직관적이고 관리도 활발한 chemfig를 고르는 사람이 많을 것입니다. XyMTeX가 지금도 유용한 때는 그것으로 쓰인 기존 원고를 유지보수할 때, 그리고 위치 번호로 지정하는 방식이 손에 익은 경우입니다. 출력은 LaTeX 표준 모드 외에 PostScript와 PDF 모드를 지원합니다.
tikz-feynman은 LuaLaTeX 전제 — pdfLaTeX에서 나오는 경고
LuaLaTeX으로 컴파일하세요. 다른 엔진에서도 "돌아가기는" 하지만 자동 배치가 듣지 않고, 배치 관련 키는 조용히 무시되는 것이 아니라 하나씩 경고로 보고됩니다. TeX Live 2024의 pdflatex로 시험하니 먼저 "Package tikz-feynman Warning: LuaTeX is required if you wish to have vertices automatically placed."가 나오고, 이어서 horizontal, node distance, level distance, sibling distance 각각에 대해 "The key you tried to use ... requires LuaTeX. It will be ignored."가 줄지어 나왔습니다. 배치 알고리즘이 Lua로 쓰였기 때문이며, lualatex으로 바꾸자 경고가 하나도 나오지 않았습니다.
한 가지 더, compat 번호에 주의하세요. 자주 인용되는 \usepackage[compat=1.0.0]{tikz-feynman}는 TeX Live 2024에서 경고를 냅니다. "Package tikz-feynman Warning: The preamble requested version 1.0.0, but the system version is 1.1.0. This may change some diagrams." 동봉된 것은 1.1.0(2016년 2월 5일) 이므로 compat=1.1.0이라고 쓰는 것이 맞습니다. 이 키의 역할은 패키지가 갱신되어 그림이 달라질 때 알아차리게 하는 것이므로, 자기 환경에 설치된 판에 맞춰 쓰는 것이 본래 사용법입니다(주 번호가 어긋나면 경고가 아니라 오류가 납니다).
% compile with lualatex
\usepackage[compat=1.1.0]{tikz-feynman}
% ...
% one-shot command: e+ e- -> mu+ mu- via a photon
\feynmandiagram [horizontal=a to b] {
i1 -- [fermion] a -- [fermion] i2,
a -- [photon] b,
f1 -- [fermion] b -- [fermion] f2,
};이 그림은 전형적인 s-채널 산란입니다. 왼쪽의 쌍이 꼭짓점 a에서 합류하고, a와 b를 물결선(광자) 이 잇고, 오른쪽에서 다른 쌍으로 갈라집니다. 선 스타일은 [fermion](화살표 달린 직선), [photon](물결선), [gluon](나선) 등으로 지정하며, 꼭짓점은 이름만 적으면 암묵적으로 만들어집니다. horizontal=a to b는 "a와 b를 수평으로 놓아라"라는 배치 힌트로, 앞서 pdfLaTeX가 무시하겠다고 경고하던 바로 그 키입니다. 위치를 세밀하게 정하려면 tikzpicture 안에 feynman 환경을 열고 \vertex로 꼭짓점을 놓은 뒤 \diagram*으로 잇습니다.
feynmf / feynmp — 1989년에 태어난 2패스 방식
이 계열은 그림을 LaTeX 밖에서 조판하고 결과를 가져오는 2패스 방식입니다. feynmf는 METAFONT를, feynmp는 MetaPost를 씁니다. 작성자는 Thorsten Ohl이며, feynmf.sty의 저작권 표시는 1989년까지 거슬러 올라갑니다. LaTeX2e(1994년)보다 이릅니다. TeX Live 2024에 들어 있는 것은 v1.08이고, 내부 판 관리 타임스탬프는 여전히 1996년입니다. 달리 말하면 30년 가까이 손댈 필요가 없었다는 뜻이기도 합니다.
작성 방식은 선언적입니다. 그림은 fmffile 환경에서 파일 이름별로 묶고, 그 안의 fmfgraph(또는 fmfgraph*)에서 외부 다리를 \fmfleft와 \fmfright에, 선을 \fmf{...}에 씁니다. 꼭짓점 좌표는 쓰지 않습니다. 어느 다리가 어느 꼭짓점을 지나 어디로 빠지는지만 말하면 배치는 알아서 해 줍니다. \fmf{fermion}{i1,v1,o1}은 "i1에서 v1을 거쳐 o1으로 페르미온 선을 그으라"는 뜻입니다.
% feynmp-auto runs MetaPost for you: pdflatex -shell-escape document
\usepackage{feynmp-auto}
% ...
\begin{fmffile}{myfd}
\begin{fmfgraph*}(120,80)
\fmfleft{i1,i2}
\fmfright{o1,o2}
\fmf{fermion}{i1,v1,o1}
\fmf{photon}{v1,v2}
\fmf{fermion}{i2,v2,o2}
\end{fmfgraph*}
\end{fmffile}여기서 이 페이지 첫머리의 이야기로 돌아옵니다. feynmf 경로에서는 첫 번째 LaTeX 실행이 myfd.mf, 곧 METAFONT 소스를 써 내고, 이를 mf에 통과시키면 그림이 글꼴로 주조됩니다. TeX Live 2024에서 실제로 돌린 METAFONT의 보고가 "Font metrics written on myfd.tfm"과 "Output written on myfd.600gf (1 character, 4340 bytes)"였습니다. 그림 하나가 문자 하나. 두 번째 LaTeX 실행은 그 글꼴의 첫 번째 문자를 본문에 놓을 뿐입니다. feynmp(MetaPost 경로)라면 글꼴이 아니라 보통의 그림이 나오므로, 현대의 PDF 작업 흐름에서는 대개 이쪽을 고릅니다.
실무에서는 feynmp-auto를 불러오는 편이 수월하며, MetaPost 실행을 자동화해 줍니다. 다만 외부 프로그램을 띄우는 이상 --shell-escape가 필요하고, 빠뜨렸을 때가 성가십니다. TeX Live 2024에서 시험해 보니 경고도 오류도 없이 그저 그림 없는 PDF가 만들어졌습니다. 그림 자리가 비어 있다면 우선 -shell-escape를 빠뜨리지 않았는지 의심하세요. 붙이고 두 번 돌리면 mpost가 실행되고 그림이 들어갑니다.
분자 궤도 도표의 modiagram — MOdiagram 환경은 비권장이 되었습니다
환경 이름은 소문자 modiagram을 쓰세요. 인터넷의 예제들, 그리고 이 페이지의 예전 판을 포함해 \begin{MOdiagram}이라고 쓰는 예가 널리 퍼져 있지만, TeX Live 2024의 modiagram 0.3a에서 그것을 쓰면 "Package modiagram Warning: The environment MOdiagram is deprecated. Use modiagram instead."라고 경고합니다. 그림 자체는 나오지만, 언젠가 사라질 이름을 계속 쓸 이유는 없습니다. 소문자로 바꾸면 경고는 나오지 않습니다.
분자 궤도 도표(MO 도표) 는 화학과 물리의 경계에 있는 그림으로, 원자 궤도(AO)가 결합성ㆍ반결합성 분자 궤도(MO)로 조합되는 모습을 에너지 높이에 따라 세로로 배열해 보여 줍니다. 바로 이를 위해 만들어진 것이 modiagram(Clemens Niederberger 제작, TeX Live 2024에서는 0.3a)이며 바탕은 TikZ입니다. \usepackage{modiagram}으로 불러오고, 환경 안에서 좌우 원자 궤도는 \atom으로, 그것들을 잇는 분자 궤도는 \molecule로 씁니다.
\usepackage{modiagram}
% ...
% lower-case environment name: MOdiagram is deprecated
\begin{modiagram}
\atom{left}{ 1s = {0; up} }
\atom{right}{ 1s = {0; up} }
\molecule{ 1sMO = {1; pair, } }
\end{modiagram}이것은 수소 분자 H2를 나타내는, 있을 수 있는 가장 단순한 MO 도표입니다. \atom{left}와 \atom{right}가 각각 1s 궤도에 위쪽 스핀 전자 하나씩을 놓고({0; up}의 0은 에너지 준위), \molecule이 둘을 결합성 궤도로 합쳐 전자쌍(pair)을 넣습니다. 전자의 채움 방식(up, down, pair)과 준위 높이만 인수로 주면 가로선과 스핀 화살표로 이루어진 준위 도표가 저절로 짜입니다. 같은 종류의 준위 도표는 순수 TikZ로도 그릴 수 있지만, modiagram은 MO 도표의 관례에 특화된 만큼 정형적인 그림을 더 짧고 정확하게 쓸 수 있습니다.
용도별 선택과 컴파일에서 막히기 쉬운 곳
선택은 무엇을 만들고 싶은가에서 자연스럽게 따라 나옵니다. 문장 안에 화학식과 반응식을 쓴다면 mhchem, 구조식이나 반응 스킴을 그린다면 chemfig(복잡한 축합 고리에 명령 기반 방식이 맞으면 XyMTeX), 파인만 도표라면 tikz-feynman(오래된 환경이나 기존 원고라면 feynmf / feynmp), 분자 궤도 도표라면 modiagram입니다. mhchem과 chemfig는 경쟁이 아니라 보완 관계이며, 본문의 식은 mhchem, 별행의 골격은 chemfig처럼 같은 문서에서 함께 쓰는 것이 흔한 형태입니다.
경험상 컴파일에서 막히는 원인은 대략 세 가지로 좁혀집니다. 엔진이 다름 — tikz-feynman의 배치에는 LuaLaTeX이 필요합니다. --shell-escape 누락 — feynmp-auto는 말없이 그림을 빠뜨립니다. 그리고 패스 수 — feynmf / feynmp는 두 번 돌려야 그림이 들어갑니다. 여기에 더해 chemfig와 modiagram은 TikZ 기반이라 그림 수가 늘면 계산이 무거워집니다. tikzexternalize로 그림을 캐시하거나 standalone 클래스로 그림만 따로 컴파일하면 편집 중 대기 시간이 눈에 띄게 줄어듭니다.