codesonic
2020-06-07 10:28:08
这篇文章主要介绍mchm
宏包和 chemfig
宏包,其中较多是 chemfig
宏包书写较复杂的有机化学结构式。
mchm
宏包和 chemfig
宏包都已经可以在 Tex Live
中直接使用,如果您没有本地的 Tex
编译器,可以前往Overleaf使用在线编译器(需要注册,且免费版编译时间不能超过一分钟)。
chemfig
宏包还有更多进阶的内容。我大概在暑假会将 update:不会了,我找到了翻译完成的中文说明书https://chemfig.man.huzheyang.cnchemfig
宏包说明书翻译完毕并写一篇中文说明书发布在这个博客。
mchm
宏包用来书写不涉及有机化学的化学式。使用这个宏包,需要使用指令\ce{}
。在大括号内有以下几个特性。
1.数字下标将不再需要 _{}
来表示,可以直接书写,如 H2SO4
表现为
2.+
和 -
如果没有两边没有空格,则表现为上下标,如 H+
显示为H+ + OH-
显示为
3.水合物的书写可以直接用 *
,如 KCr(SO4)2 * 12H2O
显示为
4.拥有可以标注反应条件的箭头,-> <-> <=>
显示为
此外还有 <=>> <<=>
等箭头。
如果想要标注反应条件,则在箭头后加 T[][]
,如 ->T[催化剂][\Delta] <=>T[\Delta]
显示为
5.单键,双键和三键可以直接用 - = #
代替,如 CH3-CH=CH-C#CH
显示为
6.如果Ca(NO3)2 + Na2CO3 -> CaCO3 v + 2NaNO3
和 2HCl + 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
宏包,即有机化学,才是这篇文章的重头戏。
chemfig
宏包用于书写有机化学中的结构式等,键线式和结构式等都需要 chemfig
来书写。
\chemfig{}
用于书写单个有机物结构式,如果要将有机化合物写入方程式,可以将 \chemfig{}
嵌套入 \ce{}
里面。
注意:在chemfig
中,三键改为用 ~
而不是用 #
来表示。
\chemfig{}
有如下几个作用:
1.在 \chemfig{}
中,为防止产生歧义,数字下标不再能直接写出,如CH_4
,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表示键长,方向由 0
到 7
编号。如 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(-=-=-=)
分别显示为:
由上面酮与氰化氢加成的例子,也能看到少许绘制完整结构式的方法。通过以上几个点,我们还是不能绘制较复杂的结构式,接下来我们将以上几个点拼凑起来,绘制完整的分子结构式。
将以上内容结合起来,我们要绘制更加复杂的有机结构式。
1.嵌套
如果绘制不断改变方向的键链,需要用到嵌套。A(-[x,y]B)
绘制了一个条从A(-[x1,y1]B(-[x2,y2]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)
绘制了
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可能会不断更新,且大部分内容高中化学无需用到。
比如异丙基苯,苯环上的一个碳原子连着异丙基,若将异丙基简写为
这个时候可以指定键的起点(或终点)\chemfig{[,0.7]*6(-=-=(-[2,0.7,,3]CH_3CHCH_3)-=)}
,表示终点为异丙基的第三个原子,即中间的
如果不采用指定终点,则显示为
在刚刚没有用到的两个逗号之间,表示的是起点,如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
放在代码前来优化排版。
可以看出,用一个
也有人用 \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
空心点(例如绘制十氢化萘的顺反异构体需用到)
以下给出一个完整的文档例子,绘制了高中有机化学基础常见的化学方程式,如果上面的内容没有完全讲明白一些细小的点,可以由例子中体会。
代码
这份代码太长了,在线编译会超时很久,在本机的texlive上也编译了两分钟之久。所以给各位编译后的一份pdf放在这里~
链接:https://pan.baidu.com/s/1pI0axwIV8qI_UpeJl7_iRw
提取码:ele7
这篇说明的大部分内容都是自己和同学摸索出来的...因为网络上可以搜索到的中文资料少之又少,应该是比目前能搜索到的任何资料都更加详细。
update 搜索到了全文说明 见文章开头
感谢同学@zcmimi在技术方面的支持。
感谢同学@henry_y在学术方面的支持,他帮我查了上面那篇pdf的学术性错误。
感谢来自化学老师的学术性支持。
codesonic 初稿于2020年6月。