from sympy.external import import_module from sympy.utilities.decorator import doctest_depends_on from sympy.parsing.latex.lark import LarkLaTeXParser, TransformToSymPyExpr, parse_latex_lark # noqa from .errors import LaTeXParsingError # noqa __doctest_requires__ = {('parse_latex',): ['antlr4', 'lark']} @doctest_depends_on(modules=('antlr4', 'lark')) def parse_latex(s, strict=False, backend="antlr"): r"""Converts the input LaTeX string ``s`` to a SymPy ``Expr``. Parameters ========== s : str The LaTeX string to parse. In Python source containing LaTeX, *raw strings* (denoted with ``r"``, like this one) are preferred, as LaTeX makes liberal use of the ``\`` character, which would trigger escaping in normal Python strings. backend : str, optional Currently, there are two backends supported: ANTLR, and Lark. The default setting is to use the ANTLR backend, which can be changed to Lark if preferred. Use ``backend="antlr"`` for the ANTLR-based parser, and ``backend="lark"`` for the Lark-based parser. The ``backend`` option is case-sensitive, and must be in all lowercase. strict : bool, optional This option is only available with the ANTLR backend. If True, raise an exception if the string cannot be parsed as valid LaTeX. If False, try to recover gracefully from common mistakes. Examples ======== >>> from sympy.parsing.latex import parse_latex >>> expr = parse_latex(r"\frac {1 + \sqrt {\a}} {\b}") >>> expr (sqrt(a) + 1)/b >>> expr.evalf(4, subs=dict(a=5, b=2)) 1.618 >>> func = parse_latex(r"\int_1^\alpha \dfrac{\mathrm{d}t}{t}", backend="lark") >>> func.evalf(subs={"alpha": 2}) 0.693147180559945 """ if backend == "antlr": _latex = import_module( 'sympy.parsing.latex._parse_latex_antlr', import_kwargs={'fromlist': ['X']}) if _latex is not None: return _latex.parse_latex(s, strict) elif backend == "lark": return parse_latex_lark(s) else: raise NotImplementedError(f"Using the '{backend}' backend in the LaTeX" \ " parser is not supported.")