• MathJax: 让前端支持数学公式


    文章图片存储在GitHub,网速不佳的朋友,请看《MathJax:让前端支持数学公式》 或者 来我的技术小站 godbmw.com

    1. 必须要说

    1.1 开发背景

    博主使用Vue开发的个人博客,博文使用markdown语法编写,然后交给前端渲染。为了更方便的进行说明和讲解,需要前端支持LaTex的数学公式,并且渲染好看的样式

    1.2 效果展示

    数学公式分为行内公式和跨行公式,当然都需要支持和渲染。

    我准备了3条公式,分别是行内公式、跨行公式和超长的跨行公式:

    $alpha+eta=gamma$
    
    $$alpha+eta=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。效果图如下所示:

    2. 使用MathJax

    2.1 引入CDN

    在使用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>

    2.2 配置MathJax

    将MathJax的配置封装成一个函数:

    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; // 
    };
    

    2.3 使用MathJax渲染

    MathJax提供了window.MathJax.Hub.Queue来执行渲染。在执行完文本获取操作后,进行渲染操作:

    if (isMathjaxConfig === false) { // 如果:没有配置MathJax
      initMathjaxConfig();
    }
    
    // 如果,不传入第三个参数,则渲染整个document
    // 因为使用的Vuejs,所以指明#app,以提高速度
    window.MathJax.Hub.Queue(["Typeset", MathJax.Hub, document.getElementById('app')]);
    

    2.4 修改默认样式

    MathJax默认样式在被鼠标focus的时候,会有蓝色边框出现。对于超长的数学公式,x方向也会溢出。

    添加以下样式代码,覆盖原有样式,从而解决上述问题:

    /* MathJax v2.7.5 from 'cdnjs.cloudflare.com' */
    .mjx-chtml {
      outline: 0;
    }
    .MJXc-display {
      overflow-x: auto;
      overflow-y: hidden;
    }
    

    3. 注意事项

    3.1 不要使用npm

    不要使用npm,会有报错,google了一圈也没找到解决方案,github上源码地址有对应的issue还没解决

    博主多次尝试也没有找到解决方法,坐等版本更新和大神指点。

    3.2 动态数据

    在SPA单页应用中,数据是通过Ajax获取的。此时,需要在数据获取后,再执行渲染

    如果习惯es5,可以在回调函数中调用window.MathJax.Hub.Queue。但是更推荐es6,配合Promiseasync/await来避免“回调地域”。

    3.3 版本问题

    对于不同版本或者不同CDN的MathJax,第二部分的样式覆盖的class名称不同。比如在cdnbootv2.7.0版本中,样式覆盖的代码应该是下面这段:

    /* MathJax v2.7.0 from 'cdn.bootcss.com' */
    .MathJax {
      outline: 0;
    }
    .MathJax_Display {
      overflow-x: auto;
      overflow-y: hidden;
    }
    

    4. 更多资料

  • 相关阅读:
    CCF CSP 201709-1 打酱油 (贪心)
    CCF CSP 201712-1 最小差值
    CCF CSP 201612-1 中间数
    CCF CSP 201609-1 最大波动
    CCF CSP 201604-1 折点计数
    CCF CSP 201512-1 数位之和
    CCF CSP 201509-1 数列分段
    CCF CSP 201503-1 图像旋转 (降维)
    CCF CSP 201412-1 门禁系统
    CCF CSP 201409-1 相邻数对
  • 原文地址:https://www.cnblogs.com/geyouneihan/p/9743302.html
Copyright © 2020-2023  润新知