如何在IPython Notebook中获取Sympy表达式的LaTeX表格?

5
我正在使用sympy从多个表达式中收集项,并希望在ipython-notebook中以表格形式格式化结果,其中最左侧的列为项,每个后续列表示一个表达式。列中的条目来自于sympy.collect(syms,evaluate = False)返回的dict。
到目前为止,我有:
from IPython.display import display, Latex
import pandas as pd
import sympy as sym
sym.init_printing()
x,y,z = sym.symbols('x,y,z')
da,db,dc = sym.symbols('{\Delta}a {\Delta}b {\Delta}c ' )

e_list = []
d_list = []
e_list.append(da*2*x + da*(y - 2) + db*3*z + dc*(x+y))
e_list.append(dc*z + dc*x + da*x + db*(z+2))
for e in e_list:
    display(e.expand().collect((x,y,z)))
    d_list.append(e.expand().collect((x,y,z),evaluate=False))

df = pd.DataFrame(d_list).T

数据框的显示效果我很满意,只是其中的条目以原始LaTeX代码的形式呈现。
我尝试了以下方法:
Latex(df.to_latex())

但是我得到的只是被一个框包围的latex代码。
编辑: 这似乎是ipython和latex表格的已知问题,请参见此处:

http://grokbase.com/t/scipy.org/ipython-user/12acr5rrr1/may-be-old-topic-just-getting-started-with-ipython-notebook-trouble-with-tables

我有两种不同的解决方法。 使用Unicode:

sym.init_printing(use_latex=False)
...
da,db,dc = sym.symbols('∆a ∆b ∆c' )

或者将表格显示为sympy矩阵:
terms = [x,y,z]
d_list = [(e.expand().collect((terms),evaluate=False)) for e in e_list]
mterms = sym.zeros(M.shape[0],len(terms)+1)
key1 = d_list[0].keys()[0]
terms.insert(0,key1)
for i in range(mterms.shape[0]):
    for j in range(mterms.shape[1]):
        try:
            mterms[i,j] = d_list[i][terms[j]]
        except:
            mterms[i,j] = 0

mterms

我可能错了,但我认为这可能是pandas或IPython中的一个bug(取决于哪个负责)。我希望在数据框中注册了自定义显示方法的项目能够使用该方法进行显示。 - asmeurer
我已经找了几个小时了...我找不到在IPython中将latex放入表格的方法。:( - korylprince
1个回答

0

毫无疑问,问题的一部分在于df.to_latex()输出的latex实际上并不是有效的latex。例如,如果您只是将该函数的输出粘贴到专用的latex文档中,它将无法编译。

特别是,表格中的某些条目包含像\Delta这样的内容,但这些内容位于数学环境之外(没有美元符号)。

所以这绝对是一个问题。另一个可能的问题是使用\toprule等。这些都是非标准的latex结构(尽管可以使用正确的latex包),但我不知道这些rule是否被Latex函数识别。

尽管如此,我甚至无法使最简单的tabular环境正常显示。例如,即使我执行以下操作:

Latex(r"""\begin{tabular}{l} 1 \\ 2 \end{tabular}""")

我得到了一个装箱的结果,就像你说的一样。(尽管该字符串的内容在专用的LaTeX文档中可以正确编译。)


1
这是因为所有内容都必须与MathJax配合使用。最好的方法是渲染一个HTML表格,并使用MathJax渲染条目。 - asmeurer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接