MolScript:用于反应式和弯箭头机理的文本语言
简答:MolScript 是一种用于反应式和电子转移机理的小型文本语言。每个物种写成 SMILES,物种之间用 +、->、<-> 或 <=> 连接,用原子映射编号标记箭头涉及的原子,每个弯箭头写一行 move。MolDraw 会画出结构、反应条件、孤对电子、电荷和每一个箭头,并在你看到之前按绘图规则校验每个箭头。结果是普通的、可编辑的画布内容,可以下载为图片,或下载为用于 LaTeX 的 chemfig 代码。
MolScript 一览
| 你要写的内容 | 用 SMILES 表示物种,物种之间写运算符,反应条件写在箭头后的方括号里,电子转移写成 move 行。 |
|---|---|
| 功能一览 | 排好版的反应式:结构、加号、反应箭头、平衡箭头或共振箭头、反应条件、说明文字、孤对电子、电荷、自由基圆点和弯箭头。 |
| 箭头类型 | 双电子弯箭头(->)和单电子单钩箭头(~>),起点可以是孤对电子、电荷、自由基、原子或化学键,终点可以是原子、化学键或正在形成的化学键。 |
| 校验 | 每个映射编号都必须存在且唯一;每个箭头都必须从有电子的地方出发;每个画出的箭头都会在间隙、指向、弯曲度和间距方面接受评判。问题会连同行号一起返回。 |
| 输出项 | 可编辑的 MolDraw 画布对象;支持 MolDraw 的所有导出格式,包括用于 LaTeX 文档的 chemfig(.tex)。 |
| 目前的应用 | MolDraw AI 聊天通过编写 MolScript 来画机理,Templates 面板中的机理图也是用它构建的。 |
| 下一步 | 面向画布应用的开放框架,以及任何助手都能加载的 AI 技能。参见路线图。 |
第一个脚本:SN2
氢氧根从背面进攻溴甲烷,溴离子在同一步离去。用 MolScript 写只需四行:
title: SN2 of bromomethane [OH-:1] "hydroxide" + [CH3:2][Br:3] "bromomethane" ->[SN2][acetone] CO "methanol" + [Br-] move :1 -> 1..2 move 2-3 -> 3
逐行解释:
title:在反应式上方添加标题。- 反应式行列出各个物种。
[OH-:1]是氢氧根,其氧原子的映射编号为 1;[CH3:2][Br:3]是溴甲烷,碳为 2,溴为 3。"hydroxide"是画在结构下方的说明文字。->[SN2][acetone]是上下带文字的反应箭头。 move :1 -> 1..2:原子 1 上的孤对电子(这里是负电荷)移向 1 与 2 之间正在形成的键。move 2-3 -> 3:已有 C–Br 键的电子移向溴。
映射编号只是供你和箭头使用的标签。它们永远不会被画出来,也不会改变分子。
语言说明
物种与运算符
任何 SMILES 都可以作为物种。运算符两侧各留一个空格:
+ | 共反应物或共产物之间的加号。用 + 连接的物种始终在同一行。 |
|---|---|
-> | 反应箭头。 |
<=> | 平衡箭头(两个半箭头)。 |
<-> | 共振箭头(双头箭头)。用于同一物种的共振式之间。 |
=> | 逆合成箭头。 |
箭头上方和下方的文字放在紧贴箭头的方括号里:->[NaBH4][MeOH, 0 °C]。如果只要下方文字,第一对方括号留空:->[][reflux]。物种后面用双引号括起的说明文字会画在该物种下方:CC(=O)O "acetic acid"。
多个步骤
以运算符开头的行会从上一个物种继续反应式,因此一个机理可以一行写一步,该步的箭头紧跟在下面:
title: SN1 of tert-butyl bromide C[C:1](C)(C)[Br:2] ->[slow] C[C+:3](C)C + [Br-] move 1-2 -> 2 -> C[C+:4](C)C + [OH2:5] move :5 -> 5..4 ->[fast] CC(C)(C)[OH2+]
弯箭头:move 行
箭头涉及的每个原子都要在 SMILES 中带有映射编号:[OH-:1]、[CH3:2][Br:3],普通的氧写成 [O:4]。编号在整个脚本中必须唯一。然后:
move <from> -> <to> two-electron curly arrow move <from> ~> <to> one-electron fish-hook
两端的写法相同:
:n | 原子 n 上的孤对电子。对于阴离子,箭头从负号出发,与化学工作者的画法一致。 |
|---|---|
n | 原子 n。自由基的箭头从其圆点出发。 |
n-m | 原子 n 与 m 之间已有的化学键。作为起点时,电子离开该键;作为终点时,电子使该键变成双键。 |
n..m | n 与 m 之间正在形成的键(只能作终点)。箭头头部停在原子 m 旁边、朝向 n 的一侧。 |
多个箭头可以写在同一行,用分号分隔:move :1 -> 1..4; 4-2 -> 2-3; 3-5 -> 5。被转移的氢要显式写出,如 [H:5][O:6]CC,这样箭头才能从它的键出发。带映射编号的自由基中心要写明氢原子数,以保留其圆点:CC(C)(C)[OH0:1] 是叔丁氧基自由基。
箭头会自动放置。如果你想要特定的弯曲方式,可以在花括号中添加覆盖设置:move 2-3 -> 3 {bow=0.3 side=left}。
指令和注释
title: … | 反应式上方的标题。 |
|---|---|
per-row: 2 至 8 | 反应式换行前每行的结构数(默认 4)。 |
layout: row、cycle、branch | 反应式形状:从左到右、催化循环,或一个反应物生成多个产物。 |
# … | 注释,直到行尾。SMILES 中的 #(三键)不是注释。 |
错误
问题会连同所在行一起、用通俗的语言返回,这样人或 AI 助手都可以修正该行并重新绘制:
line 1: put +, -> or <-> between "[O:1]C" and "[O:1]C" line 3: no atom is tagged :9 in the SMILES (write it as [X:9]) line 4: n..m (a bond being formed) can only be the destination line 5: a move needs -> (curly arrow) or ~> (fish-hook) between its ends C (map 2) has no lone pair
少打字、多画图:名称、高亮和编号
只有当原子有歧义时才需要映射编号。在某一步反应物中只出现一次的元素可以直接用元素符号指代;在键端点中,只计算与另一端相连的原子。下面是完整的 SN1 机理,没有映射编号,化合物和步骤都已编号,各行来回蛇形排列:
title: SN1 with element ends, numbered, snake rows number: both wrap: snake per-row: 3 CC(C)(C)Br ->[slow] C[C+](C)C + [Br-] move C-Br -> Br -> C[C+](C)C + O move :O -> O..C+ ->[fast] CC(C)(C)[OH2+]
C-Br 是唯一与溴相连的碳,C+ 按电荷选中正离子,:O 是该步中唯一氧原子的孤对电子。如果某元素出现两次,MolScript 会提示并要求使用映射编号。
h2 | 原子 2 上的一个氢,会自动为你显式化:move :1 -> 1..h2; h2-2 -> 2-3。 |
|---|---|
let base = [OH-:1] "hydroxide" | 定义一次物种,之后写 $base 即可。 |
[OH]~C([H])([H])([H])~[Br] {ts} | 过渡态:~ 表示部分(虚线)键,{ts} 画出带 ‡ 的方括号,并把正在形成和断裂的键拉直。 |
{δ+=2 δ-=3} | 原子旁的部分电荷。 |
{highlight=2/3-4:blue} | 给原子 2 和 3–4 键加上高亮填充。 |
{ox=1:II}、{dative=1-2} | 用于有机金属步骤的氧化态和金属–配体键。 |
[Ph] [R1] [Nu-:1] | 画成标签的缩写和 R 基团。 |
->[{CC(=O)Cl}][AlCl3] | 在箭头上方画成结构的试剂。 |
layout: cycle | 催化循环;以第一个物种结尾即可闭合循环,导出为 chemfig 时带有真正的圆弧。 |
脚本如何变成图
脚本每次都经过相同的步骤,所以同一个脚本总是得到同样的图:
- 读取。脚本被拆分为反应式行、move 行和指令。每个物种、运算符、说明文字和反应条件都连同行号一起记录。
- 检查标签。move 中用到的每个映射编号都必须恰好出现在一个原子上,每个
n-m都必须是真实存在的键,每个起点都必须有可给出的电子:孤对电子、电荷、自由基或化学键。 - 绘制物种。每个 SMILES 都变成键角规整的 2D 结构。箭头需要的显式氢会画成原子;电荷、孤对电子和自由基圆点按 SMILES 的描述添加。
- 排布反应式。结构、加号和箭头按实际宽度紧凑排列,在反应箭头处换行,反应条件和说明文字留出间距,确保文字不重叠。
- 放置弯箭头。每个箭头从化学工作者会画的位置离开其电子来源,并弯曲避开化学键、标签和其他箭头(详见下文)。
- 检查化学。每一步带弯箭头的反应都会按电子重新推演一遍:每个箭头从孤对电子、自由基或化学键取走两个电子(单钩箭头为一个),放到某个原子上或某个键中。得到的结构必须与箭头后面写出的结构一致。产物错误(附原子和电荷差异)、碳上有十个电子、从已无电子的原子出发的箭头、未成对的单钩箭头,或打断 σ 键的共振箭头,都会连同行号一起报告。
- 评判每个箭头。每个放置好的箭头都会按规则进行测量。在拥挤位置无法满足规则的箭头仍会画出,但会作为警告报告。
- 交付可编辑对象。结果是普通的画布内容:拖动结构,箭头会跟着走;可以重新设置任何样式并导出。
MolScript 遵循的箭头规则:
| 箭尾 | 位于给出电子的孤对电子或负号、自由基圆点或化学键中点上,绝不压在原子标签上。 |
|---|---|
| 箭头 | 停在接受电子的原子前一点,或停在正在形成的键的间隙中、朝向进攻原子的一侧。 |
| 弯曲 | 向结构外侧弯曲,箭头角度保持一致;单钩箭头的单个倒钩始终位于曲线外侧。 |
| 间距 | 与化学键、标签、电荷、圆点和其他箭头保持距离;指向同一目标的箭头呈扇形散开,而不是叠在一起。 |
| 长度 | 过短难以辨认或过长难以追踪的箭头会被标记出来。 |
每当 MolDraw 更新时,MolScript 测试集中的每个参考机理都会被绘制出来,并按这些规则接受评判。目前共有 41 个机理、81 个弯箭头,全部通过了绘图规则和电子计数检查,Templates 中的图也同样如此。你可以在 MolScript 示例库中查看每一个。
例题
E2 消除:一步中的三个箭头
title: E2 elimination [OH-:1] + [H:4][CH2:2][CH:3](C)[Br:5] ->[E2] C=CC + O + [Br-] move :1 -> 1..4; 4-2 -> 2-3; 3-5 -> 5
迈克尔加成:贯穿共轭体系的一串箭头
title: Michael addition [CH2-:1]C(C)=O + [CH2:2]=[CH:3][C:4](C)=[O:5] ->[1,4-addition] CC(=O)CCC=C(C)[O-] move :1 -> 1..2; 2-3 -> 3-4; 4-5 -> 5
2-3 -> 3-4 把 C=C 的 π 电子移入 C–C 键,使其成为双键。Diels–Alder 反应:成环的箭头
title: Diels–Alder [CH2:1]=[CH:2][CH:3]=[CH2:4] + [CH2:5]=[CH2:6] ->[Δ] C1CC=CCC1 move 1-2 -> 2-3; 3-4 -> 4..5; 5-6 -> 6..1
自由基加成:单钩箭头
title: Radical addition of Br• to propene [Br:1] + [CH2:2]=[CH:3]C -> BrC[CH]C move 1 ~> 1..2 move 2-3 ~> 1..2 move 2-3 ~> 3
~> 画出单钩箭头。终止于 1..2 的两个箭头在新键中点相遇。共振:烯醇负离子
[CH2-:1][C:2](C)=[O:3] <-> C=C(C)[O-] move :1 -> 1-2 move 2-3 -> 3
<-> 是共振箭头;弯箭头显示一种共振式如何变成另一种。基于 MolScript:完整的图
MolDraw Templates 面板(左侧工具栏底部的按钮)中的机理图都是用 MolScript 编写的。Fischer 酯化、羟醛加成和格氏加成的每一步都是一个简短的脚本;模板再在其周围加上面板、步骤标签、高亮圆圈和注释。由于这些步骤都是文本,每幅图中的每个箭头都会像上面的示例一样接受校验。
MolScript 与 chemfig
chemfig 是大多数化学工作者用来排版结构和机理的 LaTeX 宏包。它在自己的用途上非常出色,MolScript 并不打算在 LaTeX 中取代它。两者描述的是不同的东西:
| chemfig | MolScript | |
| 你描述的是 | 图本身:每个键的角度和长度,然后是每个箭头的锚点、偏移和弯曲。 | 化学本身:用 SMILES 表示的物种,以及哪些电子移到哪里。 |
| 排版 | 手动完成,逐个结构、逐个反应式调整。 | 自动完成:结构、行、反应条件和说明文字。 |
| 弯箭头 | 命名点之间的 TikZ 路径;位置在第二次 LaTeX 编译时确定。 | 映射编号之间的一行 move;自动放置并按绘图规则评判。 |
| 错误 | 表现为一份看起来不对的 PDF。 | 连同行号一起报告:缺少映射编号、起点没有电子、化学键不存在。 |
| 结果 | 文档中的排版输出。 | 可编辑的画布对象,外加图片、矢量和 chemfig 导出。 |
| 最适合 | 在 LaTeX 文档中进行精细的排版控制。 | 快速得到正确、整洁的机理,无论是手写还是由 AI 助手生成。 |
两者可以配合使用:用 MolScript 绘图,然后选择 Download → chemfig (.tex),即可得到用于文档的 chemfig 代码。chemfig 机理示例展示了这些代码的样子。
为什么用文本:MolScript 与 AI 助手
MolScript 的设计目标是让语言模型无需处理坐标就能画出机理:
- 模型本来就擅长写 SMILES,所以每个物种都使用它们熟悉的表示法。
- 原子映射让箭头没有歧义。“从原子 1 的孤对电子指向 1 与 2 之间正在形成的键”不会像“从氧指向碳的箭头”那样被放错位置。
- 错误信息可以直接据此修正。收到
line 3: no atom is tagged :9的模型可以修改第 3 行再试一次。 - 几何不是模型的工作。弯曲、间隙和间距由引擎决定和检查,而这恰恰是模型最薄弱的地方。
MolDraw AI 聊天已经这样工作了:让它画“羟醛加成的机理”,它会在后台编写 MolScript。MolScript 还被打包成一个 AI 技能:一个文件夹,包含语言参考、能发现大多数错误的规则、41 个经过校验的示例和一个小型独立校验器。它教给助手的工作流程是:规划中间体、编写脚本、运行校验器、修正报告的每个问题,然后才给出回答,这样你看到的机理已经逐个电子核对过了。
为了衡量效果,我们准备了一个包含 41 个机理请求的评测集(例如“展示叔丁基正离子的 E1 去质子”“画出带氧化态的 Pd 交叉偶联循环”),每个请求都有参考脚本。一个回答最多得四分:能编译、电子守恒、得到正确产物、每个弯箭头都通过绘图规则。参考脚本得分为 100%。
路线图:从 MolDraw 功能到开放框架
我们计划把 MolScript、它的编译器以及反应式和箭头引擎作为开源框架发布,任何画布应用都可以用它来绘制反应和机理,并具有编程语言般的可靠性:有书面规范、输出稳定、错误可据以修正。以下是在发布之前需要完成的工作。
语言说明
| 物种、运算符、反应条件、说明文字、续行 | 已完成 |
|---|---|
| 从孤对电子、电荷、自由基和化学键出发的双电子箭头和单钩箭头 | 已完成 |
带版本号的规范(MolScript 1,molscript: 1),附正式语法和一致性测试集 | 已完成 |
可复用的命名物种:let A = …,之后在后续步骤中写 $A | 已完成 |
方向提示:{rotate=90}、{flip}、{align=3} | 已完成 |
过渡态({ts}、用 ~ 表示部分键)、δ+ / δ−、方括号 | 已完成 |
高亮({highlight=2/3-4:blue})、化合物和步骤编号(number: both) | 已完成 |
| 在箭头上方画成结构的试剂;缩写(Ph、Ts、Boc)和 R 基团 | 已完成 |
| 能自行闭合的催化循环,每段圆弧上都有清晰的标签 | 已完成 |
循环内的弯箭头、金属–配体键({dative=1-2})和氧化态({ox=1:II}) | 已完成 |
准确性
| 标签存在、起点有电子、每个画出的箭头都通过几何规则 | 已完成 |
|---|---|
| 电子计数:推算箭头所表示的产物,并与写出的产物进行比较 | 已完成 |
| 每一步的电荷和原子守恒;八隅体、未成对单钩箭头和共振(σ 键)检查 | 已完成 |
简化氢原子的写法:h2 表示原子 2 上的一个氢 | 已完成 |
更少的映射编号:该步中唯一的元素即可直接使用(move C-Br -> Br) | 已完成 |
排版
| 按实际宽度紧凑排行;反应条件和说明文字永不重叠 | 已完成 |
|---|---|
均衡换行(3 + 2,而不是 4 + 1),并按宽度换行(width:) | 已完成 |
行与行之间的连接更短:wrap: snake 让下一行反向排列,并用一个短的向下箭头连接 | 已完成 |
网格布局(layout: grid),各行的列对齐 | 已完成 |
框架
| 编译器和校验器作为独立软件包,不依赖 MolDraw 应用 | 已完成 |
|---|---|
| 编译器与任意渲染器之间稳定、有文档的反应式格式 | 已完成 |
| 输出到画布、SVG 和 PNG;chemfig 和 JSON 导出器 | 已完成 |
| 用真正圆弧导出催化循环到 chemfig(并可导入回来) | 已完成 |
| 命令行工具:输入脚本,输出校验报告、图片或 chemfig 文件 | 已完成 |
| 带版本的排版,升级后同一脚本的绘图保持不变 | 已完成 |
| 编辑器支持:输入时即显示高亮和问题(Templates 中的 MolScript 标签页) | 已完成 |
| 编辑器中补全映射编号、选项和关键字(按 Tab 选第一个) | 已完成 |
| 公开的参考机理示例库,每个都自动校验 | 已完成 |
| 示例库已有 41 个经过校验的机理;目标是扩充到数百个 | 下一步 |
| 以开源方式发布软件包、技能和规范 | 下一步 |
AI 技能
| 已用于 MolDraw AI 聊天,带行号的错误会反馈给模型 | 已完成 |
|---|---|
| 打包好的技能:参考、规则、示例,以及助手在回答前可以运行的校验步骤 | 已完成 |
| 包含 41 个机理提示的评测集,按化学正确性和箭头整洁度评分 | 已完成 |
| 公布主流 AI 模型在评测集上的得分 | 下一步 |
如果你从事教学、撰写论文或开发化学软件,并希望参与塑造这一项目,请通过 MolDraw 中的 Request feature 告诉我们。
试一试
- 打开 MolDraw 和 AI 聊天,请它画一个机理,例如“画出 2-溴丙烷与氢氧根的 E2 机理”。聊天会编写 MolScript 并画出来。
- 或者打开左侧工具栏底部的 Templates,添加 Fischer 酯化、羟醛反应或格氏反应的图,或者在 MolScript 标签页中编写自己的脚本:它会高亮脚本、在你输入时显示问题,并在画布上绘制出来。
- 像对待任何绘图一样拖动、修改样式或扩展结果,然后下载为图片或 chemfig。
问题与解答
什么是 MolScript?
MolScript 是一种用于反应式和弯箭头机理的简短文本语言。物种写成 SMILES,用 +、->、<-> 或 <=> 连接,每个弯箭头是原子映射编号之间的一行 move。MolDraw 会画出结构、反应条件、孤对电子、电荷和箭头,结果在画布上仍然可以编辑。
如何在 MolScript 中画弯箭头?
在 SMILES 中给箭头涉及的原子标上原子映射编号,例如 [OH-:1] 和 [CH3:2][Br:3],然后写 move :1 -> 1..2 表示原子 1 的孤对电子与原子 2 形成新键,再写 move 2-3 -> 3 表示 C–Br 键断裂、电子移向溴。
如何画单钩(单电子)箭头?
用 ~> 代替 ->:move 1-2 ~> 1 把原子 1 与原子 2 之间化学键的一个电子送到原子 1。两个终点在同一个正在形成的键(n..m)上的单钩箭头会在该键中点相遇。
MolScript 比 chemfig 更好吗?
它们解决的是不同的问题,并且可以配合使用。chemfig 是一个 LaTeX 宏包,你要在文档中亲手放置每一个键和箭头。MolScript 描述化学本身,排版和箭头几何交给 MolDraw,并由 MolDraw 校验每个箭头。任何 MolScript 绘图都可以下载为 chemfig 代码,用于 LaTeX 文档。
AI 助手能写 MolScript 吗?
能。MolDraw AI 聊天就是通过编写 MolScript 来画机理的,因为语言模型擅长写 SMILES,而原子映射让每个箭头端点都没有歧义。错误会连同行号一起返回,模型可以据此修正。我们还计划推出一个打包好的 AI 技能,供其他助手使用。
MolScript 会开源吗?
这是我们的计划:语言、编译器以及反应式和箭头引擎将作为开放框架发布,供其他画布应用用来绘制反应和机理。路线图列出了在此之前需要完成的工作。