Latex 带有乳胶的sage笔记本dirac胸罩

Latex 带有乳胶的sage笔记本dirac胸罩,latex,sympy,mathjax,sage,Latex,Sympy,Mathjax,Sage,我很难在sage笔记本中获得正确格式化的latex输出。我使用sympy来制作sympy.physics.quantum.Bra和Ket,但似乎无法从中获得正确的乳胶性能 例如,我想在一个文件中显示符号psi sage: p = var('Psi') sage: show(p) 显示希腊字符{\Psi} 但是使用sympy sage: k = Ket(p) sage: show(k) 显示纯文本| Psi> 我已经搜索、测试和试验过,试图获得格式化的输出,但都没有用 sage: latex(

我很难在sage笔记本中获得正确格式化的latex输出。我使用sympy来制作sympy.physics.quantum.Bra和Ket,但似乎无法从中获得正确的乳胶性能

例如,我想在一个文件中显示符号psi

sage: p = var('Psi')
sage: show(p)
显示希腊字符{\Psi}

但是使用sympy

sage: k = Ket(p)
sage: show(k)
显示纯文本| Psi>

我已经搜索、测试和试验过,试图获得格式化的输出,但都没有用

sage: latex(k)
{\left |\Psi\right\rangle}-纯文本

创建自定义latex宏:

sage: from sage.misc.latex import latex_extra_preamble
sage: latex.add_macro("\\newcommand{\\ket}[1]{\\left|{#1}\\right\\rangle}")
sage: var("myket", latex_name=r"\ket{\alpha}")
sage: show(myket)
给我想要的输出!带有字母符号的乳胶风格ket。。。 但是,只要我尝试将此方法应用于sympy Ket,它就失败了

sage: k = Ket('k', latex_name=r"\left|{\Psi}\right\rangle")
sage: show(k)
和其他变体,都会吐出纯文本| k>


我觉得有一个简单的解决办法,我缺少一些标志,让sympy在sage笔记本中表现正常。

这里有一个解决办法。它可能不是很健壮,但可能适合您的需要。这里有两个问题:

1-你需要告诉sage如何给胸罩和胸罩上乳胶。这可以使用
latex_table
完成,该表是一个dict关联类型到latex类型设置功能:

from sympy.physics.quantum import Bra, Ket
def latexBra(x):
    if len(x.args) == 1:  # x.args contains the argument of the Bra
        res = latex(x.args[0])
    else:
        res = ",".join(latex(i) for i in x.args)
    return r"{\left|%s\right\rangle}"%res

from sage.misc.latex import latex_table
latex_table[Bra] = latexBra
当然,你也必须为Ket做同样的事情。你可能也希望这样做

sympy.physics.quantum.operator.OuterProduct
sympy.physics.quantum.operator.InnerProduct
...
然而,这只解决了问题的一部分:推迟胸罩。请注意,Phi不是延迟的

sage: bPhi = Bra(var('Phi'))
sage: print latex(bPhi)
{\left|\text{\texttt{Phi}}\right\rangle}
2-原因是Sympy
bPhi
参数
bPhi.args[0]
不完全是Sage变量
Phi
,而是Sympy
符号
对象:

sage: type(bPhi.args[0])
<class 'sympy.core.symbol.Symbol'>
因此,你可以告诉Sage,对于迟到的Sympy的
符号

from sympy.core.symbol import Symbol
latex_table[Symbol] = lambda x : latex(SR(x))
然后:

sage: bPhi = Bra(var('Phi'))
sage: print latex(bPhi)
{\left|\Phi\right\rangle}

只是为了让我明白;latex_表是否是向任何要显示的对象添加任意latex格式的正确方法?想为对象创建乳胶包装器吗?我注意到:sage:bPhi=Bra(var('Phi'))sage:print latex(bPhi){\left\langle\Phi\right}这有点奇怪,但我并不担心,因为。。。圣人:bPhi给了我一件乳胶胸罩,上面有Phi的预期符号!sage:type(bPhi.args[0]),我认为这对我的目的有用。@locky138:
latex\u表
不将latex格式与对象关联,而是与
type
(=class)关联。任何类型为
Bra
的对象都将使用
latex\u table[Bra]
格式化功能。这是在类
Bra
中定义方法
\uLaTeX
的替代方法。如果不能修改类(例如:对于内置类),则必须使用它。另外,我不明白你觉得奇怪的是什么。print latex(bPhi)=>{\left\langle\Phi\right}只是有一个空格,而不是任何字符或latex命令。我希望从您的示例中得到{\left |\text{\texttt{Phi}}\right\rangle}。您可以使用
sympy.latex
获得胸罩和胸罩的乳胶表示。
sage: bPhi = Bra(var('Phi'))
sage: print latex(bPhi)
{\left|\Phi\right\rangle}