背景
- 主要是最近接触了一些题目识别相关的功能。需要将ocr识别的结果(latex)展示给用户,用户能在识别的结果上进行修改和提交。即一个完整的公式富文本编辑器,有操作,复制,粘贴。
实现方案
- 前期直接使用了某个不开源的editor进行二次开发。但此编辑器不支持latex格式的展示。只支持mathmal格式的展示。因此当我们存取的时候,需要在这两个格式进行转换。后面开发中遇到的主要问题,也在格式转换上。
- 主要流程

- latex2mathml工具
- mathml2latex 工具
- 公式文本编辑器+渲染工具
Latex
- latex作为ocr识别的结果返回给前端,后续的展示和修改都基于它。
- 为什么使用latex 因为他是跨平台的。而mathml没有这么通用~
LaTeX 在世界范围内用于科学文档,书籍以及许多其他形式的出版。 它不仅可以创建精美的排版文档,而且还允许用户非常快速地处理排版更为复杂的部分,例如输入数学公式、创建目录、饮用和创建书目以及在所有章节中保持一致的布局。 由于可用的开源软件包数量众多(稍后会详细介绍),所以 LaTeX 的可能性是无穷的。 这些软件包允许用户使用 LaTeX 做更多的事情,比如添加脚注、绘制图表格、创建表格等。
一串latex文本和对应的渲染结果

Mthml
MathML指“数学标记语言”,是XML语言的一个子集,用来在web网页,甚至部分软件中显示数学公式。
一段mathml和对应的展示


mathml2latex的实现

- 区分leaf和非leaf节点进行parse
- leaf节点相对简单 直接根据tagname类型返回对应的latex语法
- 非leaf节点 根据标签类型 ,使用不同的模板匹配 children中解析到的内容(chidren的解析的过程是递归的解析父节点的过程)
eg.

有哪些问题
- 上面解析mathml的过程看似简单,其实有很多需要处理的问题,主要原因是,我们最后提交的数据需要和ocr识别出来的语法同步。
例如 如下两种语法都能导致相同的效果。

-
同样的标签 不能使用同样的模板渲染。例如

-
通过mathjax latex2mathml 后的mathml文本不能被富文本编辑器正确展示。--目前针对特殊情况特殊 处理 后续改造方案
-
使用latex支持的开源文本编辑器。自己实现一个操作面板。这样避免了数据格式转换带来的问题。

-
实现类似语雀的功能,直接将要求用户输入latex语法 展示成公式,并且不支持复制。不过这个不太符合我们的业务场景。

-
使用latex.js 将latex pares成html。自己实现一个公式富文本编辑器,即不存在数据转换的问题(但需要处理latex2html的坑)
总结
- 使用三个不同的工具 进行 数据的转入 数据的渲染 数据的转出 是导致问题的根本原因
- 欢迎指正 欢迎提出意见&其他方案 🐶 ~