·

Vue或Nuxt中如何渲染数学公式?

发布时间:2024-06-06 16:13:27阅读量:1080
转载请注明来源

在网页上,有很多种方法可以渲染漂亮的数学公式。但是这些方法基本上不能直接应用于Vue.js或者Nuxt.js。在本文中,我们将分别说明如何在Vue.js或者Nuxt.js中使用katexmathjax渲染数学公式。

Katex

想要自动渲染所有页面上的数学公式,你需要使用CDN来加载katex

<!-- index.html -->

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/poem-studio-favicon-black.svg">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/katex.min.css" integrity="sha384-wcIxkf4k558AjM3Yz3BBFQUbk/zgIYC2R0QpeeYb+TwlBVMrlgLqwRjRtGZiK7ww" crossorigin="anonymous">
    <script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/katex.min.js" integrity="sha384-hIoBPJpTUs74ddyc4bFZSM1TVlQDA60VBbJS0oA934VSz82sBx1X7kSx2ATBDIyd" crossorigin="anonymous"></script>
    <script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/contrib/auto-render.min.js" integrity="sha384-43gviWU0YVjaDtb/GhzOouOXtZMP/7XUzwPTstBeZFe/+rCMvRwr4yROQP43s0Xk" crossorigin="anonymous"
    onload="renderMathInElement(document.body);"></script>
    <title>Manitori</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

如果你使用的是Nuxt.js,那么你需要修改你的nuxt.config.ts

//nuxt.config.ts

export default defineNuxtConfig({
  app: {
    head: {
      link: [
        {rel:'stylesheet', href:"https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/katex.min.css", integrity:"sha384-wcIxkf4k558AjM3Yz3BBFQUbk/zgIYC2R0QpeeYb+TwlBVMrlgLqwRjRtGZiK7ww", crossorigin:"anonymous"}
      ],
      script: [
        {
          defer:true,
          src:"https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/katex.min.js", 
          integrity:"sha384-hIoBPJpTUs74ddyc4bFZSM1TVlQDA60VBbJS0oA934VSz82sBx1X7kSx2ATBDIyd", 
          crossorigin:"anonymous"
        },
        {
          defer:true, 
          src:"https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/contrib/auto-render.min.js", 
          integrity:"sha384-43gviWU0YVjaDtb/GhzOouOXtZMP/7XUzwPTstBeZFe/+rCMvRwr4yROQP43s0Xk", 
          crossorigin:"anonymous",
          onload:"renderMathInElement(document.body);"
        },
       ]
    }
  }

})

如果你需要更改renderMathInElement函数的选项,你可以在另一个<script>标签中调用renderMathInElement

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/poem-studio-favicon-black.svg">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/katex.min.css" integrity="sha384-wcIxkf4k558AjM3Yz3BBFQUbk/zgIYC2R0QpeeYb+TwlBVMrlgLqwRjRtGZiK7ww" crossorigin="anonymous">
    <script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/katex.min.js" integrity="sha384-hIoBPJpTUs74ddyc4bFZSM1TVlQDA60VBbJS0oA934VSz82sBx1X7kSx2ATBDIyd" crossorigin="anonymous"></script>
    <script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.10/dist/contrib/auto-render.min.js" integrity="sha384-43gviWU0YVjaDtb/GhzOouOXtZMP/7XUzwPTstBeZFe/+rCMvRwr4yROQP43s0Xk" crossorigin="anonymous"></script>
    <script>
    document.addEventListener("DOMContentLoaded", function() {
      renderMathInElement(document.body, {
          // customised options
          // • auto-render specific keys, e.g.:
          delimiters: [
              {left: '$$', right: '$$', display: true},
              {left: '$', right: '$', display: false},
              {left: '\\(', right: '\\)', display: false},
              {left: '\\[', right: '\\]', display: true}
          ],
          // • rendering keys, e.g.:
          throwOnError : false
        });
    });
    </script>
    <title>Manitori</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

需要注意的是,直接使用document.body可能会导致一些关键性错误,见Vue - TypeError: Cannot read properties of null (reading 'insertBefore')。因此,建议将document.body 改为一个特定的渲染区域document.getElementById(Id) ,不过这样的话,你需要每一页都分别调用一次renderMathInElement

<script lang="ts" setup>
onMounted(()=>{
  nextTick(()=>{
    var node = document.getElementById(Id)
    document.addEventListener("DOMContentLoaded", function() {
      renderMathInElement(node, {
        // customised options
        // • auto-render specific keys, e.g.:
        delimiters: [
          {left: '$$', right: '$$', display: true},
          {left: '$', right: '$', display: false},
          {left: '\\(', right: '\\)', display: false},
          {left: '\\[', right: '\\]', display: true}
        ],
        // • rendering keys, e.g.:
        throwOnError : false
      });
    });
  })
})
</script>

在Vue.js中,你估计需要异步渲染数学公式,因此可以根据以下示例写:

<script lang="ts" setup>
var node = document.getElementById(Id)

Promise.resolve()
.then(()=>{
  nextTick(()=>{
    document.addEventListener("DOMContentLoaded", function() {
      renderMathInElement(node, {
        // customised options
        // • auto-render specific keys, e.g.:
        delimiters: [
          {left: '$$', right: '$$', display: true},
          {left: '$', right: '$', display: false},
          {left: '\\(', right: '\\)', display: false},
          {left: '\\[', right: '\\]', display: true}
        ],
        // • rendering keys, e.g.:
        throwOnError : false
      });
    });
  })
})
</script>

Mathjax

mathjax来自动渲染数学公式,比katex要简单得多。跟katex一样,你最好使用CDN来加载mathjax

<!-- index.html -->

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/poem-studio-favicon-black.svg">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" id="MathJax-script" async
    src="https://cdn.jsdelivr.net/npm/mathjax@4.0.0-beta.6/tex-chtml.js">
  </script>
  <script>
    MathJax = {
      tex: {
        inlineMath: [['$', '$'], ['\\(', '\\)']]
      }
    };
    </script>
    <title>Manitori</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

如果你使用的是Nuxt.js,那么在你的nuxt.config.ts 中添加如下代码:

//nuxt.config.ts

export default defineNuxtConfig({
  app: {
    head: {

      script: [
        {
          type: "text/javascript",
          id: "MathJax-script",
          async: true,
          src: "https://cdn.jsdelivr.net/npm/mathjax@4.0.0-beta.6/tex-chtml.js",
        },
        {
          innerHTML:
            "MathJax = {tex: {inlineMath: [['$', '$'],['$$', '$$']]}};",
        },
      ]
})

然而在Vue.js中,使用mathjax,你也需要异步渲染数学公式。不然,所有渲染的数学公式都会重新变回原样。为此,你需要使用MathJax.typesetPromise()

<script lang="ts" setup>
Promise.resolve()
.then(()=>{
  nextTick(() => {
    MathJax.typesetPromise();
  });
})
</script>

或者你可以使用setTimeout来替代nextTick:

setTimeout(() => {
  MathJax.typesetPromise();
}, 3000);

根据上面的做法,你就可以轻松在Vue.js或Nuxt.js中整合katex和mathjax啦😄!

0 人喜欢

评论区

暂无评论,来发布第一条评论吧!

弦圈热门内容

数学中的「分析」是什么意思?

知乎提问:数学中许多分支名字中带有「分析」二字,如数学分析、实分析、复分析、泛函分析、调和分析、数值分析……牠们的共同点是什么(也就是,「分析」二字是什么意思)?我的回答(原文已删):我感觉分析有研究某个数学对象局部性质的意思。比如说,几何分析就是通过PDE将流形上的局部性质跟整体的拓扑性质联系起来。又比如说,任意形式的波都可以分解成傅立叶级数的形式。这些都是研究局部性质的例子吧。我不是做分析的,这只是我的粗浅理解。。原文发布于 2021-05-24 18:48我看回知乎曾经的回答,我发现2021年前的时间,回答都普遍比较简单。2021年,那时候我应该刚读大一吧,没怎么写过notes,更别提后面写多篇论文了,因此写作能力一般,也懒得长篇大论。

读基础数学如何解决经济问题?

知乎提问:读基础数学如何解决经济问题?我的回答(已删):读基础数学还想着赚钱干嘛,想赚钱就别读纯数了。因为如果想赚钱,这难度系数指数级上升,你做纯数可能做得已经很不错了还不如那些IT行业人士赚个月入过万。因此,如果你想靠纯数赚钱,你会觉得很不公平,而且在这浮躁的社会环境里,你怀着这种心态也很难沉得下心来做研究。对于经济问题,正如刘宇航前辈所说,降低需求是最好的办法。原文发布于 2021-05-24 19:06下面引用一下lyh的回答,话说我以前刚开始学数学的时候,知乎还是挺多数学大佬的,这种是真的专业的,不像现在一些数学大v压根没啥数学水平。目前来看,绝大多数数学大v都退乎了,有不少还注销账号了,回答一个也没留下来。lyh算是少数几个还坚持在知乎发言,并且还是持续性更新的,别的哪怕还留在知乎基本也很少发言了。

想做朗兰兹纲领方向,请问如何安排学习进度?

知乎提问:最近对朗兰兹纲领感兴趣,主要是向往大一统的理论,但因为这个领域很庞大,不知道从哪里入手,希望能提供学习顺序,推荐一些书目,越详细越好。另外,想知道哪些院校这方面做的比较好我的回答(已删):我并不是做Langlands programs方向的,但是也对其有所兴趣,因为算术几何跟Langlands programs也有所联系。个人觉得可以从Shimura varieties作为学习的切入点,具体的references可以看Milne的note,直接百度就有了。同时,可以看看欧阳毅的Galois representation,Scholze关于local Langlands的文章,还有Harris和Taylor的The Geometry and Cohomology of Some Simple Shimura Varieties。在看的过程中,看不懂就往下补知识,并且不要忘记了解相应知识的诞生背景,这样做效率是最高的。不过,这些东西都特别难读,反正我也很多看不懂,还是找个该方向的专家带最好。原文编辑于 2022-05-02 22:30原文评论区Milne的course notes ...

初二可以学习抽象代数吗?

知乎提问:孩子初二,数学成绩经常满分(120)。有时候117 118,孩子说想学点高端的,我想让孩子学抽象代数可行吗我的回答(已删):没必要学,这么着急学这些内容干什么呢,孩子又不一定真的感兴趣,搞不好让他讨厌起了数学更糟糕。数学是以兴趣为主的,什么提前学之类的都是渣渣,提前学又不代表你以后数学成就会很高。初二既然数学成绩还行,那就意味着孩子有更多的空余时间可以做他感兴趣的事情,家长不应该强行给孩子灌输一些不应该在他这个年龄学习的东西。除非你孩子真的很热爱数学,那么你拦都拦不住他自学,还需要你去灌输给他吗?原文发布于 2021-05-28 09:25

你是如何对数学产生兴趣的?

知乎提问:短暂的兴趣也行,有长期的更好。请大家积极分享哦我的回答(已删):我以前是因为物理喜欢数学的,当时特别崇拜Einstein,想要以后做理论物理学。因为Einstein当年也是自学微积分的,于是我也入坑微积分。刚开始,觉得特别难学,无数次想要放弃,但是最后都克服掉了这些困难,学习不少微积分的基础内容,开始感受到数学的美妙。刚开始我在学微积分的同时,还会学一些物理的东西。可是后来,我每次打算学物理最后都会被学数学取而代之,我开始对数学越来越无法自拔,以至于牺牲学习物理的时间。就这样,我就改变了曾经理论物理的方向,转为数学。再后来,我对数学的喜爱远远超过物理了,同时高考备考紧张,我干脆放弃学习物理,全身心投入到数学当中。原文发布于 2021-12-20 20:10

学数学的目的是什么?能给我带来什么?

知乎提问:学数学的目的是什么?能给我带来什么?我的回答:这个问题有点难以用语言来回答。数学带给了我的东西实在太多了,从童年开始到如今,我整个人看待世界的方式,我的三观,我的方方面面早就被数学所改变,并且与数学难以隔离。如果硬要展开来说,我能想到以下几点:首先就是审美,这种审美是指一种抽象意义上的审美,不是简单的说眼睛看到什么觉得很美。这种审美是你个人数学风格、数学品味、数学思想里最根本的东西,几乎会影响你关于数学的一切。你写下的定义、命题、定理“美不美”,你觉得某个理论“美不美”,这些都跟你的审美有关。其次数学给了我夹杂着理性的感性,我经常一边看数学,一边听音乐,这样能让我沉浸在一个独特的精神世界。呆在这个世界里,思绪会变得清晰,情感也会变得起伏,这个时候往往灵感迸发,很多原来想不懂的东西突然就想懂了。用心理学的说法解释,就是数学带给我体验超心流状态(不是心流)。最后数学还带给我理性思维、更加缜密的逻辑等等,这些其他回答也反复提过,就不说了。

怎样才能培养数学兴趣?

知乎提问:怎样才能培养数学兴趣?我的回答:想要培养数学兴趣很简单,首先你肯定要对数学有好感,如果连这点基础都没有估计也很难对数学感兴趣。然后你只需要不断的了解数学、接触数学,形成一个了解数学=&gt;进一步深入了解数学这样的一个循环,自然而然就会对数学感兴趣。具体的讲,你可以做的包括以下几条,可以根据自己的兴趣进行调整:多读数学相关的介绍文章,或者数学方面的一些资讯报道,从浅层了解数学。多读数学家相关的传记,数学家留下的话、数学家分享的经验等等,这里的数学家不仅仅包括过去杰出的数学家,还需要包括如今在世的数学家。多读不同数学领域相关的教材,多方涉猎,加深对数学各个领域的初步理解。这个做法是最能培养数学兴趣和数学品味的。上面两种方式只是辅助第三种方法,毕竟想要了解数学,培养对数学的喜爱,最直接也是最有效的方法,无疑是直接关注数学本身,直接学起来、思考起来。以上三条主要针对初学者,当你不那么初学之后,就不要目光放得太高了。我曾经有段时间就是因为看得太多名人名家的内容,反而开始看不起那些没那么杰出的人,这完全就是愚蠢的想法!多关注身边同样喜欢数学的人或同行,多交流了解对方的想法和经验,这样对 ...

大一上挂科后果严重吗?

知乎提问:大一上挂科后果严重吗?我的回答:还真问题不大,我大一的时候身边就有不少同学挂科了,结果无非是补考,或者严重点的重修,最后都能过。我大一大二的时候也是对挂科害怕不已,每次考前复习都十分紧张。直到后来快毕业的时候,我得知自己居然缺了通识课学分不能发毕业证,而我身边那些挂过科的同学全都学分修够了。那时候我才明白没啥好怕的。。。当然最后那个学分还是补上了,虚惊一场。后面我打算在 数学故事天地 写一篇因为沉迷数学导致挂科而大学无法毕业的小说,虽然我文笔不行,但是我有足够的想象力,只要我把逻辑、故事线、设定全写出来,一样会是丰富的故事内容,只不过细节描写没那么动人、生动。希尔伯特也曾经说过,数学家拥有足够丰富的想象力,完全可以当一个作家。原话我现在在网上已经找不着了,只找到了下面这句话"You know, for a mathematician, he did not have enough imagination. But he has become a poet and now he is fine." &nbsp;——David Hilbert“他曾没有足够的想象力来当数学家。不过 ...

洛必达法则为何成为禁术?

知乎提问:如题,高考用会扣分,大学微积分考试还明令禁止使用洛必达法则(我个人还是好喜欢洛必达法则)疑惑产生于大一半期考试之前,刚刚学极限没多久的时候。为了让学生更好地理解“极限”这个概念,学校用心良苦,在半期考试中ban了洛必达,仅此而已。我的回答:因为洛必达法则并不是洛必达发现的,而是洛必达买下来的😇。说到洛必达法则,我的回忆就倒回到初三和高中时期,当时做高等数学的极限题我都喜欢直接洛必达法则,我不太想考虑除了洛必达还有什么别的计算方法,没必要。因为洛必达法则明显更加友好,反而更加容易让学生熟练掌握极限,我初三乃至高中的时候,学高等数学能学懂,其中就少不了洛必达法则的功劳。其实多用几次洛必达法则感觉上来了,再去理解极限的本质,也不是不可以。只能说国内的这种教育模式非常的按部就班,就必须你按照学校指定的路径来学习,真的就流水线工厂一样,教育被整成这样,教育出来的人自然也很难有创新思维。这只是普通的通过性考试,完全没必要考虑所谓的公平性问题。就好比,初三的时候自学了高中的正弦定理、余弦定理,或者,高三的时候自学了洛必达法则、级数等微积分的东西,可以很轻松的解决某些题目。这种还勉强能狡辩一 ...