我手搓了一个 MathType 7公式输入键盘Web版

21 阅读4分钟

最近在做一个 Web 端公式输入相关的小项目,过程中有个感受特别明显:

如果只是给开发者用,LaTeX 输入当然够了;
但如果是给老师、教研、题库录入人员、运营同学这类非程序员用户用,单纯靠手敲 LaTeX,体验其实并不友好。

所以我想做一个更接近 MathType 7 使用习惯的 Web 公式输入 demo。这是原版mathtype7键盘:

mathtype.png

目前这个 demo 已经把基础交互链路跑通了,做成了一个 Vue 3 组件化的版本。这是我做的键盘:

image.png

image.png 这个键盘基本上还原了原版全部的公式,核心的映射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. 键盘和编辑器解耦

键盘层本身不关心底层编辑器是谁,它只负责输出两类结果:

  • latex
  • insert

这样设计之后,后面无论是继续增强 MathLive 集成,还是换成别的编辑器思路,都会更灵活一些。

我觉得这个方向适合哪些项目?

这个 demo 虽然现在还是一个基础版,但方向是比较明确的。
我觉得它比较适合下面这类场景:

  • 教育 SaaS
  • 题库系统
  • 在线考试系统
  • 公式富文本编辑器
  • 知识库/文档系统中的公式输入模块
  • 需要 MathType 风格输入体验的内部业务系统

最后

如果你也在做 Web 端公式输入、在线教育、题库录入、公式编辑器这类需求,欢迎交流。

  • 联系方式wx:Daisy15656948781

如果大家对这个方向感兴趣,后面我也可以继续分享这个项目里几个更具体的点,比如:

  • 将这个键盘直接封装成一个npm包
  • MathLive 在 Vue 里怎么封装更顺手
  • 公式键盘的数据结构怎么设计
  • KaTeX 按钮渲染怎么处理
  • MathType 风格键盘在 Web 端怎么拆组件