📦

【LaTeX】chemfigで有機化学の反応機構を書くための巻矢印描画用パッケージを作成してみた

に公開

はじめに

有機化学のレポートや論文をLaTeXで書く際、chemfig パッケージは非常に強力ですが、有機化学で用いられる電子の移動を含む反応機構を書くのは非常に大変です。

従来の \chemmove コマンドを使う場合、矢印一本引くために以下のような記述が必要でした。(参照:chemfigパッケージのマニュアル)

% 従来の書き方
\draw[->, shorten >=2pt] (o1) .. controls +(90:1cm) and +(90:1cm) .. (c1);

いちいちこのようなコマンドを書くのは非常に面倒です。

そこで本記事では、座標計算を一切行わずに、化学的な意図(攻撃、開裂、形成)をそのまま記述できるパッケージchemmechを作成したので、それを紹介したいと思います。これにより、有機化学の思考をそのままchemfigのコードにすることができます。

できること

このパッケージを導入すると、直感的なコマンドで原子や結合間をつなぐ「巻矢印」を描画できるようになります。矢印の角度や形状は自動計算されますが、引数で微調整することも可能です。mol2chemfigと組み合わせれば、複雑な反応式を素早く描くことができます。

1. 準備:ノードの指定

どの原子や結合が反応するかを指定するために、各原子に ノード(ID) を割り振る必要があります。
\chemfig コマンドの中で @{名前} を原子の直前に書くことで設定できます。
例:Aをc1, Bをc2, Cをc3 と名付ける場合

\chemfig{@{c1}A = @{c2}B - @{c3}C}

手動で全て書くのは大変ですが、mol2chemfigというツールを使えば、構造式を出力する際に自動で番号付きノード(@{a1},@{a2}・・ )を付与してくれます。mol2chemfigについての記事は化学構造式のTeXコードを一瞬で出力する方法をご覧ください。

2. 矢印コマンド一覧

\chemfig{...} のコードの下に、以下のコマンドを記述して矢印を追加します。実際は(@{a1},@{a2}・・ )のようなノードで指定していますが、引数の理解のためにこのような表記にしています。
分子内の電子の移動

  • \bdclev[回転方向]{C-X}: C-X結合が開裂し、電子対がXに移動
  • \bdform[回転方向]{C-O}: Oのlone pairがB-Cにπ結合として参加
  • \bdrelay{C=C-C}: C=C結合の電子が隣のC-C結合に参加

分子間の電子の移動

  • \nuatk[矢印の発射角度]{求核剤}{A-B} : 求核剤からAに求核攻撃(Bの背面から)
  • \elatk[矢印の入射角度]{C=C}{求電子剤} : C=Cの結合の電子がEに移動して新たな結合を作る
    これにより、化学者が頭の中でイメージする動作をそのままコードに落とし込めます。

実装例

ブロモエタンのE2脱離反応の反応機構を表すコードと、出力例を示します。\chemfig{}mol2chemfigで出力したのをほぼそのまま使っています。

main.tex
\chemfig{@{n}\charge{45 = $\scriptstyle-$}{B}} %塩基
\qquad
\chemfig{
                        @{c1}Br%
    -[@{c1-2}:210,1.613]@{c2}C%
                           (
              -[@{c2-4}:230]@{c4}H%
                           )
                           (
              -[@{c2-5}:310]@{c5}H%
                           )
    -[@{c2-3}:150,1.613]@{c3}C%
                           (
               -[@{c3-6}:60]@{c6}H%
                           )
                           (
              -[@{c3-7}:150]@{c7}H%
                           )
          -[@{c3-8}:240]@{c8}H%
}
\bdclev[1]{c2-c1} %Br脱離
\bdrelay{c8-c3-c2} %ベータ水素が引き抜かれて結合に参加
\nuatk[270]{n}{c8-c3} % 求核攻撃

出力例:

実装

実行環境

  • PC: MacBook Air (M1, 2020)
  • OS: macOS Sequoia 15.6
  • エディタ: VS Code + LaTeX Workshop
  • TeXディストリビューション: TeX Live 2025 (LuaLaTeX)

GitHubからstyファイルをダウンロード

ソースコードとマニュアルはGitHubで公開しています。
以下のリポジトリで chemmech.sty をダウンロードして、TeXファイルと同じ階層に置いてください。GitHubリポジトリ
緑色の[code]をクリックして Download ZIPもしくはURLをコピーしてVS codeを開いてGitリポジトリのクローンからURLを貼り付けても良いです。

mol2chemfigで構造式を生成

mol2chemfigでノードを指定する必要があります。mol2chemfigについては化学構造式のTeXコードを一瞬で出力する方法や、(8) MOL2CHEMFIG でお手軽に分子を描いてみる
を先にご覧ください。ノードを生成するにはmol2chemfigをダウンロードした後に

mol2chemfig -w -y delete -g atom -i pubchem 996
mol2chemfig  -w -m -g node -i pubchem 996 #-mでメチル基を表示する

のように、-g 任意の文字でノードの名前を設定することができます。反応機構における役割などで分けると、矢印を書くときに後々わかりやすいと思います。反応機構の過程でメチル基を表示したいときは-mと追加します。

コマンドで描画

結合の開裂: \bdclev

結合の電子対が原子の方へ移動する矢印を描きます。
コマンド仕様:
\bdclev[回転方向]{ノード名1-ノード名2}

  • 引数 {ノード名1-ノード名2}:
    • ここで指定するのは元素記号(CやBr)ではなく、自分で定義した「ノード名」 です。
    • 矢印は「ノード名1とノード名2の結合(の中点)」から始まり、「ノード名2」へ向かいます。
  • オプション [回転方向]:
    • 1 (デフォルト): 反時計回り (Counter-clockwise)
    • -1: 時計回り (Clockwise)
    • ※ 数学の角度定義(単位円)と同じで、正の値が反時計回りです。
      コード例:
      まず、矢印の始点・終点にしたい原子に @{名前} でタグ付けをします。
      ここでは炭素に a1、臭素に a2 という名前をつけています。
% 1. 構造式を描く(原子に名前をつける)
% Cに 'a1'、Brに 'a2' という名前を付与
\chemfig{
    H-@{a1}C(-[:90]H)(-[:270]H)-@{a2}Br
}
% 2. 定義した名前を使って矢印を描く
% C-Br結合から、Brに向かって矢印が描かれる(反時計回り)
\bdclev[1]{a1-a2}

結合の形成: \bdform

\bdclev とは逆に、原子(ノード2)から結合へ向かう矢印を描きます。
引数の指定方法などは \bdclev と全く同じです。
コマンド仕様:
\bdform[回転方向]{ノード名1-ノード名2}

  • 動作:
    \bdclev の逆向きです。「ノード名2」からスタートし、「ノード名1とノード名2の間の結合」へ矢印が伸びます。
    コード例:
\chemfig{R-@{a1}C(-[90]H)-@{a2}O}
% O1(酸素)から、C1-O1間の結合に向かって矢印を描く
% (酸素のローンペアが結合になるイメージ)
\bdform[1]{a1-a2}
  • 補足
    結局、\bdclev\bdformもノードの順番を{炭素原子 - 電気陰性度高い原子}にすればコマンドの意味を考えることで、直感的にかつ正しく描画できます。

結合の移動: \bdrelay

コマンド仕様:
\bdrelay{ノード1-ノード2-ノード3}
動作
自動で隣り合う結合から結合への電子の移動を書くことができます。連続する三つのノードを書くと、
ノード1-ノード2の結合がノード2-ノード3へと移動します。π共役系やE2反応におけるβ水素の引き抜きの際に使用できます。

分子間反応(求核攻撃): \nuatk

求核剤(Nu)が、原子に対して攻撃を仕掛ける矢印を描きます。
対象の結合に対して、立体的に適切な角度(背面攻撃など)で矢印が入るよう計算されます。

コマンド仕様:
\nuatk[出発角度]{求核剤ノード}{被攻撃ノード-参照ノード}

  • 引数 {求核剤ノード}:
    攻撃を仕掛ける側の原子や孤立電子対のノード名です。

  • 引数 {被攻撃ノード-参照ノード}:

    • 被攻撃ノード: 実際に攻撃を受ける原子(例:カルボニル炭素)。
    • 参照ノード: 結合の方向を決めるための相方の原子(例:カルボニル酸素)。
    • {C1-O1} と指定すると、C1とO1の結合軸を基準にして、C1に背面攻撃するよう実行される
  • オプション [出発角度]:

    • 求核剤から矢印が飛び出す方向を指定します。
    • 水平面を0度とし、反時計回りを正とします(例:90=上向き、270=下向き)。
      コード例:
\chemfig{R-@{a1}C(-[90]R)=@{a2}O}
\qquad
\chemfig{@{n}Nu}
% Nu(求核剤)から、カルボニル炭素(C)へ攻撃
% オプション[45]: 求核剤の右斜め上から矢印が出発し、O原子の背後からCに攻撃
\nuatk[45]{Nu}{a1-a2}

分子間反応(求電子攻撃): \elatk

二重結合などのπ電子が、求電子剤(E)を捕捉しに行く矢印を描きます。
結合に対して求電子剤がどちら側にあるかを自動判定し、近い側から矢印を出します。

コマンド仕様:
\elatk[到着角度]{結合ノード1-結合ノード2}{求電子剤ノード}

  • 引数 {ノード1-ノード2}:
    矢印の始点となる結合の両端のノード名です。この2つのノード間の結合から結合に垂直に矢印が伸びます。

  • 引数 {求電子剤ノード}:
    攻撃を受ける(矢印が向かう)求電子剤のノード名です。

  • オプション [到着角度]:

    • 矢印が求電子剤に突き刺さる角度(入射角)を指定します。
    • \nuatk と同様に度数法(0〜360)で指定します。

コード例:

\chemfig{R-a{c1}C(-[210]H)=@{c2}C(-[-30]H)-R}
\qquad
\chemfig{@{el}E}
% C=C 二重結合から、求電子剤Eへ攻撃
% オプション[90]:求電子剤の上(90度)から矢印が入る
\elatk[90]{C1-C2}{el}

反応式

反応物 + 反応物 → 生成物 のように矢印も用いて書きたいという方は

\schemestart
\chemfig{・・・} % 反応物
\qquad
\chemfig{・・・} %反応物
\arrow
\chemfig{・・・} %生成物
\何らかの巻矢印コマンド
\schemestop

という形で書けます。\schemestart,\schemestopで囲んでいる行に改行コマンドを入れたり空行を入れるとエラーになるので注意してください。

補足

mol2chemfigでノードを生成すると、@{a1},@{a2}・・ のように番号だけが変化していきます。そのため、{c1-c2}のようにするべきところを{c1-2}のようにしても動作するようにしました。
応用例や、実際のコンパイル画像を見たいという方はGitHubリポジトリでPDFも公開しているのでご覧ください。

まとめ

矢印の描画を効率的に書くことができるので、ぜひ皆さんも使ってみてください。ド素人ですので、間違いや改善点などあれば知らせていただけると幸いです。最後まで読んでいただきありがとうございました。

Discussion