化学・物理の図

化学反応式や分子の骨格、素粒子のファインマン図——理系の図には、その分野だけの「描き方の文法」があります。汎用の TikZ で一から描くこともできますが、領域専用のパッケージを使えば、化学者・物理学者が手で書く記法そのままに、短いコードで正確な図が得られます。このページでは、化学の mhchemchemfig・XyMTeX と、物理の tikz-feynmanfeynmf、そして分子軌道図の modiagram を、何を作る道具なのかという観点から整理します。

まず全体像です。同じ「化学・物理の図」でも、作りたいものによって使う道具がはっきり分かれます。次の表で対応を押さえてから、個別に見ていきます。

パッケージ分野作れるもの
mhchem化学化学式・反応式(文字としての H₂O、2H₂+O₂→2H₂O)
chemfig化学構造式・骨格・反応スキーム(結合と分岐の図)
XyMTeX化学構造式(命令ベースの古参パッケージ)
tikz-feynman物理ファインマン図(TikZ ベース・自動配置)
feynmf / feynmp物理ファインマン図(METAFONT/MetaPost・2 パス)
modiagram化学・物理分子軌道(エネルギー準位)図

化学式と反応式——mhchem

mhchem は、化学と反応式**を文字として組むためのパッケージです。構造(骨格)の絵ではなく、H2O2 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})。

document.tex
\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下向き矢印 ↓ になる)として組まれます。矢印のラベルは ->[上][下] のように 2 つ書け、上下に条件を併記できます。\ce{} は本文中でも $...$ の数式中でも使えます。

mhchem は構造式を 描けません(結合線や環は範囲外)。単結合・二重結合のような短い結合記号は \ce{C\bond{-}C} のように \bond で表せますが、本格的な骨格図がほしいときは次の chemfig の出番です。なお同種の機能をもつ後発の chemformula というパッケージもあり、こちらは \ch{...} という命令を使います。

構造式と反応スキーム——chemfig

chemfig は、分子の 構造式(骨格図) を描くための定番パッケージです。TikZ を土台に、「結合と分岐のミニ言語」** で分子をひと筆書きのように記述します。読み込みは \usepackage{chemfig} だけ。中心命令は **\chemfig{...}** で、中括弧の中に原子と結合を並べます。

文法の核は 結合記号角度 です。結合は -(単結合)、=(二重結合)、~(三重結合)で表し、原子と原子のあいだに置きます。各結合の向きは、直後の角括弧で指定します。**[2] のような 0〜7 の数字は 45° 刻みの定義済み方向** で、[0] が東(右・0°)、そこから反時計回りに [2] が真上(90°)、[4] が西(180°)、[6] が真下(270°)。任意角は **[:30]** のようにコロン付きで絶対角度(度)を書きます。枝分かれは丸括弧 (...) で表し、本筋から分岐させます。

document.tex
\usepackage{chemfig}
% ...
% メタン CH4:中心 C に H を 4 方向へ
\chemfig{H-C(-[2]H)(-[6]H)-H}

% ベンゼン環(交互の二重結合)
\chemfig{*6(=-=-=-)}

上のメタンは、まず H-C で炭素の 西側 に水素を 1 つ置き、続く 2 つの枝 (-[2]H)(-[6]H)真上真下 に水素を、最後の -H東側(既定方向)に水素を伸ばした、十字形の CH₄ になります。下のベンゼンは、*6(...)6 員環 を意味し、括弧内の =-=-=-単結合と二重結合を交互に 並べた、おなじみの六角形の芳香環として描かれます。* は通常の環、** を使うと内側に円を描いた芳香環表現になります。

さらに chemfig反応スキーム(複数の分子を矢印でつなぐ図)も描けます。**\schemestart ... \schemestop** で囲み、その中に分子(\chemfig{...})を並べ、**\arrow** で矢印を入れます。\arrow{->[条件]} のように矢印の上に試薬や条件を書け、\arrow{<=>} で平衡矢印になります。次は単純な A → B のスキームです。

latex
\schemestart
  \chemfig{H-C(-[2]H)(-[6]H)-H}
  \arrow{->[\small oxidation]}
  \chemfig{O=C(-[2]H)-[6]H}
\schemestop

これはメタンの構造式から、酸化を表す ラベル付きの矢印 を経て、ホルムアルデヒドの構造式へと至る、横並びの反応スキームになります。chemfigpdfLaTeX・LuaLaTeX・XeLaTeX のどれでも 動き、土台が TikZ なので追加のドライバ設定はふつう不要です(DVI 経由の pLaTeX では dvipdfmx を指定)。

もうひとつの構造式——XyMTeX

構造式を描く古参のパッケージに XyMTeX(Shinsaku Fujita 作)があります。chemfig が「結合をひと筆書きする」発想なのに対し、XyMTeX は 環や骨格そのものを命令で呼び出す 発想です。たとえばベンゼン誘導体なら専用命令に置換基の位置と種類を引数で渡す、という書き方をします。複雑な縮合多環や置換パターンを、定型の命令で安定して組めるのが強みです。

読み込みは \usepackage{xymtex} で、ベンゼン環を縦長・横長に描く命令などが用意されています。新規に書き始めるなら、記法が直感的で活発に保守されている chemfig を選ぶ人が多いですが、XyMTeX 由来の既存原稿や、その命令体系が手に馴染んでいる場合には今も有用です。出力は LaTeX 標準のほか PostScript・PDF モードに対応します。

ファインマン図——tikz-feynman と feynmf

物理に移ります。素粒子の相互作用を表す ファインマン図 には、大きく 2 系統の道具があります。現代的なのが **tikz-feynman で、TikZ を土台に、頂点(vertex)と線(propagator)を宣言すると 自動でレイアウト** してくれます。読み込みは互換指定付きの \usepackage[compat=1.0.0]{tikz-feynman} が推奨です。

手早く描くなら一発命令 **\feynmandiagram** を使います。線のスタイルを [fermion](フェルミオン=矢印付き直線)、[photon](光子=波線)、[gluon](グルーオン=螺旋)などで指定し、頂点は名前を書くだけで暗黙に作られます。細かく配置を決めたいときは **feynman 環境** を tikzpicture の中で開き、**\vertex で頂点を置き、\diagram*** で結びます。

document.tex
\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,
};

この図は、左側の電子・陽電子の対が頂点 a で合流し、ab波線(光子) が結び、右側で別の粒子対へと分かれる、典型的な s チャンネル散乱になります。horizontal=a to b は「a と b を水平に並べる」配置のヒントです。重要:自動レイアウトの計算には LuaTeX が必要 で、tikz-feynman は内部で Lua アルゴリズムを使います。pdfLaTeX でも動きますが、配置は簡易なものに退化し警告が出ます。実質 LuaLaTeX でのコンパイルが前提 と考えてください。

もう一系統が、古典的な **feynmf / feynmp です。図を METAFONT(feynmf)または MetaPost(feynmp で別に組み、その結果を取り込むという 2 パス方式** をとります。図は fmffile 環境でファイル名をまとめ、fmfgraph(または fmfgraph*)の中に \fmfleft\fmfright で外部脚を、\fmf{...} で線を指定します。最初の LaTeX 実行で図の定義ファイルが書き出され、mfmpost でフォント/図に変換し、2 度目の実行で取り込まれる——という流れです。

document.tex
\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 の実行を自動化 でき、手作業の 2 パスが楽になります。feynmffeynmp は枯れていて出力が美しく、古い論文や TeX 環境でいまも広く使われますが、MetaFont/MetaPost を別途呼ぶ手間 があります。新規なら手軽な tikz-feynman、既存資産や最小限の依存で済ませたいなら feynmf 系、と使い分けるとよいでしょう。

分子軌道図とエネルギー準位——modiagram

化学と物理の境目にあるのが 分子軌道図(MO 図)——原子軌道(AO)が結合性・反結合性の分子軌道(MO)へと組み合わさる様子を、エネルギーの高さで縦に並べて描く図です。これに特化したのが **modiagram** で、TikZ を土台にしています。\usepackage{modiagram} で読み込み、**MOdiagram 環境 の中に、左右の原子軌道を \atom で、それらをつなぐ分子軌道を \molecule** で記述します。

document.tex
\usepackage{modiagram}
% ...
\begin{MOdiagram}
  \atom{left}{ 1s = {0; up} }
  \atom{right}{ 1s = {0; up} }
  \molecule{ 1sMO = {1; pair, } }
\end{MOdiagram}

これは水素分子 H₂ の最も単純な MO 図です。\atom{left}\atom{right} が、各水素の 1s 軌道に上向きスピンの電子を 1 個ずつ{0; up}0 はエネルギー準位)置き、\molecule が両者を結合性軌道へまとめて 電子対pair)を入れます。電子の入り方(updownpair)や準位の高さを引数で与えるだけで、横線とスピン矢印からなる準位図が組み上がります。なお同種のエネルギー準位図は 素の TikZ でも 描けますが、modiagram は MO 図の作法に特化している分、定型の図を短く正確に書けます。

使い分けとコンパイルの注意

最後に実務上の指針です。何を作りたいか で素直に選べます。化学式・反応式 を文章中に書くなら mhchem構造式・反応スキーム を描くなら chemfig(複雑な縮合環で命令ベースが向くなら XyMTeX)、ファインマン図 なら tikz-feynman(古い環境や既存原稿なら feynmffeynmp)、分子軌道図 なら modiagrammhchemchemfig は補い合う関係で、本文の式は mhchem、別行の骨格は chemfig、と 同じ文書で併用 するのがよくある形です。

エンジン・パスの注意 も押さえておきましょう。tikz-feynman の自動レイアウトは LuaLaTeX を前提 とし、他エンジンでは配置が劣化します。feynmffeynmpMetaFont/MetaPost を別途呼ぶ 2 パス が必要です(feynmp-auto で自動化可能)。chemfigmodiagram は TikZ ベースで pdfLaTeX・LuaLaTeX・XeLaTeX のいずれでも動きますが、TikZ 図は計算が重く、枚数が多いと コンパイルが遅く なります。tikzexternalize で図をキャッシュするか、standalone クラスで図を単独コンパイルすると編集が快適になります。