将 Python 数值表达式转换为 LaTeX
我需要使用有效的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)$'
但甚至这样做,它需要将 x
和 y
声明为类型“symbols”。
我想要更简单的东西,最好可以使用编译器模块中的解析器来实现。
>>> compiler.parse('1+2**(x+y)')
Module(None, Stmt([Discard(Add((Const(1), Power((Const(2), Add((Name('x'), Name('y'))))))))]))
最后但并非最不重要的一点是,为什么:我需要生成这些 LaTeX 片段,以便我可以使用 MathJax 在网页中显示它们。
I need to convert strings with valid Python syntax such as:
'1+2**(x+y)'
and get the equivalent LaTeX:
$1+2^{x+y}$
I have tried SymPy's latex
function but it processes actual expression, rather than the string form of it:
>>> latex(1+2**(x+y))
'$1 + 2^{x + y}
but to even do this, it requires x
and y
to be declared as type "symbols".
I want something more straightforward, preferably doable with the parser from the compiler module.
>>> compiler.parse('1+2**(x+y)')
Module(None, Stmt([Discard(Add((Const(1), Power((Const(2), Add((Name('x'), Name('y'))))))))]))
Last but not least, the why: I need to generate those LaTeX snippets so that I can show them in a webpage with MathJax.
>>> latex('1+2**(x+y)')
'$1+2**(x+y)
but to even do this, it requires x
and y
to be declared as type "symbols".
I want something more straightforward, preferably doable with the parser from the compiler module.
Last but not least, the why: I need to generate those LaTeX snippets so that I can show them in a webpage with MathJax.
but to even do this, it requires x
and y
to be declared as type "symbols".
I want something more straightforward, preferably doable with the parser from the compiler module.
Last but not least, the why: I need to generate those LaTeX snippets so that I can show them in a webpage with MathJax.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
这是一个相当长但仍然不完整的方法,不以任何方式涉及 sympy。这足以涵盖
(-b-sqrt(b**2-4*a*c))/(2*a)
的示例,该示例被翻译为\frac{- b - \sqrt{b^{2} - 4 \;一个\; c}}{2 \; a}
并渲染为它基本上创建了 AST 并让它生成对应的乳胶数学AST 节点。其中的内容应该足以让您了解如何在其缺乏的地方进行扩展。
Here's a rather long but still incomplete method that doesn't involve sympy in any way. It's enough to cover the example of
(-b-sqrt(b**2-4*a*c))/(2*a)
which gets translated to\frac{- b - \sqrt{b^{2} - 4 \; a \; c}}{2 \; a}
and renders asIt basically creates the AST and walks it producing the latex math the corresponds to the AST nodes. What's there should give enough of an idea how to extend it in the places it's lacking.
您可以将
sympy.latex
与eval
一起使用:您仍然必须将变量声明为符号,但如果这确实是一个问题,那么编写解析器会更容易这比解析所有内容并从头开始生成乳胶要好。
You can use
sympy.latex
witheval
:You still have to declare the variables as symbols, but if this is really a problem, it's much easier to write a parser to do this than to parse everything and generate the latex from scratch.
您可以使用 SymPy。只需首先将字符串传递给 sympify() 函数,该函数会将其转换为有效的 SymPy 表达式(即为您创建符号等)。所以你可以做
S()
也是sympify()
的快捷方式,即latex(S('1+2**(x+y)) '))
也有效。You can use SymPy. Just pass the string to the
sympify()
function first, which will convert it to a valid SymPy expression (i.e., create the Symbols for you, etc.). So you could doS()
is also a shortcut tosympify()
, i.e.,latex(S('1+2**(x+y)'))
also works.为了构建 tom10 的答案,您可以定义一个字典,该字典将生成符号并在调用 eval 时使用它:
然后,如果您使用,
则不必担心为变量预先创建符号。
To build on tom10's answer you can define a dictionary that will generate symbols and use that when calling eval:
Then if you use
you shouldn't have to worry about pre-creating Symbols for the variables.
只需对杰夫·里迪(Geoff Reedy)优秀答案进行一点修复:
之前它不会将新项目添加到字典中。现在你可以将它与你的表达式一起使用:
并且你可以在将其转换为 LaTeX: 之前进一步简化它
,你会得到这个:
Just a little fix to Geoff Reedy excellent answer:
Before it would not add the new item to the dict. Now you can use this with your expression:
and you can further simplify it before converting it to LaTeX:
and you get this:
渲染 @Geoff Reedy Latex 格式文本。我们可以使用 matplotlib。
To render @Geoff Reedy latex format text. We could use matplotlib.