LaTeX으로 화학식을 조판할 때 가장 먼저 정할 것은 쓰는 법이 아니라 어떤 패키지를 불러올지입니다. mhchem의 \ce{H2O}와 chemmacros의 \ch{H2O}는 둘 다 같은 H₂O를 냅니다. 그런데 이 둘을 순순히 함께 불러오면 ! LaTeX Error: Option clash for package mhchem.으로 떨어집니다. 순서를 바꿔도 마찬가지였습니다. 이 페이지에서는 \ce{}로 반응식・전하・상태・동위원소를 어떻게 치는지, IUPAC 명명법을 어떻게 조판하는지, 그리고 chemmacros가 v6에서 모듈 기구를 버린 뒤 무엇이 달라졌는지를 TeX Live 2024에서 실제로 컴파일하며 정리합니다. 구조식을 그리는 표기법 자체(결합 기호와 각도, 고리 쓰는 법)는 「화학・물리 그림」 페이지가 주인이므로, 여기서는 문서에 넣는 쪽에서 다룹니다.
mhchem 사용법 — \ce{}는 “순순히 치면 바르게 나온다”
\usepackage{mhchem}을 불러오고 화학에 관한 것은 전부 \ce{...} 안에 씁니다. 설계 사상은 일관됩니다. 종이에 쓰듯 치면 조판이 바르게 나옵니다. 원소 기호 바로 뒤의 숫자는 아래 첨자로 내려가고(\ce{H2O} → H₂O), ^ 뒤의 숫자와 부호는 전하 위 첨자가 되며(\ce{SO4^2-} → SO₄²⁻), ->는 반응 화살표, <=>는 평형 화살표가 됩니다. 괄호 안의 상태 기호 (aq), (s), (l), (g)는 적은 그대로 통과하고, 끝의 v는 침전을 뜻하는 아래 화살표, ^는 발생하는 기체의 위 화살표입니다. TeX Live 2024 동봉판은 v4.10(2024년 1월 29일), 작성자는 Martin Hensel입니다.
\usepackage{mhchem}
% ...
\ce{2 H2 + O2 -> 2 H2O} % a balanced reaction
\ce{SO4^2-} % ion with charge
\ce{CO2 + C <=> 2 CO} % equilibrium
\ce{NaCl(aq) + AgNO3(aq) -> AgCl(s) v + NaNO3(aq)} % states, precipitate
\ce{CaCO3 ->[$\Delta$] CaO + CO2 ^} % labelled arrow, gas evolved
\ce{^{227}_{90}Th+} % isotope with mass and atomic number
\ce{CuSO4.5H2O} % the dot becomes a centred dot
\ce{H+ + OH- <=>> H2O} % unequal equilibrium위의 모든 줄을 TeX Live 2024에서 통과시키고 pdftotext로 내용을 확인했습니다. 화살표에는 대괄호로 라벨을 얹을 수 있고, ->[위][아래]처럼 둘을 쓰면 위아래에 각각 다른 조건이 들어갑니다. 동위원소는 \ce{^{227}_{90}Th+}처럼 질량수와 원자번호를 기호 앞에 쌓아 둘 수 있고, 수화물의 가운뎃점은 \ce{CuSO4.5H2O}의 마침표가 그대로 가운데 점이 됩니다. 평형 화살표는 <=> 외에 한쪽이 우세한 <=>>와 <<=>가 있습니다. \ce{}는 본문에서도 $...$ 안에서도 똑같이 작동하므로, 문단 한가운데에 화학식을 끼워 넣는 용도로 그대로 쓸 수 있습니다.
| 입력 | 출력 | 기억법 |
|---|---|---|
H2O | H₂O | 원소 기호 바로 뒤의 숫자는 자동으로 아래 첨자 |
SO4^2- | SO₄²⁻ | ^ 뒤의 숫자와 부호는 전하로서 위 첨자 |
2 H2 + O2 -> 2 H2O | 계수와 반응 화살표가 붙은 반응식 | 계수는 공백으로 띄워 앞에 둡니다. ->가 화살표 |
CO2 + C <=> 2 CO | 평형 화살표 | <=>는 균형, <=>>와 <<=>는 한쪽 우세 |
AgCl(s) v | AgCl(s)↓ | 상태 기호는 그대로. 끝의 v가 침전 화살표 |
CaCO3 ->[$\Delta$] CaO | 화살표 위에 Δ가 얹힘 | ->[위][아래]로 화살표 위아래에 조건을 적을 수 있음 |
CuSO4.5H2O | CuSO₄·5H₂O | 수화물의 마침표가 가운뎃점이 됩니다 |
여기서 작은 이야기 하나. mhchem.sty를 열면 맨 앞 주석에 관리자의 연락처가 ROT13으로 암호화되어 놓여 있습니다. 이유도 적혀 있는데, 스팸 대책이라고 합니다. “ROT13을 모르면 인터넷에서 검색하라”는 주석까지 붙어 있습니다. 20년 넘게 유지보수가 이어진 패키지에서 가장 사람 냄새 나는 구석입니다. 구현 자체는 현대적이어서 expl3, l3keys2e, calc, amsmath, chemgreek, graphics를 스스로 불러옵니다. amsmath는 mhchem이 알아서 읽으므로 직접 쓸 필요가 없습니다.
Option clash for package mhchem이 나왔다면
mhchem과 chemmacros를 둘 다 \usepackage로 쓰면 ! LaTeX Error: Option clash for package mhchem.으로 멈춥니다. TeX Live 2024에서 두 순서를 모두 시험했지만 어느 쪽이 먼저든 마찬가지였습니다. 원인은 chemmacros가 화학식 엔진을 내부에서 고르는 구조이고, 그 과정에서 mhchem을 자체 옵션과 함께 불러오기 때문입니다. 정답은 \usepackage[formula=mhchem]{chemmacros}라고 쓰는 것입니다. 이것만으로 충돌이 사라지고 chemmacros의 \ch{...}가 내부에서 mhchem을 쓰게 됩니다. 실제로 \ch{2 H2 + O2 -> 2 H2O}와 \iupac{ethanol}이 같은 문서에서 오류 없이 통과했습니다.
% WRONG -- fails with "! LaTeX Error: Option clash for package mhchem."
% \usepackage{chemmacros}
% \usepackage{mhchem}
% RIGHT -- let chemmacros load mhchem itself
\usepackage[formula=mhchem]{chemmacros}
% ...
\ch{2 H2 + O2 -> 2 H2O}
\iupac{ethanol}겸사겸사 chemmacros를 맨몸으로 불러올 때 나오는 두 메시지를 알아 두면 마음이 놓입니다. 하나는 Package chemmacros Warning: You haven't loaded any package for upright Greek으로, 정체 그리스 문자를 내는 기구를 chemgreek을 통해 고르지 않았다는 경고입니다. α-아미노산의 α를 쓰는 순간 바로 필요해집니다. 다른 하나는 Package chemmacros Info: You haven't chosen a formula method so I'm assuming으로 시작하는 정보 줄이며, 이것이 위의 formula= 키에 해당합니다. 둘 다 오류는 아니지만, 화학식의 모습이 생각과 다를 때 먼저 의심할 곳이 이 두 줄입니다.
chemmacros v6 — 모듈은 이제 없습니다
chemmacros를 “모듈을 골라 불러오는 종합 번들”이라고 설명한 글은 이미 낡은 정보입니다. TeX Live 2024 동봉판은 v6.2a(2022년 3월 11일, Clemens Niederberger 작)이고, 패키지 스스로 이렇게 알립니다. 모듈 기구는 v6에서 바뀌었고, 모든 모듈은 본체에 통합되어 minimal 옵션을 붙이지 않는 한 처음부터 불러와져 있으며, 새 기본값은 이전의 modules=all에 해당한다고. \usechemmodule을 쓰면 그 경고만 나오고 아무 일도 일어나지 않습니다. 즉 \usepackage{chemmacros} 한 줄로 명명법도, 산화수도, 뉴먼 투영도 모두 쓸 수 있는 상태가 됩니다. 화학식 엔진은 기본적으로 chemformula로, mhchem과 비슷한 \ch{...}를 지닌 별개 패키지이며 \usepackage{chemformula}로 단독으로도 쓸 수 있습니다.
옛 원고를 다시 컴파일하는 쪽을 위한 구제책도 마련되어 있습니다. chemmacros.sty 첫머리에 \DeclareRelease {v4} {2015-02-08}과 \DeclareRelease {v5} {2020-03-07}이 나란히 있고, TeX Live에는 chemmacros-2015-02-08.sty와 chemmacros-2020-03-07.sty가 실제로 동봉되어 있습니다. LaTeX의 롤백 기구로 옛 판을 날짜로 지목할 수 있으니, v5 시절에 쓴 논문이 v6에서 무너졌다면 다시 쓰기 전에 먼저 옛 판을 지정해 견주어 보십시오.
IUPAC 명명법 조판 — \iupac과 입체 기술자의 이탤릭
유기 화합물의 이름은 겉모습이 규약으로 정해져 있다는 점에서 수식과 닮았습니다. \iupac{...}은 그 규약을 돌보는 명령으로, 안에서 \-는 줄바꿈해도 되는 하이픈, \higher{...}는 입체 기술자를 위로 올려 이탤릭으로 놓는 지정으로 작동합니다. \iupac{(1\higher{R},3\higher{S})\-camphor}라고 쓰면 (1R,3S)-캄퍼가 조판되고 R과 S가 이탤릭이 됩니다. 위치 번호의 하이픈이 줄바꿈 자리를 겸하므로, 2단 조판 논문에서 긴 이름이 단 밖으로 삐져나오는 사고가 크게 줄어듭니다.
\usepackage[formula=mhchem]{chemmacros}
\usepackage{ghsystem} % needed separately for \ghspic and the H/P statements
% ...
\iupac{2,4,6\-trinitrotoluene} % \- is a breakable hyphen
\iupac{(1\higher{R},3\higher{S})\-camphor} % italic stereodescriptors
\ox{2,Ca} \ox{-2,O} % oxidation numbers, roman
\cip{R,S} % Cahn-Ingold-Prelog descriptors
\latin{in situ} % Latin phrases, per house style
\pH{} \pKa{} \pOH{} % upright p, italic quantity
\newman{0,60,120,180,240,300} % a Newman projection위의 명령은 모두 TeX Live 2024에서 동작했습니다. \ox{2,Ca}는 Ca의 오른쪽 어깨에 로마 숫자 산화수를 놓고, \ox{-2,O}는 음의 산화수를 냅니다. \cip{R,S}는 Cahn–Ingold–Prelog 기술자를, \latin{in situ}는 라틴어 구절을 지면 관행에 맞춰 조판하며, \pH, \pKa, \pOH는 p를 정체로, 양 기호를 이탤릭으로 놓는 정형입니다. \newman{...}은 각도 목록을 넘기면 뉴먼 투영을 그립니다. 한 가지만 주의가 필요한데 GHS 그림문자입니다. \ghspic{skull}은 chemmacros만으로는 ! Undefined control sequence.가 납니다. \usepackage{ghsystem}을 따로 써 주십시오.
구조식과 반응 스킴 — \chemname과 화살표 라벨의 함정
구조식 자체는 chemfig가 그립니다. 결합 기호 - = ~와 0~7의 각도, *6(...) 같은 고리 표기법은 「화학・물리 그림」 페이지가 자세합니다. 여기서 다루는 것은 그것을 문서에 얹을 때의 층입니다. \schemestart ... \schemestop으로 반응 스킴을 짜고, 분자를 늘어놓은 뒤 \arrow로 화살표를 끼웁니다. 각 분자에는 \chemname{\chemfig{...}}{벤젠}으로 이름을 붙일 수 있고, 이름은 구조 바로 아래에 가지런히 들어갑니다. 전체 축척이나 결합의 굵기는 \setchemfig{atom sep=2em, bond style={line width=1pt}}처럼 한꺼번에 지정합니다. TeX Live 2024 동봉판은 v1.66(2023년 12월 28일), 작성자는 Christian Tellechea입니다.
\usepackage{mhchem}
\usepackage{chemfig}
\setchemfig{atom sep=2em, bond style={line width=1pt}}
% ...
\schemestart
\chemname{\chemfig{*6(-=-=-=)}}{benzene}
% arrow labels are ordinary TEXT: bare "FeBr_3" gives "! Missing $ inserted."
\arrow{->[\ce{Br2}][\ce{FeBr3}]}
\chemname{\chemfig{*6(-=-(-Br)=-=)}}{bromobenzene}
\schemestop화살표 라벨에는 실측한 함정이 있습니다. \arrow{->[...]}의 대괄호 안은 평범한 문자열이며 수식 모드가 아닙니다. 그래서 \arrow{->[FeBr_3]}이라고 쓰면 _가 본문에 나가고, ! Missing $ inserted.에서 시작해 ! Extra }, or forgotten $., ! Undefined control sequence.로 이어지다 마지막에는 \node가 정의되지 않았다는 말과 함께 그림이 망가집니다. 아래 첨자가 필요한 라벨은 \ce{FeBr3}이나 \chemfig{FeBr_3}으로 감싸십시오. \ce{}와 chemfig를 같은 문서에서 쓰는 것은 권장되는 조합이며(앞 절의 chemmacros 충돌과는 다른 이야기입니다), 실제로 둘을 함께 불러와도 문제없이 통과했습니다. 이 밖에 \charge로 비공유 전자쌍과 전하를, \chemabove와 \chembelow로 원자의 위아래에 주기를, \polymerdelim으로 반복 단위의 괄호를 붙일 수 있습니다.
결국 무엇을 불러올 것인가
화학식과 반응식만 필요하다면 mhchem만 불러오십시오. 압도적 다수의 논문에는 이것이 정답이며, \ce{} 하나만 익히면 됩니다. 구조식도 그린다면 mhchem + chemfig입니다. 이 둘은 충돌하지 않고, 본문의 반응식은 \ce{}로, 별도로 배치하는 골격 구조는 \chemfig{}로 하는 것이 정석입니다. 명명법・산화수・GHS・열역학까지 들어간다면 chemmacros를 쓰되, mhchem을 별도 줄로 불러오지 말고 [formula=mhchem]을 넘기십시오. 이 순서로 필요한 만큼만 더해 가면 Option clash도 Undefined control sequence도 만나지 않습니다.