блокнот sage dirac bra-ket обозначение с латексом

У меня возникли трудности с получением правильно отформатированного латексного вывода для записи в блокноте Sage. Я использую sympy для sympy.physics.quantum.Bra и Ket, но, похоже, не могу добиться от них правильного латексного поведения.

например, я хочу показать символ пси в кет.

sage: p = var('Psi')
sage: show(p)

отображает греческий символ {\Psi}

но используя симпи

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)

дает результат, который я хочу! кет в латексном стиле с символом альфы... однако, как только я пытаюсь применить этот метод к симпатичному кету, он терпит неудачу

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

и другие варианты, все выдают обычный текст |k>

У меня есть ощущение, что для этого есть простое решение, какой-то флаг, который мне не хватает, чтобы заставить sympy вести себя правильно в блокноте sage.


person Lundy    schedule 16.04.2014    source источник


Ответы (1)


Вот решение. Вероятно, это не очень надежно, но, вероятно, его можно адаптировать к вашим потребностям. Здесь две проблемы:

1 - Вам нужно сказать мудрецу, как слатексировать Бра и Кет. Это можно сделать с помощью latex_table, который представляет собой тип, связывающий dict с функциями набора текста в латексе:

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
...

Однако это решает только часть проблемы: латексирование бюстгальтера. Обратите внимание, что Фи не в латексе.

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'>

Однако можно вернуть Phi Мудреца, вернув объект Symbol обратно в символическое кольцо Мудреца (SR):

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}
person hivert    schedule 17.04.2014
comment
Просто чтобы убедиться, что я понимаю; Является ли latex_table правильным способом добавления произвольного латексного форматирования к любому объекту, который мы хотим отобразить? как способ создания латексных оберток для объектов? кое-что, что я заметил: sage: bPhi = Bra(var('Phi')) sage: print латекс(bPhi) {\left\langle \Phi\right|} это немного странно, но меня это не беспокоит, потому что .. sage: bPhi дает мне латексный бюстгальтер с ожидаемым символом Phi! sage: type(bPhi.args[0]) ‹class'sympy.core.symbol.Symbol'›, который, я думаю, подойдет для моих целей. - person Lundy; 17.04.2014
comment
@ Locky1138: latex_table связывает латексное форматирование не с объектами, а с type (= класс). Любой объект типа Bra будет использовать функцию форматирования latex_table[Bra]. Это альтернатива определению метода _latex_ в классе Bra. Вы должны использовать его, если вы не можете изменить класс (например, для встроенного класса). Кроме того, я не понимаю, что вы находите странным. - person hivert; 17.04.2014
comment
print latex(bPhi) =› {\left\langle \Phi\right|} просто содержит пробел вместо какого-либо символа или латексной команды. Я ожидал {\left|\text{\texttt{Phi}}\right\rangle} из вашего примера. - person Lundy; 17.04.2014
comment
Вы можете использовать sympy.latex, чтобы получить латексное представление бюстгальтера и кетчупа. - person asmeurer; 18.04.2014