TeX Alchemist Online

TeX のこと,フォントのこと,Mac のこと

TeXによる化学組版

はじめに

この記事は TeX & LaTeX Advent Calendar 2013 の3日目の記事です。
2日目はk16shikanoさんでした。4日目はsenopenさんとなっています。

普段はTeXで化学のお仕事をしつつ,Mac用のTeX統合環境 TeXShop,数式画像生成ツール TeX2img の開発といったこともやっております。
先日のTUG 2013 ではTeXShopの開発についてお話しさせて頂きました。

化学におけるTeX

さて,数学や物理学,計算機科学といった学問分野では,TeXを使って書籍や論文を執筆するのはごく当然のことと思います。
しかし,化学の分野では,TeXが広く普及しているとは言いがたいのが現状です。

ですが,TeXの数式表現力,レイアウトの自動化機能,マクロプログラミングといった強力な機能は,化学の文書作成にも大いに力を発揮します。
それを使わずにおくのは大変もったいないことです。

先日,TeX組版で高校生向けの化学の参考書を執筆・出版しました。

2014年度用 鉄緑会東大化学問題集  資料・問題篇/解答篇 2004‐2013 (単行本)

2014年度用 鉄緑会東大化学問題集 資料・問題篇/解答篇 2004‐2013 (単行本)

今日は,この本を作るために使ったTeXの技法の数々を紹介しようと思います。
化学の文書作成にもTeXが役立つことを広く知ってもらい,化学業界のTeXユーザーが一人でも増えれば幸いです。

「鉄緑会東大化学問題集」TeX組版の基本情報

環境
Mac OS X
TeXエンジン
upLaTeX + dvipdfmx
ドキュメントクラス
jsarticle
使用パッケージ
amsmath, otf, mhchem など多数。
使用フォント
和文:ヒラギノ,欧文:Computer Modern が基本。
使用エディタ
TeXShop
図版作成
Adobe Illustrator
ページ数
480ページ

一からコンパイルするには Core i7 3.4GHz + RAM 16GB の iMac で6分かかりました。

TeXによる化学組版

化学の文書にも多数の数式が登場しますが,その部分の書き方は通常のTeXと変わりません。
化学に特有なのは,化学式・化学反応式・構造式といったものの表現でしょう。
化学式の表現には,mhchemパッケージというものが非常に役立ちます。

mhchemパッケージ

mhchemパッケージはCTANからダウンロードできますが,最近の TeX Live であれば初めからインストールされているでしょう。

\usepackage[version=3]{mhchem}

とすれば使用できるようになります。

化学式・イオン式

基本となるのが \ce という命令です。添字やイオンの価数・符号の上付き・下付きは,原則として自動判断されるという優れものです。いちいち $\mathrm{SO}_4^{2-}$ のように打つ必要がありません。
ただし例外として,多価のイオンの価数の前には ^ を打つ必要があります。"SO42-"SO42-SO42-SO42- のどれを意味するのかは,化学の知識がなければ判断できず,TeXはそこまでは自動判断できないからです。

【入力】

\ce{Na2S2O3}, \ce{NH4+}, \ce{[Ag(CN)2]-}, \ce{SO4^2-}, \ce{Cr2O7^2-}, \ce{Al^3+}

【出力】
f:id:doraTeX:20131203225956p:plain


通常のTeXの数式モードでは,$\mathrm{SO}_4^{2-}$ のように,複数の文字を上付きにするには { } で囲まなければなりませんが,\ce{} の引数中ではそれは不要です。^ 以降の連続する部分が全てイオン価数と見なされますので,\ce{SO4^2-} という表記で大丈夫です。({2-}をカッコで囲んでも問題ありません。)

ただし,同位体を区別するために原子番号や質量数を左側に記す場合は,次のように { } で囲うことが必要です。

【入力】

\ce{_{17}^{35}Cl}

【出力】
f:id:doraTeX:20131203225957p:plain



化学反応式の様々な表現

化学反応式の基本

+ の前後にスペースを入れておけば,それはイオンの電荷ではなく化学反応式のプラスであると判断され,適切に組版されます。

また,-> で化学反応式の矢印を表します。

【入力】

\ce{Ag2O + 4NH3 + H2O -> 2[Ag(NH3)2]+ + 2OH-}

【出力】
f:id:doraTeX:20131203225958p:plain


化学平衡

<=> で化学平衡を表す両矢印になります。

【入力】

\ce{CaCO3 <=> Ca^2+ + CO3^2-}

【出力】
f:id:doraTeX:20131203225959p:plain


沈殿や気体発生の矢印

他の化学式から離して単独で v と書くと沈殿生成を表す下矢印,^ を書くと気体生成を表す上矢印になります。

【入力】

\ce{Ba^2+ + SO4^2- -> BaSO4 v}

\ce{2H+ + 2e- -> H2 ^}

【出力】
f:id:doraTeX:20131203231434p:plain


水和水

水和水(結晶水)は . に続けて書きます。$ で普通のTeX数式を混ぜることもできます。

【入力】

\ce{CaSO4.2H2O -> CaSO4.$\frac{1}{2}$H2O + $\frac{3}{2}$H2O}

【出力】
f:id:doraTeX:20131203230001p:plain


偏った平衡

<=>><<=> で,一方に偏った平衡を表す,長さの異なる矢印になります。

【入力】

\ce{CH3COOH <<=> CH3COO- + H+}

\ce{H+ + OH- <=>> H2O}

【出力】
f:id:doraTeX:20131203231524p:plain


触媒など反応条件の表示

矢印の上に触媒などを書くこともできます。

【入力】

\ce{2H2O2 ->C[MnO2] O2 ^ + 2H2O }

【出力】
f:id:doraTeX:20131203230003p:plain


この C は「化学式モードにする」という意味です。これを付けなければ,通常の数式モードになります。

【入力】

\ce{N2 + 3H2 ->[x\,\mathrm{mol}] 2NH3 }

【出力】
f:id:doraTeX:20131203230004p:plain


矢印の上下両方に注釈を付けることもできます。

【入力】

\ce{2CrO4^2- + 2H+ <=>C[H+][OH-] Cr2O7^2- + H2O }

【出力】
f:id:doraTeX:20131203230005p:plain


加熱を表す三角は \Delta で表現します。

【入力】

\ce{CuSO4.5H2O ->C[\Delta] CuSO4.H2O + 4H2O ^ }

【出力】
f:id:doraTeX:20131203231728p:plain


C の代わりに T を使えば,テキストモードで注釈を入れられます。

【入力】

\ce{PbCl2 ->T[熱湯に溶解] Pb^2+ + 2Cl-}

【出力】
f:id:doraTeX:20131203230007p:plain


複数行にまたがる反応式

長い化学反応式を折り返して複数行の化学反応式にするときは,普通に amsmathalign* 環境を使っています。
【入力】

\begin{align*}
&\ce{2KMnO4 + 5(COOH)2 + 3H2SO4}\\
&\ce{-> 2MnSO4 + 10CO2 + K2SO4 + 8H2O}
\end{align*}

【出力】
f:id:doraTeX:20131203230008p:plain


熱化学方程式

熱化学方程式を書くときに \ce{} の引数中で - を直接用いると,単結合と解釈されて,前後のスペースが狭くなってしまいます。

【悪い例】

\ce{NaCl (固) = Na+ (気) + Cl- (気) - 780kJ}

【出力】
f:id:doraTeX:20131203230009p:plain


こういうときは,全体を数式環境に入れて,数式として取り扱わせるべきでしょう。

【良い例】

\[\ce{NaCl}\mbox{(固)} = \ce{Na+}\mbox{(気)} + \ce{Cl-}\mbox{(気)} - 780\,\mathrm{kJ}\]

【出力】
f:id:doraTeX:20131203235559p:plain


構造式の表現

一行で書ける単純な構造式も,\ce で表現できます。

  • 単結合は - で表現します。ただし,イオンの電荷の符号と解釈されないよう,左右にスペースを空けます。
  • 二重結合は = で表現します。これはスペースを入れる必要はありません。
  • 三重結合は # で表現します。これもスペースを入れる必要はありません。

【入力】

\ce{HC#C - CH=CH2 + 3H2 -> CH3 - CH2 - CH2 - CH3}

【出力】
f:id:doraTeX:20131203230011p:plain


ただし,# は本来TeXで特別な意味を持つ記号なので,マクロ定義内で使うときには注意が必要です。

% \def\acetylene{\ce{HC#CH}} %% => ERROR: Illegal parameter number in definition
\def\acetylene{\ce{HC##CH}} %% => OK


ただ,\def の中で \def をしているときとか,\expandafter 祭りをしているときなどに,# の個数に注意しながら展開を考えるのは疲れるので,三重結合を表す代替記法 \tbond (triple bond)を使うのがお勧めです。

\ce{HC\tbond C - CH=CH2 + 3H2 -> CH3 - CH2 - CH2 - CH3}

反応の量的変化

反応の量的変化を表す表は,普通に tabular を使って作ります。
【入力】

\begin{tabular}{cc@{}c@{}c}\hline
 & \ce{N2O4} & \ce{<=>} & \ce{2NO2} \\\hline
 反応前 & $N$ && $0$ \\
 変化量 & $-N\alpha$ && $+2N\alpha$ \\
 平衡状態 & $N(1-\alpha)$ && $2N\alpha$ \\\hline
 \multicolumn{4}{r}{$N(1+\alpha)\,\mathrm{[mol]}$}
\end{tabular}

【出力】
f:id:doraTeX:20131203230012p:plain


picture環境によるベンゼン環の描画

横向きのベンゼン環を用いた反応式の表現

横向きのベンゼン環を picture 環境を使って描画する命令を次のように定義しておけば,\ce と組み合わせて,比較的自然に使うことができます。

【定義】

%\usepackage{epic} %%% 古い環境の場合はこれが必要
%\usepackage{eepic} %%% 古い環境の場合はこれが必要
\usepackage[dvipdfmx]{pict2e}

% 横向きベンゼン \benzene
\def\benzene{{\unitlength.1pt%
\raisebox{-7pt}{\begin{picture}(223,195)%
\linethickness{.5pt}%
\font\tenln=linew10%
\put(0,96){\line(10,17){56}}%
\put(54,191){\line(1,0){114}}%
\put(166,191){\line(10,-17){56}}%
\put(0,98){\line(10,-17){56}}%
\put(54,5){\line(1,0){114}}%
\put(166,5){\line(10,17){56}}%
\put(23,98){\line(10,17){45}}%
\put(155,173){\line(10,-17){45}}%
\put(66,22){\line(1,0){90}}%
\end{picture}}}}

% 横向きフェニル基 \phenyl
\def\phenyl{{\unitlength.1pt%
\raisebox{-7pt}{\begin{picture}(301,195)%
\linethickness{.5pt}%
\font\tenln=linew10%
\put(0,96){\line(10,17){56}}%
\put(54,191){\line(1,0){114}}%
\put(166,191){\line(10,-17){56}}%
\put(0,98){\line(10,-17){56}}%
\put(54,5){\line(1,0){114}}%
\put(166,5){\line(10,17){56}}%
\put(23,98){\line(10,17){45}}%
\put(155,173){\line(10,-17){45}}%
\put(66,22){\line(1,0){90}}%
\put(220,98){\line(1,0){80}}%
\end{picture}}}}

% 横向きベンゼンパラ二置換体 \para
\def\para{{\unitlength.1pt%
\raisebox{-7pt}{\begin{picture}(378,195)%
\linethickness{.5pt}%
\font\tenln=linew10%
\put(77,96){\line(100,173){57}}%
\put(132,192){\line(1,0){113}}%
\put(243,192){\line(100,-173){56}}%
\put(77,98){\line(10,-17){57}}%
\put(132,3){\line(1,0){113}}%
\put(243,3){\line(100,173){56}}%
\put(100,98){\line(100,173){45}}%
\put(232,173){\line(100,-173){45}}%
\put(143,22){\line(1,0){90}}%
\put(297,98){\line(1,0){80}}%
\put(0,98){\line(1,0){80}}%
\end{picture}}}}

【使用例】

\ce{{\benzene} + HNO3 ->C[~~\Delta~~][] {\phenyl} NO2 + H2O}

\ce{{\phenyl} NH2 + NaNO2 + 2HCl -> {\phenyl} N^+#NCl- + NaCl + 2H2O}

\ce{{\phenyl} N^+#NCl- + {\phenyl} O^-Na+ -> {\phenyl} N=N  {\para} OH + NaCl}

【出力】
f:id:doraTeX:20131203231943p:plain


オルト・メタ二置換体の表現

ベンゼンのオルト二置換体やメタ二置換体も,picture環境で描画する命令を次のように定義できます。

【定義】

\makeatletter
% オルト二置換体
\def\ortho#1#2{{\unitlength.1pt%
\raisebox{-7pt}{\begin{picture}(270,225)%
\linethickness{.5pt}%
\font\tenln=linew10%
\put(2,56){\line(0,1){113}}%
\put(2,167){\line(173,100){97}}%
\put(2,58){\line(173,-100){95}}%
\put(96,2){\line(173,100){97}}%
\put(192,56){\line(0,1){113}}%
\put(97,222){\line(173,-100){97}}%
\put(22,157){\line(173,100){76}}%
\put(22,68){\line(173,-100){76}}%
\put(173,69){\line(0,1){87}}%
\put(192,167){\line(173,100){76}}%
\put(192,57){\line(173,-100){76}}%
\end{picture}}%
\nobreak\kern2pt\nobreak
\setbox0\hbox{\raisebox{12pt}{\ce{#1}}}%
\setbox1\hbox{\raisebox{-9pt}{\ce{#2}}}%
\ifdim\wd0>\wd1\@tempdima=\wd0\else\@tempdima=\wd1\fi
\nobreak\makebox[0pt][l]{\usebox0}\nobreak\makebox[\@tempdima][l]{\usebox1}}}

% メタ二置換体
\def\meta#1#2{{\unitlength.1pt%
\raisebox{-7pt}{\begin{picture}(270,310)%
\linethickness{.5pt}%
\font\tenln=linew10%
\put(2,56){\line(0,1){113}}%
\put(2,167){\line(173,100){97}}%
\put(2,58){\line(173,-100){95}}%
\put(96,2){\line(173,100){97}}%
\put(192,56){\line(0,1){113}}%
\put(97,222){\line(173,-100){97}}%
\put(22,157){\line(173,100){76}}%
\put(22,68){\line(173,-100){76}}%
\put(173,69){\line(0,1){87}}%
\put(192,57){\line(173,-100){76}}%
\put(97,220){\line(0,1){89}}%
\end{picture}}%
\nobreak\kern2pt\nobreak
\setbox0\hbox{\kern-23pt\raisebox{26pt}{\ce{#1}}}%
\setbox1\hbox{\raisebox{-9pt}{\ce{#2}}}%
\ifdim\wd0>\wd1\@tempdima=\wd0\else\@tempdima=\wd1\fi
\nobreak\makebox[0pt][l]{\usebox0}\nobreak\makebox[\@tempdima][l]{\usebox1}}}
\makeatother

【使用例】

\[\ortho{COOH}{OH} + \ce{(CH3CO)2O ->} \ortho{COOH}{OCOCH3} + \ce{CH3COOH}\]
\[\meta{CH2OCOCH3}{NO2} + \ce{H2O ->} \meta{CH2OH}{NO2} + \ce{CH3COOH}\]

【出力】
f:id:doraTeX:20131203230014p:plain


もっと複雑な構造式をどうするか?

上記の例のような比較的シンプルな構造式ならこれでよいですが,ベンゼン環の三置換体以上であったり,枝分かれのある炭化水素の場合などはどうすればよいでしょうか。
これは悩ましい問題です。

化学構造式をTeXで出力する非常に強力なパッケージとして,藤田眞作先生の XyMTeX が知られています。
しかし,XyMTeX は非常に汎用的で高機能であるがゆえに,初心者が気軽に使うにはハードルが高く,習得やカスタマイズに時間がかかると思われます。

そこで,折衷案として,全てをTeXで作ることは諦め,ある程度以上複雑な構造式は Adobe Illustrator で作成するようにしました。

TeX2img の利用

そのために開発したのが数式画像生成ツールTeX2imgです。

  1. TeX2img の画面に,\ce や上記の \benzene などを使って,構造式のパーツを打ち込む。
  2. コンパイルしてEPSファイルを生成。
  3. その EPS を Illustrator に配置。
  4. Illustrator 上でパーツを組み合わせて複雑な構造式を作成する。
  5. ファイルをPDFで保存。
  6. \includegraphics でTeX文書に貼り込む。

という手順を経ることで,複雑な構造式の図を作成しています。(TeX2imgの設定で,2.と3.の段階は自動化できます。)

追記:chemfigパッケージ

枝分かれや環状構造を含む構造式を簡単に描く方法として,chemfigパッケージというのがあります。その使い方を
TeX & LaTeX Advent Calendar 2014 の記事としてまとめました。

おわりに

このように,TeXを使って化学の文書を組版するときの工夫を紹介してゆきました。
化学関係の皆様に,少しでもTeXに興味を持って頂ければ幸いです。