前端显示LaTeX公式

Time:2021-06-27

前言

近来在学习神经网络,不少笔记中都使用了LaTeX进行公式的书写,考虑到准备把这些笔记也放到网站上方便日后来看,于是就整起了引入显示LaTeX公式的方法。

我的前端环境:VueCLI4.5

选择使用的是MathJax.js。

MathJax.js中文文档如下:

MathJax 中文文档 — MathJax Chinese Doc 2.0 documentation (mathjax-chinese-doc.readthedocs.io)

Author:雾雨霜星
欢迎来我的个人网站进行学习:
https://www.shuangxing.top/#/passage?id=29
转载请注明出处!

MathJax使用原理

在工程引入MathJax.js后(具体引入方法见后文),调用如下方法实现LaTeX公式的渲染:

  • MathJax.Hub.Queue:通过传入需要渲染的部分id,来实现相应内容识别LaTex公式并渲染显示。

    使用方法参考:

    const MathQueue = function (elementId) {if (!window.MathJax) {return;}window.MathJax.Hub.Queue(["Typeset", window.MathJax.Hub, document.getElementById(elementId)]);
    };
    

    此处是把MathJax.Hub.Queue进行了封装。

    其中需要我们进行提供的变量(或者相应修改写死)只有elementId。其余部分可以保持原封不动。

  • MathJax.Hub.Config:对MathJax进行渲染的详细配置,包括识别LaTex的符号、显示模式与字体、控制台输出信息等。

    一般的使用方法参考下文即可。

MathJax的引入与使用

建议使用外部引入,因为如果整个工程加入会导致打包所得文件进一步变大。

在index.html页面,外联引入MathJax.js:

<script type="text/javascript" asyncsrc="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML">
</script>

目前我看到不少教程的思路是:在index.html使用外联引入,然后另外写一个MathJax的配置文件,这个配置文件里面封装MathJax.Hub.Config作为MathJax的初始化,封装MathJax.Hub.Queue用于输入ID调用渲染内容。在main.js引入该配置文件,设置Vue调用全局变量,从而在别的组件,通过this.commonsVariable来调用MathJax的配置文件中的函数,使用相应MathJax的渲染方法。

可惜或许是我比较菜,按照这样的思路,即使是作出了那是在做highlight.js的引入时所作的尝试修改,也没能成功。终究不是页面报错就是没有效果。

于是我就想,直接在显示文章的页面调用封装了MathJax各种使用方法的配置文件,从而直接在组件中使用里面的方法。

首先是MathJax的配置文件:

//我写在了components/MathJax/globalVariable中,开了一个文件夹MathJax,里面创建了一个js。
let isMathjaxConfig = false;//用于标识是否配置
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; //配置完成,改为true
};
const MathQueue = function (elementId) {if (!window.MathJax) {return;}window.MathJax.Hub.Queue(["Typeset", window.MathJax.Hub, document.getElementById(elementId)]);
};
export default {isMathjaxConfig,initMathjaxConfig,MathQueue
}

这段代码在CSDN随处可见,不过按照发布时间的推算,大概是这个博主写的:https://www.cnblogs.com/geyouneihan/p/9743302.html
然后在我的文章显示页面组件中进行调用:

import globalVariable from '@/components/MathJax/globalVariable'
... ...
created() {this.GetPassage();if(globalVariable.isMathjaxConfig){globalVariable.initMathjaxConfig();}globalVariable.MathQueue("passage-main-area");},
}

其中this.GetPassage();是调取文件内容显示出来,我是在文章显示后再调用MathJax的方法对相应LaTeX公式进行识别并渲染。

这样对段落公式($开头的公式)有效果的,不过问题是,内联公式(开头的公式)有效果的,不过问题是,内联公式(开头的公式)有效果的,不过问题是,内联公式(开头的公式)没有效果,而且菜单那些设置也没有效果。

参考到MathJax中文文档,可以考虑直接通过script标签引入内联配置。

使用内联设置,在index.html配置如下:

<!-- 引入数学公式美化插件MathJax --><script type="text/javascript" asyncsrc="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script><script type="text/javascript"src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://myserver.com/MathJax/config/local/local.js"></script><script type="text/x-mathjax-config">MathJax.Hub.Config({showProcessingMessages: false, //关闭js加载过程信息messageStyle: "none", //不显示信息showMathMenu: false, //关闭右击菜单显示availableFonts: ["STIX", "TeX"], //可选字体jax: ["input/TeX", "output/HTML-CSS"],tex2jax: {inlineMath: [ ['$','$'], ["\\(","\\)"] ],displayMath: [ ['$$','$$'], ["\\[","\\]"] ]}});</script>

此时所有的效果都可以达成了。

经过测试,使用内联配置下,原本MathJax中封装的配置可以删去,即原本的initMathjaxConfig变成:

const initMathjaxConfig = () => {if (!window.MathJax) {return;}isMathjaxConfig = true; //配置完成,改为true
};

同样可以达到效果。

存在缺陷

  1. 加载速度受到网络影响:

    在网速比较慢的时候,有时候页面文章显示完了,但是公式也还是没能加载出来,或者需要等很久。一般是需要重新刷新,页面才能重新把LaTeX公式渲染出来,否则看着就只是一堆符号。

  2. 控制台的报错:

    由于在index.html中引入了如下:

      <script type="text/javascript"src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://myserver.com/MathJax/config/local/local.js"></script>
    

    控制台报错为:

    Failed to load resource: net::ERR_NAME_NOT_RESOLVED   myserver.com/MathJax/config/local/local.js?V=2.7.5:1
    

    点开进去myserver.com/MathJax/config/local/local.js?V=2.7.5:1,无法访问该页面。

    但是删去了我的公式就经常很久加载不出来,需要我手动刷新页面才加载出来,也不知怎么回事,所以我还是留着了。

小插曲

一开始按照别人的思路去引入MathJax并使用:

首先把别人的MathJax配置文件粘到了自己的工程目录下。

然后在main.js引入那个MathJax的配置文件:

//在 main.js 中引入MathJax的调用封装配置文件
import globalVariable from './components/Math/globalVariable'
Vue.prototype.commonsVariable = globalVariable;

但是在我以前搭建网站时就已经明白,在VueCLI4.5的工程里面,直接使用Vue对象恐怕不是那么明智,于是我尝试了进行如下的修改:

import globalVariable from '@/components/MathJax/globalVariable'
// 加入MathJax配置的Js及其调用方法
app.prototype.commonsVariable = globalVariable

然而可惜的是,没有效果。在相应我的文章显示页面调用如下:

if(this.commonsVariable.isMathjaxConfig){this.commonsVariable.initMathjaxConfig();}this.commonsVariable.MathQueue("passage");

结果这个页面直接就报错了。

后来在main.js改为:

import globalVariable from '@/components/MathJax/globalVariable'
// 加入MathJax配置的Js及其调用方法
app.use(globalVariable)

结局依旧没有改变。。。

所以这或许是我学艺不精所致,看来对vue及其main.js中各种api的使用还需要更多的修炼啊!

来来来,看看你的网速:
Uk=Ik∗RkU_k = I_k * R_k Uk​=Ik​∗Rk​
如果看得到下划线符号,说明LaTeX公式没有被渲染出来!网速不行啊!dddd(懂的都懂!)

Author:雾雨霜星
欢迎来我的个人网站进行学习:
https://www.shuangxing.top/#/passage?id=29
转载请注明出处!

Thanks!

PS: 毕竟,霜星酱水平有限,如果发现任何错误还请及时邮箱告知我,我会去改哦!

前端显示LaTex公式相关推荐

  1. Hexo如何显示latex公式

    我们用hexo+github/gitee搭建个人博客,会发现无法显示markdown文件里的latex公式,这是因为hexo默认支持的hexo-renderer-marked渲染器不支持latex公式 ...

  2. MathJax详细配置——在线显示LaTeX公式的解决方案

    MathJax详细配置--在线显示LaTeX公式的解决方案 参考文章: (1)MathJax详细配置--在线显示LaTeX公式的解决方案 (2)https://www.cnblogs.com/andn ...

  3. 浏览器无法正常显示latex公式问题

    问题 在使用谷歌浏览器浏览知乎某些论文翻译时无法正常转义latex公式,主要因为代理服务器没有加载数学公式js文件,导致只能显示原始latex编辑公式. 解决方案 按键ctrl shift J打开co ...

  4. html显示latex公式,wordpress显示数学公式插件【LaTeX转HTML】

    20190616更新,我的理解有误. 正确写法是,直接切换到代码编辑器. https://www.mathjax.org/ 然后写Tex格式,示例如下: \title{Hello LaTeX2HTML ...

  5. VSCode下使用markdown导出pdf,导出图片或插入LaTeX公式等使用记录(1)

    记录一下自己觉得比较好用的markdown插件,以及在VSCode下编辑并将markdown的渲染结果导出pdf为或png等格式. 1.Markdown All in One VSCode下的mark ...

  6. Md2All,让公众号完美显示Latex数学公式

    当公众号遇上Latex 大家都知到,公众号连代码块都不支持,更不要说功能强大的Latex公式了. 那在Md2All之前,如果想在公众号上显示Latex公式应该怎么办呢? 最通常的做法就是在某个支持La ...

  7. python opencv 官方文档里LaTeX公式不能正常显示怎么办?

    在查看opencv官方文档时,发现里面出现个看不懂的东西 比如这一句: \f[\begin{array}{l} | \texttt{dstsize.width} *2-src.cols| \leq 2 ...

  8. latex积分号、求和、极限符号大小,上下标位置控制,行内公式显示行间公式效果

    大家在写行内公式的时候经常会遇到这些问题: ∫f(x)\int f(x)∫f(x)积分符号很小,怎么变成大积分号:∫f(x)\displaystyle\int f(x)∫f(x) ∑n=0kan\su ...

  9. office 2019+mathtype安装(word不显示,latex公式转换{EMBED Equation.DSMT4}问题等)

    安装包 链接中包括mathtype7和mathtype6.9(建议安装6.9,7网上找到的破解码,都破解不了): 链接:https://pan.baidu.com/s/16Qq0Ln8QDneLCdq ...

最新文章

  1. matlab game of life,模拟器cellular auotomata元胞自动机 matlab
  2. Keil 5出现Error: L6218E: Undefined symbol解决方法
  3. python读取文件多行内容-Python读取文件、大文件和指定行内容的几种方法
  4. 4 个概念,1 个动作,让应用管理变得更简单
  5. 全球及中国自主运输机器人行业十四五创新模式与运行战略规划报告2022版
  6. go linux 源码编译环境,修改并编译golang源码
  7. LeetCode 649. Dota2 参议院(循环队列)
  8. 计算机史上首篇教你从算法问题提炼算法思想的文章
  9. 修改linux远程主机名命令hostname
  10. 未检测到其他显示器_如何将 Surface 连接到电视、显示器或投影仪,我教你
  11. android bugly 符号表,bugly cocos 接入和 符号表使用
  12. 如何导入asl文件?ps制作知识
  13. pandas 下的 one hot encoder 及 pd.get_dummies() 与 sklearn.preprocessing 下的 OneHotEncoder 的区别
  14. send anywhere:一个全平台的文件传输神器
  15. Astah 7.2 安装
  16. 电子通讯录(自存储)
  17. 某网吧网络布线规划设计
  18. Hibernate 马士兵 学习笔记
  19. Ant Design Vue 如何分页(后台传入)
  20. linux秘钥对生成器,linux – GPG密钥生成器*不*使用熵

热门文章

  1. OpenCV基础(22)使用OpenCV生成及读取二维码以及与Zbar比较
  2. 网站跟踪(web tracking)的原理
  3. PS生成gif图像前后帧混叠
  4. Nvidia jetson nano 配置 CUDA9 CUDNN7.1.5
  5. python初学者使用wingIDE
  6. 代码还原小试牛刀(一):魔改的MD5
  7. 自旋锁与互斥锁的使用场景分析
  8. 网页开发 net java_.net web开发技术路线图
  9. midjourney——轻松创作气球设计的数字绘图软件
  10. AI处理生物信号-FJS