Web端數(shù)學(xué)公式展示

作者:zjruan
日期:2016-12-23
關(guān)鍵詞:前端、公式、LaTex、MathJax

項(xiàng)目開發(fā)中,我們有時(shí)候會(huì)遇到一些關(guān)于公式的需求。當(dāng)遇到一些簡單的公式,我們可以直接使用 css 樣式或 使用 其他工具生成圖片。例如:

x<sup>2</sup> + y<sup>2</sup> = 0

// 結(jié)果
x2 + y2 = 0

但是遇到一些復(fù)雜的的公式,這種方法便會(huì)變的很困難。如下圖。不過如果這樣的公式只是固定的、少量的,我們還可以使用其它工具生成公式,再使用截圖或?qū)С鰣D片的方式去解決它。下圖便是如此。

數(shù)學(xué)公式.png

但是當(dāng)我們遇到一些大量的、可配置的公式展示需求時(shí),上面的方法便不合適了。現(xiàn)在在線教育如此的火,從事這行的開發(fā)不可避免的會(huì)遇到這些問題,特別是 k12 領(lǐng)域。

一、有哪些方式可以渲染公式的?

動(dòng)態(tài)渲染公式的方式有很多,這篇文章只是介紹其中的一種。我們先看看一些常見的。

1、word 公式編輯器

相信大部分題庫系統(tǒng)里的題目都是用 office word 編寫的。這里就不多介紹了。

2、MathML

【百度百科】mathml 是數(shù)學(xué)標(biāo)記語言,是一種基于XML標(biāo)準(zhǔn)通用標(biāo)記語言的子集)的標(biāo)準(zhǔn),用來在互聯(lián)網(wǎng)上書寫數(shù)學(xué)符號和公式的置標(biāo)語言。
使用方式如下:

<math xmlns="http://www.w3.org/1998/Math/MathML"> 
  <mrow> 
    <mrow> 
      <msup> <mi>a</mi> <mn>2</mn> </msup> 
      <mo>+</mo> 
      <msup> <mi>b</mi> <mn>2</mn> </msup>
    </mrow> 
    <mo>=</mo> 
    <msup> <mi>c</mi> <mn>2</mn> </msup>
 </mrow> 
</math>
```
>// 結(jié)果
a<sup>2</sup> + b<sup>2</sup> = c<sup>2</sup>

但是它又一個(gè)致命問題,就是兼容性非常低,IE 和 Chrome 都不支持。
[MathML更多信息請參照這里](https://developer.mozilla.org/en-US/docs/Web/MathML/Element/math)

### 3、第三方庫渲染
這個(gè)是比較靠譜的。在自己公司沒有足夠的開發(fā)資源的時(shí)候,使用第三方庫來解決這方面的問題,還是很值得推薦的。
本文將要描述的是使用 **MathJax** 來解決公式渲染的問題。

## 二、MathJax 公式渲染

![mathjax.png](http://upload-images.jianshu.io/upload_images/2139239-aee39e5db64faa7a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

使用之前,我們來看一下它是什么:
```
Beautiful math in all browsers
A JavaScript display engine for mathematics that works in all browsers. 
No more setup for readers. It just works.
```
這個(gè)是它官網(wǎng)的簡單介紹,簡單的說,就是渲染公式的 js 庫。
在使用之前,我們最好還需要掌握一些前置知識。我見過不少編輯公式的人都不動(dòng)這個(gè),這是使用 word 圖形化工具去編寫公式,其實(shí)這樣效率還是蠻低的。

### LaTex

【百度百科】LaTeX(LATEX,音譯“拉泰赫”)是一種基于ΤΕ
Χ的排版系統(tǒng),由美國計(jì)算機(jī)學(xué)家萊斯利·[蘭伯特](http://baike.baidu.com/subview/87545/15322469.htm)(Leslie Lamport)在20世紀(jì)80年代初期開發(fā),利用這種格式,即使使用者沒有排版和程序設(shè)計(jì)的知識也可以充分發(fā)揮由TeX所提供的強(qiáng)大功能,能在幾天,甚至幾小時(shí)內(nèi)生成很多具有書籍質(zhì)量的印刷品。

可以看到,編輯公式只是 latex 牛刀小試。而 mathjax 是支持 latex 排版的。

### MathJax 使用

mathjax使用主要有兩種方式:
一種是引用 mathjax 的 js 庫,然后再客戶端渲染;
```
// mathjax js引用方式
<script type="text/javascript">
    window.MathJax = {
        showProcessingMessages: false,
        messageStyle: "none",
        tex2jax: {
            inlineMath: [['$', '$'], ["\\(", "\\)"]],
            processEscapes: true
        },
        "fast-preview": {disabled: true},
        CommonHTML: { linebreaks: { automatic: true } },
        "HTML-CSS": { linebreaks: { automatic: true } },
        SVG: { linebreaks: { automatic: true } },
        TeX: { noErrors: { disabled: true } },
        MathMenu: {
            styles: {
                ".MathJax_Menu": {"z-index":2001}
            }
        },
        AuthorInit: function () {
            MathJax.Hub.Register.StartupHook("MathMenu Ready",function () {MathJax.Menu.BGSTYLE["z-index"] = 2000;});
            MathJax.Hub.processSectionDelay = 0;
        }
    }
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML-full"></script>
```
另一種是部署 nodejs 的mathjax 服務(wù),由 node 根據(jù)公式生成圖片,再向前端返回圖片地址。  
如何部署 mathjax node 服務(wù),請點(diǎn)擊這里:[MathJax_node](https://github.com/mathjax/MathJax-node)。

#### 兩種方式的優(yōu)缺點(diǎn):
##### 引用js庫
優(yōu)點(diǎn): 簡單,方便
缺點(diǎn):引用的 mathjax 庫資源較多,在渲染的過程中,可能會(huì)出現(xiàn)公式抖動(dòng)(公式的樣式會(huì)一直在變化)
#### node 服務(wù)(推薦)
優(yōu)點(diǎn):將公式直接生成圖片,穩(wěn)定,方便,兼容性強(qiáng)
缺點(diǎn):node 服務(wù)可能不穩(wěn)定,對node需要有一定了解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 公司正在做教育類產(chǎn)品,在遇到數(shù)學(xué)公式時(shí),我們一般會(huì)使用latex表達(dá)式來做保存和渲染。在其中一個(gè)項(xiàng)目上,遇到一個(gè)需...
    無式閱讀 12,690評論 11 14
  • 終于搞定了使用 MathJax 渲染 LaTex 數(shù)學(xué)公式的問題,分享給大家。 辛辛苦苦用 markdown 寫就...
    kamidox閱讀 2,254評論 1 20
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,947評論 18 139
  • https://www.zhihu.com/question/21318658?rf=26222832 數(shù)據(jù)結(jié)構(gòu)這...
    小酷哥閱讀 215評論 0 0
  • 一、戰(zhàn)略 首先清楚你所在的階段。從0到1,還是爆發(fā)期,還是穩(wěn)定期。不看階段的戰(zhàn)略,都是耍流氓。戰(zhàn)略決定了你的資源部...
    stone哥的平凡之路閱讀 307評論 0 1