文章图片存储在GitHub
,网速不佳的朋友,请看《MathJax:让前端支持数学公式》 或者 来个人技术小站 godbmw.comjavascript
博主使用Vue
开发的我的博客,博文使用markdown
语法编写,而后交给前端渲染。为了更方便的进行说明和讲解,须要前端支持LaTex
的数学公式,而且渲染好看的样式。css
数学公式分为行内公式和跨行公式,固然都须要支持和渲染。html
我准备了3条公式,分别是行内公式、跨行公式和超长的跨行公式:前端
$\alpha+\beta=\gamma$
$$\alpha+\beta=\gamma$$
$$\int_{0}^{1}f(x)dx \sum_{1}^{2}\int_{0}^{1}f(x)dx \sum_{1}^{2}\int_{0}^{1}f(x)dx \sum_{1}^{2}\int_{0}^{1}f(x)dx \sum_{1}^{2}\int_{0}^{1}f(x)dx \sum_{1}^{2}\int_{0}^{1}f(x)dx \sum_{1}^{2}\int_{0}^{1}f(x)dx \sum_{1}^{2}\int_{0}^{1}f(x)dx \sum_{1}^{2}\int_{0}^{1}f(x)dx \sum_{1}^{2}\int_{0}^{1}f(x)dx \sum_{1}^{2}$$
复制代码
这篇测试文章的地址是:https://godbmw.com/passage/12
。效果图以下所示: java
在使用MathJax以前,须要经过CDN引入, 在<body>
标签中添加: <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>
。git
将MathJax的配置封装成一个函数:es6
let isMathjaxConfig = false; // 防止重复调用Config,形成性能损耗
const initMathjaxConfig = () => {
if (!window.MathJax) {
return;
}
window.MathJax.Hub.Config({
showProcessingMessages: false, //关闭js加载过程信息
messageStyle: "none", //不显示信息
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [["$", "$"], ["\\(", "\\)"]], //行内公式选择符
displayMath: [["$$", "$$"], ["\\[", "\\]"]], //段内公式选择符
skipTags: ["script", "noscript", "style", "textarea", "pre", "code", "a"] //避开某些标签
},
"HTML-CSS": {
availableFonts: ["STIX", "TeX"], //可选字体
showMathMenu: false //关闭右击菜单显示
}
});
isMathjaxConfig = true; //
};
复制代码
MathJax提供了window.MathJax.Hub.Queue
来执行渲染。在执行完文本获取操做后,进行渲染操做:github
if (isMathjaxConfig === false) { // 若是:没有配置MathJax
initMathjaxConfig();
}
// 若是,不传入第三个参数,则渲染整个document
// 由于使用的Vuejs,因此指明#app,以提升速度
window.MathJax.Hub.Queue(["Typeset", MathJax.Hub, document.getElementById('app')]);
复制代码
MathJax
默认样式在被鼠标focus
的时候,会有蓝色边框出现。对于超长的数学公式,x方向也会溢出。ajax
添加如下样式代码,覆盖原有样式,从而解决上述问题:npm
/* MathJax v2.7.5 from 'cdnjs.cloudflare.com' */
.mjx-chtml {
outline: 0;
}
.MJXc-display {
overflow-x: auto;
overflow-y: hidden;
}
复制代码
npm
不要使用npm,会有报错,google了一圈也没找到解决方案,github上源码地址有对应的issue
还没解决。
博主屡次尝试也没有找到解决方法,坐等版本更新和大神指点。
在SPA单页应用中,数据是经过Ajax
获取的。此时,须要在数据获取后,再执行渲染。
若是习惯es5
,能够在回调函数中调用window.MathJax.Hub.Queue
。可是更推荐es6
,配合Promise
和async/await
来避免“回调地域”。
对于不一样版本或者不一样CDN的MathJax
,第二部分的样式覆盖的class
名称不一样。好比在cdnboot
的v2.7.0
版本中,样式覆盖的代码应该是下面这段:
/* MathJax v2.7.0 from 'cdn.bootcss.com' */
.MathJax {
outline: 0;
}
.MathJax_Display {
overflow-x: auto;
overflow-y: hidden;
}
复制代码