化学方程式、分子骨架、粒子物理中的费曼图——科学图形各自都有本领域的“绘图语法”。当然可以用通用的 TikZ 从零搭建,但使用领域专用宏包,就能用化学家或物理学家在纸上书写的记法,用很短的代码得到准确的图。这一页从“各工具实际用来做什么”的角度,整理化学中的 mhchem、chemfig、XyMTeX,物理中的 tikz-feynman、feynmf,以及用于分子轨道图的 modiagram。
先看整体图景。即使同样是“化学和物理图形”,要用的工具也会随目标图形明显分开。先通过下面的表确认每个宏包对应的领域,再逐一来看。
| 宏包 | 领域 | 可制作的内容 |
|---|---|---|
mhchem | 化学 | 化学式和反应式(作为文字排版的 H₂O、2H₂+O₂→2H₂O) |
chemfig | 化学 | 结构式、骨架式和反应方案(键与分支的图) |
XyMTeX | 化学 | 结构式(较早的命令式宏包) |
tikz-feynman | 物理 | 费曼图(基于 TikZ,自动布局) |
feynmf / feynmp | 物理 | 费曼图(METAFONT/MetaPost,两遍流程) |
modiagram | 化学/物理 | 分子轨道(能级)图 |
化学式与反应式 — mhchem
mhchem 用来把化学式和反应式作为文字排版。它不是画结构(骨架)图的工具,而是负责 在正文或数学环境中书写的化学记号,例如 H2O 或 2 H2 + O2 -> 2 H2O。在导言区用 \usepackage[version=4]{mhchem} 载入,然后在正文中把表达式写进核心命令 \ce{...}(chemical equation)里。
\ce{} 的巧妙之处在于,按自然方式输入就会得到正确的化学排版。紧跟在元素符号后的数字会自动变成 下标(\ce{H2O} → H₂O),带 ^ 的数字或符号会变成 电荷上标(\ce{SO4^2-} → SO₄²⁻)。箭头可以直接写 ->(正向)、<=>(平衡)、<-(反向),+ 会以反应物相加的正确间距排版。状态像 \ce{H2O(l)} 这样放在括号中;沉淀写作 v,逸出气体写作 ^,并用空格分隔(\ce{BaSO4 v})。
\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}这些例子依次排成:水的生成(左右的系数 2 和下标会自动对齐)、加热(->[\Delta] 把条件标签 Δ 放在箭头上方)、水的电离平衡(双向平衡箭头)、硫酸钡沉淀(末尾的 v 变成 向下箭头 ↓)。箭头可以带两个标签,如 ->[上][下],分别标注在上下方。\ce{} 既可用于正文,也可用于 $...$ 数学环境中。
mhchem 不能绘制结构式——键线和环不在它的范围内。单键、双键这类简短的键符号可以用 \bond 表示,例如 \ce{C\bond{-}C};但如果需要真正的骨架图,就该使用下一节的 chemfig。另外还有一个目标相近、较新的宏包 chemformula,它通过 \ch{...} 命令提供类似功能。
结构式与反应方案 — chemfig
chemfig 是绘制分子 结构式(骨架图) 的常用宏包。它基于 TikZ,用一种 “键与分支的迷你语言” 像一笔画一样描述分子。载入只需 \usepackage{chemfig}。核心命令是 \chemfig{...},在花括号中排列原子和化学键。
语法的核心是 键符号 和 角度。键用 -(单键)、=(双键)、~(三键)表示,放在原子之间。每条键的方向在紧随其后的方括号中指定。像 [2] 这样的 0 到 7 的数字表示以 45° 为步长的预定义方向:[0] 是东(右,0°),逆时针数过去,[2] 是正上方(90°),[4] 是西(180°),[6] 是正下方(270°)。任意角度则像 [:30] 这样用冒号写绝对角度(度)。分支用圆括号 (...) 表示,从主链分出。
\usepackage{chemfig}
% ...
% メタン CH4:中心 C に H を 4 方向へ
\chemfig{H-C(-[2]H)(-[6]H)-H}
% ベンゼン環(交互の二重結合)
\chemfig{*6(=-=-=-)}上面的甲烷中,H-C 先在碳的 西侧 放一个氢;接下来的两个分支 (-[2]H) 和 (-[6]H) 分别在 正上方 和 正下方 加氢;最后的 -H 向 东侧(默认方向)伸出一个氢,形成十字形的 CH₄。下面的苯中,*6(...) 表示 六元环,括号里的 =-=-=- 让 单键和双键交替,画出熟悉的六边形芳香环。* 生成普通环;使用 ** 则得到内侧带圆的芳香环表示。
chemfig 还可以绘制 反应方案,也就是用箭头连接多个分子的图。用 \schemestart ... \schemestop 包起来,在其中放置分子(\chemfig{...}),再用 \arrow 插入箭头。像 \arrow{->[条件]} 这样可以在箭头上方写试剂或条件,\arrow{<=>} 则生成平衡箭头。下面是一个简单的 A → B 方案。
\schemestart
\chemfig{H-C(-[2]H)(-[6]H)-H}
\arrow{->[\small oxidation]}
\chemfig{O=C(-[2]H)-[6]H}
\schemestop这会生成一个从左到右的反应方案:从甲烷结构式出发,经过表示氧化的 带标签箭头,到达甲醛结构式。chemfig 可在 pdfLaTeX、LuaLaTeX、XeLaTeX 下运行;因为它基于 TikZ,通常不需要额外的驱动设置(在经由 DVI 的 pLaTeX 下请指定 dvipdfmx)。
另一种结构式工具 — XyMTeX
绘制结构式的老牌宏包还有 XyMTeX(Shinsaku Fujita 编写)。如果说 chemfig 的思路是“把化学键一笔画出来”,XyMTeX 的思路则是 用命令直接调用整个环或骨架。例如苯衍生物会把取代基的位置和种类作为参数传给专用命令。它的优势在于,复杂的稠合多环和取代模式可以通过固定、结构化的命令稳定排版。
用 \usepackage{xymtex} 载入;它提供了把苯环画成纵向或横向等多种命令。全新写作时,多数人会选择记法更直观且仍活跃维护的 chemfig,但对于基于 XyMTeX 的既有稿件,或已经熟悉其命令体系的场合,XyMTeX 现在仍然有用。输出方面,它支持 LaTeX 标准模式,也支持 PostScript 和 PDF 模式。
费曼图 — tikz-feynman 与 feynmf
接着转向物理。表示基本粒子相互作用的 费曼图 主要有两类工具。现代的一类是 tikz-feynman,它基于 TikZ:声明顶点(vertex)和线(propagator)后,系统会 自动布局。推荐用带兼容性键的 \usepackage[compat=1.0.0]{tikz-feynman} 载入。
想快速作图时,使用一次性命令 \feynmandiagram。线的样式可指定为 [fermion](费米子,即带箭头直线)、[photon](光子,即波浪线)、[gluon](胶子,即螺旋线)等;顶点只要写出名称就会隐式创建。若要精确控制位置,则在 tikzpicture 中打开 feynman 环境,用 \vertex 放置顶点,再用 \diagram* 连接。
\usepackage[compat=1.0.0]{tikz-feynman}
% ...
% 一発命令:e+ e- → μ+ μ-(光子交換)
\feynmandiagram [horizontal=a to b] {
i1 -- [fermion] a -- [fermion] i2,
a -- [photon] b,
f1 -- [fermion] b -- [fermion] f2,
};这是教科书式的 s 通道散射:左侧的电子-正电子对在顶点 a 汇合,a 与 b 由一条 波浪线(光子) 连接,右侧再分裂成另一对粒子。horizontal=a to b 是布局提示,意思是“把 a 和 b 水平放置”。注意:自动布局计算需要 LuaTeX,因为 tikz-feynman 内部使用 Lua 算法。它也能在 pdfLaTeX 下运行,但布局会退化为较简单的形式并发出警告。可以认为 实际使用时基本以 LuaLaTeX 编译为前提。
另一类是经典的 feynmf / feynmp。它们先用 METAFONT(feynmf)或 MetaPost(feynmp) 单独生成每个图,再把结果引入文档,是一种 两遍流程。图按文件名分组在 fmffile 环境中;在 fmfgraph(或 fmfgraph*)里,用 \fmfleft、\fmfright 指定外部腿,用 \fmf{...} 指定线。第一次 LaTeX 运行会写出图的定义文件,mf/mpost 将其转换为字体或图形,第二次运行再读入结果。
\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}这段代码用 feynmp 画出与前面相同的散射。使用 feynmp-auto 可以 自动执行 MetaPost 步骤,减轻手动两遍流程的负担。feynmf/feynmp 已经很成熟,输出漂亮,在旧论文和 TeX 环境中至今仍广泛使用,但它们需要 额外调用 MetaFont/MetaPost。大致原则是:新工作选方便的 tikz-feynman;若处理旧稿或希望依赖最少,则选 feynmf 系列。
分子轨道图与能级 — modiagram
位于化学和物理交界处的是 分子轨道图(MO 图),它把原子轨道(AO)组合成成键和反键分子轨道(MO)的过程,按能量高低纵向排列来表示。专门用于此的是 modiagram,它同样基于 TikZ。用 \usepackage{modiagram} 载入后,在 MOdiagram 环境 中,用 \atom 描述左右原子轨道,用 \molecule 描述连接它们的分子轨道。
\usepackage{modiagram}
% ...
\begin{MOdiagram}
\atom{left}{ 1s = {0; up} }
\atom{right}{ 1s = {0; up} }
\molecule{ 1sMO = {1; pair, } }
\end{MOdiagram}这是最简单的 MO 图,表示氢分子 H₂。\atom{left} 和 \atom{right} 分别在每个氢的 1s 轨道中放入一个自旋向上的电子({0; up},其中 0 是能级),\molecule 则把两者合并为一个成键轨道并放入 电子对(pair)。只要把占据方式(up、down、pair)和能级高度作为参数给出,就能得到由横线和自旋箭头组成的能级图。类似的能级图也可以用 纯 TikZ 绘制,但 modiagram 专门面向 MO 图规范,因此能更简短、准确地写出这些定型图。
如何选择,以及编译注意事项
最后给出实务上的选择准则。可以直接按 想做什么 来选。若要在正文中写化学式和反应式,用 mhchem;若要画 结构式和反应方案,用 chemfig(复杂稠合环若适合命令式方法,则用 XyMTeX);若要画 费曼图,用 tikz-feynman(旧环境或既有稿件可用 feynmf/feynmp);若要画 MO 图,用 modiagram。mhchem 与 chemfig 是互补关系,常见做法是在 同一文档中并用:正文中的方程用 mhchem,另起一行的骨架图用 chemfig。
也要注意 引擎和编译遍数要求。tikz-feynman 的自动布局 以 LuaLaTeX 为前提;在其他引擎下布局会退化。feynmf/feynmp 需要 额外调用 MetaFont/MetaPost 的两遍流程(可用 feynmp-auto 自动化)。chemfig 和 modiagram 基于 TikZ,可在 pdfLaTeX、LuaLaTeX、XeLaTeX 下运行,但 TikZ 图计算量较大,图多时 编译会变慢。用 tikzexternalize 缓存图形,或用 standalone 类单独编译图形,可以让编辑过程更顺畅。