# latex2mathml
[![Crate](http://meritbadge.herokuapp.com/latex2mathml)](https://crates.io/crates/latex2mathml)
[![docs.rs](https://docs.rs/latex2mathml/badge.svg)](https://docs.rs/latex2mathml/)
`latex2mathml` provides a functionality to convert LaTeX math equations to MathML.
This crate is implemented in pure Rust, so it works in any environments if Rust works (including WebAssembly).
- [WebAssembly example](https://osanshouo.github.io/latex2mathml-web/index.html)
# Supported LaTeX commands
- Numbers, e.g. `0`, `3.14`, ...
- ASCII and Greek (and more) letters, e.g. `x`, `\alpha`, `\pi`, `\aleph`, ...
- Symbols, e.g., `\infty`, `\dagger`, `\angle`, `\Box`, `\partial`, ...
- Binary relations, e.g. `=`, `>`, `<`, ...
- Binary operations, e.g. `+`. `-`, `*`, `/`, `\times`, ...
- Basic LaTeX commands, e.g. `\sqrt`, `\frac`, `\sin`, ...
- Integrals, e.g., `\int`, `\int_0^\infty`, `\iint`, `\oint`, ...
- Big operators, e.g., `\sum`, `\prod`, `\bigcup_{i = 0}^\infty`, ...
- Limits and overset/underset, e.g., `\lim`, `\overset{}{}`, `\overbrace{}{}`, ...
- Font styles, e.g. `\mathrm`, `\mathbf`, `\bm`, `\mathit`, `\mathsf`, `\mathscr`, `\mathbb`, `\mathfrak`, `\texttt`.
- MathML lacks calligraphic mathvariant: https://github.com/mathml-refresh/mathml/issues/61
- White spaces, e.g., `\!`, `\,`, `\:`, `\;`, `\ `, `\quad`, `\qquad`.
- Matrix, e.g. `\begin{matrix}`, `\begin{pmatrix}`, `\begin{bmatrix}`, `\begin{vmatrix}`.
- Feynman slash notation: `\slashed{\partial}`.
See `examples/equations.rs` for examples. Note that all supported commands are defined in `src/token.rs`.
## Unsupported LaTeX commands
- New line `\\`, except for ones in a matrix.
- Alignment `&`, except for ones in a matrix.
- Multi-line expressions, e.g. `\begin{align}..\end{align}`.
- Complicated sub/superscripts (`<mmultiscripts>`).
Dollar sign `\$` is allowed for the `latex_to_mathml` function, but the `replace` function does not allow it.
This is because the `replace` function assumes all dollar signs appear as boundaries of LaTeX equations.
If a feature you need is lacked, feel free to open an issue.
# Usage
For a single LaTeX equation:
```rust
use latex2mathml::{latex_to_mathml, DisplayStyle};
let latex = r#"\erf ( x ) = \frac{ 2 }{ \sqrt{ \pi } } \int_0^x e^{- t^2} \, dt"#;
let mathml = latex_to_mathml(latex, DisplayStyle::Block).unwrap();
println!("{}", mathml);
```
For a document that includes LaTeX equations:
```rust
let text = r#"
Let us consider a rigid sphere (i.e., one having a spherical
figure when tested in the stationary system) of radius $R$
which is at rest relative to the system ($K$), and whose centre
coincides with the origin of $K$ then the equation of the
surface of this sphere, which is moving with a velocity $v$
relative to $K$, is
$$\xi^2 + \eta^2 + \zeta^2 = R^2$$
"#;
let mathml = latex2mathml::replace(text).unwrap();
println!("{}", mathml);
```
See also `examples/equations.rs` and `examples/document.rs`.