文章目录
前言: 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 的转换
- GitHub:latex.js
2. Python 生态(适合文本处理/科研)
(1) PyLaTeX
- 类型:生成库
- 特点:
- 用于生成 LaTeX 文档(非解析)
- 支持数学公式、表格等元素生成
- 使用场景:动态生成 LaTeX 源码
- 示例:
from pylatex import Document, Math doc = Document() doc.append(Math(data=['E=mc^2']))
- GitHub:PyLaTeX
(2) SymPy(仅数学公式解析)
- 特点:
- 将 LaTeX 数学公式解析为符号表达式
- 支持计算和转换回 LaTeX
- 使用场景:需要公式符号计算
- 示例:
from sympy.parsing.latex import parse_latex expr = parse_latex(r'\frac{d}{dx}(x^2)')
(3) Latex2MathML
- 特点:将 LaTeX 公式转为 MathML
- GitHub:latex2mathml
3. Java/Kotlin 生态
(1) JLaTeXMath
- 特点:
- 将 LaTeX 公式渲染为 Java2D 图像
- 支持 Swing 和 Android
- 使用场景:桌面/移动端应用内显示公式
- GitHub:JLaTeXMath
(2) SnuggleTeX
- 特点:
- LaTeX 转 XHTML/MathML
- 支持部分 LaTeX 数学模式
- GitHub:SnuggleTeX
4. C++ 生态(高性能需求)
(1) LaTeXpp
- 特点:实验性 LaTeX 解析器,生成 AST
- GitHub:latexpp
(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
选择建议:
- Web 渲染:优先选 KaTeX(性能好)或 MathJax(功能全)
- 公式解析/计算:Python 用 SymPy,JavaScript 用 latex.js
- 完整文档解析:考虑 LaTeX.js(JS)或 Pandoc(多语言)
- 移动端/桌面端: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 x−y | $ x-y $ |
3 | × \times × | \times | x × y x\times y x×y | $ x\times y $ |
4 | ∗ \ast ∗ | \ast | x ∗ y x \ast y x∗y | $ 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} xy2−5y−3 | $ \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 x∓y | $ 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} x→0lim | $ \lim_{x\to0} $ |
16 | 极限 | \displaystyle | lim x → ∞ \displaystyle \lim_{x\to\infty} x→∞lim | $ \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 1∏Nxi | $ \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 ∫1∞x3×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) x11x21⋮x12x22⋮……⋱ | \left( \begin{array}{ccc} x_{11} & x_{12} & \ldots \ x_{21} & x_{22} & \ldots \vdots & \vdots & \ddots \end{array} \right) $ |
希腊字母
先举例:
α + β \alpha + \beta α+β
几个经典数学公式
- 欧拉公式
e i π + 1 = 0 e^{i\pi} + 1 = 0 eiπ+1=0 - 傅里叶变换
f ( t ) = ∫ − ∞ ∞ f ( t ) e − i w t d t f(t)=\int_{-\infty}^\infty f(t) e^{-iwt}dt f(t)=∫−∞∞f(t)e−iwtdt
参考链接
TODO
本人持续维护补充中…