【问题标题】:sage notebook dirac bra-ket notation with latexsage notebook dirac bra-ket notation with latex
【发布时间】:2014-04-16 20:57:28
【问题描述】:

我很难在 Sage 笔记本中获得正确格式的乳胶输出以用于表示法。我将 sympy 用于 sympy.physics.quantum.Bra 和 Ket,但似乎无法从中获得适当的乳胶行为。

例如,我想在 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)

给出我想要的输出!带有 alpha 符号的乳胶风格 ket... 但是,一旦我尝试将此方法应用于 sympy Ket,它就会失败

sage: k = Ket('k', latex_name=r"\left|{\Psi}\right\rangle")
sage: show(k)

和其他变种,都吐出纯文本|k>

我觉得有一个简单的解决方案,我缺少一些标志来让 sympy 在 sage notebook 中正常运行。

【问题讨论】:

    标签: latex sympy mathjax sage


    【解决方案1】:

    这里有一个解决方案。它可能不是很健壮,但它可能会适应您的需要。这里有两个问题:

    1 - 你需要告诉 sage 如何给 Bra 和 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
    

    当然,你必须为 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 Symbol 对象:

    sage: type(bPhi.args[0])
    <class 'sympy.core.symbol.Symbol'>
    

    但是,可以通过将 Symbol 对象强制回 Sage 的符号环 (SR) 来取回 Sage 的 Phi

    sage: SR(bPhi.args[0]) is Phi
    True
    

    因此,您可以告诉 Sage 以将 Sympy 的 Symbol 乳胶化:

    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_table 是否只是将任意乳胶格式添加到我们要显示的任何对象的正确方法?像为对象创建乳胶包装器的方法吗?我注意到的东西: sage: bPhi = Bra(var('Phi')) sage: print latex(bPhi) {\left\langle \Phi\right|} 这有点奇怪,但对我来说不是问题,因为.. . sage: bPhi 给了我带有 Phi 预期符号的乳胶文胸! sage: type(bPhi.args[0]) 我认为这将适用于我的目的。
    • @Locky1138: latex_table 不会将乳胶格式与对象相关联,而是与type (=class) 相关联。任何Bra 类型的对象都将使用latex_table[Bra] 格式化函数。这是在类Bra 中定义方法_latex_ 的替代方法。如果您无法修改类(例如:用于内置类),则必须使用它。另外,我不明白你觉得什么奇怪。
    • print latex(bPhi) => {\left\langle \Phi\right|} 只是有一个空格,而不是任何字符或乳胶命令。我从你的例子中期待 {\left|\text{\texttt{Phi}}\right\rangle}。
    • 你可以使用sympy.latex获取bra和ket的乳胶表示。
    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 2013-01-01
    • 2017-09-23
    • 1970-01-01
    • 2023-01-09
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多