2

简洁版本

我可以在 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

输出只是reprof 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_有时会得到多个参数。除了第一个参数,我不知道任何参数是什么意思,所以我把它们扔掉了。最后,我敢肯定还有很多事情仍然很丑陋。这只是我最初粗略尝试的结果。

4

4 回答 4

3

我是 GA 模块的作者,我将研究 Ipython 乳胶问题。我强烈建议您使用具有新版本 GA 的最新版本 sympy。查看有关如何使用新 GA 的新文档。有几件事发生了变化。尝试以下(我不知道它是否会起作用,因为我自己不使用 Ipython)。对于“格式”语句使用

格式(ipy=真)

并查看它是否有效(再次查看文档和新发行版的示例,其他内容随着打印和模块的其他方面发生变化)。我的开发方法是使用“geany”编辑器编写脚本。然后我可以按下编辑器上的运行按钮并观察终端或乳胶的输出。

我对您使用 GA 的用途感兴趣,并找出您希望在未来版本中包含的内容。如果您想直接与我联系,我的电子邮件是

abrombo@verizon.net

于 2013-09-09T12:21:44.307 回答
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
于 2014-02-25T07:00:28.453 回答
1

编辑:

当前的git 版本具有更新的代码和非常不同的语法。我提出了一个拉取请求,其中包含使 ipython notebook 完全工作所需的最后一段代码。因此,希望在不久的将来,以下任何一项都不是必需的。

年长者:

以下是我在最新版本的 sympy 中使用的 MWE(我目前使用 sympy 版本 0.7.5-git 和 ipython notebook 版本 2.0.0-dev)。

# 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) )

据推测,相关部分实际上应该合并到代数代码中。特别是, mathjax 从未见过, , 等的 tex 宏定义,并且\W与mathjax 不兼容,因此必须更改这些定义。此外,该函数需要在类中定义。\lp\rp\bm_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)
于 2014-02-25T17:24:10.950 回答
1

我正在对 galgebra 进行另一次重大重写,它解决了许多 Ipython/LaTeX 问题。一旦我可以将我为它编写的 LaTeX 文档转换为 python-sphinx,它将被添加到我的 sympy github 存储库中。如果您不耐烦,请访问 github.com/brombo/GA 并查看 LaTeX 文档中的 GA.pdf。需要进行重大重写的原因是,为了正确地进行流形/子流形,需要对几何代数进行多个实例化,这在当前实现中是不可能的。这是因为子流形有它自己的几何代数,它不同于基本流形。新实现还包括一个带有左右 grad 运算符的微分运算符类(请参阅文档)。

于 2014-04-05T00:48:15.193 回答