基于 KaTeX 构建的小程序原生 LaTeX 渲染组件(不依赖服务端渲染)
https://github.com/rojer95/katex-mini
基于 katex 库,解析 latex 公式生成虚拟 dom 树对象,将 dom 对象翻译成小程序的 rich-text 支持的 nodes 由小程序渲染
rich-text
组件渲染,请注意小程序基础库 1.4.0 开始支持虽然这里使用了服务端,但是这里是产出json格式的nodes而非图片,相对于将latex转为图片的方案也好很多
Demo: https://github.com/rojer95/katex-mini/tree/master/demo
npm install @rojer/katex-mini
miniprogram_npm
目录app.wxss
加载 katex 的内置 css 样式@import "./miniprogram_npm/@rojer/katex-mini/index.wxss";
// app.js
import { loadKatex } from "@rojer/katex-mini";
App({
onLaunch() {
// 通过动态方式加载katex代码,节省小程序包体大小
wx.request({
url: "https://lib.baomitu.com/KaTeX/latest/katex.min.js",
success: ({ data: code }) => {
loadKatex(code);
wx.katex = true;
},
});
},
});
// index.js
import parse from "@rojer/katex-mini";
Page({
data: {
nodes: [],
latex:
"\\displaystyle \\frac{1}{\\Bigl(\\sqrt{\\phi \\sqrt{5}}-\\phi\\Bigr) e^{\\frac25 \\pi}} = 1+\\frac{e^{-2\\pi}} {1+\\frac{e^{-4\\pi}} {1+\\frac{e^{-6\\pi}} {1+\\frac{e^{-8\\pi}} {1+\\cdots} } } }",
},
onInput: function (e) {
this.setData({
latex: e.detail.value,
});
},
renderLatex: function () {
this.setData({
nodes: parse(this.data.latex),
});
},
});
<view class="container">
<rich-text nodes="{{nodes}}">rich-text>
<textarea value="{{latex}}" bindinput="onInput" maxlength="1400">textarea>
<button bindtap="renderLatex">渲染button>
view>
Demo: https://github.com/rojer95/katex-mini-taro-demo
git clone [email protected]:rojer95/katex-mini-taro-demo.git
yarn
yarn dev:weapp
Demo: https://github.com/rojer95/katex-mini-api
katex-mini.wxss
: https://cdn.jsdelivr.net/npm/@rojer/katex-mini/dist/index.wxss
// 在app.wxss中
@import "katex-mini.wxss";
wx.request({
url: "https://katex-mini-api.vercel.app",
data: {
latex: "a=b+c",
},
dataType: "json",
success(res) {
this.setData({
nodes: res.data,
});
},
});
<rich-text nodes="{{ nodes }}" />
如果能帮到你,希望能给我一个Star。感谢!