最近在做一个 Web 端公式输入相关的小项目,过程中有个感受特别明显:
如果只是给开发者用,LaTeX 输入当然够了;
但如果是给老师、教研、题库录入人员、运营同学这类非程序员用户用,单纯靠手敲 LaTeX,体验其实并不友好。
所以我想做一个更接近 MathType 7 使用习惯的 Web 公式输入 demo。这是原版mathtype7键盘:
目前这个 demo 已经把基础交互链路跑通了,做成了一个 Vue 3 组件化的版本。这是我做的键盘:
这个键盘基本上还原了原版全部的公式,核心的映射json文件中有490个公式配置,可以输出公式对应的latex语法字符串或者mathlive字符串。
先看下这个 demo 主要做了什么
这个项目目前主要实现了下面几块:
- MathType 7 风格的公式键盘布局
- 常见数学符号面板
- 常见模板面板
- 分类标签切换
- MathLive 公式编辑器接入
- LaTeX 插入与输出
- KaTeX 渲染公式按钮
- 分式、根式、上下标、积分、求和、矩阵等常见模板支持
简单来说,就是把“公式编辑器”和“公式键盘”两部分拆开来做,再把它们组合起来。
项目里几个核心部分也比较清晰:
MathTypeEditor:封装 MathLive 编辑器MathTypeKeyboard:负责键盘交互和面板组织MathTypeLatexButton:负责用 KaTeX 渲染按钮内容MathTypePalettePopup:负责弹出的模板面板core/data.ts:负责维护整个键盘的符号和模板数据
为什么想做成 MathType 7 风格?
核心原因还是“熟悉”。
很多教育类、题库类、公式录入类场景里的用户,对 MathType 的认知成本最低。
如果 Web 端组件在交互层面尽量贴近 MathType 7,用户上手速度会快很多。
尤其是在这些场景里会更明显:
- 在线题目录入
- 组卷系统
- 教师备课平台
- 作业系统
- 富文本中的公式输入
- 数学、物理、化学公式录入
相比“给一个输入框让用户自己写 LaTeX”,公式键盘这种交互方式对真实业务用户更友好。
这个项目是怎么实现的?
整体技术栈比较简单:
- Vue 3
- TypeScript
- Vite
- MathLive
- KaTeX
1. 用 MathLive 解决公式编辑
MathLive 提供了 math-field,很适合做 Web 端公式输入框。
我这里把它单独封装成了一个 MathTypeEditor 组件,处理这些事情:
v-model双向绑定- 插入公式模板
- 输入事件同步
- 聚焦和插入行为封装
这样键盘层只负责“发出要插入什么”,编辑器层只负责“怎么插进去”。
2. 用 KaTeX 渲染键盘按钮
键盘上的每一个符号、模板,本质上都是一段 LaTeX。
如果直接显示原始字符串,用户点选体验会很差;用 KaTeX 渲染后,按钮会直观很多。
这部分我单独做成了 MathTypeLatexButton,负责把 LaTeX 转成可点击的公式按钮。
3. 用数据驱动整个键盘
这个项目里比较重要的一点,是把键盘结构做成了数据驱动:
- 符号面板
- 模板面板
- 快捷符号
- 分类区域
都在 core/data.ts 里集中维护。
这样做的好处是,后续如果要继续补齐符号、扩展模板、定制某个业务版本,维护成本会低很多,不需要把逻辑和 UI 写死在组件里。
4. 键盘和编辑器解耦
键盘层本身不关心底层编辑器是谁,它只负责输出两类结果:
latexinsert
这样设计之后,后面无论是继续增强 MathLive 集成,还是换成别的编辑器思路,都会更灵活一些。
我觉得这个方向适合哪些项目?
这个 demo 虽然现在还是一个基础版,但方向是比较明确的。
我觉得它比较适合下面这类场景:
- 教育 SaaS
- 题库系统
- 在线考试系统
- 公式富文本编辑器
- 知识库/文档系统中的公式输入模块
- 需要 MathType 风格输入体验的内部业务系统
最后
如果你也在做 Web 端公式输入、在线教育、题库录入、公式编辑器这类需求,欢迎交流。
- 联系方式wx:Daisy15656948781
如果大家对这个方向感兴趣,后面我也可以继续分享这个项目里几个更具体的点,比如:
- 将这个键盘直接封装成一个npm包
- MathLive 在 Vue 里怎么封装更顺手
- 公式键盘的数据结构怎么设计
- KaTeX 按钮渲染怎么处理
- MathType 风格键盘在 Web 端怎么拆组件