如何使用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,更重要的是,在物理堆栈交换方程预览系统中也是如此。