SymPy はPython上で数式を扱うモジュール。 SymPyに含まれるparse_latex関数を使うと、LaTeXの書式で書かれた数式も読み込める。 これをPyodideで使いたいと考えていた。
少し試しただけですが、実用にはまだ厳しいかもと思いました。
- parse_latexはデフォルトだと antlr4-python3-runtime を使おうとするが、Pyodideはこれに対応していない
- SymPyの時期バージョン(1.13)では、 parse_latex関数に
backend
引数が追加され、 lark-parser を使ったparsingにも対応する- しかし lark-parser は完全ではない書式(部分的に不正な書式、欠けてる状態など)への対応がANTLR4より弱いらしい
Parsing - SymPy 1.13.0rc2 documentation
以上を踏まえたうえで、lark backendを試してみた。
試したコード
pyodide-sympy.html:
<!doctype html> <html> <head> <script src="https://cdn.jsdelivr.net/pyodide/v0.24.1/full/pyodide.js"></script> <title>SymPy on Pyodide</title> </head> <body> <div id="result"></div> <script type="text/javascript"> let pyodide; let result = document.getElementById("result"); async function main() { // setup pyodide = await loadPyodide(); await pyodide.loadPackage("micropip"); const micropip = pyodide.pyimport("micropip"); await micropip.install("Sympy==1.13.0rc3"); await micropip.install("lark-parser"); const output = pyodide.runPython(` from sympy.parsing.latex import parse_latex expr = parse_latex(r"\\sqrt {x} = 1", backend="lark") expr `) result.innerHTML = output; } main(); </script> </body> </html>
結果
このぐらいシンプルなものだと動作はしそう。とはいえ実用を考えると対応してないフォーマットも多数あるようで、まだまだこれからという感じ。