我可以在ipython笔记本中获得很好的乳胶风格的sympy几何代数对象的打印吗?
在ipython
笔记本中,我可以从sympy
得到各种数学对象的漂亮打印。例如,如果我的sympy
变量是希腊字符,则输出将以乳胶的形式打印出来。 (大概使用MathJax ......)一个明确的例子:
from sympy import symbols, init_printing
init_printing(use_latex=True)
alpha = symbols('alpha')
alpha**2/3
输出是一个很好地显示的分数乳胶,具有正确放置的上标和真正的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
的{{1}},这与gamma_x
无关。同样,调用<sympy.galgebra.GA.MV at 0x1060b8510>
只会给我print
,这正是我想要避免的。
在脚本中,我可以在上面添加以下内容:
_1*gamma_x
这给了我预期的DVI和漂亮的乳胶表达。当然,如果我在笔记本中做同样的事情,我绝对没有输出任何打印语句,即使那些不涉及GA对象 - 几乎没有,不仅仅是非常漂亮的东西。
我正在运行python 2.7.5,使用sympy 0.7.3,并使用ipython 1.0下的笔记本。
由于工作中已经有了各种变化,我不得不做出各种改变。我在my answer收集了一个很好的当前示例。
我实际上得到了一个非常难看的黑客来使用当前版本的代码。以下工作,但我非常不满意,所以我希望艾伦的新版本的模块将带来更好的东西。这主要是供参考。但基本思想似乎是from sympy.galgebra.latex_ex import LatexPrinter, xdvi
LatexPrinter.format(1,1,1,1)
print gamma_x
xdvi(filename='testGA.tex')
需要以某种方式定义。任何对症状或ipython工作有更深入了解的人都非常欢迎发表评论。
sympy.galgebra.GA.MV._repr_latex_
注意不幸使用正则表达式,带有负面的lookbehinds等。另外,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
有时会得到多个参数。我不知道有什么争论,但第一种方式,所以我只是扔掉它们。最后,我确信有很多东西仍然非常丑陋;这只是我最初粗略尝试的结果。
答案 0 :(得分:3)
我是GA模块的作者,我将研究Ipython乳胶问题。我强烈建议您使用最新版本的带有新版GA的sympy。查看有关如何使用新GA的新文档。有些事情发生了变化。尝试以下(我不知道它是否会起作用,因为我自己不使用Ipython)。对于“格式”语句,请使用
格式(IPY = TRUE)
并查看它是否有效(再次查看文档和新分发的示例,其他内容随着打印和模块的其他特征而发生变化)。我的开发方法是使用“geany”编辑器编写脚本。然后我可以按下编辑器上的运行按钮,观察输出终端或乳胶。
我对您使用GA的内容感兴趣,并了解您希望在未来版本中包含哪些内容。如果您希望直接与我联系,我的电子邮件是
abrombo@verizon.net
答案 1 :(得分:1)
这适合我。
import sympy
import sympy.galgebra
import sympy.galgebra.printing
sympy.galgebra.ga_print_on()
sympy.galgebra.ga.Format(ipy=True)
sympy.init_printing(use_latex=True)
def MVlatex(mv, *args) :
from re import sub
s = str(mv)
s = sub(r'\\W',r'\\wedge', s)
s = sub(r'\\bm',r'\\mathbf', s)
return '$$'+s+'$$'
sympy.galgebra.ga.MV._repr_latex_ = MVlatex
答案 2 :(得分:1)
current git version有更新的代码和非常不同的语法。我已经制作了一个pull request,其中包含了使ipython笔记本完全兼容所需的最后一段代码。因此,希望在不久的将来不需要以下任何一项。
以下是我最近使用的sympy版本所使用的MWE(我目前使用的是带有ipython笔记本版本2.0.0-dev的sympy版本0.7.5-git)。
# Some generic startup stuff
import sympy, sympy.galgebra.ga
metric = '1 0 0,0 1 0,0 0 1'
gamma_x,gamma_y,gamma_z = sympy.galgebra.ga.MV.setup('gamma_x gamma_y gamma_z',metric)
# Setup nice printing for the notebook
sympy.init_printing()
sympy.galgebra.ga.Format(ipy=True)
def MVlatex(mv, *args) :
mv.base_to_blade()
return '$$'+str(mv).replace(r'\W', r'\wedge').replace(r'\bm', r'\boldsymbol').replace(r'\lp',r'\left(').replace(r'\rp',r'\right)')+'$$'
sympy.galgebra.ga.MV._repr_latex_ = MVlatex
# Show a couple examples
display(gamma_x ^ gamma_y)
display( 3*gamma_x*gamma_y/2 + (gamma_z^gamma_x) )
据推测,相关部分实际上应该合并到galgebra代码中。特别是,mathjax永远不会看到\W
,\lp
,\rp
等的tex宏定义,并且\bm
与mathjax不兼容,所以那些必须改变了。此外,函数_repr_latex_
需要在MV
类中定义。
我还会注意到,对于其他无法动态添加属性的类(在这种情况下为_repr_latex_
),您仍然可以告诉ipython使用您的函数进行显示,例如
ip = get_ipython()
latex_formatter = ip.display_formatter.formatters['text/latex']
latex_formatter.for_type_by_name('sympy.galgebra.ga', 'MV', MVlatex)
答案 3 :(得分:1)
我正在对galgebra进行另一次重大改写,解决了许多Ipython / LaTeX问题。只要我将为其编写的LaTeX文档转换为python-sphinx,它就会被添加到我的sympy github存储库中。如果你不耐烦,请访问github.com/brombo/GA并查看LaTeX文档中的GA.pdf。需要重大重写的原因是因为为了正确地进行流形/子流形,需要具有几何代数的多个实例,这在当前实现中是不可能的。这是因为子流形有它自己的几何代数,它与基础流形不同。新实现还包括具有左右梯度运算符的微分运算符类(请参阅文档)。完成后(新的实现)还有一个多线性转换类,可用于具体的符号张量(不需要索引)。