李維龍,任 龍
(1. 湖南民族職業(yè)學(xué)院,湖南 岳陽 414000; 2. 岳陽職業(yè)技術(shù)學(xué)院,湖南 岳陽 414000)
在當(dāng)前的軟件系統(tǒng)中,有很多強(qiáng)大、易用的編輯器,如Office、Nodepad++、Ultraedit 和Markdown 等.但當(dāng)我們使用這些流行的編輯器編寫物理、數(shù)學(xué)等專業(yè)學(xué)術(shù)文章時,經(jīng)常會因為編輯器無法滿足公式的描寫、數(shù)學(xué)模式的展示、公式的演算與圖形效果的展示而不得不暫時停止思考,轉(zhuǎn)而在一些更專業(yè)的軟件,如Mathematica、COMSOL 中完成公式演算、圖形效果的展示等工作,再截取圖片粘貼到Word 等文字編輯軟件中,以便使文章的內(nèi)容更準(zhǔn)確,更容易讓人理解. 這種工作方式是讓人痛苦的,同時工作效率也比較低下. 目前,已經(jīng)有一些網(wǎng)站使用Markdown集成了Mathjax,但是仍存在一些問題,比如渲染速度較慢、公式不夠完整、無法進(jìn)行演算、無法展示圖形效果等[1~3]. 基于一些實際需要以及編輯器的現(xiàn)狀,本文設(shè)計研究一種可以專門用于編寫數(shù)學(xué)、物理等科學(xué)類專業(yè)文章的編輯器.
Markdown 是一種輕量級標(biāo)記語言,創(chuàng)始人為約翰·格魯伯(John Gruber). 它允許人們使用易讀易寫的純文本格式編寫文檔,然后轉(zhuǎn)換成有效的XHTML(或者HTML)文檔. 這種語言吸收了很多在電子郵件中已有的純文本標(biāo)記的特性. 由于Markdown 的輕量化、易讀易寫特性,并且支持圖片、圖表、數(shù)學(xué)式,因此目前許多網(wǎng)站都廣泛使用Markdown 來撰寫幫助文檔或是用于論壇上發(fā)表消息. 如GitHub、Reddit、Diaspora、Stack Exchange、OpenStreetMap 、SourceForge、簡書等. Markdown 甚至還能被使用來撰寫電子書.
Mathjax 是一款運行在瀏覽器中的開源數(shù)學(xué)符號渲染引擎,使用Mathjax 可以方便地在瀏覽器中顯示數(shù)學(xué)公式,不需要使用圖片. 目前,Mathjax 可以解析Latex、MathML 和ASCIIMathML 的標(biāo)記語言.Mathjax 項目始于2009年,發(fā)起人包括American Mathematical Society、Design Science 等,還有眾多的支持者. Mathjax 可能會成為今后數(shù)學(xué)符號渲染引擎中的主流. 本文接下來會講述Mathjax 的基礎(chǔ)用法,但不涉及Mathjax 的安裝及配置. 此外,推薦使用StackEdit 學(xué)習(xí)Mathjax 的語法,它支持Markdown 和Mathjax.
Sagemath 是一個免費、開源的數(shù)學(xué)軟件系統(tǒng),采用GPL 協(xié)議. 它整合了許多開源Python 包,采用Python 語言編寫,但也支持其他語言. 它的目標(biāo)是創(chuàng)造一個可變的開源軟件以替代Magma、Maple、Mathematica 和Matlab. Sagemath 不僅是一個軟件,也是一個編程環(huán)境,提供命令行模式、筆記本模式,可以編寫編譯型程序和解釋型程序. 目前Sagemath 支持Linux、Mac OS X、BSD、Solaris 等平臺.
在當(dāng)前一些主流編輯器軟件中,有部分軟件是開源的且功能十分強(qiáng)大,筆者試圖設(shè)計一種以Markdown 為主體,同時集成Mathjax 和Sagemath 功能,具有普通文本、數(shù)學(xué)公式、公式演算、圖形效果展示等功能的新型融合編輯器.
新型編輯器具備文本編輯、數(shù)學(xué)公式編輯、公式演算、圖形效果展示等功能. 在文本編輯方面,選擇對Markdown 進(jìn)行功能擴(kuò)充; 在數(shù)學(xué)公式編輯方面選擇將Mathjax 集成到Markdown 中,同時使用Latex對Mathjax 進(jìn)行補(bǔ)充與改進(jìn); 在公式演算與圖形效果展示方面,選擇將Sagemath 集成到Markdown 中. 最終形成一個以Markdown 為主體,同時集成Mathjax 與Sagemath 的編輯器,用于實現(xiàn)普通文本編輯、數(shù)學(xué)公式編輯、公式演算、圖形效果展示等. 同時,為了方便集成,編輯器提供了js 腳本,可以直接嵌入到網(wǎng)頁中使用. 但融合過程中仍然存在一些問題,如Markdown、Mathjax 本身對數(shù)學(xué)與物理等科學(xué)類知識的支持還不全面,需要擴(kuò)充原有的功能; Markdown、Mathjax、Sagemath 是三個獨立的體系,需要將它們整合到一起; 需要在渲染的性能上進(jìn)行優(yōu)化等.
第一,對Mathjax 的擴(kuò)充. 這部分工作相對比較簡單,Mathjax 已經(jīng)支持了Latex 的大部份語法,少數(shù)特殊的符號也可以通過擴(kuò)展腳本來實現(xiàn),所以這一塊的研究工作主要集中在對特殊符號的支持上.
第二,對Markdown 的擴(kuò)充. 這部分工作則比較麻煩,一方面有部分Markdown 的分支已支持了不同的功能,但基于Markdown 版本不同,這些功能的代碼不能直接使用,只能綜合幾個版本的功能特點,重新在Markown 中開發(fā)這些功能. 另一方面,在實際的文章編輯過程中,會產(chǎn)生很多Markdown 本身不支持的需要開發(fā)擴(kuò)充的功能,如對視頻的支持,或是Markdown 本身的bug 導(dǎo)致某些功能在特定的情況下出錯,需要修改代碼來修復(fù)這個問題,如空行導(dǎo)致多級列表縮進(jìn)混亂等問題.
第三,將Sagemath 集成到Markdown 中. 在數(shù)學(xué)與物理等科學(xué)理論的推導(dǎo)過程中,有部分公式需要用到前面公式的推導(dǎo)結(jié)果,而這種計算過程又比較復(fù)雜,簡單的計算或是引用之前的計算結(jié)果有時會出現(xiàn)錯誤,同時,學(xué)習(xí)者有時也需要在學(xué)習(xí)的過程中演算文章中的公式,而Sagemath 提供了實時演算的功能,能通過修改公式進(jìn)行進(jìn)一步的演算,并顯示演算結(jié)果,如果需要以圖形化的方式顯示,也可以將公式轉(zhuǎn)換成圖形顯示. 另外,由于兩個編輯器都是獨立的系統(tǒng),故需要修改它們的代碼才能將其整合集成到一起.筆者通過研究之后,確定了修改Markdown 與Mathjax 的代碼,同時編寫一個腳本調(diào)用Sagemath,并在Markdown 中增加對Mathjax 與Sagemath 的支持.
第四,對渲染的性能進(jìn)行優(yōu)化. 一個簡單的集成方案就是先進(jìn)行Markdown 的渲染,再進(jìn)行Mathjax的渲染,最后進(jìn)行Sagemath 的渲染. 一開始,這個方案是可行的,但隨著測試數(shù)據(jù)量的增大,性能問題突顯出來,并且使得編輯器出現(xiàn)了卡頓現(xiàn)象. 當(dāng)然,也可以選擇在編輯結(jié)束之后再進(jìn)行渲染,但如果一個編輯器不能在編輯的過程中就看到最終的效果,就需要在編輯結(jié)束后對文檔的整體格式再進(jìn)行調(diào)整. 最終,選擇通過在Mardown 中渲染Mathjax 的方式優(yōu)化編輯器的性能,并且使用雙緩沖的方式解決渲染過程中的閃動問題. 但在Markdown 中對Sagemath 進(jìn)行渲染的難度太大,所以,編輯器中如果出現(xiàn)大量的sagemath 公式,那么渲染速度就會降低,從而影響到對文檔的編輯. 不過,它的性能可以基本滿足實際需求,相較之前,有了很大的提高.
(1)文字編輯方面
對Markdown 進(jìn)行功能擴(kuò)充. 實現(xiàn)并擴(kuò)充的功能包括: Undo 撤消、Redo 重做、Sagemath、Mathjax、Italic 斜體、Bold 粗體、Image 圖片、視頻、表格、字?jǐn)?shù)提示、最大化、還原、行號、同步滾動等.
(2)數(shù)學(xué)公式方面
Mathjax+Latex. 將Mathjax集成到Markdown中,同時使用Latex對Mathjax進(jìn)行補(bǔ)充與改進(jìn),使用$表示行內(nèi)的公式,使用$$表示塊級公式,在塊級模式下,多個公式以整體的形式在一個塊結(jié)構(gòu)中顯示.
(3)公式演算與圖形效果展示方面
將Sagemath 集成到Markdown 中. 通過$$$可以輸入Sagemath 的公式與代碼,支持輸入時觸發(fā)運算,同時支持用戶通過點擊運算按鈕來觸發(fā)運算. 支持單個代碼塊的計算并顯示圖形結(jié)果,也支持分段的計算,以便在一篇文章中可以將整個計算過程分開講解、計算、呈現(xiàn)結(jié)果.
編輯器的主體功能展示效果如圖1 所示.
圖1 編輯器的主體功能展示效果
設(shè)計功能強(qiáng)大的編輯器是一個不斷優(yōu)化的過程,后續(xù)優(yōu)化建議如下. 第一,了解Markdown、Mathjax、Sagemath 的發(fā)展趨勢,以及納入到標(biāo)準(zhǔn)中的版本. 第二,選擇合適的版本與開發(fā)語言,而不是從頭開始.第三,在擴(kuò)展Markdown 的功能時,就同時將Mathjax 與Sagemath 加入到Markdown 的格式元素中. 第四,一開始就應(yīng)該考慮在Markdown 的渲染過程中同時渲染Mathjax,如果可能,也應(yīng)該同時渲染Sagemath.第五,應(yīng)該參考與其相似的編輯器的功能,雖然其它的編輯器可能沒有支持?jǐn)?shù)學(xué)公式或是演算功能,但編輯器的一些輔助性功能也可作為提高可用性與易用性的參考.