|
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 |
|
|
|
from .errors import LaTeXParsingError |
|
|
|
|
|
__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.") |
|
|