gpt4 book ai didi

python - 将 Python 数值表达式转换为 LaTeX

转载 作者:IT老高 更新时间:2023-10-28 22:24:49 26 4
gpt4 key购买 nike

我需要使用有效的 Python 语法转换字符串,例如:

'1+2**(x+y)'

并获得等效的 LaTeX:

$1+2^{x+y}$

我尝试过 SymPy 的 latex 函数,但它处理的是实际表达式,而不是它的字符串形式:

>>> latex(1+2**(x+y))
'$1 + 2^{x + y}$'
>>> latex('1+2**(x+y)')
'$1+2**(x+y)$'

但要做到这一点,它需要将 xy 声明为“符号”类型。

我想要一些更直接的东西,最好是使用编译器模块中的解析器。

>>> compiler.parse('1+2**(x+y)')
Module(None, Stmt([Discard(Add((Const(1), Power((Const(2), Add((Name('x'), Name('y'))))))))]))

最后但同样重要的是,原因:我需要生成这些 LaTeX 片段,以便我可以使用 MathJax 在网页中显示它们。

最佳答案

这是一个相当长但仍然不完整的方法,它不涉及任何形式的 sympy。涵盖 (-b-sqrt(b**2-4*a*c))/(2*a) 的示例就足够了,它被翻译为 \frac{- b -\sqrt{b^{2} - 4\;一个\; c}}{2\; a} 并呈现为

alt text

它基本上创建了 AST 并遍历它产生与 AST 节点相对应的 latex 数学。那里的内容应该足以说明如何在缺少的地方扩展它。


import ast

class LatexVisitor(ast.NodeVisitor):

def prec(self, n):
return getattr(self, 'prec_'+n.__class__.__name__, getattr(self, 'generic_prec'))(n)

def visit_Call(self, n):
func = self.visit(n.func)
args = ', '.join(map(self.visit, n.args))
if func == 'sqrt':
return '\sqrt{%s}' % args
else:
return r'\operatorname{%s}\left(%s\right)' % (func, args)

def prec_Call(self, n):
return 1000

def visit_Name(self, n):
return n.id

def prec_Name(self, n):
return 1000

def visit_UnaryOp(self, n):
if self.prec(n.op) > self.prec(n.operand):
return r'%s \left(%s\right)' % (self.visit(n.op), self.visit(n.operand))
else:
return r'%s %s' % (self.visit(n.op), self.visit(n.operand))

def prec_UnaryOp(self, n):
return self.prec(n.op)

def visit_BinOp(self, n):
if self.prec(n.op) > self.prec(n.left):
left = r'\left(%s\right)' % self.visit(n.left)
else:
left = self.visit(n.left)
if self.prec(n.op) > self.prec(n.right):
right = r'\left(%s\right)' % self.visit(n.right)
else:
right = self.visit(n.right)
if isinstance(n.op, ast.Div):
return r'\frac{%s}{%s}' % (self.visit(n.left), self.visit(n.right))
elif isinstance(n.op, ast.FloorDiv):
return r'\left\lfloor\frac{%s}{%s}\right\rfloor' % (self.visit(n.left), self.visit(n.right))
elif isinstance(n.op, ast.Pow):
return r'%s^{%s}' % (left, self.visit(n.right))
else:
return r'%s %s %s' % (left, self.visit(n.op), right)

def prec_BinOp(self, n):
return self.prec(n.op)

def visit_Sub(self, n):
return '-'

def prec_Sub(self, n):
return 300

def visit_Add(self, n):
return '+'

def prec_Add(self, n):
return 300

def visit_Mult(self, n):
return '\\;'

def prec_Mult(self, n):
return 400

def visit_Mod(self, n):
return '\\bmod'

def prec_Mod(self, n):
return 500

def prec_Pow(self, n):
return 700

def prec_Div(self, n):
return 400

def prec_FloorDiv(self, n):
return 400

def visit_LShift(self, n):
return '\\operatorname{shiftLeft}'

def visit_RShift(self, n):
return '\\operatorname{shiftRight}'

def visit_BitOr(self, n):
return '\\operatorname{or}'

def visit_BitXor(self, n):
return '\\operatorname{xor}'

def visit_BitAnd(self, n):
return '\\operatorname{and}'

def visit_Invert(self, n):
return '\\operatorname{invert}'

def prec_Invert(self, n):
return 800

def visit_Not(self, n):
return '\\neg'

def prec_Not(self, n):
return 800

def visit_UAdd(self, n):
return '+'

def prec_UAdd(self, n):
return 800

def visit_USub(self, n):
return '-'

def prec_USub(self, n):
return 800
def visit_Num(self, n):
return str(n.n)

def prec_Num(self, n):
return 1000

def generic_visit(self, n):
if isinstance(n, ast.AST):
return r'' % (n.__class__.__name__, ', '.join(map(self.visit, [getattr(n, f) for f in n._fields])))
else:
return str(n)

def generic_prec(self, n):
return 0

def py2tex(expr):
pt = ast.parse(expr)
return LatexVisitor().visit(pt.body[0].value)

关于python - 将 Python 数值表达式转换为 LaTeX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3867028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com