使用sympy的乳胶印刷作为仲裁课程

时间:2017-11-07 19:37:00

标签: python latex sympy

假设我正在构建一个类,在其中我有一个__repr__方法来打印它。有没有办法使用sympy的乳胶打印来呈现__repr__输出?

对于最小的例子,请考虑

e1, e2, e3 = sympy.symbols('e_1 e_2 e_3')
class vector:
    def __init__(self, _coordinates, _basis):
        self.coordinates = coordinates
        self.basis = basis
    def __repr__(self):
        string = ''
        for k in range(len(basis)):
            string += '{}{} + '.format(self.coordinates[k], self.basis[k])
        return string[:-3]

在这个示例中,如果我创建一个这样的实例:v = vector([1, 0, 0], [e1, e2, e3])我希望print(v)看起来像$ 1e_1 + 0e_2 + 0e_3 $。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解对sympy.add的限制。这样就够了吗?

import sympy as sym
import sympy.printing as printing
e1, e2, e3 = sym.symbols('e_1 e_2 e_3')

class Vector:
    def __init__(self, _coordinates, _basis):
        self.coordinates = _coordinates
        self.basis = _basis
    def __repr__(self):
        expr = sum([c*e for c, e in zip(self.coordinates, self.basis)])
        return '${}$'.format(printing.latex(expr))
v = Vector([1, 0, 0], [e1, e2, e3])
print(repr(v))
# $e_{1}$

v = Vector([1, 2, 3], [e1, e2, e3])
print(repr(v))
# $e_{1} + 2 e_{2} + 3 e_{3}$

答案 1 :(得分:1)

IPython笔记本中的Sympy对象的LaTeX显示由IPython的display模块处理。如果对象定义了_repr_latex_()函数,则在调用Sympy init_printing()时,IPython将呈现对象的LaTeX表示。以下代码应与IPython一起使用。在最新版本的IPython中,不需要导入display()函数。对于旧版本,我们可能必须包含from IPython.display import display

import sympy as s
s.init_printing()

class vector:
    def __init__(self, _coordinates, _basis):
        self.coordinates = _coordinates
        self.basis = _basis
    def __repr__(self):
        string = ''
        for k in range(len(self.basis)):
            string += '{}{} + '.format(self.coordinates[k], self.basis[k])            
        return string[:-3]
    def _repr_latex_(self):
        string = self.__repr__()
        string = '$' + string + '$'
        return string

e1, e2, e3 = s.symbols('e_1 e_2 e_3')
v = vector([1, 0, 0], [e1, e2, e3])
display(v)