化学・物理の図

ファインマン図を LaTeX で描く古典的な方法では、図がひとつの フォントの文字 になります。比喩ではありません。TeX Live 2024 で feynmf の図を METAFONT に通すと、"Font metrics written on myfd.tfm" に続けて "Output written on myfd.600gf (1 character, 4340 bytes)" と報告されます——文字数 1。散乱過程の絵が、字幅表つきの活字として鋳造されたわけです。理系の図には分野ごとの「描き方の文法」があり、専用パッケージはその文法をそのまま入力にします。このページでは化学の mhchemchemfigXyMTeX、物理の tikz-feynmanfeynmf、そして分子軌道図の 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-})。矢印は ->(正反応)、<=>(平衡)、<-(逆反応)をそのまま打て、+ は反応物の足し算として正しい空きで組まれます。

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}
\ce{C\bond{-}C}

これらは順に、水の生成(係数 2 と下付きが自動で整う)、加熱(->[\Delta] で矢印の 上に条件ラベル が乗る。->[上][下] と二つ書けば上下に併記できます)、水の電離平衡(双方向の平衡矢印)、硫酸バリウムの沈殿(末尾の v下向き矢印 になる。発生する気体は ^)、そして単結合の記号 \bond として組まれます。\ce{} は本文中でも $...$ の数式中でも使えます。ただし 構造式は描けません——結合線や環は範囲外です。骨格の絵がほしいときは次の chemfig の出番になります。同じ狙いの後発パッケージに chemformula があり、そちらは \ch{...} を使います。

構造式を一筆書きで —— chemfig の結合記号と角度

chemfig は分子の 構造式(骨格図) を描く定番で、TikZ を土台に「結合と分岐のミニ言語」で分子を記述します。読み込みは \usepackage{chemfig} だけ、中心命令は \chemfig{...} です。文法の核は 結合記号角度 の二つ。結合は -(単結合)、=(二重結合)、~(三重結合)を原子のあいだに置き、向きは直後の角括弧で指定します。[2] のような 0〜7 の数字は 45° 刻みの定義済み方向 で、[0] が東(右)、反時計回りに [2] が真上、[4] が西、[6] が真下。任意角は [:30] のようにコロン付きで絶対角度を書きます。枝分かれは丸括弧 (...) で本筋から分岐させます。

document.tex
\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{<=>} で平衡矢印になります。

latex
\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 が付いた構造が出ます——「どこに何が付くか」を位置番号で指定する、化学の命名規則そのままの書き方です。複雑な縮合多環や置換パターンを、定型の命令で安定して組めるのが強みになります。

document.tex
\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." が出て、続けて horizontalnode distancelevel distancesibling 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 と書くのが正解です。この鍵の役目は、パッケージが更新されて図が変わったときに気づけるようにすることなので、自分の環境の版に合わせて書く のが本来の使い方です(メジャー番号が食い違うとエラーになります)。

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

この図は、左側の対が頂点 a で合流し、ab波線(光子) が結び、右側で別の対へ分かれる典型的な s チャンネル散乱です。線のスタイルは [fermion](矢印付き直線)、[photon](波線)、[gluon](螺旋)などで指定し、頂点は名前を書くだけで暗黙に作られますhorizontal=a to b は「a と b を水平に並べよ」という配置のヒントで、先ほど pdfLaTeX が無視すると警告していた鍵がこれです。位置を細かく決めたいときは、tikzpicture の中に feynman 環境 を開き、\vertex で頂点を置いて \diagram* で結びます。

feynmf / feynmp —— 1989 年生まれの二段階方式

こちらは図を LaTeX の外で組み、結果を取り込む 二段階方式です。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 へフェルミオン線を引け」という意味です。

document.tex
% 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)" でした。図が 1 文字。二度目の LaTeX 実行は、そのフォントの 1 文字目を本文に置いているだけ、というわけです。feynmp(MetaPost 経路)ならフォントではなく通常の図形になります ので、現代の PDF ワークフローではふつうこちらを選びます。

実務では feynmp-auto を読み込むのが楽で、MetaPost の実行を自動化してくれます。ただし外部プログラムを起動する以上 --shell-escape が要り、しかも忘れたときが厄介です——TeX Live 2024 で試したところ、警告もエラーも出さずに 図の無い PDF が出来上がりました。図の場所が空白になっていたら、まず -shell-escape を付け忘れていないか疑ってください。付けて 2 回まわせば、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 で書きます。

document.tex
\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 軌道に上向きスピンの電子を 1 個ずつ 置き({0; up}0 はエネルギー準位)、\molecule が両者を結合性軌道へまとめて 電子対pair)を入れます。電子の入り方(updownpair)と準位の高さを引数で与えるだけで、横線とスピン矢印からなる準位図が組み上がります。同種の準位図は 素の TikZ でも 描けますが、modiagram は MO 図の作法に特化しているぶん、定型の図を短く正確に書けます。

使い分けと、コンパイルで詰まりやすいところ

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

コンパイルで詰まる原因は、経験上ほぼ三つに絞られます。エンジン違い——tikz-feynman の配置は LuaLaTeX が要ります。--shell-escape の付け忘れ——feynmp-auto は無言で図を落とします。そして パスの数——feynmf / feynmp は 2 回まわさないと図が入りません。加えて chemfigmodiagram は TikZ ベースなので、図の枚数が増えると計算が重くなります。tikzexternalize で図をキャッシュするか、standalone クラスで図だけ単独コンパイルすると、編集中の待ち時間が目に見えて減ります。