如何使用Python为LaTeX和UnicodeMath生成表示张量及其协变导数的方程代码



如何使用Python为LaTeX和UnicodeMath生成表示张量及其协变导数的方程代码?(我不习惯做完整的"回答你自己的问题")事情请随意编辑这部分,这样它就不那么可怕了。

我最近在做关于张量和协变导数的数学,把它们写出来很痛苦。因此,我编写了代码来为我做这件事。您可以告诉它以LaTeX输出代码(例如,如果您想在stackexchange或研究论文上编写问题)或UnicodeMath(例如,如果您想在Microsoft Word文档中操作方程)。我我已经解决了所有的bug,应该可以发布了。我在Python 3.11.0中编写了它。它可能会得到改进,但这样做不会改变输出或使代码明显快于人类。我应该再加一些评论的。我称这个程序为"unicodemath - latex - tensorgenv2 .py"。我在顶部包含了一些示例,以便您可以了解它是如何工作的。我用这份文件作为方程的参考。我把带上标的协变导数称为逆变导数;我不认为这是正确的术语,但我离题了。我想给出一个LaTeX代码的例子,但是由于一些奇怪的原因,它不能在这个stackoverflow上正确显示。希望人们发现这有用!:)

#print(UnicodeMathChristoffelComp1("T",["\nu ","\rho ","\sigma ","\lambda "],[0,0,0,1],"\kappa ",1,"\mu "))
#print(UnicodeMathCovariantDerivative("T",["\nu ","\rho ","\sigma ","\lambda "],[0,0,0,1],"\kappa ","\theta ","\mu "))
#print(UnicodeMathContravariantDerivative("T",["\nu ","\rho ","\sigma ","\lambda "],[0,0,0,1],"\kappa ","\theta ","\phi ","\mu "))
#print(LaTeXChristoffelComp1("T",["\nu ","\rho ","\sigma ","\lambda "],[0,0,0,1],"\kappa ",1,"\mu "))
#print(LaTeXCovariantDerivative("T",["\nu ","\rho ","\sigma ","\lambda "],[0,0,0,1],"\kappa ","\theta ","\mu "))
#print(LaTeXContravariantDerivative("T",["\nu ","\rho ","\sigma ","\lambda "],[0,0,0,1],"\kappa ","\theta ","\phi ","\mu "))

def UnicodeMathTensorGen(T,u,covariance):
    #Replace all 's with \'s!
    #0 for covariant, 1 for contravariant
    n=len(covariance)
    if(n==0):
        return T
    elif(n==1):
        return T+"_^"[covariance[0]]+u[0]
    string="■(〖"+T+"〗"+"_^"[covariance[0]]+"("+u[0]
    for i in range(1,n):
        if(covariance[i]!=covariance[i-1]):
            string+=") 〖\zwsp 〗"+"_^"[covariance[i]]+"("
        string+=u[i]
    return string+"))"
def UnicodeMathChristoffelComp1(T,u,covariance,indexvar,index,derivvar):
    string=""
    match covariance[index]:
        case 1:
            string+="+〖Γ\zwsp〗_("+derivvar+indexvar+")^"+u[index]
        case 0:
            string+="-〖Γ\zwsp〗_("+derivvar+u[index]+")^"+indexvar
    u[index]=indexvar
    return string+" "+UnicodeMathTensorGen(T,u,covariance)
def UnicodeMathChristoffelComp2(a,b,c,indexvar):
    return "1/2 〖g^〖"+c+indexvar+"〗〗(partial_〖"+a+"〗 g_〖"+b+indexvar+"〗+partial_〖"+b+"〗 g_〖"+a+indexvar+"〗-partial_〖"+indexvar+"〗 g_〖"+a+b+"〗)"
def UnicodeMathChristoffelComp3(T,u,covariance,indexvar,indexvar2,index,derivvar):
    string=""
    match covariance[index]:
        case 1:
            string+="+"+UnicodeMathChristoffelComp2(derivvar,indexvar,u[index],indexvar2)
        case 0:
            string+="-"+UnicodeMathChristoffelComp2(derivvar,u[index],indexvar,indexvar2)
    u[index]=indexvar
    return string+" "+UnicodeMathTensorGen(T,u,covariance)
def UnicodeMathCovariantDerivative(T,u,covariance,indexvar,indexvar2,derivvar):
    string2="_〖"+derivvar+"〗 "+UnicodeMathTensorGen(T,u,covariance)
    string="\nabla"+string2+"=\partial"+string2
    for i in range(len(covariance)):
        string+=UnicodeMathChristoffelComp1(T,u[:],covariance,indexvar,i,derivvar)
    string+="=\partial"+string2
    for i in range(len(covariance)):
        string+=UnicodeMathChristoffelComp3(T,u[:],covariance,indexvar,indexvar2,i,derivvar)
    return string
def UnicodeMathContravariantDerivative(T,u,covariance,indexvar,indexvar2,indexvar3,derivvar):
    string2=UnicodeMathTensorGen(T,u,covariance)
    string="\nabla^〖"+derivvar+"〗 "+string2+"=〖g^〖"+derivvar+indexvar3+"〗〗\nabla_〖"+indexvar3+"〗 "+string2+"=〖g^〖"+derivvar+indexvar3+"〗〗(\partial_〖"+indexvar3+"〗 "+string2
    for i in range(len(covariance)):
        string+=UnicodeMathChristoffelComp1(T,u[:],covariance,indexvar,i,indexvar3)
    string+=")=〖g^〖"+derivvar+indexvar3+"〗〗(\partial_〖"+indexvar3+"〗 "+string2
    for i in range(len(covariance)):
        string+=UnicodeMathChristoffelComp3(T,u[:],covariance,indexvar,indexvar2,i,indexvar3)
    return string+")"
def LaTeXTensorGen(T,u,covariance):
    n=len(covariance)
    if(n==0):
        return T
    elif(n==1):
        return T+"_^"[covariance[0]]+"{"+u[0]+"}"
    string=T+"_^"[covariance[0]]+"{"+u[0]
    for i in range(1,n):
        if(covariance[i]!=covariance[i-1]):
            string+="}{}"+"_^"[covariance[i]]+"{"
        string+=u[i]
    return string+"}"
def LaTeXChristoffelComp1(T,u,covariance,indexvar,index,derivvar):
    string=""
    match covariance[index]:
        case 1:
            string+="+Γ{}_{"+derivvar+indexvar+"}^{"+u[index]+"}"
        case 0:
            string+="-Γ{}_{"+derivvar+u[index]+"}^{"+indexvar+"}"
    u[index]=indexvar
    return string+" "+LaTeXTensorGen(T,u,covariance)
def LaTeXChristoffelComp2(a,b,c,indexvar):
    return "\frac{1}{2}g^{"+c+indexvar+"}\left(\partial_{"+a+"}g_{"+b+indexvar+"}+\partial_{"+b+"}g_{"+a+indexvar+"}-\partial_{"+indexvar+"}g_{"+a+b+"}\right)"
def LaTeXChristoffelComp3(T,u,covariance,indexvar,indexvar2,index,derivvar):
    string=""
    match covariance[index]:
        case 1:
            string+="+"+LaTeXChristoffelComp2(derivvar,indexvar,u[index],indexvar2)
        case 0:
            string+="-"+LaTeXChristoffelComp2(derivvar,u[index],indexvar,indexvar2)
    u[index]=indexvar
    return string+LaTeXTensorGen(T,u,covariance)
def LaTeXCovariantDerivative(T,u,covariance,indexvar,indexvar2,derivvar):
    string2="_{"+derivvar+"} "+LaTeXTensorGen(T,u,covariance)
    string="\nabla"+string2+"=\partial"+string2
    for i in range(len(covariance)):
        string+=LaTeXChristoffelComp1(T,u[:],covariance,indexvar,i,derivvar)
    string+="=\partial"+string2
    for i in range(len(covariance)):
        string+=LaTeXChristoffelComp3(T,u[:],covariance,indexvar,indexvar2,i,derivvar)
    return string
def LaTeXContravariantDerivative(T,u,covariance,indexvar,indexvar2,indexvar3,derivvar):
    string2=LaTeXTensorGen(T,u,covariance)
    string="\nabla^{"+derivvar+"}"+string2+"=g^{"+derivvar+indexvar3+"}\nabla_{"+indexvar3+"}"+string2+"=g^{"+derivvar+indexvar3+"}\left(\partial_{"+indexvar3+"}"+string2
    for i in range(len(covariance)):
        string+=LaTeXChristoffelComp1(T,u[:],covariance,indexvar,i,indexvar3)
    string+="\right)=g^{"+derivvar+indexvar3+"}\left(\partial_{"+indexvar3+"}"+string2
    for i in range(len(covariance)):
        string+=LaTeXChristoffelComp3(T,u[:],covariance,indexvar,indexvar2,i,indexvar3)
    return string+"\right)"

编辑:添加对Tailwhip问题的回答:

print(LaTeXCovariantDerivative("T",["\nu ","\rho ","\sigma ","\lambda "],[0,0,0,1],"\kappa ","\theta ","\mu "))
$$nabla_{mu } T_{nu rho sigma }{}^{lambda }=partial_{mu } T_{nu rho sigma }{}^{lambda }-Γ{}_{mu nu }^{kappa } T_{kappa rho sigma }{}^{lambda }-Γ{}_{mu rho }^{kappa } T_{nu kappa sigma }{}^{lambda }-Γ{}_{mu sigma }^{kappa } T_{nu rho kappa }{}^{lambda }+Γ{}_{mu kappa }^{lambda } T_{nu rho sigma }{}^{kappa }=partial_{mu } T_{nu rho sigma }{}^{lambda }-frac{1}{2}g^{kappa theta }left(partial_{mu }g_{nu theta }+partial_{nu }g_{mu theta }-partial_{theta }g_{mu nu }right)T_{kappa rho sigma }{}^{lambda }-frac{1}{2}g^{kappa theta }left(partial_{mu }g_{rho theta }+partial_{rho }g_{mu theta }-partial_{theta }g_{mu rho }right)T_{nu kappa sigma }{}^{lambda }-frac{1}{2}g^{kappa theta }left(partial_{mu }g_{sigma theta }+partial_{sigma }g_{mu theta }-partial_{theta }g_{mu sigma }right)T_{nu rho kappa }{}^{lambda }+frac{1}{2}g^{lambda theta }left(partial_{mu }g_{kappa theta }+partial_{kappa }g_{mu theta }-partial_{theta }g_{mu kappa }right)T_{nu rho sigma }{}^{kappa }$$

编辑2:修复了LaTeX生成代码。显然,物理堆栈交换方程预览是混乱的,这导致我上传错误的代码,因为它是唯一的变体预览说工作。也修正了我为尾鞭做的编辑。真是个烦人的bug。

编辑3:我很抱歉他们那样对待你,尾巴。不幸的是,这种毒性在stackexchange上很常见。我知道你的评论帮助我在我的代码中找到了一个bug,更重要的是,在物理堆栈交换方程预览系统中也是如此。

最新更新