# latex2mathml [![Crate](https://img.shields.io/crates/v/latex2mathml.svg)](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. `=`, `>`, `<`, `\ll`, `:=`, ... - Binary operations, e.g. `+`. `-`, `*`, `/`, `\times`, `\otimes`, ... - Basic LaTeX commands, e.g. `\sqrt`, `\frac`, `\sin`, `\binom`, ... - Parentheses, e.g., `\left\{ .. \middle| .. \right]`, ... - Integrals, e.g., `\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}`. - Multi-line equation `\begin{align}` (experimental, see below). - 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 or align environment. - Alignment `&`, except for ones in a matrix or align environment. - Complicated sub/superscripts (``). Align environment `\begin{align} .. \end{align}` is experimentally supported from version 0.2.1, as suggested in the [issue #2](https://github.com/osanshouo/latex2mathml/issues/2). Because it is implemented using `matrix` environment, the output MathML is not recommended and rendered equation may be not well-formatted. 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); ``` To convert HTML files in a directory recursively, use `latex2mathml::convert_html`. This function is for converting HTMLs generated by `cargo doc`. See also `examples/equations.rs` and `examples/document.rs`.