Skip to content
Snippets Groups Projects
latex_transer.py 5.04 KiB
Newer Older
Augusta's avatar
Augusta committed
from sympy import *
'''
getUnit			'{} () \\'				独立表达模块
getIndepend		'abcd'					独立符号
getContinuous	'1234. a^b a_b {x'}'	连续符号
getElement		'* / '					浅连续表达
getAll			'+ -'					强连续表达(全部)
				'='						全表达式
'''
syms={
	"alpha","beta","gamma","delta","varepsilon","varphi","lambda","mu","rho","sigma","omega","Gamma","Delta","Theta","Lambda","Xi","Pi","Sigma","Upsilon","Phi","Psi","Omega"
}
basicNumber="1234567890."
def warning(warn):
Augusta's avatar
Augusta committed
	print("Unknow elem:",warn)
Augusta's avatar
Augusta committed
def getUnit(E,dep):
	dep=dep+1
Augusta's avatar
Augusta committed
	# print(' '*dep*2,'>getUnit',E)
Augusta's avatar
Augusta committed
	res=''
	if E[0]=='{' or E[0]=='(':
		res,E=getAll(E[1:],dep)
	elif E[:5]=='\\frac':
		elem1,E=getUnit(E[5:],dep)
		elem2,E=getUnit(E,dep)
		res=elem1/elem2
	elif E[:5]=='\\sqrt':
		res,E=getUnit(E[5:],dep)
		res=sqrt(res)
	elif E[:8]=='\\nthroot':
		elem1,E=getUnit(E[8:],dep)
		elem2,E=getUnit(E,dep)
		res=pow(elem1,1/elem2)
	elif E[:5]=='\\sum^':#inf \\sum^{high}_{n=low}elem
		high,E=getIndepend(E[5:],dep)
		high=int(high)
		n,E=getContinuous(E[2:],dep)
		n=str(n)
		low,E=getAll(E[1:],dep)
		low=int(low)
		elem,E=getElement(E,dep)
		res=0
		for i in range(low,high+1):
			res+=elem.evalf(subs={n:i})
	elif E[:5]=='\\sum_':#inf \\sum_{n=low}^{high}elem
		n,E=getContinuous(E[6:],dep)
		n=str(n)
		low,E=getAll(E[1:],dep)
		low=int(low)
		high,E=getIndepend(E[1:],dep)
		high=int(high)
		elem,E=getElement(E,dep)
		res=0
		for i in range(low,high+1):
			res+=elem.evalf(subs={n:i})
	elif E[:5]=='\\log_':
Augusta's avatar
Augusta committed
		# print('here')
Augusta's avatar
Augusta committed
		log_,E=getIndepend(E[5:],dep)
		elem,E=getElement(E,dep)
		res=log(elem)/log(log_)
	elif E[:5]=='\\ln':
		elem,E=getContinuous(E,dep)
		res=log(elem)
	elif E[:4]=='\\cos':
		elem,E=getContinuous(E[4:],dep)
		res=cos(elem)
	elif E[:4]=='\\sin':
		elem,E=getContinuous(E[4:],dep)
		res=sin(elem)
	elif E[:4]=='\\tan':
		elem,E=getContinuous(E[4:],dep)
		res=tan(elem)
	elif E[:4]=='\\cot':
		elem,E=getContinuous(E[4:],dep)
		res=cot(elem)
	elif E[:5]=='\\acos':
		elem,E=getContinuous(E[4:],dep)
		res=acos(elem)
	elif E[:5]=='\\asin':
		elem,E=getContinuous(E[4:],dep)
		res=asin(elem)
	elif E[:5]=='\\atan':
		elem,E=getContinuous(E[4:],dep)
		res=atan(elem)
	elif E[:5]=='\\acot':
		elem,E=getContinuous(E[4:],dep)
		res=acot(elem)
	else:
		for s in syms:
			if E[:len(s)+1]=='\\'+s:
				res=symbols(s)
				E=E[len(s)+1:]
				break
Augusta's avatar
Augusta committed
	# print(' '*dep*2,'<getUnit',res,E)
Augusta's avatar
Augusta committed
	return res,E
def getIndepend(E,dep):
	dep=dep+1
Augusta's avatar
Augusta committed
	# print(' '*dep*2,'>getIndepend',E)
Augusta's avatar
Augusta committed
	if E[0]=='{' or E[0]=='(' or E[0]=='\\':
		res,E=getUnit(E,dep)
Augusta's avatar
Augusta committed
	elif E[0] in "0123456789":
		res=int(E[0])
		E=E[1:]
Augusta's avatar
Augusta committed
	else:
		res=symbols(E[0])
		E=E[1:]
Augusta's avatar
Augusta committed
	# print(' '*dep*2,'<getIndepend',res,E)
Augusta's avatar
Augusta committed
	return res,E
def getIndependStr(E,dep):
	cnt=0
	s=""
	for i in E:
		if i=='{':
			cnt+=1
		elif i=='}':
			cnt-=1
		s+=i
		if cnt==0:
			return s,E[len(s):]
def getContinuous(E,dep):
	dep=dep+1
Augusta's avatar
Augusta committed
	# print(' '*dep*2,'>getContinuous',E)
Augusta's avatar
Augusta committed
	s=""
	for i in E:
		if i in basicNumber:
			s=s+i
		else:
			break
	if s!='':
		elem=s
		try:
			res=int(elem)
		except:
			res=float(elem)
		E=E[len(elem):]
	else:
		res,E=getIndepend(E,dep)
		elem=str(res)
	if E!='':
		if E[0]=='^':
			elemSuper,E=getIndependStr(E[1:],dep)
			if E!='' and E[0]=='_':
				elemSub,E=getIndependStr(E[1:],dep)
				res=symbols(elem+'_'+elemSub)
			try:
				elemSuper,tmp=getIndepend(elemSuper)
				res=pow(res,elemSuper)
			except:
				res=symbols(s+'^'+elemSuper)
		elif E[0]=='_':
			elemSub,E=getIndependStr(E[1:],dep)
			res=symbols(elem+'_'+elemSub)
			if E!='' and E[0]=='^':
				try:
					elemSuper,E=getIndepend(E[1:],dep)
					res=pow(res,elemSuper)
				except:
					elemSuper,E=getIndependStr(E[1:],dep)
					res=symbols(res+'^'+elemSuper)
Augusta's avatar
Augusta committed
	# print(' '*dep*2,'<getContinuous',res,E)
Augusta's avatar
Augusta committed
	return res,E
def getElement(E,dep):
	dep=dep+1
Augusta's avatar
Augusta committed
	# print(' '*dep*2,'>getElement',E)
Augusta's avatar
Augusta committed
	res,E=getContinuous(E,dep)
	while E!='':
		if E[0]=='*':
			elem,E=getContinuous(E[1:],dep)
			res=res*elem
Augusta's avatar
Augusta committed
		elif E[:5]=='\\cdot':
			elem,E=getContinuous(E[5:],dep)
			res=res*elem
		elif E[:6]=='\\times':
			elem,E=getContinuous(E[6:],dep)
			res=res*elem
Augusta's avatar
Augusta committed
		elif E[0]=='/':
			elem,E=getContinuous(E[1:],dep)
			try:
				res=res/elem
			except ZeroDivisionError as e:
Augusta's avatar
Augusta committed
				print(e)
		elif E[:4]=='\\div':
			elem,E=getContinuous(E[4:],dep)
			try:
				res=res/elem
			except ZeroDivisionError as e:
				print(e)
Augusta's avatar
Augusta committed
		elif E[0]!='+' and E[0]!='-' and E[0]!='}' and E[0]!=')':
			elem,E=getContinuous(E,dep)
			res=res*elem
		else:
			break
Augusta's avatar
Augusta committed
	# print(' '*dep*2,'<getElement',res,E)
Augusta's avatar
Augusta committed
	return res,E
def getAll(E,dep):
	dep=dep+1
Augusta's avatar
Augusta committed
	# print(' '*dep*2,'>getAll',E)
Augusta's avatar
Augusta committed
	if E[0]=='+':
		res,E=getElement(E[1:],dep)
	elif E[0]=='-':
		res,E=getElement(E[1:],dep)
		res=-res
	else:
		res,E=getElement(E,dep)
	while E!='':
		if E[0]=='+':
			elem,E=getElement(E[1:],dep)
			res=res+elem
		elif E[0]=='-':
			elem,E=getElement(E[1:],dep)
			res=res-elem
		else:
			break
	E=E[1:]
Augusta's avatar
Augusta committed
	# print(' '*dep*2,'<getAll',res,E)
Augusta's avatar
Augusta committed
	return res,E
def Trans(E):
Augusta's avatar
Augusta committed
	if E=='':
		return E
Augusta's avatar
Augusta committed
	E='{'+E+'}'
	E=E.replace(' ','')
	res,E=getUnit(E,0)
Augusta's avatar
Augusta committed
	print(latex(res))
Augusta's avatar
Augusta committed
	return res
if __name__=='__main__':
	# E=input('')
Augusta's avatar
Augusta committed
	E=' \\sum^{10+20}_{n=5}(n\\cdot\\omega)+3'
Augusta's avatar
Augusta committed
	res=Trans(E)
	print(simplify(res))