🧪 在线实例演示
欢迎体验 Scientific Expression Engine 的完整功能。以下包含代码示例和交互式公式编辑器。
📐 基础数学公式
分数
\frac{1}{2} + \frac{3}{4} = \frac{5}{4}import { ParserRegistry } from '@sciexpr/parser'
import { LatexReverseRenderer } from '@sciexpr/renderer'
const registry = new ParserRegistry()
const ast = registry.parse('\\frac{1}{2} + \\frac{3}{4} = \\frac{5}{4}')
const renderer = new LatexReverseRenderer()
const latex = renderer.render(ast)
console.log(latex.value) // \frac{1}{2}+\frac{3}{4}=\frac{5}{4}<span class="katex">
<span class="katex-html">
<span class="mfrac">...</span>
<span class="mbin">+</span>
<span class="mfrac">...</span>
<span class="mrel">=</span>
<span class="mfrac">...</span>
</span>
</span>根式与指数
\sqrt[3]{x^{2} + y^{2}}import { ParserRegistry } from '@sciexpr/parser'
import { MathMLRenderer, UnicodeRenderer } from '@sciexpr/renderer'
const registry = new ParserRegistry()
const ast = registry.parse('\\sqrt[3]{x^{2} + y^{2}}')
// 渲染为 MathML
const mathml = new MathMLRenderer()
console.log(mathml.render(ast).value)
// <math><mroot><mrow><msup><mi>x</mi><mn>2</mn></msup>...
// 渲染为 Unicode
const unicode = new UnicodeRenderer()
console.log(unicode.render(ast).value)
// ∛(x²+y²)求和与积分
\sum_{n=1}^{\infty} \frac{1}{n^{2}} = \frac{\pi^{2}}{6}\int_{0}^{\infty} e^{-x^{2}} \, dx = \frac{\sqrt{\pi}}{2}⚗️ 化学表达式
分子式
\ce{H2SO4}
\ce{C6H12O6}
\ce{Fe2(SO4)3}import { ChemicalParser } from '@sciexpr/parser'
const parser = new ChemicalParser()
const ast = parser.parse('H2SO4')
// AST 结构:
// root (molecule)
// ├── chem-element: H (count: 2)
// ├── chem-element: S (count: 1)
// └── chem-element: O (count: 4)化学反应方程式
\ce{2H2 + O2 ->[\text{点燃}] 2H2O}import { ReactionBalancer } from '@sciexpr/chemistry'
import { ChemicalParser } from '@sciexpr/parser'
const parser = new ChemicalParser()
const ast = parser.parse('2H2 + O2 -> 2H2O')
const balancer = new ReactionBalancer()
const result = balancer.checkConservation(
['2H2', 'O2'],
['2H2O']
)
console.log(result.balanced) // true ✅离子与元素
\ce{Fe^{3+} + 3OH- -> Fe(OH)3 v}
\ce{Cu^{2+} + 2e- -> Cu}
\ce{[Ag(NH3)2]+}\ce{^{235}_{92}U}
\ce{^{12}_{6}C}import {
ION_TEMPLATES, ELEMENT_TEMPLATES,
searchIons, getCations, getAnions,
searchElements, getElementsByPeriod,
} from '@sciexpr/presets'
// 获取所有阳离子
const cations = getCations()
// → [Li⁺, Na⁺, K⁺, NH₄⁺, Ca²⁺, Mg²⁺, Fe²⁺, Fe³⁺, ...]
// 获取所有阴离子
const anions = getAnions()
// → [F⁻, Cl⁻, Br⁻, I⁻, OH⁻, NO₃⁻, SO₄²⁻, CO₃²⁻, ...]
// 按周期查询元素
const period3 = getElementsByPeriod(3)
// → [Na, Mg, Al, Si, P, S, Cl, Ar]
// 模糊搜索元素
const results = searchElements('铁')
// → [{ id: 'elem-Fe', name: '铁', ... }]🤖 AI 智能集成
自然语言 → 公式
import { AIPipeline } from '@sciexpr/ai'
// 使用方只需实现 SPI 接口,注入自己的 AI 模型
const pipeline = new AIPipeline({
completionProvider: new MyOpenAIProvider(), // 你的 AI
knowledgeBaseProvider: new MyVectorKB(), // 你的知识库
})
// 自然语言查询
const results = await pipeline.naturalLanguageToFormula('勾股定理')
// → [{ text: 'a^{2} + b^{2} = c^{2}', label: '勾股定理', ... }]
// AI 智能补全
const completions = await pipeline.getCompletions({
currentInput: '\\frac{\\pi',
cursorPosition: 8,
expressionType: 'math',
})
// → [{ text: '\\pi', label: 'π (圆周率)' }, ...]AI 输出规范化
import { AIPipeline } from '@sciexpr/ai'
const pipeline = new AIPipeline({
normalizerProvider: new MyAINormalizer(),
})
// ChatGPT 输出:$$H_2O$$
// Claude 输出:\(H_2O\)
// Gemini 输出:H₂O
// → 统一规范化
const r1 = await pipeline.normalize('$$H_2O$$', 'latex')
// → $H_{2}O$
const r2 = await pipeline.normalize('\\(H_2O\\)', 'latex')
// → $H_{2}O$
const r3 = await pipeline.normalize('H₂O', 'latex')
// → $H_{2}O$✍️ ELN 实验需求 → AI 生成实验方案(示例操作)
下面的示例演示了完整的 「实验需求表单 → AI 生成实验方案 → 展示」 流程(ELN 电子实验记录本场景):
- 关联 ELN 模板(如:催化剂活性测试记录模板),填写化学名称 / 反应体系、反应条件与文字描述 / 实验目标;
- 点击 生成实验方案,表单数据被组装为结构化 Prompt;
- 通过
@sciexpr/ai的chatToFormula()流式调用 LLM —— 覆盖默认公式 System Prompt,改用实验方案生成 System Prompt(支持 OpenAI 兼容接口); - 生成结果(配平反应方程式 + 分步实验方案)实时渲染为 Markdown + KaTeX + mhchem 展示。
没有 API Key 也没关系:勾选配置面板中的 「模拟模式」 即可体验完整流程(内置 MTO / SAPO-34 示例方案)。
填写实验需求并点击「生成实验方案」,AI 将输出配平反应方程式与分步实验方案。
ELN 模板 / 反应体系 / 条件 / 目标
表单数据 → 结构化实验需求
@sciexpr/ai 流式调用 LLM
Markdown + KaTeX + mhchem
💡 无头函数调用
该示例的核心是 chatToFormula() —— 一条不依赖任何 UI 组件的纯函数调用,消息组装、流式输出、结果清理全部内置:
import {
chatToFormula,
OpenAICompatProvider,
EXPERIMENT_SYSTEM_PROMPT, // 实验方案 System Prompt(@sciexpr/ai 内置常量)
EXPERIMENT_USER_PROMPT_PREFIX, // 实验方案 user 前缀(@sciexpr/ai 内置常量)
} from '@sciexpr/ai'
const provider = new OpenAICompatProvider({
baseURL: 'https://api.deepseek.com/v1',
apiKey: 'sk-...',
model: 'deepseek-chat',
})
// 表单数据 → 结构化 Prompt → 发送 → 拿到清理后的实验方案
const { cleaned, raw } = await chatToFormula({
provider,
prompt: [
'【关联 ELN 模板】催化剂活性测试记录模板',
'【化学名称 / 反应体系】甲醇制烯烃(MTO),SAPO-34 分子筛',
'【反应条件】温度 480℃,常压',
'【实验目标】验证不同硅铝比对乙烯/丙烯选择性的影响',
].join('\n'),
systemPrompt: EXPERIMENT_SYSTEM_PROMPT, // 直接引用内置常量,也可传自定义 Prompt
userPromptPrefix: EXPERIMENT_USER_PROMPT_PREFIX,
onStream: (acc) => console.log(acc), // 流式增量
})其他可用常量:
FORMULA_USER_PROMPT_PREFIX(公式生成默认前缀)、DEFAULT_FORMULA_SYSTEM_PROMPT(公式生成 System Prompt)。
🧩 跨框架组件
Vue 3
<script setup>
import { FormulaEditor } from '@sciexpr/vue'
import { ref } from 'vue'
const formula = ref('\\frac{-b \\pm \\sqrt{b^{2}-4ac}}{2a}')
</script>
<template>
<FormulaEditor v-model="formula" />
</template>React
import { FormulaEditor } from '@sciexpr/react'
function App() {
const [formula, setFormula] = useState('\\frac{1}{2}')
return <FormulaEditor value={formula} onChange={setFormula} />
}Web Component (纯 HTML)
<formula-editor value="\frac{1}{2}"></formula-editor>
<script type="module">
import '@sciexpr/web-component'
</script>📝 Markdown 集成
@sciexpr/markdown 是一个 markdown-it 插件,让你在 Markdown 文档中无缝嵌入数学公式和化学表达式。下面是一个交互式 Markdown 编辑器——左侧编写 Markdown + 公式,右侧实时预览渲染效果。
⏳ 加载 Markdown 渲染引擎...
快速上手
pnpm add @sciexpr/markdown markdown-itimport MarkdownIt from 'markdown-it'
import { formulaPlugin } from '@sciexpr/markdown'
const md = new MarkdownIt().use(formulaPlugin)
// 行内公式:$...$
md.render('质能方程 $E = mc^{2}$ 是爱因斯坦提出的')
// 块级公式:$$...$$
md.render('$$\\frac{-b \\pm \\sqrt{b^{2}-4ac}}{2a}$$')与 VitePress 集成
// .vitepress/config.ts
import { defineConfig } from 'vitepress'
import { formulaPlugin } from '@sciexpr/markdown'
export default defineConfig({
markdown: {
config(md) {
md.use(formulaPlugin, {
enableChemistry: true, // 化学式自动识别
enableNumbering: true, // 公式自动编号
})
},
},
})配置选项
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enableChemistry | boolean | false | 启用 \ce{...} 化学式自动识别 |
enableNumbering | boolean | false | 块级公式自动编号 |
inlineDelimiter | string | '$' | 行内公式分隔符 |
blockDelimiter | string | '$$' | 块级公式分隔符 |
extractMeta | boolean | false | 提取公式元数据到 token.meta |
💡 提示
上方的交互式 Demo 使用 markdown-it + KaTeX 在浏览器端实时渲染,与 @sciexpr/markdown 插件行为完全一致。试试在左侧编辑器中编写你的公式吧!
🧩 Vue 组件集成
@sciexpr/vue 提供了一套 Vue 3 组件,让你在 Vue 项目中快速集成公式编辑与渲染能力。下方的编辑器底层使用 @sciexpr/parser 实时解析 AST。
🧩 @sciexpr/vue — 独立子组件展示
1. FormulaToolbar — 工具栏
提供常用 LaTeX 命令的快捷插入按钮,支持 6 大分类。
2. SymbolPanel — 符号面板
分类浏览希腊字母、数学运算符等常见符号。
3. ElementTable — 元素周期表
交互式化学元素周期表,点击即可插入元素符号。
4. LivePreview + Formula — 实时预览 & 渲染
输入 LaTeX 源码,实时查看 KaTeX 渲染结果。
\frac{{x^{2}+y^{2}}}{{\sqrt{{z}}}}\frac{{x^{2}+y^{2}}}{{\sqrt{{z}}}}核心组件
| 组件 | 说明 |
|---|---|
<Formula> | 纯渲染组件,source prop 传入 LaTeX 渲染为 KaTeX HTML |
<FormulaEditor> | 完整编辑器,工具栏 + 实时预览 + AI 自动补全 |
<LivePreview> | 实时预览组件 |
<FormulaToolbar> | 独立工具栏,可插入分式、根式、上下标等 |
<SymbolPanel> | 数学符号面板,数据来自 @sciexpr/math |
<ElementTable> | 交互式元素周期表,来自 @sciexpr/chemistry |
快速集成
pnpm add @sciexpr/vue<script setup>
import { ref } from 'vue'
import { Formula, FormulaEditor, LivePreview } from '@sciexpr/vue'
const formula = ref('\\frac{1}{2}')
</script>
<template>
<!-- 纯渲染:行内 -->
<p>质能方程 <Formula source="E = mc^2" /> 由爱因斯坦提出。</p>
<!-- 纯渲染:块级 -->
<Formula source="\int_0^\infty e^{-x^2} dx" display-mode />
<!-- 完整编辑器(v-model 双向绑定)-->
<FormulaEditor v-model="formula" />
<!-- 仅实时预览 -->
<LivePreview :source="formula" display-mode />
</template>💡 提示
上方的交互 Demo 模拟了 FormulaEditor 的核心体验:左侧编写 Markdown + LaTeX 公式,右侧实时渲染预览。工具栏数据来源于 @sciexpr/math 和 @sciexpr/presets。
🎮 交互式公式编辑器
下面是一个完整的在线公式编辑器,你可以直接输入 LaTeX 或点击工具栏按钮来构建公式,右侧实时预览渲染效果。
\sum _{{n=1}}^{{\infty }}\frac{{1}}{{n^{{2}}}}=\frac{{\pi ^{{2}}}}{{6}}📦 快速集成
只需要 3 步:
# 1. 安装
pnpm add @sciexpr/core @sciexpr/parser @sciexpr/renderer
# 2. 解析 & 渲染import { ParserRegistry } from '@sciexpr/parser'
import { KatexRenderer } from '@sciexpr/renderer'
// 3. 一行搞定!
const registry = new ParserRegistry()
const ast = registry.parse('E = mc^{2}')
const html = new KatexRenderer().render(ast)
console.log(html.value) // <span class="katex">E = mc²</span>💡 提示
点击上方工具栏按钮可以快速插入 LaTeX 命令,也可以直接在左侧编辑框输入 LaTeX 源码。支持 Ctrl+/ 快速插入分式,Ctrl+S 快速插入根式。