PyodideでSympyのparse_latexを使いたい

SymPyPython上で数式を扱うモジュール。 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>

結果

このぐらいシンプルなものだと動作はしそう。とはいえ実用を考えると対応してないフォーマットも多数あるようで、まだまだこれからという感じ。