一种融合编辑器的设计
2022-10-26李维龙
李维龙,任 龙
(1. 湖南民族职业学院,湖南 岳阳 414000; 2. 岳阳职业技术学院,湖南 岳阳 414000)
在当前的软件系统中,有很多强大、易用的编辑器,如Office、Nodepad++、Ultraedit 和Markdown 等.但当我们使用这些流行的编辑器编写物理、数学等专业学术文章时,经常会因为编辑器无法满足公式的描写、数学模式的展示、公式的演算与图形效果的展示而不得不暂时停止思考,转而在一些更专业的软件,如Mathematica、COMSOL 中完成公式演算、图形效果的展示等工作,再截取图片粘贴到Word 等文字编辑软件中,以便使文章的内容更准确,更容易让人理解. 这种工作方式是让人痛苦的,同时工作效率也比较低下. 目前,已经有一些网站使用Markdown集成了Mathjax,但是仍存在一些问题,比如渲染速度较慢、公式不够完整、无法进行演算、无法展示图形效果等[1~3]. 基于一些实际需要以及编辑器的现状,本文设计研究一种可以专门用于编写数学、物理等科学类专业文章的编辑器.
1 相关编辑器概述
1.1 Markdown
Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber). 它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档. 这种语言吸收了很多在电子邮件中已有的纯文本标记的特性. 由于Markdown 的轻量化、易读易写特性,并且支持图片、图表、数学式,因此目前许多网站都广泛使用Markdown 来撰写帮助文档或是用于论坛上发表消息. 如GitHub、Reddit、Diaspora、Stack Exchange、OpenStreetMap 、SourceForge、简书等. Markdown 甚至还能被使用来撰写电子书.
1.2 Mathjax
Mathjax 是一款运行在浏览器中的开源数学符号渲染引擎,使用Mathjax 可以方便地在浏览器中显示数学公式,不需要使用图片. 目前,Mathjax 可以解析Latex、MathML 和ASCIIMathML 的标记语言.Mathjax 项目始于2009年,发起人包括American Mathematical Society、Design Science 等,还有众多的支持者. Mathjax 可能会成为今后数学符号渲染引擎中的主流. 本文接下来会讲述Mathjax 的基础用法,但不涉及Mathjax 的安装及配置. 此外,推荐使用StackEdit 学习Mathjax 的语法,它支持Markdown 和Mathjax.
1.3 Sagemath
Sagemath 是一个免费、开源的数学软件系统,采用GPL 协议. 它整合了许多开源Python 包,采用Python 语言编写,但也支持其他语言. 它的目标是创造一个可变的开源软件以替代Magma、Maple、Mathematica 和Matlab. Sagemath 不仅是一个软件,也是一个编程环境,提供命令行模式、笔记本模式,可以编写编译型程序和解释型程序. 目前Sagemath 支持Linux、Mac OS X、BSD、Solaris 等平台.
2 融合编辑器的设计与实现
在当前一些主流编辑器软件中,有部分软件是开源的且功能十分强大,笔者试图设计一种以Markdown 为主体,同时集成Mathjax 和Sagemath 功能,具有普通文本、数学公式、公式演算、图形效果展示等功能的新型融合编辑器.
2.1 总体设计
新型编辑器具备文本编辑、数学公式编辑、公式演算、图形效果展示等功能. 在文本编辑方面,选择对Markdown 进行功能扩充; 在数学公式编辑方面选择将Mathjax 集成到Markdown 中,同时使用Latex对Mathjax 进行补充与改进; 在公式演算与图形效果展示方面,选择将Sagemath 集成到Markdown 中. 最终形成一个以Markdown 为主体,同时集成Mathjax 与Sagemath 的编辑器,用于实现普通文本编辑、数学公式编辑、公式演算、图形效果展示等. 同时,为了方便集成,编辑器提供了js 脚本,可以直接嵌入到网页中使用. 但融合过程中仍然存在一些问题,如Markdown、Mathjax 本身对数学与物理等科学类知识的支持还不全面,需要扩充原有的功能; Markdown、Mathjax、Sagemath 是三个独立的体系,需要将它们整合到一起; 需要在渲染的性能上进行优化等.
2.2 具体实现
第一,对Mathjax 的扩充. 这部分工作相对比较简单,Mathjax 已经支持了Latex 的大部份语法,少数特殊的符号也可以通过扩展脚本来实现,所以这一块的研究工作主要集中在对特殊符号的支持上.
第二,对Markdown 的扩充. 这部分工作则比较麻烦,一方面有部分Markdown 的分支已支持了不同的功能,但基于Markdown 版本不同,这些功能的代码不能直接使用,只能综合几个版本的功能特点,重新在Markown 中开发这些功能. 另一方面,在实际的文章编辑过程中,会产生很多Markdown 本身不支持的需要开发扩充的功能,如对视频的支持,或是Markdown 本身的bug 导致某些功能在特定的情况下出错,需要修改代码来修复这个问题,如空行导致多级列表缩进混乱等问题.
第三,将Sagemath 集成到Markdown 中. 在数学与物理等科学理论的推导过程中,有部分公式需要用到前面公式的推导结果,而这种计算过程又比较复杂,简单的计算或是引用之前的计算结果有时会出现错误,同时,学习者有时也需要在学习的过程中演算文章中的公式,而Sagemath 提供了实时演算的功能,能通过修改公式进行进一步的演算,并显示演算结果,如果需要以图形化的方式显示,也可以将公式转换成图形显示. 另外,由于两个编辑器都是独立的系统,故需要修改它们的代码才能将其整合集成到一起.笔者通过研究之后,确定了修改Markdown 与Mathjax 的代码,同时编写一个脚本调用Sagemath,并在Markdown 中增加对Mathjax 与Sagemath 的支持.
第四,对渲染的性能进行优化. 一个简单的集成方案就是先进行Markdown 的渲染,再进行Mathjax的渲染,最后进行Sagemath 的渲染. 一开始,这个方案是可行的,但随着测试数据量的增大,性能问题突显出来,并且使得编辑器出现了卡顿现象. 当然,也可以选择在编辑结束之后再进行渲染,但如果一个编辑器不能在编辑的过程中就看到最终的效果,就需要在编辑结束后对文档的整体格式再进行调整. 最终,选择通过在Mardown 中渲染Mathjax 的方式优化编辑器的性能,并且使用双缓冲的方式解决渲染过程中的闪动问题. 但在Markdown 中对Sagemath 进行渲染的难度太大,所以,编辑器中如果出现大量的sagemath 公式,那么渲染速度就会降低,从而影响到对文档的编辑. 不过,它的性能可以基本满足实际需求,相较之前,有了很大的提高.
2.3 核心功能说明
(1)文字编辑方面
对Markdown 进行功能扩充. 实现并扩充的功能包括: Undo 撤消、Redo 重做、Sagemath、Mathjax、Italic 斜体、Bold 粗体、Image 图片、视频、表格、字数提示、最大化、还原、行号、同步滚动等.
(2)数学公式方面
Mathjax+Latex. 将Mathjax集成到Markdown中,同时使用Latex对Mathjax进行补充与改进,使用$表示行内的公式,使用$$表示块级公式,在块级模式下,多个公式以整体的形式在一个块结构中显示.
(3)公式演算与图形效果展示方面
将Sagemath 集成到Markdown 中. 通过$$$可以输入Sagemath 的公式与代码,支持输入时触发运算,同时支持用户通过点击运算按钮来触发运算. 支持单个代码块的计算并显示图形结果,也支持分段的计算,以便在一篇文章中可以将整个计算过程分开讲解、计算、呈现结果.
编辑器的主体功能展示效果如图1 所示.
图1 编辑器的主体功能展示效果
3 结束语
设计功能强大的编辑器是一个不断优化的过程,后续优化建议如下. 第一,了解Markdown、Mathjax、Sagemath 的发展趋势,以及纳入到标准中的版本. 第二,选择合适的版本与开发语言,而不是从头开始.第三,在扩展Markdown 的功能时,就同时将Mathjax 与Sagemath 加入到Markdown 的格式元素中. 第四,一开始就应该考虑在Markdown 的渲染过程中同时渲染Mathjax,如果可能,也应该同时渲染Sagemath.第五,应该参考与其相似的编辑器的功能,虽然其它的编辑器可能没有支持数学公式或是演算功能,但编辑器的一些辅助性功能也可作为提高可用性与易用性的参考.