Web端数学公式展示

作者:zjruan
日期:2016-12-23
关键词:前端、公式、LaTex、MathJax

项目开发中,我们有时候会遇到一些关于公式的需求。当遇到一些简单的公式,我们可以直接使用 css 样式或 使用 其他工具生成图片。例如:

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

// 结果
x2 + y2 = 0

但是遇到一些复杂的的公式,这种方法便会变的很困难。如下图。不过如果这样的公式只是固定的、少量的,我们还可以使用其它工具生成公式,再使用截图或导出图片的方式去解决它。下图便是如此。

数学公式.png

但是当我们遇到一些大量的、可配置的公式展示需求时,上面的方法便不合适了。现在在线教育如此的火,从事这行的开发不可避免的会遇到这些问题,特别是 k12 领域。

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

动态渲染公式的方式有很多,这篇文章只是介绍其中的一种。我们先看看一些常见的。

1、word 公式编辑器

相信大部分题库系统里的题目都是用 office word 编写的。这里就不多介绍了。

2、MathML

【百度百科】mathml 是数学标记语言,是一种基于XML标准通用标记语言的子集)的标准,用来在互联网上书写数学符号和公式的置标语言。
使用方式如下:

<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>
```
>// 结果
a<sup>2</sup> + b<sup>2</sup> = c<sup>2</sup>

但是它又一个致命问题,就是兼容性非常低,IE 和 Chrome 都不支持。
[MathML更多信息请参照这里](https://developer.mozilla.org/en-US/docs/Web/MathML/Element/math)

### 3、第三方库渲染
这个是比较靠谱的。在自己公司没有足够的开发资源的时候,使用第三方库来解决这方面的问题,还是很值得推荐的。
本文将要描述的是使用 **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.
```
这个是它官网的简单介绍,简单的说,就是渲染公式的 js 库。
在使用之前,我们最好还需要掌握一些前置知识。我见过不少编辑公式的人都不动这个,这是使用 word 图形化工具去编写公式,其实这样效率还是蛮低的。

### LaTex

【百度百科】LaTeX(LATEX,音译“拉泰赫”)是一种基于ΤΕ
Χ的排版系统,由美国计算机学家莱斯利·[兰伯特](http://baike.baidu.com/subview/87545/15322469.htm)(Leslie Lamport)在20世纪80年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由TeX所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。

可以看到,编辑公式只是 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 服务,由 node 根据公式生成图片,再向前端返回图片地址。  
如何部署 mathjax node 服务,请点击这里:[MathJax_node](https://github.com/mathjax/MathJax-node)。

#### 两种方式的优缺点:
##### 引用js库
优点: 简单,方便
缺点:引用的 mathjax 库资源较多,在渲染的过程中,可能会出现公式抖动(公式的样式会一直在变化)
#### node 服务(推荐)
优点:将公式直接生成图片,稳定,方便,兼容性强
缺点:node 服务可能不稳定,对node需要有一定了解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容