数学公式的识别渲染Latex及其它

前言: TeX、LaTeX和KaTeX及MathJax

TeX是一个电子排版系统,LaTeX是一套宏集,面向各种终端,KaTeX是面向web的。
不会KaTex的人,无以言。

W3C提出了MathML语言,但没有流行起来。

MathJax是一个开源组织,其前身是由美国数学学会( American Mathematical Society )和工业与应用数学学会(Society for Industrial and Applied Mathematics)赞助的一个协会,他提出了一个基于 HTML+JS+CSS的方法来实现数学公式的解决方案,并且逐渐成为行业标准。

MathJax采用类似Markdown的LaTex标记来记录数学符号,并附带了常规的文字语义。

Beautiful and accessible math in all browsers. A JavaScript display engine for mathematics that works in all browsers. No more setup for readers. It just works.

实现

Latex这种格式的文本,无论是iOS还是在Android上,底层都是通过一个Web的方式来渲染。

方法1,使用YYLable加载文本,然后在需要显示 LaTex的地方,通过WebKit,加载出来,整体上是YYLabel+WKWebView的方式来实现,YYLabel负责加载富文本,WKWebView负责加载LaTex。
方法2:方法2,将LaTex做成PDF,然后加载到LaTex的地方,和方法一基本上雷同

新建一个类继承于UIWebView 处理字符串中,含有LaTex的部分加上class

-(void)dealWithHTMLString:(NSString *)html{
    NSString* htmlPath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
    NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
    // 是否有$ ,有表示的含有LaTex
    if([html rangeOfString:@"$"].location != NSNotFound) { // Expression inside text.
        NSRange r;
        BOOL intex = NO; // 判断是前面的$还是后面的$,需要一对
        while ((r = [html rangeOfString:@"$"]).location != NSNotFound) {
            html = [html stringByReplacingCharactersInRange:r withString:(intex ? @"</span>" : @"<span class=\"tex\">")];
            intex = !intex;
        }
        if (intex) NSLog(@"没有闭合");
    }
    // 将处理后的字符串,嵌套在index.html中
    appHtml = [appHtml stringByReplacingOccurrencesOfString:@"$LATEX$"
                                                 withString:html];
    NSURL *baseURL = [NSURL fileURLWithPath:htmlPath];
    [self setDelegate:self];
    [self loadHTMLString:appHtml baseURL:baseURL];;
}

对应的HTML:

<!DOCTYPE html>
<!-- saved from url=(0028)http://khan.github.io/KaTeX/ -->
<html class="wf-proximanova-i6-active wf-proximanova-n3-active wf-proximanova-n4-active wf-proximanova-n6-active wf-active"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<link rel="stylesheet" type="text/css" href="katex.min.css">
<script src="katex.min.js" type="text/javascript"></script>
</head>

<body>
<div>$LATEX$</div>

<script type="text/javascript">
// 对 clsss = tex 进行处理
window.startup = function() {
	function onload() {
		var texes = document.getElementsByClassName('tex');
        for(var i=0; i<texes.length; i++) {
            katex.render(texes[i].innerHTML, texes[i]);
        }
	}
	onload();
}
startup();
</script>
</body>
</html>

以下是针对不同编程语言的 LaTeX/KaTeX 解析库推荐,根据使用场景和需求可选择最适合的工具:


相关库介绍

1. JavaScript 生态(最适合 Web 场景)

(1) KaTeX

  • 类型:渲染库
  • 特点
    • 轻量级(比 MathJax 快得多)
    • 只支持 LaTeX 子集,但覆盖大部分数学公式
    • 无动态解析功能,专注渲染
  • 使用场景:需要在网页中快速渲染公式
  • 示例
    katex.render("E = mc^2", document.getElementById('math'));
    
  • 官网katex.org

(2) MathJax

  • 类型:渲染库
  • 特点
    • 支持完整 LaTeX 语法
    • 支持化学式(mhchem)、物理单位等扩展
    • 体积较大,渲染速度较慢
  • 使用场景:需要完整 LaTeX 支持且不介意性能
  • 官网mathjax.org

(3) latex.js

  • 类型:解析+渲染库
  • 特点
    • 纯 JavaScript 实现的 LaTeX 解析器
    • 可将 LaTeX 转为 HTML(带公式渲染)
  • 使用场景:需要完整 LaTeX 到 HTML 的转换
  • GitHublatex.js

2. Python 生态(适合文本处理/科研)

(1) PyLaTeX

  • 类型:生成库
  • 特点
    • 用于生成 LaTeX 文档(非解析)
    • 支持数学公式、表格等元素生成
  • 使用场景:动态生成 LaTeX 源码
  • 示例
    from pylatex import Document, Math
    doc = Document()
    doc.append(Math(data=['E=mc^2']))
    
  • GitHubPyLaTeX

(2) SymPy(仅数学公式解析)

  • 特点
    • 将 LaTeX 数学公式解析为符号表达式
    • 支持计算和转换回 LaTeX
  • 使用场景:需要公式符号计算
  • 示例
    from sympy.parsing.latex import parse_latex
    expr = parse_latex(r'\frac{d}{dx}(x^2)')
    

(3) Latex2MathML


3. Java/Kotlin 生态

(1) JLaTeXMath

  • 特点
    • 将 LaTeX 公式渲染为 Java2D 图像
    • 支持 Swing 和 Android
  • 使用场景:桌面/移动端应用内显示公式
  • GitHubJLaTeXMath

(2) SnuggleTeX

  • 特点
    • LaTeX 转 XHTML/MathML
    • 支持部分 LaTeX 数学模式
  • GitHubSnuggleTeX

4. C++ 生态(高性能需求)

(1) LaTeXpp

  • 特点:实验性 LaTeX 解析器,生成 AST
  • GitHublatexpp

(2) Mathematica 的 Wolfram Engine

  • 特点:商业软件,但支持完美 LaTeX 解析和计算
  • 示例
    ToExpression["\\frac{d}{dx}(x^2)", TeXForm]
    

5. 专用工具(非编程库)

(1) Pandoc

  • 特点:文档格式转换工具,支持 LaTeX 到其他格式的转换
  • 使用场景:批量文档转换
  • 官网pandoc.org

(2) TeXLive 的 latex 命令

  • 特点:官方 LaTeX 引擎,可通过命令行调用
  • 示例
    latex myfile.tex && dvisvgm myfile.dvi
    

选择建议

  1. Web 渲染:优先选 KaTeX(性能好)或 MathJax(功能全)
  2. 公式解析/计算:Python 用 SymPy,JavaScript 用 latex.js
  3. 完整文档解析:考虑 LaTeX.js(JS)或 Pandoc(多语言)
  4. 移动端/桌面端:Java/Kotlin 用 JLaTeXMath,C++ 用 LaTeXpp

对于复杂需求(如解析任意 LaTeX 文档结构),目前尚无完美解决方案,通常需要组合多个工具使用。

在线编辑器处理数学公式

tinymce

首先,目前通用的公式语法 是 latex mathml ,相关的插件有 kityformula、mathtype 和mathjax。

区别:
第一种方案是将使用他提供的编辑器输入,然后将输入界面截屏转换为base64图片做保存,同时给img增加属性data-latex用来描述这个数学公式以便在他的编辑器中回显,我们最终得到的就是一个包含标签的字符串。

常见数学公式一览表

序号运算符输入举例举例代码
1 + + ++ x + y x+y x+y$ x+y $
2 − - - x − y x-y xy$ x-y $
3 × \times ×\times x × y x\times y x×y$ x\times y $
4 ∗ \ast \ast x ∗ y x \ast y xy$ x \ast y $
5 ÷ \div ÷\div x ÷ y x \div y x÷y$ x \div y $
6分数\frac x y \frac {x} {y} yx$ \frac{x}{y} $
7上标^ x y x^y xy x y x^y xy
8下标_ x y x_y xy x y x_y xy
9开二次方\sqrt x \sqrt x x $ \sqrt x $
10开方\sqrt y 2 − 5 y − 3 x \sqrt[x]{y^2-5y-3} xy25y3 $ \sqrt[x]{y^2-5y-3} $
11加减\pm x ± y x \pm y x±y$ x \pm y $
12减加\mp x ∓ y x \mp y xy$ x \mp y $
13对数\log log ⁡ 2 ( x ) \log_2(x) log2(x)$ \log_2(x) $
14对数\log log ⁡ ( x ) \log(x) log(x)$ \log(x) $
15极限\lim lim ⁡ x → 0 \lim_{x\to0} x0lim$ \lim_{x\to0} $
16极限\displaystyle lim ⁡ x → ∞ \displaystyle \lim_{x\to\infty} xlim$ \displaystyle \lim_{x\to\infty} $
17求和\sum ∑ 0 ∞ \sum_0^\infty 0$ \sum_0^\infty $
18求积\prod ∏ 1 N x i \prod_1^N x_i 1Nxi$ \prod_1^N x_i $
19积分\int ∫ 1 ∞ x 3 × s i n x d x \int_1^\infty x^3\times sinx{\rm d}x 1x3×sinxdx$ \int_1^\infty x^3\times sinx{\rm d}x $
20微分\rm d x d y \frac{{\rm d}x}{{\rm d}y} dydx$ \frac{{\rm d}x}{{\rm d}y} $

矩阵

效果命令
a b c d \begin{matrix} a & b \\ c & d \end{matrix} acbd\begin{matrix}
a & b
\ c & d
\end{matrix}
( a b c d ) \begin{pmatrix} a & b \\ c & d \end{pmatrix} (acbd)\begin{pmatrix}
a & b
\ c & d
\end{pmatrix}
∣ a b c d ∣ \begin{vmatrix} a & b \\ c & d \end{vmatrix} acbd \begin{vmatrix}
a & b
\\ c & d
\end{vmatrix}
( x 11 x 12 … x 21 x 22 … ⋮ ⋮ ⋱ ) \left( \begin{array}{ccc} x_{11} & x_{12} & \ldots \\ x_{21} & x_{22} & \ldots \\ \vdots & \vdots & \ddots \end{array} \right) x11x21x12x22 \left( \begin{array}{ccc}
x_{11} & x_{12} & \ldots
\ x_{21} & x_{22} & \ldots
\vdots & \vdots & \ddots
\end{array} \right) $

希腊字母

先举例:

α + β \alpha + \beta α+β

几个经典数学公式

  1. 欧拉公式
    e i π + 1 = 0 e^{i\pi} + 1 = 0 e+1=0
  2. 傅里叶变换
    f ( t ) = ∫ − ∞ ∞ f ( t ) e − i w t d t f(t)=\int_{-\infty}^\infty f(t) e^{-iwt}dt f(t)=f(t)eiwtdt

参考链接

TODO

本人持续维护补充中…

### 配置 VSCode 支持 LaTeX 公式识别与预览 为了使 Visual Studio Code (VSCode) 正确识别并显示 LaTeX 数学公式,可以采取多种方法来实现这一目标。 #### 方法一:通过 MathJax 实现公式的渲染 在 `.md` 文件头部添加特定的 JavaScript 代码片段能够调用在线服务解析 LaTeX 表达式: ```html <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$', '$']], processEscapes: true, skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'] } }); </script> ``` 这段脚本会加载来自 Cloudflare 的 MathJax 库,并配置其处理 `$...$` 形式的内联数学模式[^2]。 #### 方法二:安装扩展程序增强功能 利用社区开发的各种插件也可以极大地改善体验。例如,“Markdown All in One” 插件提供了良好的 Markdown 编辑支持;而 “Latex Workshop” 则专注于提供完整的 LaTeX 开发环境,不过对于仅需简单公式预览的情况来说可能有些大材小用了。更推荐的是专门用于解决此问题的小型插件如 "Markdown+Math"[^1] 或者 CeleryMath 进行截图转 LaTex 功能[^3]。 #### 方法三:调整设置优化效果 确保已启用实时预览选项以便即时查看更改后的效果。如果遇到延迟或其他异常情况,则可以在用户设置 JSON 中增加如下参数以提高性能: ```json { "markdown.preview.breaks": false, "markdown.styles": [], "editor.fontFamily": "'Courier New', monospace", } ``` 此外,还可以尝试修改 `settings.json` 来指定自定义 CSS 样式表路径,从而进一步定制化页面外观。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北极象

如果觉得对您有帮助,鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值