·

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

发布时间:2024-06-06 16:13:27阅读量:905
专业文章
转载请注明来源

在网页上,有很多种方法可以渲染漂亮的数学公式。但是这些方法基本上不能直接应用于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 人喜欢

评论区

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

弦圈热门内容

GTM023 W.H.Greub线性代数经典教材:Linear Algebra

这本教材是我高中时期入门线性代数的主要教材,我的很多基础知识都来源于这本书,如今看回这本书可以说满满的回忆。这本书可以说,是我读过的内容最为全面且完备的线性代数教材了。而且它的语言风格非常的代数化,没有什么直观可言,以抽象为主,表述简练、知识密度高。总之,真的太对我的胃口了,我当时是挺喜欢看这本书。这本教材跟其他线性代数教材一样,先从最基本的向量空间开始讲起,但不同的是,它这里还应用了群论的知识。紧接着这本书以代数抽象的形式讲矩阵和行列式,尤其是行列式,书中的描述直达其代数本质,这是我当时印象挺深刻的。接着书本还继续往外拓展,讲到与向量空间相关的一些概念,如泛函分析中的内积空间,同调代数中的代数和同调。总之,这本书对初学者有一点小门槛,适合喜欢挑战难度、喜欢看高水平读物的初学者看。

QQ频道AI视频泛滥?未来互联网上会充斥着AI生成的垃圾视频吗?

QQ这段时间感觉AI视频比以前多了,而且更主要是现在QQ还给AI视频推流了,可以说举措完全跟其他平台不同。以往QQ上的AI视频,基本上都是没流量的,现在给流量扶持,势必会导致AI视频进一步泛滥。其他平台像知乎、公众号、推特,发AI生成的内容,其实是会直接限流的。昨天我在知乎上发一篇AI生成的小说,创作声明了AI写的,结果直接零流量,阅读量1应该就是我自己吧。而在推特上发东西,如果用Gemini修改你自己写的语句,发上去也会被限流。小红书我没试过,之前看那种AI美女的笔记也挺泛滥的,不过后来我举报过以后就基本没看到了,也不知道是不是算法问题,还是小红书算法更新了。总之,小红书也是不鼓励AI生成的。说实话就没几个平台真的会鼓励AI生成的内容,只有极少数幸运儿会得到流量,毕竟说实话绝大多数AI内容都惨不忍睹,我其中最讨厌的就是那种AI美女图片,现在还多了视频,真的恶心,关键是居然还有人会看?尤其是QQ视频,之前还不给AI内容推流,现在直接开始推流了,更加惨不忍睹,关键是还不少人评论互动。如果是我,肯定直接不点,流量都懒得给它。AI视频如果仅仅只是整活那种,那还勉强能接受,但是我更喜欢那种混剪 ...

我开发的宇宙级APP竟然成为了其他世界的系统

陈木是弦圈一名默默无闻的全栈程序员,他每天身兼多职,任劳任怨地工作,既负责网站前端的开发与维护,又得兼顾后端的开发与维护。前段时间,陈木又接到了新的任务,要求他负责弦圈APP相关的开发工作 计划开发弦圈的桌面端版和APP版。于是,陈木在挑选了众多技术与框架后,选择了使用Universal React Native Pro Max进行APP的开发,这是一个近期在全世界都很火的框架。Universal React Native是基于传统的React Native通过最新的universal技术[1]进一步迭代升级,从而能达到用React Native语言开发任何东西原生的一个技术框架,而Pro Max则是它的超级升级版,你甚至能用它编程纳米机器人和可控核聚变引擎。开发的日子时间总是过得飞快,眨眼间就过了几万年,陈木头发都秃了,才终于从工作中缓过来。这时陈木也收到放假的通知 弦圈APP先开发到这里......,他松了口气,终于可以放松一下,并开始着手考虑自己一直以来的设想——开发一个宇宙级APP。所谓的宇宙级APP数亿年以来,一直都是各大星域争相竞争的研究对象,指的是通过开发宇宙级API接口 ...

如何激怒一位数学爱好者?

知乎提问:如何激怒一位数学爱好者?我的回答:我初三乃至高中想要自学高等数学的时候,像“学数学有什么用?”、“纯数学有什么实际应用吗?”、“你一个做数学的连这么简单的计算都不会?”这些话及其变式,确实有可能让我非常不爽。到了高三乃至本科这个阶段,像“名词党”、“你知道什么相关的例子吗?”、“你需要知道更多具体的数学”、“你问的问题太trivial”、“你看这个内容需要要看这么久?”、“你不是做数学的”等等这些话及其变式,都会让我觉得非常不爽。当然这是之前会感到不爽,直到我开始独立做研究、写论文,真正开始做数学后,才发现这些话要么都是单纯的p话、要么是正确的废话,总是如今是完全不在意。说这些话的人,本身水平如何也要画个大大的问号,有些人连学术产出都没有就喜欢到处指点江山、误人子弟。这时到了做数学阶段,记忆中曾经让我不爽的话,包括“你的论文好像notes啊”,然后就是投稿时审稿人的冷淡回应,如“你的论文不适合本期刊”、“你的论文in general non sense”。直到后来我的论文也得到某些人认可后,我也明白在纯数学什么东西是对的、什么理论是重要的有时候是一件非常主观的事情。最近能让我 ...

世界婴儿危机,我们要被婴儿淹没了吗?(故事线)

我打算补全一下之前写的 世界婴儿危机,我们要被婴儿淹没了吗?的故事线,这个故事的灵感源于一次在微信上跟朋友聊天,我突发奇想下说出来的。当时记得是在讨论泡菜国的一则新闻,水里检测出伟哥的成分超标😅。然后我直接展开想象,原本我很想把故事像小说那样一章一章的全写出来,但奈何我的文笔真的有限,我语文一向不太好,每写一点就像挤牙膏一样特别难受。不过这么有趣的故事就这么荒废在那了,我觉得很是心疼,即便自己文采不行,不能把细节刻画好,还是把故事线理一理吧。第一章 危机开始泡菜国H市,有一条河名为“生命之河”,它原本清澈见底,但如今因为泛滥的伟哥成分,而变得“浑浊”,晚上河面上散发着“诡异”的光芒。这本是一个平常的晚上,但是泡菜国的年轻人像打了鸡血一样,免疫了伟哥的副作用开始以一天七次的频率疯狂造娃。由于每次都一发入魂,泡菜国的新生人口直接开始暴增,出生率轻松超过了人类历史最高记录。很快这也引起了政府的注意,然而政府不仅对此十分冷淡,直接打算坐视不管,他们认为这次婴儿潮危机会很快过去,泡菜国总统还忙着处理他的弹劾案件呢。泡菜国也因为这次史无前例的婴儿潮事件,沦为全世界的笑柄,其他国家的人纷纷落井下石, ...

在下22岁打算毕生献身于攻克黎曼猜想,可以给我一句忠告吗?

知乎提问:在下22岁打算毕生献身于攻克黎曼猜想,可以给我一句忠告吗?我的回答:在我看来数学研究者执着于攻克某个猜想、某个问题,除了名利外,毫无意义。比起关注某个著名的open question,还不如多些关注数学本身,解决问题也罢、构建理论也罢,所有这一切不过是为了数学的发展罢了。即便你对黎曼猜想真的很感兴趣,也没必要毕生都花费在这上面,得在合适的时机干合适的事情。怀尔斯很小的时候就被费马大定理所吸引,但他最后也是在代数几何领域有了突破性进展后,觉得是时候了才选择攻克费马大定理。有句话叫“站在巨人的肩膀上”,个人是渺小的,很多时候你总是夸大了个人的作用。想要攻克黎曼猜想这种级别的问题,需要好多代数学家们的努力。因此,与其执着于这个虚无缥缈的猜想,还不如着眼于当下,先解决当下的数学问题,发展当下的数学理论。只有这个做好了,你才有资格挑战黎曼猜想。

AI写小说:陈默重生(版本一+版本二)

这篇短文出于今年6月份,故事线是自己写的,内容是AI输出的,可以发现质量并不怎么好,AI总是get不到我的点,老是差么点,达不到我的要求和期望。经过几个月的改进,现在的AI应该好些了吧。版本一陈默坐在高三的课堂上,心中却是翻涌着前世的记忆。他曾是鸿蒙神,统领亿万星域,仅差半步就能踏入传说中的灭神境。然而,在突破的关键时刻,他意外陨落,重生回到了这个看似平凡的高三时期。这个世界与他前世的修仙界截然不同,这是一个属于职业者的世界。人们通过转职仪式来觉醒自己的职业天赋,从而决定未来的道路。陈默深知,他即将面临的转职仪式,对他来说不仅是一次重新选择的机会,更可能是他重拾前世力量,再次踏上巅峰的起点。随着校长慷慨激昂的演讲落幕,转职仪式正式开始。同学们怀着紧张与期待的心情,一个个走上转职阵法,去迎接他们命运的转折。然而,对于大多数人来说,转职结果都是普通的职业,虽然让他们有些失望,但也只能接受现实。终于轮到了陈默。他站起身,深吸一口气,稳步走向转职阵法。当他将手放在觉醒石上的那一刻,他感受到了一股前所未有的能量波动。紧接着,天地间突发异象,黑云笼罩了方圆数十万公里,仿佛要将整个世界都吞噬进去。老 ...