読者です 読者をやめる 読者になる 読者になる

Acetaminophen’s diary

化学に関すること、TeXに関すること、ゆきだるまに関すること。

化学構造式をTeXで(1):自動化による簡単生成

化学 TeX ソフト

追記:新しい記事を書いたので、以下の内容は少々古い。最新はこちら:

ただし、ソフトウェアの概要やインストール方法などは以下の内容を参照。

つい先日発見したばかりの「化学構造式を TeX で出力する簡単な方法」を紹介する。驚くほど簡単だ。複雑なマクロを自力で書く必要も全くなく、特に新しいコマンドを覚える必要もない。後で紹介するプリアンブルをコピペするだけで、簡単に化学構造式を描くことができる。ただし、手動調整を何も伴わない(コンピュータによる自動生成)ため、多少原子の配置がおかしくなるのは大目に見てほしい。

使用するリソースは全てクロスプラットフォームなので、汎用性はあると思う(実際に僕が試したのは WindowsMac のみ)。

ケムステからいらした方へ (2014-11-05)

訪問ありがとうございます。こちらのはてなブログでは「化学」と組版ソフト「TeX (LaTeX)」との関連や、その他のツールとの連携について記事にしています。化学以外の分野で多く用いられる TeX に関する記事が多めでなじみが薄いかもしれませんが、それらを含めて多分野の融合という観点から興味深い記事も掲載しています。はてなブログもどうぞよろしくお願いいたします。

簡潔に今回の手順を先に述べておく。

前提条件:TeX が普通に使えること(使用パッケージ:基本的には graphicx パッケージのみ!)

必要なソフトウェア:Open Babel, Inkscape(いずれもオープンソース!)

  1. まず、Open Babel をインストール
  2. 次に、Inkscape をインストール
  3. LaTeX ソースを書き(後述:ほぼコピペでOK)、platex + dvipdfmx などで通常通りタイプセット

 

TeX で構造式を描く需要と難しさ

このブログの以前の記事


TeXを使うべきか、Wordを使うべきか - Acetaminophen’s diary

で考察した通り、TeX で化学構造式を描く需要はあまりないかもしれない。しかし、今回はこれに安易な方法で挑戦する。化学のおすすめソフト (2014-09-01)でも述べたが、TeX でコマンドにより化学構造式を描くのは結構難しい。これを実現するには例えば以下が参考になる:

このようにマクロを使用してコマンドで作図するのもよいが、慣れるまでには相当の熟練を要する。一方、ChemDraw や類似のフリーソフトを使用していったん PDF を出力し、それを \includegraphics で取り込むのは直感的で実行しやすいが、これらと同等の機能と操作性をあわせもつオープンソースのプログラムが少ない*1ため、利用しづらいまたは抵抗があるという人もいるだろう。しかし、今回はどちらでもなく

オープンソース」かつ「化学系で使いやすい」

という条件を満たしている。

 

使用するソフトウェアとファイル形式、リソースの説明

Open Babel

詳細な手順の前に、今回の鍵となる Open Babel について説明する必要がある。

Open Babel とは、主に化学構造を保持するさまざまなファイルフォーマットを変換するシステムで、フリーで配布されている。分子のモデリングというよりは“分子の情報学”(ケモインフォマティクスなどともいわれる)の目的で使われるシステムであって、化学構造のライブラリ、構造が類似しているかどうかの判定などにも役立つ。例として Windows 用のインストーラをダウンロードしてインストールすると、下のような GUI ソフトウェアが利用できる(僕がケムステに投稿した記事も参照)。

f:id:acetaminophen:20141101215224p:plain

入出力ファイル形式は相当数あり、おそらく化学構造を表すために用いられるほとんどのフォーマットをカバーしている。主なものでは

  • .mol
    MDL MOL format:化学構造を記述する標準的なフォーマットで、結合表 (Connection Table) という考えに基づく行列表記法の1つ
  • .cml
    Chemical Markup Language:化学情報を XML と同じように扱おうという言語
  • .cdx
    ChemDraw binary format:化学系で最もメジャーな構造式描画ソフトウェア(有償)の標準出力形式
  • .smi
    SMILES files:Simplified Molecular Input Line Entry Specificationの略で、線形表記法の1つ。今回の主役!

といったところだと思う。詳しい日本語リソースとしては、例えば

などがある。

 

SMILES

SMILES とは行形式の文字列で分子の構造を表す規則に従った書き方で、原子と原子の結合に関する情報を含んでいる。例えばニコチン酸ナイアシン)は以下のような構造式である。

f:id:acetaminophen:20141101215534p:plain

この分子の SMILES 表記は

OC(C1=CC=CN=C1)=O

となる。大まかな規則としては(上の化学者のつぶやきからの引用)

  1. 原子記号で表示、水素は記載せず自動飽和
  2. 隣接原子は隣に書く
  3. 2重結合は"="で、3重結合は"#"、分岐は"()"で示す
  4. 環形成している原子同士にナンバリングする

で、「OC の炭素に (環) と =O が結合している」ことと「OCの結合した炭素(最初のC1)から数えて、(C1=C-C=C-N=C-C1)環を形成している」ことが分かる。人間が読んでもよく分からないが、この SMILES 表記はコンピュータ的には処理しやすく設計されているらしい。

ちなみに、僕が以前「化学のおすすめソフト (2014-09-01)」で紹介したフリーソフト ChemSketch, Marvin Sketch, Accelrys Draw や商用の ChemDraw は、描画した構造式を SMILES 形式に変換する機能がある。ただ、これらはいずれもオープンソースではないため、使いにくい場合がある。

 

ChemSpider

そこで登場するのが、ChemSpider というオンラインの化学情報データベースである。自由にアクセスでき、窓から化合物名を入力して構造式や SMILES 表記を得たり、逆に SMILES 表記から対応する化合物名を得たりすることができる。

ちなみについ先ほどのニコチン酸はここで SMILES 表記を入力し、MOL ファイルをダウンロードして ChemSketch で開いたものをスクリーンショットに取ったものである。

 

詳細なやりかた

以下では Windows の場合で説明する。おそらく他の OS でも等価なことが可能なはず(未確認)。

初めに、Open BabelInkscape をインストールする。インストーラに従うだけなので、簡単なはず。

次に、両方のプログラムに PATH を通す。今回はコマンドラインからこれらのプログラムを使用するので、(GUI ソフトウェアの利用だけなら特に不要だが)PATH を通しておく必要がある。僕の場合は環境変数 PATH の末尾に

C:\PROGRA~2\OpenBabel-2.3.2;C:\PROGRA~2\Inkscape

を書き加えた*2

それから、肝心の TeX ソースを書く。とりあえず、TeX ソースのプリアンブルに以下のように書いておく(コピペで十分):

\documentclass{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\newcounter{smilescounter}
\setcounter{smilescounter}{1}
\newcommand{\smiles}[1]{
\immediate\write18{%
  obabel -:"#1" -O smilesimg\arabic{smilescounter}.svg && %
  inkscape -f smilesimg\arabic{smilescounter}.svg --export-pdf=smilesimg\arabic{smilescounter}.pdf || %
  rm -f smilesimg\arabic{smilescounter}.pdf%
}
\includegraphics{smilesimg\arabic{smilescounter}.pdf}
\addtocounter{smilescounter}{1}
}

そして、本文には以下のように記述する:

\begin{figure}[ht]
  \centering
  \smiles{C(C(C(=O)O)N)C(=O)N}
  \caption{アスパラギンです。}
\end{figure}

プリアンブルを見ればなんとなくわかるはずだが「obabel でまず SMILES 表記から SVG 形式の画像に変換し、それを inkscape で PDF に変換しなさい、もし失敗したら出力の PDF ファイルを消去しなさい」というコマンドを外部に吐き出すようにしているわけである。この変換過程はテキストを保持したベクター画像の状態になるため、無事に PDF 画像が生成すれば figure 環境中で取り込まれる。このとき \smiles の引数に使う SMILES 表記はもちろん ChemSpider で自動的に出力されるもののコピペでOK。

ソースファイルができたら platex + dvipdfmx でタイプセットするわけだが、ここで一つ注意すべき点がある。外部のプログラムを実行するので、platex に -shell-escape オプションを付けなければならない。すなわち

platex -shell-escape smiles.tex
dvipdfmx smiles.dvi

のように入力する*3。もちろんこうしてしまうと任意のプログラムが TeX 経由で実行できてしまうので、セキュリティ上はあまり好ましくない。特に Web 上から取得したソースなど、他人が作ったソースを利用することが多い場合は要注意。実行するときは自己責任で(次回説明)。

このサンプルをGoogleサイトに置いておく:smiles.tex, smiles.pdf

 

f:id:acetaminophen:20141101223031p:plain

f:id:acetaminophen:20141101223055p:plain

開いて見てみると、簡単な分子ならそれなりにきれいに表示できている。複雑な分子になると原子の位置が重なって見づらくなっている場合があるので、このような場合は調節しなおしたい分子だけ SVG または PDF ファイルを Inkscape で直接GUIから開いて編集し、普段通り \includegraphics で取り込むとよいだろう。

 

もっと楽に、かつ親切に

実は、この方法は以下のサイトから仕入れたものである。

で、このうち1つめの記事は PDF でなく PNG 画像を取り込むことになっている。というのも、obabel は PNG なら直接出力可能だからであろう。しかしそのコメント欄に、いったん obabel が出力可能な SVGInkscape に通して PDF 出力するという方法が提案され、さらに

でこれを実現する graphvizObabel.sty というスタイルファイルが公開されている(ページのいちばん下あたり)。これを受けて書かれたのが上の2つめの記事で、このパッケージを読み込むことでずいぶん簡便になっている。しかも、\includegraphics にオプションを渡すことができるようになっているのでより都合が良い。

そこで、graphvizObabel.sty を次の TeX ソースファイルと同じ場所に置いておけば、図のサイズも調整できることになる。

プリアンブル:

\documentclass{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\usepackage{graphvizObabel}

本文:

\begin{figure}[ht]
  \centering
  \obabel[scale=0.6]{C(C(C(=O)O)N)C(=O)N}
  \caption{アスパラギンです。}
\end{figure}

これを先ほどと同様に

platex -shell-escape obabel.tex
dvipdfmx obabel.dvi

と実行すると、platex のログだけでなく実行した外部プログラムのログも保管してくれる。ちなみに僕が最初に紹介した smiles.tex は、基本的に PNG 取り込みだった1つ目の記事のソースの改変版で、例のスタイルファイルを参考にしつつ、外部コマンド呼び出しを最小限で書き換えただけのものである。

こちらもサンプルをGoogleサイトに置いておく:obabel.tex, obabel.pdf

 

細かい点として、参考にした記事は全て pdflatex を使っていたので、日本語処理用に graphicx パッケージに dvipdfmx オプションを付け、jsarticle クラスに書き換えた。欧文だけの場合は article クラスで dvipdfmx オプションを削除し

pdflatex -shell-escape smiles.tex

のようにすることもできる。

 

次回はこの方法の注意点と、より安全かつ便利な方法を提案する。

*1:例えば

などで紹介されているプログラムは利用可能。ただ、配布サイトを訪れた印象としては ChemDraw や ChemSketch, Marvin Sketch, Acclerys Draw には及ばない感じ?

*2:Windows 7 (64bit) で Program Files (x86) 以下にインストールしたので MS-DOS8.3 形式で書いておいた。

*3:僕の場合は

RegistryTool: Could not set the value 'C:\PROGRA~2\Inkscape\inkscape.exe'

というエラーが出たが、結果に問題がなかったので無視。おそらくコマンドライン版である inkscape.com と GUI 版である inkscape.exe が共存していることに起因すると推測している。