用Latex 写化学方程式

codesonic

2020-06-07 10:28:08

Personal

这篇文章主要介绍$\text{Latex}$中的 `mchm` 宏包和 `chemfig` 宏包,其中较多是 `chemfig` 宏包书写较复杂的有机化学结构式。 `mchm` 宏包和 `chemfig` 宏包都已经可以在 `Tex Live` 中直接使用,如果您没有本地的 `Tex` 编译器,可以前往[Overleaf](https://www.overleaf.com/)使用在线编译器(需要注册,且免费版编译时间不能超过一分钟)。 `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.拥有可以标注反应条件的箭头,`-> <-> <=>` 显示为 ![](https://cdn.luogu.com.cn/upload/image_hosting/87vtcmy0.png) 此外还有 `<=>> <<=>` 等箭头。 如果想要标注反应条件,则在箭头后加 `T[][]` ,如 `->T[催化剂][\Delta] <=>T[\Delta]` 显示为 ![](https://cdn.luogu.com.cn/upload/image_hosting/lva68acr.png) 5.单键,双键和三键可以直接用 `- = #` 代替,如 `CH3-CH=CH-C#CH` 显示为 ![](https://cdn.luogu.com.cn/upload/image_hosting/z0tqdmmn.png) 6.如果$\text{v}$和$\text{ \^ }$ 旁边有空格,会显示成向下的箭头(沉淀)和向上的箭头(气体),如 `Ca(NO3)2 + Na2CO3 -> CaCO3 v + 2NaNO3` 和 `2HCl + Na2CO3 -> H2O + CO2 ^ + 2NaCl` 显示为 ![](https://cdn.luogu.com.cn/upload/image_hosting/1jicxnpz.png) 以下是一个被引用很多次的例子(有稍作修改) ``` \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} ``` 它显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/ibit1eru.png) 有了以上内容,已经可以较方便地书写无机化学中的大部分化学式了。而 `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}` 显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/ndmlfiad.png) 缩短化学键的指令稍后再提。 3.可以用 `*n(---)` 表示一个环,n为环的边(或点)个数,括号内为环的化学键。如苯环的凯库勒式可以写作 `*6(-=-=-=)` 或 `*6(=-=-=-)` 显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/eia9u6ny.png) 这个苯环有点太大,关于缩小苯环和改变方向,也是过会再提。 苯环的另一种常见画法是内部带有圆圈的正六边形(鲍林式)。 我们用 `\text{**6(------)}` 表示,显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/qhvjg45l.png) 表示六元环时,括号内第一个符号表示左下角的键,逆时针旋转编号,最后一个为最左边的键。如 `*6(=-----) *6(-=----) *6(-----=)` 分别显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/rfpbwym4.png) 如果括号内的键数量达不到括号外的数字,则会从最后一个开始缺失,如果超过括号外的数字,则不会显示多余的键,如 `*6(------=) *6(=----)` 分别显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/5uualvn1.png) 单个环中,如果没有定义方向,那么最左边必定是一条垂直的键,且由括号内最后一个符号表示它,括号内第一个符号表示它的下一个键,如 `*3(--=) *4(---=) *5(----=)` 分别显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/5wsfr1uv.png) 4.定义方向和键长,在键后用 `[x,y]` 描述。x表示方向,y表示键长,方向由 `0` 到 `7` 编号。如 `0` 指向向右, `1` 指向右上, `2` 指向正上: ![](https://cdn.luogu.com.cn/upload/image_hosting/uvmayd5l.png) 使用例: ``` \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))}} ``` 显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/gutrmh2y.png) 你也可以自定义角度,改为 `:x` ,如 `CH_3C(=[:30]O)(-[:330]CH_3)` 显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/xmu61aw6.png) 如果不定义角度,系统会按照键的起点所连接的键数量取一个系统认为美观的角度,这个很不靠谱。除非你绘制的分子式全在一条线内,不建议不定义角度。 我们发现以上的化学键显得有些太长,我们可以用 ` [,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))}} ``` 显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/mw507onq.png) 如果你只想定义键长,不定义角度,可以写为 `[,y]` 。 用这个办法也可以定义环的键长和方向,我们发现上面的苯环太大了,可以改为 `[,0.7]*6(-=-=-=)` ,也可以定义方向 `[:30,0.7]*6(-=-=-=)` 分别显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/9adeza6z.png) 由上面酮与氰化氢加成的例子,也能看到少许绘制完整结构式的方法。通过以上几个点,我们还是不能绘制较复杂的结构式,接下来我们将以上几个点拼凑起来,绘制完整的分子结构式。 # 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(-=-=--))=-=--))-=-=)}} ``` 显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/y5nnlmkg.png) 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]))=)} ``` ![](https://cdn.luogu.com.cn/upload/image_hosting/veizr9mf.png) ``` \text{香叶醇:}\chemfig{(-[6](-[5](-[6](-[7](=[6](-[5])(-[7])))))(=[7](-[1](-[7]OH))))} ``` ![](https://cdn.luogu.com.cn/upload/image_hosting/utr36t08.png) 这样的显示方式,双键与单键相连方式与习惯方式不符,我们可以稍作修改,将代码改为 ``` \chemfig{(-[6,](-[5,](-[6,](-[7,](=^[6,](-[5,])(-[7,])))))(=^[7,](-[1,](-[7,]OH))))} ``` ![](https://cdn.luogu.com.cn/upload/image_hosting/jx8rwc95.png) 注意到,此时单键连向双键的其中一条横向而不是连向两条横线中间了。 # Part 4 杂项 这个part可能会不断更新,且大部分内容高中化学无需用到。 ### 两个键的链接 比如异丙基苯,苯环上的一个碳原子连着异丙基,若将异丙基简写为$\text{CH}_3\text{CHCH}_3$,而键又连着中间的碳,如果直接按以上方法绘制,会将键连至第一个碳。 这个时候可以指定键的起点(或终点)`\chemfig{[,0.7]*6(-=-=(-[2,0.7,,3]CH_3CHCH_3)-=)}`,表示终点为异丙基的第三个原子,即中间的$\text{C}$ ![](https://cdn.luogu.com.cn/upload/image_hosting/zan20584.png) 如果不采用指定终点,则显示为 ![](https://cdn.luogu.com.cn/upload/image_hosting/e3hlxbml.png) 在刚刚没有用到的两个逗号之间,表示的是起点,如4-异丙基~~庚~~辛烷,写作 `\chemfig{CH_3CH_2CH_2CHCH_2CH_2CH_2CH_3(-[2,0.7,7,3]CH_3CHCH_3)}` ![](https://cdn.luogu.com.cn/upload/image_hosting/k31xeod0.png) 这就是指定起点与终点的键的画法了。 ### 键的拓展 除了常见的单键,双键和三键,存在一些其他的键,如楔形式中的键,`chemfig` 都提供了方法。 ![](https://cdn.luogu.com.cn/upload/image_hosting/92xzsbvu.png) 楔形式可以定义三角形的形状。 `\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} ``` ![](https://cdn.luogu.com.cn/upload/image_hosting/ggdkz6ai.png) 这种定义方式是定义整个分子所有的键,定义分子所有键的命令还有: `bond offset=`表示键的端点与字母之间的距离,如 ``` \chemfig[bond offset=0pt]{A-B} \chemfig{A-B} \chemfig[bond offset=5pt]{A-B} ``` 显示为 ![](https://cdn.luogu.com.cn/upload/image_hosting/xy1216su.png) 默认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,用小括号中间一个逗号表示一个键起点和终点的间隔,下面看看效果: ![](https://cdn.luogu.com.cn/upload/image_hosting/ghmuiuiu.png) 也可以定义键长,不再需要在每个键前面表示键长 ``` \chemfig[atom sep=2em]{A-B}\par \chemfig[atom sep=50pt]{A-B} ``` 显示为: ![](https://cdn.luogu.com.cn/upload/image_hosting/77aniw64.png) 也可以定义颜色,如`\chemfig[bond style={line width=1pt,red}]{A-B=C>|D<E>:F}`显示为 ![](https://cdn.luogu.com.cn/upload/image_hosting/6ow4mv58.png) 另外还有一种方法可以定义键线式的角度,表示为`::x` ,表示在上一个键的角度上加上`x`度作为新的角度。 `\chemfig{A-[:-5]-[::20]-[::20]B-[7]-[::20]C-[::20]}`显示为 ![](https://cdn.luogu.com.cn/upload/image_hosting/hvsos9sq.png) ### 高分子聚合物 先看一个例子 ``` \chemfig{-[@{left,0.75}]CH_2-CH_2-[@{right,0.25}]} \polymerdelim[delimiters ={[]},height = 5pt]{left}{right} ``` ![](https://cdn.luogu.com.cn/upload/image_hosting/xrjhko8j.png) 高分子聚合物采用先画中间,再画括号(或者中括号)的画法。由于这种原因,括号常常无法准确放在键中间,所以有时用一个`\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} ``` ![](https://cdn.luogu.com.cn/upload/image_hosting/ilctxrjs.png) 下面的例子采用了 `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} ``` ![](https://cdn.luogu.com.cn/upload/image_hosting/87k3os3d.png) ### 更多符号 `\fulldisk ` 实心点,`\emptydisk` 空心点(例如绘制十氢化萘的顺反异构体需用到) # Part 5 花絮与致谢 以下给出一个完整的文档例子,绘制了高中有机化学基础常见的化学方程式,如果上面的内容没有完全讲明白一些细小的点,可以由例子中体会。 [代码](https://www.luogu.com.cn/paste/eh9kp86r) 这份代码太长了,在线编译会超时很久,在本机的texlive上也编译了两分钟之久。所以给各位编译后的一份pdf放在这里~ 链接:https://pan.baidu.com/s/1pI0axwIV8qI_UpeJl7_iRw 提取码:ele7 这篇说明的大部分内容都是自己和同学摸索出来的...~~因为网络上可以搜索到的中文资料少之又少,应该是比目前能搜索到的任何资料都更加详细。~~ update 搜索到了全文说明 见文章开头 感谢同学[@zcmimi](https://www.luogu.com.cn/user/36532)在技术方面的支持。 感谢同学[@henry_y](https://www.luogu.com.cn/user/36526)在学术方面的支持,他帮我查了上面那篇pdf的学术性错误。 感谢来自化学老师的学术性支持。 codesonic 初稿于2020年6月。