我很难在鼠尾草笔记本中获得格式正确的乳胶输出。我在sympy.physics.quantum.Bra和Ket上使用sympy,但似乎无法从中获得适当的乳胶行为。
例如,我想在一个字符串中显示符号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} - 纯文本
创建自定义乳胶宏:
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)
给出我想要的输出!乳胶风格的口香糖与alpha的符号... 但是,一旦我尝试将此方法应用于sympy Ket,它就会失败
sage: k = Ket('k', latex_name=r"\left|{\Psi}\right\rangle")
sage: show(k)
和其他变体,都吐出纯文本| k>
我觉得有一个简单的解决方案,一些我不想在圣人笔记本中表现得恰到好处的旗帜。
答案 0 :(得分:2)
这是一个解决方案。它可能不是很强大,但它可能适合您的需要。这是两个问题:
1 - 你需要告诉圣人如何乳胶胸罩和Ket。这可以使用latex_table
来完成,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
是与乳胶类型设置功能相关联的字典:
sympy.physics.quantum.operator.OuterProduct
sympy.physics.quantum.operator.InnerProduct
...
当然,你必须为Ket做同样的事情。您可能也希望为
执行此操作sage: bPhi = Bra(var('Phi'))
sage: print latex(bPhi)
{\left|\text{\texttt{Phi}}\right\rangle}
但是,这只能解决部分问题:乳胶罩罩。请注意,Phi不是胶乳。
bPhi
2 - 原因是Sympy bPhi.args[0]
参数Phi
不完全是Sage变量Symbol
而是Sympy sage: type(bPhi.args[0])
<class 'sympy.core.symbol.Symbol'>
对象:
Phi
然而,可以通过强迫Symbol
对象回到Sage的符号环(SR
)来取回Sage的sage: SR(bPhi.args[0]) is Phi
True
:
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}
然后:
{{1}}