简洁版本
我可以在 ipython 笔记本中获得 sympy 的几何代数对象的乳胶风格打印吗?
更长的版本
在ipython
笔记本中,我可以从sympy
. 例如,如果我的sympy
变量是希腊字符,那么输出会像乳胶一样漂亮地打印出来。(大概使用 MathJax ......)一个明确的例子:
from sympy import symbols, init_printing
init_printing(use_latex=True)
alpha = symbols('alpha')
alpha**2/3
输出是一个很好显示的分数 à la latex,带有正确放置的上标和真正的 alpha。完美的。
但我也对几何代数模块做了很多工作sympy.galgebra.GA
,我想要类似的结果。显然,该模块调用了不同的打印系统latex_ex
,当我从命令行运行脚本(如模块页面上的脚本)并让它们输出 dvi 文件时,它似乎确实有效。但我所做的一切都没有让 GA 在笔记本上看起来很漂亮。有什么我可以做的吗?
具体来说,这里有一个具体的例子:
from sympy.galgebra.GA import *
metric = '1 0 0,0 1 0,0 0 1'
gamma_x,gamma_y,gamma_z = MV.setup('gamma_x gamma_y gamma_z',metric,True)
gamma_x
输出只是repr
of gamma_x
,像<sympy.galgebra.GA.MV at 0x1060b8510>
. 同样,调用print
只是给了我_1*gamma_x
,这是我试图避免的。
在脚本中,我可以在上面添加以下内容:
from sympy.galgebra.latex_ex import LatexPrinter, xdvi
LatexPrinter.format(1,1,1,1)
print gamma_x
xdvi(filename='testGA.tex')
这给了我预期的 DVI 和很好的乳胶表达。当然,如果我在笔记本上做同样的事情,我绝对不会得到任何打印语句的输出,即使是那些不涉及 GA 对象的输出——实际上什么也没有,不仅仅是不漂亮的东西。
我正在运行 python 2.7.5,带有 sympy 0.7.3,并使用 ipython 1.0 下的笔记本。
[编辑编辑:下面的 hackiness 的更新版本]
由于在工作中进行了各种更改,因此我不得不进行各种更改。我在我的回答中收集了一个很好的当前示例。
编辑:哈基部分解决方案
我实际上已经得到了一个非常丑陋的黑客来处理当前版本的代码。下面的工作,但我很不满意,所以我希望艾伦的新版本的模块会带来更好的事情。这里主要是供参考。但基本思想似乎是sympy.galgebra.GA.MV._repr_latex_
需要以某种方式定义。任何对 sympy 或 ipython 的工作有更深入了解的人都非常欢迎发表评论。
from sympy.galgebra.GA import *
metric = '1 0 0,0 1 0,0 0 1'
gamma_x,gamma_y,gamma_z = MV.setup('{\gamma}_x {\gamma}_y {\gamma}_z',metric,True)
def MVlatex(mv, *args) :
from re import sub
s = str(mv)
s = s.replace('*',r' ')
s = sub(r'(?<![}_a-zA-Z0-9])_1(?![a-zA-Z0-9])', r' ', s)
s = sub(r'__([a-zA-Z0-9]*)', r'^{\1}', s)
s = sub(r'_([a-zA-Z0-9]*)', r'_{\1}', s)
return '$$'+s+'$$'
sympy.galgebra.GA.MV._repr_latex_ = MVlatex
gamma_x
请注意正则表达式的不幸使用,带有负面的lookbehinds等。此外,_repr_latex_
有时会得到多个参数。除了第一个参数,我不知道任何参数是什么意思,所以我把它们扔掉了。最后,我敢肯定还有很多事情仍然很丑陋。这只是我最初粗略尝试的结果。