修改Sympy对象的Jupyter Notebook' s(ipython内核)LaTeX渲染

时间:2017-10-28 19:24:13

标签: latex ipython jupyter sympy

我最近开始使用Jupyter笔记本为Fluid Dynamics课程编写家庭作业。我使用带有Sympy的IPython内核进行符号计算。通常,我需要将符号计算的结果打印为LaTeX输出。例如,请参阅以下代码

import sympy as s
s.init_printing()
from IPython.display import display
r,t = s.symbols('r,theta')
u_x = r*s.sin(t)
display(u_x)

这将在代码下方的单元格中打印$r\sin\theta$的LaTeX渲染。 Current Output 有没有我可以在输出前添加$u_x = $?在此示例中,所需的输出将是

我的目的是在Jupyter笔记本中输出我的display(u_x)语句应该像LaTeX文档中的常规方程一样。读者不必阅读代码部分以了解我在等式中显示的数量。

5 个答案:

答案 0 :(得分:3)

在通过IPython的ast.literal_eval模块进行扫描之后,事实证明我可以使用下面的函数

display

现在,from sympy import latex from IPython.display import display_latex def disp(idx, symObj): eqn = '\\[' + idx + ' = ' + latex(symObj) + '\\]' display_latex(eqn,raw=True) return 提供了所需的输出。

screen shot. I made the parent div"moviesbox" dark grey so that you can see how far the div extends and I am using light grey to show the div area.

答案 1 :(得分:2)

我想通过创建一个自定义类来提出一个(当然非常难看)的方法:

import sympy as sp
from sympy.printing.pretty.stringpict import prettyForm

class NamedExpression(sp.Expr):

    def __init__(self, name, expr=None, **kwargs):
        self._symbol = sp.Symbol(name, **kwargs)
        self._expr = expr

    def assign(self, expr):
        self._expr = expr

    def as_symbol(self):
        return self._symbol

    def as_eq(self):
        if self._expr is None:
            raise RuntimeError('No expression available')
        return sp.Eq(self._symbol, self._expr)

    def _print_myself(self, printer):
        return _print_function(self, printer)

    _sympystr = _sympyrepr = _latex = _print_myself

    def _pretty(self, printer):
        return prettyForm(_print_function(self, printer))

    def __getattribute__(self, name):
        if name in ['_symbol', '_expr', 'assign', 'as_symbol', 'as_eq',
                    '_pretty', '_sympystr', '_sympyrepr', '_latex']:
            return super().__getattribute__(name)
        expr = self._expr
        if expr is not None:
            return expr.__getattribute__(name)
        return self._symbol.__getattribute__(name)


def _print_function(obj, printer):
    expr = obj._expr
    what = obj._symbol if expr is None else expr
    return printer.doprint(what)

使用此课程,您可以创建如下符号:

u_x = NamedExpression('u_x')

您可以在SymPy表达式中使用它,它将像普通符号一样显示。

在某些时候,您可以为此符号指定一些内容:

u_x.assign(r * sp.sin(t))

之后,您可以再次在SymPy表达式中使用它,它的行为就像指定的表达式一样。

如果要显示定义,只需执行

u_x.as_eq()

答案 2 :(得分:1)

我创造了my previous answer稍微不那么丑陋的变体,避免了所有复杂的印刷品。 但是,我失去了以后分配表达式的能力;必须在施工时指定表达式。但这可能不是什么大问题。

我没有定义单个类,而是按需定义自定义类:

import sympy as sp

def named_expression(symbol, expr):

    class NamedExpression(type(expr)):

        def __new__(cls, sym, ex):
            # NB: we don't call the base class' __new__()!
            self = object.__new__(cls)
            if isinstance(sym, sp.Symbol):
                self._symbol = sym
            else:
                self._symbol = sp.Symbol(sym)
            self._expr = ex
            return self

        def __getattribute__(self, name):
            if name in ['_symbol', '_expr', 'as_symbol', 'as_eq']:
                return super().__getattribute__(name)
            return self._expr.__getattribute__(name)

        def as_symbol(self):
            return self._symbol

        def as_eq(self):
            return sp.Eq(self._symbol, self._expr)

    return NamedExpression(symbol, expr)

可以像这样使用:

u_x = named_expression('u_x', r * sp.sin(t))

或者,如果您已经有一个名为u_x符号,则可以像这样覆盖它:

u_x = named_expression(u_x, r * sp.sin(t))

和以前一样,平等可以这样显示:

u_x.as_eq()

请注意,这与IPython无关,它应该在SymPy可用的任何地方都有效。

答案 3 :(得分:0)

添加

u_x

在输入同情之后。

然后,简单地把

client.js
单元格中的

将正确呈现,无需调用显示。

答案 4 :(得分:0)

我一直在使用一种略有不同的方法,该方法直接从赋值语句生成这种输出。我简称为library("xml2") library("XML") setwd("/xml") dir <- dir() tabela=matrix(NA,nrow=length(a),ncol=1) for(i in 1:length(dir)){ visitNode <- function(node) {#Recursive Function to visit the XML tree (depth first) if (is.null(node)) {#leaf node reached. Turn back return() } print(paste("Node: ", xmlName(node))) num.children = xmlSize(node) if(num.children == 0 ) {# Add your code to process the leaf node here print( paste(" ", xmlValue(node))) } if (num.children > 0){#Go one level deeper for (i in 1 : num.children) { visitNode(node[[i]][["NFe"]]) #the i-th child of node } } } xmlfile <- dir[i] xtree <- xmlInternalTreeParse(xmlfile) root <- xmlRoot(xtree) dataxml <- visitNode(root) dataxml <- xmlToList(root) df<- as.data.frame(matrix(unlist(dataxml$NFe$infNFe$infAdic$infCpl), nrow=length(dataxml$NFe$infNFe$infAdic$infCpl),byrow=TRUE)) display math operation。您可以拨打dmo之类的电话,并在Jupyter笔记本中显示排版输出dmo(p=a*b/c**2)

与此同时,我也在研究如何更广泛地扩展sympy函数以显示已完成的操作。我有一些差异化和集成化的工作示例。我希望有时间研究如何将其嵌入sympy中,而不是用螺栓固定。

您可以在mybinder中尝试以下示例:Binder git存储库为https://github.com/gutow/Easy_Pretty_Math。请把建议和问题放在git仓库issues中。