保持表达与乳胶转换完全一致

时间:2013-10-01 14:18:06

标签: python sympy

我希望在乳胶中得到p__s_alpha = 1/k * Product(a_0,(i,1,O))的表达式。我用:

print sympy.latex(p__s_alpha)

当我在结果上运行乳胶时,我得到以下等式:

incorrect

但是,我想打印这个等式:

correct

有没有办法保持表达式的表示形式?

1 个答案:

答案 0 :(得分:2)

我开始写一个关于如何制作自己的自定义打印机的答案,但是我意识到latex中已经有一个选项可以满足您的需要,long_frac_ratio选项。如果该比率足够小,则任何足够小的分数都将打印为1/b*a而不是a/b

In [31]: latex(p__s_alpha, long_frac_ratio=1)
Out[31]: '\\frac{1}{k} \\prod_{i=1}^{O} a_{0}'

如果您感兴趣,以下是我要编写的关于编写自定义打印机的一些内容:

在内部,SymPy不区分a/ba*1/b。它们都由完全相同的对象表示(参见http://docs.sympy.org/latest/tutorial/manipulation.html)。

然而,打印系统是不同的。从该页面可以看出,a/b表示为Mul(a, Pow(b, -1)),即a*b**-1,但是打印机将其转换为分数格式(这适用于任何打印机,而不是只是LaTeX一个)。

对你而言,好消息是SymPy中的打印系统非常易于扩展(另一个好消息是SymPy是BSD开源的,所以你可以自由地重用已经存在的打印逻辑来扩展它)。要创建满足您需要的自定义LaTeX打印机,您需要在LatexPrinter中创建sympy.printing.latex子类并覆盖_print_Mul函数(因为如上所述,a/b是{ {1}})。这个函数中的逻辑并没有真正模块化,所以你真的需要复制整个source并更改它的相关部分[如上所述,对于这个,已经有一个选项,做你想做的,但在其他情况下,可能没有]。

最后一点,如果你做一个可能需要修改的更广泛的观众,我们很乐意让你把它作为拉动请求提交给SymPy。