chemfig 是一个用于绘制二维化学结构的包。它是 ochem 的替代方案。与 ochem 需要 Perl 来绘制化学结构不同,chemfig 使用 tikz 包来生成图形。chemfig 的使用方法是在导言部分添加以下内容:

\usepackage{chemfig}

基本用法

在该包中,主要使用的命令是 \chemfig{}

\chemfig{<atom1><bond type>[<angle>,<coeff>,<tikz code>]<atom2>}
  • <angle> 是两个原子(或节点)之间的键角。共有三种类型的角度:绝对角度、相对角度和预定义角度。绝对角度给出一个精确的角度(通常为 0 到 360,尽管也可以是负数),表示方法是 [:<absolute angle>]。相对角度使用语法 ::<relative angle>,表示相对于前一个键的角度。预定义角度是从 0 到 7 的整数,表示 45 度的间隔,表示方法是 [<predefined angle>]。预定义角度及其对应的绝对角度在下图中显示。

\chemfig{(-[:0,1.5,,,draw=none]\scriptstyle\color{red}0)
(-[1]1)(-[:45,1.5,,,draw=none]\scriptstyle\color{red}45)
(-[2]2)(-[:90,1.5,,,draw=none]\scriptstyle\color{red}90)
(-[3]3)(-[:135,1.5,,,draw=none]\scriptstyle\color{red}135)
(-[4]4)(-[:180,1.5,,,draw=none]\scriptstyle\color{red}180)
(-[5]5)(-[:225,1.5,,,draw=none]\scriptstyle\color{red}225)
(-[6]6)(-[:270,1.5,,,draw=none]\scriptstyle\color{red}270)
(-[7]7)(-[:315,1.5,,,draw=none]\scriptstyle\color{red}315)
-0}
  • <bond type> 描述了连接 <atom1><atom2> 的键类型。共有 9 种不同的键类型:

\chemfig{A-B}\\
\chemfig{A=B}\\
\chemfig{A~B}\\
\chemfig{A>B}\\
\chemfig{A<B}\\
\chemfig{A>:B}\\
\chemfig{A<:B}\\
\chemfig{A>|B}\\
\chemfig{A<|B}\\

\chemfig{C(-[:0]H)(-[:90]H)(-[:180]H)(-[:270]H)}
  • <coeff> 表示键的长度将乘以的系数。

  • <tikz code> 包含关于键的颜色或样式的附加选项。

例如,甲烷分子可以通过以下代码生成:

\chemfig{C(-[:0]H)(-[:90]H)(-[:180]H)(-[:270]H)}

线性分子(如甲烷)是一个简单的例子,但分子是在 chemfig 中通过嵌套形成的。

骨架图

骨架图可以通过以下方式生成:

\chemfig{-[:30]-[:-30]-[:30]}
\chemfig{-[:30]=[:-30]-[:30]}

环的语法是 <atom>*<n>(code),其中 "n" 表示环中侧面的数量,"code" 表示每个环的具体内容(键和原子)。

\chemfig{A*6(-B-C-D-E-F-)}
\chemfig{A*5(-B-C-D-E-)}
\chemfig{*6(=-=-=-)}
\chemfig{**5(------)}

路易斯结构(Lewis Structures)

路易斯结构使用语法 \charge{<position1>=<charge1>,<position2>=<charge2>...}{atom},其中 <position> 采用极坐标表示为 <angle>:<shift>,不过如果不需要额外的位移,: <shift> 可以省略。在电荷字段中,\.\: 分别表示单独的电子和成对电子。成对电子还可以通过一个条形表示,使用 \|

\charge{0=\.,90=\.,180=\.,270=\.}{C}

路易斯结构也可以通过 \chemfig{} 包含在内。

\chemfig{H-[:52.24]\charge{45=\:,135=\:}{O}-[::-104.48]H}

离子(Ions)

例如,考虑一个醋酸根离子:

\chemfig{-(-[1]O^{-})=[7]O}

由于 chemfig 命令进入数学模式,因此离子电荷可以作为上标添加(一个警告:负离子要求负号被括起来,如示例所示)。

离子的电荷可以通过使用 \oplus\ominus 来圈出:

\chemfig{-(-[1]O^{\ominus})=[7]O}

或者,电荷可以使用 \chemabove{} 放置在离子上方:

\chemfig{-\chemabove{N}{\scriptstyle\oplus}(=[1]O)-[7]O^{\ominus}}

共振结构和形式电荷(Resonance Structures and Formal Charges)

共振结构需要一些数学命令:

% see "Advanced Mathematics" for use of \left and \right
% add to preamble:
%	\usepackage{mathtools}	% \Longleftrightarrow
$\left\{\chemfig{O-N(=[:60]O)-[:300]O}\right\}
\Longleftrightarrow 
\left\{\chemfig{O=N(-[:60]O)-[:300]O}\right\} 
\Longleftrightarrow 
\left\{\chemfig{O-N(-[:60]O)=[:300]O}\right\}$

化学反应(Chemical Reactions)

chemfig 包的最新版本中,chemrelchemsign 命令已被移除,因此要绘制化学反应,必须使用 \arrow\+ 命令,并将它们放在 \schemestart\schemestop 中。

可以使用 \arrow 命令绘制几种类型的箭头:

\schemestart A\arrow{->}B\schemestop\par % 默认
\schemestart A\arrow{-/>}B \schemestop\par
\schemestart A\arrow{<-}B \schemestop\par
\schemestart A\arrow{<->}B \schemestop\par
\schemestart A\arrow{<=>}B \schemestop\par
\schemestart A\arrow{<->>}B \schemestop\par
\schemestart A\arrow{<<->}B \schemestop\par
\schemestart A\arrow{0}B \schemestop\par
\schemestart A\arrow{-U>}B \schemestop\par
\schemestart
A\arrow[,,->] B\arrow[,,-{Triangle[slant=0.5,blue,width=10pt]}]
C\arrow[,,-{CF[sharp]}] D \+ E
\schemestop


有关 \arrow 命令和 chemfig 中化学反应的更多详细息,请查阅 chemfig 文档中的第四部分 "Reaction schemes"。

旧版本

在旧版本中,可以使用以下命令创建化学反应:

\chemrel[<arg1>][<arg2>]{<arrow code>}
\chemsign+	% 产生一个加号

\chemrel{} 中,<arg1><arg2> 分别表示箭头上方和下方的文本。

有四种类型的箭头可以通过 \chemrel{} 生成:

A\chemrel{->}B\par
A\chemrel{<-}B\par
A\chemrel{<->}B\par
A\chemrel{<>}B

命名化学图形(Naming Chemical Graphics)

可以使用以下命令命名分子:

\chemname[<dim>]{\chemfig{<code of the molecule>}}{<name>}

其中 <dim> 插入在分子的底部和名称 <name> 顶部之间。默认情况下,<dim> 的大小为 1.5ex。

化学结构的命名

<name> 将相对于它所描述的分子居中。

\schemestart
\chemname{\chemfig{R-C(-[:-30]OH)=[:30]O}}{Carboxylic acid} 
\+
\chemname{\chemfig{R’OH}}{Alcohol} 
\arrow{->} 
\chemname{\chemfig{R-C(-[:-30]OR’)=[:30]O}}{Ester} 
\+
\chemname{\chemfig{H_2O}}{Water} 
\schemestop

在上述反应中,\chemname{} 插入了 1.5ex 加上羧酸分子深度的间距,以此将每个分子和它们的名称分开。这是因为反应中第一个分子(羧酸)的图形比其他分子要深。将酒精分子放在第一个位置会得到不同的结果:

\schemestart
\chemname{\chemfig{R’OH}}{Alcohol} 
\+ 
\chemname{\chemfig{R-C(-[:-30]OH)=[:30]O}}{Carboxylic acid} 
\arrow{->} 
\chemname{\chemfig{R-C(-[:-30]OR’)=[:30]O}}{Ester} 
\+ 
\chemname{\chemfig{H_2O}}{Water}
\schemestop

通过在反应中第一个 \chemname{} 前面添加 \chemnameinit{<deepest molecule>} 和在反应结束后添加 \chemnameinit{},可以解决这个问题:

\schemestart
\chemnameinit{\chemfig{R-C(-[:-30]OH)=[:30]O}} 
\chemname{\chemfig{R’OH}}{Alcohol} 
\+
\chemname{\chemfig{R-C(-[:-30]OH)=[:30]O}}{Carboxylic acid} 
\arrow{->} 
\chemname{\chemfig{R-C(-[:-30]OR’)=[:30]O}}{Ester} 
\+ 
\chemname{\chemfig{H_2O}}{Water} 
\chemnameinit{}
\schemestop

最后,添加 \\<name> 中将生成换行,使名称可以跨越多行。

高级图形

对于高级命令和示例,请参考 chemfig 手册,里面有更详细和完整的包介绍。

化学式(Chemical Formulae)

如果你需要排版化学式,你可以选择两个非常好的包:mhchem 和 chemmacros。

mhchem 包

mhchem 是一个用于排版化学公式和方程式的包,也用于排版基本的二维化学结构。要使用这个包,在导言部分添加以下内容:

\usepackage[version=4]{mhchem}

化学物种可以使用 \ce 命令进行插入。例如:

\ce{3H2O} \\
\ce{1/2H2O} \\
\ce{AgCl2-} \\
\ce{H2_{(aq)}}

渲染为:

$$\ce{3H2O} \\ \ce{1/2H2O} \\ \ce{AgCl2-} \\ \ce{H2_{(aq)}}$$

有一些内容会自动排版;例如,\ce{H2O} 中的 2 会自动作为下标,不需要额外的命令。物种的数量在公式前面。1/2 和其他分数会自动排版,如 \ce{1/2H2O}AgCl2- 中的电荷会自动作为上标排版。如果电荷既不是 +1 也不是 -1,则会使用 ^ 将其作为上标,例如 \ce{AgCl2-}。相态不会自动作为下标排版,需要用括号括起来,并使用 _,如 \ce{H2_{(aq)}}

自 2016 年 2 月起,mhchem 包也可在 TeX 的 MediaWiki 网站(如 Wikipedia)中使用,使用 <ce>...</ce> 标签。

chemmacros 包

chemformula 是一个更大化学包中的一部分,用于排版化学公式、方程式和基本的二维化学结构。该包使用的语法与 mhchem 略有不同。对于从事化学相关工作的用户,chemmacros 包将非常有用。

要使用此包,在导言部分添加以下内容:

\usepackage{chemformula}

化学物种可以使用 \ch 命令进行插入。例如:

\ch{3 H2O} \\
\ch{1/2 H2O} \\
\ch{AgCl2-} \\
\ch{H2_{(aq)}}

渲染为:

$$\ch{3 H2O} \\ \ch{1/2 H2O} \\ \ch{AgCl2-} \\ \ch{H2_{(aq)}}$$

如你所见,语法几乎相同。

XyMTeX 包

以下代码生成了下图中的皮质醇分子。

\documentclass{letter}
\usepackage{epic,carom}
\pagestyle{empty}
\begin{document}
\begin{picture}(1000,500)
  \put(0,0){\steroid[d]{3D==O;{{10}}==\lmoiety{H$_{3}$C};{{13}}==\lmoiety{H$_{3}$C};{{11}}==HO}}
  \put(684,606){\sixunitv{}{2D==O;1==OH}{cdef}}
\end{picture}
\end{document}

皮质醇由 XyMTeX 渲染。

最后修改: 2025年04月22日 星期二 10:42