用Latex 写化学方程式

codesonic

2020-06-07 10:28:08

Tech. & Eng.

这篇文章主要介绍\text{Latex}中的 mchm 宏包和 chemfig 宏包,其中较多是 chemfig 宏包书写较复杂的有机化学结构式。

mchm 宏包和 chemfig 宏包都已经可以在 Tex Live 中直接使用,如果您没有本地的 Tex 编译器,可以前往Overleaf使用在线编译器(需要注册,且免费版编译时间不能超过一分钟)。

chemfig宏包还有更多进阶的内容。我大概在暑假会将chemfig宏包说明书翻译完毕并写一篇中文说明书发布在这个博客。 update:不会了,我找到了翻译完成的中文说明书https://chemfig.man.huzheyang.cn

Part 1 \text{mchm}宏包

mchm 宏包用来书写不涉及有机化学的化学式。使用这个宏包,需要使用指令\ce{}。在大括号内有以下几个特性。

1.数字下标将不再需要 _{} 来表示,可以直接书写,如 H2SO4 表现为\text{H}_2\text{SO}_4

2.+- 如果没有两边没有空格,则表现为上下标,如 H+ 显示为\text{H}^+H+ + OH- 显示为\text{H}^+ + \text{OH}^-

3.水合物的书写可以直接用 * ,如 KCr(SO4)2 * 12H2O 显示为\text{KCr(SO}_4{)_2} · \text{12H}_2\text{O}

4.拥有可以标注反应条件的箭头,-> <-> <=> 显示为

此外还有 <=>> <<=> 等箭头。

如果想要标注反应条件,则在箭头后加 T[][] ,如 ->T[催化剂][\Delta] <=>T[\Delta] 显示为

5.单键,双键和三键可以直接用 - = # 代替,如 CH3-CH=CH-C#CH 显示为

6.如果\text{v}\text{ \^ } 旁边有空格,会显示成向下的箭头(沉淀)和向上的箭头(气体),如 Ca(NO3)2 + Na2CO3 -> CaCO3 v + 2NaNO32HCl + Na2CO3 -> H2O + CO2 ^ + 2NaCl 显示为

以下是一个被引用很多次的例子(有稍作修改)

\documentclass{article}
\usepackage[UTF8]{ctex} % 中文宏包
\usepackage{mhchem} %化学式宏包

\begin{document}

\ce{2H2 + O2 ->T[点燃] 2H2O}

\ce{N2 + 3H2 <=>[高温、加压][催化剂] 2NH3}

\ce{^{227}_{90}Th+}

\ce{KCr(SO4)2 * 12H2O}

\ce{C6H5-CHO}

\ce{X=Y#Z}

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

\end{document}

它显示为:

有了以上内容,已经可以较方便地书写无机化学中的大部分化学式了。而 chemfig 宏包,即有机化学,才是这篇文章的重头戏。

Part 2 \text{chemfig} 宏包

chemfig 宏包用于书写有机化学中的结构式等,键线式和结构式等都需要 chemfig 来书写。

\chemfig{} 用于书写单个有机物结构式,如果要将有机化合物写入方程式,可以将 \chemfig{} 嵌套入 \ce{} 里面。

注意:在chemfig中,三键改为用 ~ 而不是用 # 来表示。

\chemfig{} 有如下几个作用:

1.在 \chemfig{} 中,为防止产生歧义,数字下标不再能直接写出,如\text{CH}_4必须写为 CH_4\text{C}_6\text{H}_{12}\text{O}_6必须写为 C_6H_{12}O_6

2.在 \chemfig{} 中,化学键会被拉长,且碳碳三键改为用 ~ 表示,如 \chemfig{CH_3-CH=CH-C~CH} 显示为:

缩短化学键的指令稍后再提。

3.可以用 *n(---) 表示一个环,n为环的边(或点)个数,括号内为环的化学键。如苯环的凯库勒式可以写作 *6(-=-=-=)*6(=-=-=-) 显示为:

这个苯环有点太大,关于缩小苯环和改变方向,也是过会再提。

苯环的另一种常见画法是内部带有圆圈的正六边形(鲍林式)。

我们用 \text{**6(------)} 表示,显示为:

表示六元环时,括号内第一个符号表示左下角的键,逆时针旋转编号,最后一个为最左边的键。如 *6(=-----) *6(-=----) *6(-----=) 分别显示为:

如果括号内的键数量达不到括号外的数字,则会从最后一个开始缺失,如果超过括号外的数字,则不会显示多余的键,如 *6(------=) *6(=----) 分别显示为:

单个环中,如果没有定义方向,那么最左边必定是一条垂直的键,且由括号内最后一个符号表示它,括号内第一个符号表示它的下一个键,如 *3(--=) *4(---=) *5(----=) 分别显示为:

4.定义方向和键长,在键后用 [x,y] 描述。x表示方向,y表示键长,方向由 07 编号。如 0 指向向右, 1 指向右上, 2 指向正上:

使用例:

\text{酮与氰化氢加成:}\ce{\chemfig{CH_3C(=[1]O)(-[7]CH_3)} + \chemfig{CN(-[2]H)} ->T[催化剂] \chemfig{CH_3(-[0]C(-[2]OH)(-[0]CN)(-[6]CH3))}}

显示为:

你也可以自定义角度,改为 :x ,如 CH_3C(=[:30]O)(-[:330]CH_3) 显示为:

如果不定义角度,系统会按照键的起点所连接的键数量取一个系统认为美观的角度,这个很不靠谱。除非你绘制的分子式全在一条线内,不建议不定义角度。

我们发现以上的化学键显得有些太长,我们可以用 [,y] 来定义键长,不定义键长时长度默认为1,这个y一般取 0.7 正好,根据你的需要定义键长。

使用例:

\text{酮与氰化氢加成:}\ce{\chemfig{CH_3C(=[1,0.7]O)(-[7,0.7]CH_3)} + \chemfig{CN(-[2,0.7]H)} ->T[催化剂] \chemfig{CH_3(-[0,0.7]C(-[2,0.7]OH)(-[0,0.7]CN)(-[6,0.7]CH3))}}

显示为:

如果你只想定义键长,不定义角度,可以写为 [,y]

用这个办法也可以定义环的键长和方向,我们发现上面的苯环太大了,可以改为 [,0.7]*6(-=-=-=) ,也可以定义方向 [:30,0.7]*6(-=-=-=) 分别显示为:

由上面酮与氰化氢加成的例子,也能看到少许绘制完整结构式的方法。通过以上几个点,我们还是不能绘制较复杂的结构式,接下来我们将以上几个点拼凑起来,绘制完整的分子结构式。

Part 3 嵌套,并列与键线式

将以上内容结合起来,我们要绘制更加复杂的有机结构式。

1.嵌套

如果绘制不断改变方向的键链,需要用到嵌套。A(-[x,y]B) 绘制了一个条从\text{A}连向\text{B}的单键,B可以继续嵌套下去。如 A(-[x1,y1]B(-[x2,y2]C)) 绘制了一条从\text{A}连向\text{B}再连向\text{C}的碳链。

还有一种嵌套是环中嵌套环来绘制稠环化合物,稠环化合物在高中阶段涉及不多。但仍然稍作介绍。

嵌套环可以直接在括号内嵌套,给出一个例子:

\text{萘:}\ce{\chemfig{[,0.7]*6(-=(*6(-=-=--))-=-=)}}

\text{蒽:}\ce{\chemfig{[,0.7]*6(-=(*6(-=(*6(-=-=--))-=--))-=-=)}}

\text{菲:}\ce{\chemfig{[,0.7]*6(-=(*6(-(*6(-=-=--))=-=--))-=-=)}}

显示为:

2.并列

如果一个碳连着多个基团,需要用到并列。如 A(-[x1,y1]B)(-[x2,y2]C) 绘制了\text{A}上同时连接了\text{B}\text{C}基团。

3.键线式

键线式在以上的基础上,不添加元素名称即可,如果添加会自动在那个位置上加入元素。给出两个例子

\text{褪黑素:}\chemfig{[,0.7]*6(-=(*5(-N(-H)-=(-[:30]CH_2CH_2NHCOCH_3)--))-=-(-H_3CO)=)}

\text{键线式:}\chemfig{[,0.7]*6(-=(*5(-[0.7]N(-H)-=(-[:30,0.7](-[:330,0.7](-[:30,0.7]N(-[2,0.7]H)(-[:330,0.7](=[6,0.7]O)(-[:30,0.7])))))--))-=-(-[,0.7]O(-[1,0.7]))=)}

\text{香叶醇:}\chemfig{(-[6](-[5](-[6](-[7](=[6](-[5])(-[7])))))(=[7](-[1](-[7]OH))))}

这样的显示方式,双键与单键相连方式与习惯方式不符,我们可以稍作修改,将代码改为

\chemfig{(-[6,](-[5,](-[6,](-[7,](=^[6,](-[5,])(-[7,])))))(=^[7,](-[1,](-[7,]OH))))}

注意到,此时单键连向双键的其中一条横向而不是连向两条横线中间了。

Part 4 杂项

这个part可能会不断更新,且大部分内容高中化学无需用到。

两个键的链接

比如异丙基苯,苯环上的一个碳原子连着异丙基,若将异丙基简写为\text{CH}_3\text{CHCH}_3,而键又连着中间的碳,如果直接按以上方法绘制,会将键连至第一个碳。

这个时候可以指定键的起点(或终点)\chemfig{[,0.7]*6(-=-=(-[2,0.7,,3]CH_3CHCH_3)-=)},表示终点为异丙基的第三个原子,即中间的\text{C}

如果不采用指定终点,则显示为

在刚刚没有用到的两个逗号之间,表示的是起点,如4-异丙基辛烷,写作

\chemfig{CH_3CH_2CH_2CHCH_2CH_2CH_2CH_3(-[2,0.7,7,3]CH_3CHCH_3)}

这就是指定起点与终点的键的画法了。

键的拓展

除了常见的单键,双键和三键,存在一些其他的键,如楔形式中的键,chemfig 都提供了方法。

楔形式可以定义三角形的形状。

\chemfig[cram width=10pt,cram dash width=0.4pt,cram dash sep=1pt]{A>B>:C>|D} 中括号内四个参数分别表示起始宽度,线宽度,每几个宽度画一条线(虚楔形用)

\chemfig[cram width=10pt,cram dash width=0.4pt,cram dash sep=1pt]{A>B>:C>|D}

\chemfig[cram width=15pt,cram dash width=2pt,cram dash sep=2pt]{A>B>:C>|D}

这种定义方式是定义整个分子所有的键,定义分子所有键的命令还有:

bond offset=表示键的端点与字母之间的距离,如

\chemfig[bond offset=0pt]{A-B}

\chemfig{A-B}

\chemfig[bond offset=5pt]{A-B}

显示为

默认bond offset为2pt。可以自定义默认间隔,之后的默认间隔就是你定义的值,也可以定义单个键的间隔,方式如下:

\setchemfig{bond offset=4pt}
\chemfig{A-B-C}\par
\chemfig{A-#(,0pt)B-C}\par
\chemfig{A-B-#(0pt)C}\par
\chemfig{A-#(,0pt)B-#(0pt)C}

这里定义了默认间隔为4pt,用小括号中间一个逗号表示一个键起点和终点的间隔,下面看看效果:

也可以定义键长,不再需要在每个键前面表示键长

\chemfig[atom sep=2em]{A-B}\par
\chemfig[atom sep=50pt]{A-B}

显示为:

也可以定义颜色,如\chemfig[bond style={line width=1pt,red}]{A-B=C>|D<E>:F}显示为

另外还有一种方法可以定义键线式的角度,表示为::x ,表示在上一个键的角度上加上x度作为新的角度。

\chemfig{A-[:-5]-[::20]-[::20]B-[7]-[::20]C-[::20]}显示为

高分子聚合物

先看一个例子

\chemfig{-[@{left,0.75}]CH_2-CH_2-[@{right,0.25}]}
\polymerdelim[delimiters ={[]},height = 5pt]{left}{right}

高分子聚合物采用先画中间,再画括号(或者中括号)的画法。由于这种原因,括号常常无法准确放在键中间,所以有时用一个\bigskip放在代码前来优化排版。

可以看出,用一个\text{@{x,括号在键的位置}}来描述一个括号的位置和名字,第二行绘制括号时,表示了括号种类,高度(也可以用depth表示深度),最后用两个大括号表示加上的位置。

也有人用 \vphantom 来优化排版,如:

\chemfig{\vphantom{CH_2}-[@{op,.75}]CH_2-CH_2-[@{cl,0.25}]}
\polymerdelim[delimiters ={[]},height = 5pt]{op}{cl}

显示与上面相同,只是在整个pdf中显示会比较正常。

下面再看几个例子

\chemfig{\vphantom{CH_2}-[@{op,0.5}]CH_2-CH(-[6]Cl)-[@{cl,0.5}]}
\polymerdelim[delimiters ={[]},height = 5pt, depth = 25pt]{op}{cl}

下面的例子采用了 h align=false 来使得括号可以不在同一条水平线上

\chemfig{-[@{op,.5}:-30]O-[::60](=[::60]O)-[::-60]*6(-=-(-(=[::-60]O)-[::60]O-[::-60]-[::60]-[@{cl,.5}::-60])=-=)}
\polymerdelim[delimiters ={[]},height=30pt, h align=false]{op}{cl}

更多符号

\fulldisk 实心点,\emptydisk 空心点(例如绘制十氢化萘的顺反异构体需用到)

Part 5 花絮与致谢

以下给出一个完整的文档例子,绘制了高中有机化学基础常见的化学方程式,如果上面的内容没有完全讲明白一些细小的点,可以由例子中体会。

代码

这份代码太长了,在线编译会超时很久,在本机的texlive上也编译了两分钟之久。所以给各位编译后的一份pdf放在这里~

链接:https://pan.baidu.com/s/1pI0axwIV8qI_UpeJl7_iRw

提取码:ele7

这篇说明的大部分内容都是自己和同学摸索出来的...因为网络上可以搜索到的中文资料少之又少,应该是比目前能搜索到的任何资料都更加详细。

update 搜索到了全文说明 见文章开头

感谢同学@zcmimi在技术方面的支持。

感谢同学@henry_y在学术方面的支持,他帮我查了上面那篇pdf的学术性错误。

感谢来自化学老师的学术性支持。

codesonic 初稿于2020年6月。