python数学表达式与latex表达式转化_将python数值表达式转换为LaTeX

本文介绍了一个将Python数值表达式转换为LaTeX的实现方法,通过创建抽象语法树(AST)并遍历它,生成对应的LaTeX数学公式。示例包括平方根、分式等操作,并提供了详细的节点处理逻辑。
摘要由CSDN通过智能技术生成

这里有一个相当长但仍然不完整的方法,它不涉及任何同情。足以涵盖(-b-sqrt(b**2-4*a*c))/(2*a)的示例,该示例被转换为\frac{- b - \sqrt{b^{2} - 4 \; a \; c}}{2 \; a},并呈现为

它基本上创建AST并遍历它,生成对应于AST节点的乳胶数学。有什么可以提供足够的想法,如何在它缺乏的地方扩展它。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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值