Acetaminophen’s diary

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

誰でも簡単! 化学構造式を LaTeX に取り込むパッケージ

これは TeX & LaTeX Advent Calendar 2014 の8日目の記事です。昨日は abenori さんでした。明日は tex-ut-tex さんです。

f:id:acetaminophen:20141207165216p:plain

これは今日の日めくりカレンダー。何もわからない笑(というか合ってる?)

今日8日目はちょうど TeX ユーザの集い 2014 から1か月です。私自身も発表したわけですが、大変楽しい一日を過ごさせていただきました。

TeX ユーザの集いも初参加だったわけですが、今回は Advent Calendar の重点テーマが「このパッケージがスゴイ!」というわけで、TeX Wiki

という項目を作成した張本人として、参加しないわけにはいかないと思い、こちらも初参加です。

というわけで、今回は本ブログのコンセプトにちなんで

化学構造式を誰でも簡単に LaTeX 文書に挿入できるパッケージ

を紹介します。その名も「chemobabel.sty」です!

「誰でも」というからには、それなりに簡単でなければならないわけで、今回は本当に誰でもやってみようと思えばすぐに実行できます。というわけで、化学なんか知らないという方もぜひ読んでくださいね!(切実)

今回は Advent Calendar 目的で訪れた方向けのこの記事と、一般的な化学系の方向けの記事TeX ユーザかどうかにかかわらず読める記事)を分けて公開しました。TeX ユーザの方の中にはどうしてもやりたくない! という方がいらっしゃるかもしれませんが、こちらの記事では全く化学の知識は必要ありません。単にソフトのインストール法さえ分かれば誰でも楽しめるので、参考にしていただけると幸いです。

さて、なぜこんなパッケージを紹介するかというと、理由があります。化学を専門としない方にも事情が伝わるように、喩えを用いつつ説明します。

 

化学における TeX の状況

化学を扱う人々の中で、TeX を使っている人はほとんどいないのが現状です。なぜでしょう? 答えはおそらく単純で「大量の複雑な構造式を描く必要があるから」です。

化学系の大半の研究所では、論文などに構造式を挿入する場合に ChemDraw などの専門ソフトを使っています。こうした専門ソフトは非常に高機能で、原子をつなげて構造式を描画したうえで、それを化学的に自然に見える形に整形(構造最適化といいます)したり、論文雑誌ごとに決められたスタイルを適用(線の長さや太さ、文字と図形のバランスなど)したりできます。また描画機能だけでなく、構造式から性質を予測したり計算したりする機能ももっています。単に描画するだけであれば Illustrator のようなソフトでも十分だと思うかもしれませんが、こうした「化学的情報を最大限保持し、専門的な分析に使える規格」として独特のファイルフォーマットがあります。

ChemDraw の標準は .cdx というバイナリファイルで、他にもソフトに依存しないテキスト形式(行列形式)である .mol ファイルなどがあります。簡潔には

  • 化学業界では高機能な ChemDraw が用いられ、独特の .cdx 形式で保存される
  • 化学構造の情報を保持する汎用ファイル形式の .mol 形式も用いられる
  • 独特の .cdx 形式をインポートできるフリーソフト*1がいくつか存在する

この状況を一般に知られているグラフィックスに置き換えてみると

  • デザイナー業界では高機能な Illustrator が用いられ、独特の .ai 形式で保存される
  • ベクター画像を保持する汎用ファイル形式の .pdf も用いられる
  • 独特の .ai 形式をインポートできる Inkscape のようなオープンソースのプログラムが存在する

といった感じでしょうか。グラフィックスについては汎用的な .pdf に加えて .ai も TeX の graphicx パッケージで扱える*2わけですが、現状では化学フォーマットに関してはよく利用される .cdx や .mol ですら TeX で標準的に扱える状況ではありません。そこで、化学構造式を TeX で扱おうという場合には

  • XyMTeX や chemfig などの構造式描画パッケージを用いる
  • ChemDraw などで一旦手動で PDF や EPS 形式にエクスポートする

という操作が必要でした(TeX Wiki 参照:たった今加筆しました)。前者はマクロを習得するのが ChemDraw のような GUI ソフトウェアに比べて化学者にとっては負担になりますし、後者はいちいち手動でエクスポートするのが面倒です。こうした理由からか、化学系では TeX はほとんど使われず、専門のジャーナルでも TeX の論文を受け付けない場合が多々あります(過去記事参照)。したがって

誰も TeX を使わない → ジャーナルもサポートしない → 余計に誰も TeX を使わない

という悪循環*3のようになっていると考えています。

 

そこで、パッケージ!

こうした状況を打破するためには、選択肢を増やす必要があるわけです。化学者全員が使うかどうかは別問題として、化学者にとって選択肢が増えることは TeX 界にとっても利益だというわけです。そこで、今回は日本の TeX ユーザ向けに chemobabel.sty というパッケージを紹介します。このパッケージを使えば、手動でフォーマット変換を行うことなく \includegraphics 並みの手軽さで、化学構造式を LaTeX 文書中に挿入することができます!

 

パッケージの入手

まだ CTAN には公開されていないので、作者の GitHub レポジトリからダウンロードしましょう。作者は Acetaminophen さんです。

え…はい、自分です(笑)そもそもマクロを書いた経験自体がなく、今回見よう見まねで初めて書いたマクロを初披露という大胆な行動です。

このブログで最近何度も取り上げてきたテーマなので、もしかすると「もう既にやったよ!」という方もいらっしゃるかもしれませんが、今回はいくつかの問題点を修正するとともに、新機能の追加により「誰でも簡単に化学構造式を LaTeX 文書に取り込む」を直感的な操作で可能にするパッケージらしきものを作ってみた、というわけです*4

基本的なメソッドすでに説明したとおりですが、今回は新しくパッケージを作成するにあたり、従来の \smiles や \obabel よりもオプションと引数を多く扱えるように拡張した \smilesobabel コマンドと新機能の \chemobabel を定義しました。\smilesobabel の有利な点に関しては後ほど説明することにして、早速使ってみましょう。

 

準備

初めに、LaTeX から呼び出して使用するプログラムとして必須の Open Babel と Inkscape をインストールします。以前にも説明していますが、私が確認できた方法を簡潔に書いておきます。

Open Babel のセットアップ

  • Windowsインストーラを入手し、GUI の指示に従ってインストールする。その後、コマンドラインから呼び出せるように PATH を通す。
  • Mac (1):インストールパッケージを入手し、GUI の指示に従ってインストールする。
  • Mac (2):MacPorts などのパッケージ管理システムで openbabel を検索し、インストールする。

Mac については2通り書きましたので、お好きな方でどうぞ*5。詳細は Installation - Open Babel を参照してください。

Inkscape のセットアップ

すべてにおいて大事なのは確実に PATH を通すことです。特に GUI インストーラは、コマンドラインで使うための PATH を通してくれないので注意してください。

 

パッケージの使い方

パッケージのインストールは一般的なパッケージと同様です。$TEXMFLOCAL に置いてもよし、任意のソースと同じディレクトリに置いてもよし。

パッケージの使い方などの詳細は全て GitHub の chemobabel.pdf というドキュメントに記載しましたが、以下で簡単に説明します。例で使用した .cdx や .mol ファイルもすべて GitHub に置いてありますので、活用してください。

まずプリアンブルに

\usepackage{graphicx}
\usepackage{chemobabel}

と書いてロードします。chemobabel.sty では、化学構造式を挿入する方法が2通り提供されています。一つ目は先ほど述べた ChemDraw のような専門ソフトによる .cdx や .mol ファイルを使用する方法、二つ目は以前から紹介していた SMILES 表記法のテキストから変換する方法です。それぞれ以下のように用います。

\chemobabel[scale=0.6]{Brevetoxin A.mol}{}
\chemobabel{ATP.cdx}{-xd}
\smilesobabel[scale=0.7]{CC(=O)Nc1ccc(cc1)O}{}

タイプセット時には

pdflatex -shell-escape test.tex

のように、-shell-escape を付けて実行します。

f:id:acetaminophen:20141207133812p:plain

f:id:acetaminophen:20141207134454p:plain

なお、ここで用いた Brevetoxin A.mol は ChemSpider からダウンロードしたもの(元は 9041092.mol というファイル名)で、ATP.cdx は ChemDraw で描画したものです。また、最後の SMILES 表記はアセトアミノフェンのものです。もちろん自分で構造式を描画したファイルに対してもこの方法を利用できますので、これを希望する場合は以下の記事も参考になることでしょう:

上の例では欧文の pdflatex で示しましたが、日本語なら platex + dvipdfmx に置き換えれば同じことができます。graphicx パッケージに dvipdfmx オプションを付けるのを忘れないでください。

ここで気になるのが -shell-escape オプションです。ソース中に obabel や inkscape 以外の外部プログラム実行の恐れがあるなど、安全性に疑問を感じる場合は、プリアンブルの末尾に

\input{chemobabel-extract.tex}

と書いてみてください(追記:この方法は面倒なので、最新版では \usepackage[extract]{chemobabel} とすれば済むようにしました [2016/02/09] )。ソースを -shell-escape オプション無しでタイプセットすると、ChemFigFile.tex というファイルが書き出されます。これが obabel と inkscape にとって必要な最小限のソースなので、このファイルにのみ

pdflatex -shell-escape ChemFigFile.tex

として -shell-escape すれば安全です。この方法の副次的なメリットとして、毎回 obabel と inkscape を呼び出すことがなくなるため、必要に応じて -shell-escape するという時間短縮も挙げられます。

 

従来のコマンドの不具合や限界

以前から紹介していた \smiles や \obabel には以下のような不具合がありました。

  • \smiles :\includegraphics に渡すオプションを指定できなかったうえ、エラーハンドリングがないため不便
  • \obabel :\includegraphics に渡すオプションを指定できるが、空にすると
    ! Package keyval Error:  undefined.
    というエラーを出す(実質的には警告と同レベルで、タイプセットは可能)

一見 \obabel は実質的には問題ないように見えるかもしれませんが、以前紹介していた自動抽出マクロを実行する場合にはこれが致命的で

! Use of \obabel doesn't match its definition.

というエラーが出てタイプセットに失敗します。

こうした問題を修正し、さらに obabel に対するオプションを自由に与えられるように引数を増やした新たな拡張コマンドとして、chemobabel.sty の \smilesobabel が登場するわけです。ここではオプション未指定の場合に勝手にデフォルト値として scale=1 を与えてしまうことにより、無難に回避しています*6

 

今後の改善点

実はパッケージ自体は今月に入ってから自分用にぼちぼち作っていたのですが、実際にこの記事を Advent Calendar 用に書こうと本気で決めたのはわずか4日前で、それから慌てて機能改善を始めました。それまでは別のもう一つのネタとの間でどちらにしようか決めかねていました:

というわけで、短い準備期間でしたが、機能については満足のいくものができました。需要がありそうなら CTAN に…というのも考えていますが*7、まだ改善の余地は多くあると思っています。現状では特に

  • 初めに obabel と inkscape のインストールを確認すべきでは?
  • \catcode の変更方法がユーザ任せなのでエレガントではない?

ことが気になっています。というわけで、腕に覚えのある TeXnician の方々はどうぞご協力ください。

 

あとがき

というわけで、新しい構造式出力法の提案でした。出力の自由度は XyMTeX や chemfig に劣るとは思いますが、簡便さという点では優れているのではないでしょうか。XyMTeX に関しては TeX ゼミ さんが20日目に、chemfig に関しては doraTeX さんが12日目に解説してくれるそうなので、みなさん期待しておきましょう!

今回の Advent Calendar の記事に関連して、いろいろな方面にコミットしました:

  • パッケージの作成とドキュメント執筆(ドキュメントが大変だった…)
  • 本記事と関連記事のブログ投稿
  • TeX Wiki の新項目

というわけで、一気にいろいろやってみたというお話でした。

 

追記:2014-12-09 ちょっとだけ補足。


「化学構造式を LaTeX に取り込むパッケージ」の補足 - Acetaminophen’s diary

 

追記:2014-12-17 生物系の LaTeX 関連ツールを紹介した名記事!


生物系のためのLaTeX関連ツール - 0番染色体

同じく Advent Calendar の17日目の記事です。生物系での応用という貴重なリソース!

*1:ChemDraw ほど高機能ではない教育用無償版のようなものなら、既に紹介した ChemSketch, Accelrys Draw, Marvin Sketch などがあります。オープンソースのプログラムはより機能が劣りますが、わずかに存在しているようです。

*2:それにしてもこの前の doraTeX さんの記事はすごかった…

*3:「悪」かどうかは判断が分かれますが、少なくとも TeX 界からするとユーザの獲得に失敗しているわけですから「悪」といっていいでしょう。

*4:実は12月1日には既に最初のバージョンを公開しはじめていたのですが、これは僕が使える複数の端末 (Windows, Mac) で何度かテストし、その都度必要な部分を修正するという目的に GitHub が適していたからです。なにしろ GitHub アカウントは(僕の Twitter と同様に)こっそり作成していたので、もう既に見つけて使っている人は多分いないだろうと想定しています。いたとしたらスゴい洞察力!

*5:ただし、この記事を書いている時点では GUI パッケージは ver.2.3.1 で、MacPorts のパッケージは ver.2.3.2 でした。後述しますが、バージョン番号によって出力が異なる場合があるので、気に留めておいてください。

*6:たぶん \futurelet を使って場合分けというのが正攻法ですが…

*7:どうでしょう、あってもいいとは思いませんか?