Skip to content
Snippets Groups Projects
latex_transer.py 6.77 KiB
Newer Older
Augusta's avatar
Augusta committed
from sympy import *
Augusta's avatar
Augusta committed
Ee=E
Augusta's avatar
Augusta committed
'''
Augusta's avatar
Augusta committed
getUnit			'{} () [] \\'			独立表达模块
Augusta's avatar
Augusta committed
getIndepend		'abcd'					独立符号
getContinuous	'1234. a^b a_b {x'}'	连续符号
Augusta's avatar
Augusta committed
getElement		'* / '					强连续运算
getAll			'+ -'					弱连续运算(全部)
Augusta's avatar
Augusta committed
				'='						全表达式
'''
syms={
F CZ's avatar
F CZ committed
	"\\alpha","\\beta","\\gamma","\\varepsilon","\\varphi","\\lambda","\\mu","\\rho","\\theta","\\omega","\\Gamma","\\Delta","\\Omega","\\Lambda","\\Phi","\\Psi","\\delta","\\kappa"
Augusta's avatar
Augusta committed
}
basicNumber="1234567890."
def warning(warn):
Augusta's avatar
Augusta committed
	print("Unknow elem:",warn)
F CZ's avatar
F CZ committed
def getUnit(E,dep):
Augusta's avatar
Augusta committed
	dep=dep+1
F CZ's avatar
F CZ committed
	print(' '*dep*2,'>getUnit',E)
Augusta's avatar
Augusta committed
	res=''
Augusta's avatar
Augusta committed
	if E[0]=='{' or E[0]=='(' or E[0]=='[':
F CZ's avatar
F CZ committed
		res,E=getAll(E[1:],dep)
Augusta's avatar
Augusta committed
	elif E[:5]=='\\frac':
F CZ's avatar
F CZ committed
		elem1,E=getUnit(E[5:],dep)
		elem2,E=getUnit(E,dep)
Augusta's avatar
Augusta committed
		res=elem1/elem2
Augusta's avatar
Augusta committed
	elif E[0]=='^':
F CZ's avatar
F CZ committed
		elem1mE=getUnit(E[1:],dep)
		elem2,E=getUnit(E,dep)
Augusta's avatar
Augusta committed
		res=elem1/elem2
Augusta's avatar
Augusta committed
	elif E[:6]=='\\sqrt[':
F CZ's avatar
F CZ committed
		elem1,E=getUnit(E[5:],dep)
		elem2,E=getUnit(E,dep)
		print(elem1,elem2)
Augusta's avatar
Augusta committed
		res=pow(elem2,1/elem1)
Augusta's avatar
Augusta committed
	elif E[:5]=='\\sqrt':
F CZ's avatar
F CZ committed
		res,E=getUnit(E[5:],dep)
Augusta's avatar
Augusta committed
		res=sqrt(res)
	elif E[:5]=='\\sum^':#inf \\sum^{high}_{n=low}elem
F CZ's avatar
F CZ committed
		high,E=getIndepend(E[5:],dep)
Augusta's avatar
Augusta committed
		high=int(high)
F CZ's avatar
F CZ committed
		n,E=getContinuous(E[2:],dep)
Augusta's avatar
Augusta committed
		n=str(n)
F CZ's avatar
F CZ committed
		low,E=getAll(E[1:],dep)
Augusta's avatar
Augusta committed
		low=int(low)
F CZ's avatar
F CZ committed
		elem,E=getElement(E,dep)
Augusta's avatar
Augusta committed
		res=0
		for i in range(low,high+1):
F CZ's avatar
F CZ committed
			res+=elem.evalf(subs={n:i})
Augusta's avatar
Augusta committed
	elif E[:5]=='\\sum_':#inf \\sum_{n=low}^{high}elem
F CZ's avatar
F CZ committed
		n,E=getContinuous(E[6:],dep)
Augusta's avatar
Augusta committed
		n=str(n)
F CZ's avatar
F CZ committed
		low,E=getAll(E[1:],dep)
Augusta's avatar
Augusta committed
		low=int(low)
F CZ's avatar
F CZ committed
		high,E=getIndepend(E[1:],dep)
Augusta's avatar
Augusta committed
		high=int(high)
F CZ's avatar
F CZ committed
		elem,E=getElement(E,dep)
Augusta's avatar
Augusta committed
		res=0
		for i in range(low,high+1):
F CZ's avatar
F CZ committed
			res+=elem.evalf(subs={n:i})
Augusta's avatar
Augusta committed
	elif E[:5]=='\\log_':
F CZ's avatar
F CZ committed
		# print('here')
		log_,E=getIndepend(E[5:],dep)
		elem,E=getElement(E,dep)
Augusta's avatar
Augusta committed
		res=log(elem)/log(log_)
Augusta's avatar
Augusta committed
	elif E[:3]=='\\ln':
F CZ's avatar
F CZ committed
		elem,E=getContinuous(E[3:],dep)
Augusta's avatar
Augusta committed
		res=log(elem)
	elif E[:4]=='\\cos':
F CZ's avatar
F CZ committed
		elem,E=getContinuous(E[4:],dep)
Augusta's avatar
Augusta committed
		res=cos(elem)
	elif E[:4]=='\\sin':
F CZ's avatar
F CZ committed
		elem,E=getContinuous(E[4:],dep)
Augusta's avatar
Augusta committed
		res=sin(elem)
	elif E[:4]=='\\tan':
F CZ's avatar
F CZ committed
		elem,E=getContinuous(E[4:],dep)
Augusta's avatar
Augusta committed
		res=tan(elem)
	elif E[:4]=='\\cot':
F CZ's avatar
F CZ committed
		elem,E=getContinuous(E[4:],dep)
Augusta's avatar
Augusta committed
		res=cot(elem)
	elif E[:5]=='\\acos':
F CZ's avatar
F CZ committed
		elem,E=getContinuous(E[5:],dep)
Augusta's avatar
Augusta committed
		res=acos(elem)
	elif E[:5]=='\\asin':
F CZ's avatar
F CZ committed
		elem,E=getContinuous(E[5:],dep)
Augusta's avatar
Augusta committed
		res=asin(elem)
	elif E[:5]=='\\atan':
F CZ's avatar
F CZ committed
		elem,E=getContinuous(E[5:],dep)
Augusta's avatar
Augusta committed
		res=atan(elem)
	elif E[:5]=='\\acot':
F CZ's avatar
F CZ committed
		elem,E=getContinuous(E[5:],dep)
Augusta's avatar
Augusta committed
		res=acot(elem)
Augusta's avatar
Augusta committed
	elif E[:3]=='\\pi':
		res=pi
		E=E[3:]
	elif E[0]=='e' or E[0]=='E':
		res=E
		E=E[1:]
	elif E[:6]=='\\infty':
		res=oo
		E=E[6:]
	elif E[0]=='i':
		res=I
		E=E[1:]
Augusta's avatar
Augusta committed
	else:
		for s in syms:
Augusta's avatar
Augusta committed
			if E[:len(s)]==s:
Augusta's avatar
Augusta committed
				res=symbols(s,real=True)
Augusta's avatar
Augusta committed
				E=E[len(s):]
Augusta's avatar
Augusta committed
				break
Augusta's avatar
Augusta committed
			elif E[:len(s)-1]==s[1:]:
				res=symbols(s,real=True)
				E=E[len(s):]
				break
F CZ's avatar
F CZ committed
	print(' '*dep*2,'<getUnit',res,E)
Augusta's avatar
Augusta committed
	return res,E
F CZ's avatar
F CZ committed
def getIndepend(E,dep):
Augusta's avatar
Augusta committed
	dep=dep+1
F CZ's avatar
F CZ committed
	print(' '*dep*2,'>getIndepend',E)
Augusta's avatar
Augusta committed
	res=''
Augusta's avatar
Augusta committed
	if E[0]=='{' or E[0]=='(' or E[0]=='[' or E[0]=='\\' or E[0]=='^':
F CZ's avatar
F CZ committed
		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
	elif E[:3]=='\\pi':
		res=pi
		E=E[3:]
	elif E[0]=='e' or E[0]=='E':
		res=Ee
		E=E[1:]
	elif E[:6]=='\\infty':
		res=oo
		E=E[6:]
	elif E[0]=='i':
		res=I
Augusta's avatar
Augusta committed
		E=E[1:]
Augusta's avatar
Augusta committed
	else:
		for s in syms:
			if E[:len(s)]==s:
Augusta's avatar
Augusta committed
				res=symbols(s,real=True)
Augusta's avatar
Augusta committed
				E=E[len(s):]
				break
Augusta's avatar
Augusta committed
			elif E[:len(s)-1]==s[1:]:
				res=symbols(s,real=True)
				E=E[len(s):]
				break
Augusta's avatar
Augusta committed
		if res=='':
Augusta's avatar
Augusta committed
			res=symbols(E[0],real=True)
Augusta's avatar
Augusta committed
			E=E[1:]
F CZ's avatar
F CZ committed
	print(' '*dep*2,'<getIndepend',res,E)
Augusta's avatar
Augusta committed
	return res,E
F CZ's avatar
F CZ committed
def getIndependStr(E,dep):
Augusta's avatar
Augusta committed
	dep=dep+1
F CZ's avatar
F CZ committed
	print(' '*dep*2,'<getIndependStr',E)
Augusta's avatar
Augusta committed
	if E[0]=='{' or E[0]=='('or E[0]=='[':
		cnt=0
		s=""
		for i in E:
			if i=='{' or i=='('or E[0]=='[':
				cnt+=1
			elif i=='}' or i==')' or E[0]==']':
				cnt-=1
			s+=i
			if cnt==0:
				return s,E[len(s):]
	elif E[0] in "0123456789":
		return E[0],E[1:]
	elif E[:3]=='\\pi':
		return E[:3],E[3:]
	elif E[0]=='e' or E[0]=='E':
		return E[0],E[1:]
	elif E[:6]=='\\infty':
		return E[:6],E[6:]
	elif E[0]=='i':
		return E[0],E[1:]
	else:
		for s in syms:
			if E[:len(s)]==s:
				return s,E[len(s):]
		return E[0],E[1:]
F CZ's avatar
F CZ committed
	print(' '*dep*2,'<getIndepend',res,E)
Augusta's avatar
Augusta committed

F CZ's avatar
F CZ committed
def getContinuous(E,dep):
Augusta's avatar
Augusta committed
	dep=dep+1
F CZ's avatar
F CZ 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:
F CZ's avatar
F CZ committed
		res,E=getIndepend(E,dep)
Augusta's avatar
Augusta committed
		elem=str(res)
	if E!='':
		if E[0]=='^':
F CZ's avatar
F CZ committed
			elemSuper,E=getIndependStr(E[1:],dep)
Augusta's avatar
Augusta committed
			if E!='' and E[0]=='_':
F CZ's avatar
F CZ committed
				elemSub,E=getIndependStr(E[1:],dep)
Augusta's avatar
Augusta committed
				res=symbols(elem+'_'+elemSub,real=True)
Augusta's avatar
Augusta committed
			try:
F CZ's avatar
F CZ committed
				elemSuper,tmp=getIndepend(elemSuper,dep)
Augusta's avatar
Augusta committed
				res=pow(res,elemSuper)
			except:
Augusta's avatar
Augusta committed
				res=symbols(s+'^'+elemSuper,real=True)
Augusta's avatar
Augusta committed
		elif E[0]=='_':
F CZ's avatar
F CZ committed
			elemSub,E=getIndependStr(E[1:],dep)
Augusta's avatar
Augusta committed
			res=symbols(elem+'_'+elemSub,real=True)
Augusta's avatar
Augusta committed
			if E!='' and E[0]=='^':
				try:
F CZ's avatar
F CZ committed
					elemSuper,E=getIndepend(E[1:],dep)
Augusta's avatar
Augusta committed
					res=pow(res,elemSuper)
				except:
F CZ's avatar
F CZ committed
					elemSuper,E=getIndependStr(E[1:],dep)
Augusta's avatar
Augusta committed
					res=symbols(res+'^'+elemSuper,real=True)
F CZ's avatar
F CZ committed
	print(' '*dep*2,'<getContinuous',res,E)
Augusta's avatar
Augusta committed
	return res,E
F CZ's avatar
F CZ committed
def getElement(E,dep):
Augusta's avatar
Augusta committed
	dep=dep+1
F CZ's avatar
F CZ committed
	print(' '*dep*2,'>getElement',E)
	res,E=getContinuous(E,dep)
Augusta's avatar
Augusta committed
	while E!='':
		if E[0]=='*':
F CZ's avatar
F CZ committed
			elem,E=getContinuous(E[1:],dep)
Augusta's avatar
Augusta committed
			res=res*elem
Augusta's avatar
Augusta committed
		elif E[:5]=='\\cdot':
F CZ's avatar
F CZ committed
			elem,E=getContinuous(E[5:],dep)
Augusta's avatar
Augusta committed
			res=res*elem
		elif E[:6]=='\\times':
F CZ's avatar
F CZ committed
			elem,E=getContinuous(E[6:],dep)
Augusta's avatar
Augusta committed
			res=res*elem
Augusta's avatar
Augusta committed
		elif E[:4]=='\\ast':
F CZ's avatar
F CZ committed
			elem,E=getContinuous(E[4:],dep)
Augusta's avatar
Augusta committed
			res=res*elem
Augusta's avatar
Augusta committed
		elif E[0]=='/':
F CZ's avatar
F CZ committed
			elem,E=getContinuous(E[1:],dep)
Augusta's avatar
Augusta committed
			try:
				res=res/elem
			except ZeroDivisionError as e:
Augusta's avatar
Augusta committed
				print(e)
		elif E[:4]=='\\div':
F CZ's avatar
F CZ committed
			elem,E=getContinuous(E[4:],dep)
Augusta's avatar
Augusta committed
			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]!=')' and E[0]!=']':
F CZ's avatar
F CZ committed
			elem,E=getContinuous(E,dep)
Augusta's avatar
Augusta committed
			res=res*elem
		else:
			break
F CZ's avatar
F CZ committed
	print(' '*dep*2,'<getElement',res,E)
Augusta's avatar
Augusta committed
	return res,E
F CZ's avatar
F CZ committed
def getAll(E,dep):
Augusta's avatar
Augusta committed
	dep=dep+1
F CZ's avatar
F CZ committed
	print(' '*dep*2,'>getAll',E)
Augusta's avatar
Augusta committed
	if E[0]=='+':
F CZ's avatar
F CZ committed
		res,E=getElement(E[1:],dep)
Augusta's avatar
Augusta committed
	elif E[0]=='-':
F CZ's avatar
F CZ committed
		res,E=getElement(E[1:],dep)
Augusta's avatar
Augusta committed
		res=-res
Augusta's avatar
Augusta committed
	elif E[0]=='}' or E[0]==')' or E[0]==']':
		res=''
Augusta's avatar
Augusta committed
	else:
F CZ's avatar
F CZ committed
		res,E=getElement(E,dep)
Augusta's avatar
Augusta committed
	while E!='':
		if E[0]=='+':
F CZ's avatar
F CZ committed
			elem,E=getElement(E[1:],dep)
Augusta's avatar
Augusta committed
			res=res+elem
		elif E[0]=='-':
F CZ's avatar
F CZ committed
			elem,E=getElement(E[1:],dep)
Augusta's avatar
Augusta committed
			res=res-elem
		else:
			break
	E=E[1:]
F CZ's avatar
F CZ committed
	print(' '*dep*2,'<getAll',res,E)
Augusta's avatar
Augusta committed
	return res,E
def Trans(E):
F CZ's avatar
F CZ committed
	if E=='':
		return E
Augusta's avatar
Augusta committed
	print('Trans',E,type(E))
	if type(E)==str:
		E='{'+E+'}'
	else:
		E='{'+str(E)+'}'
Augusta's avatar
Augusta committed
	E=E.replace(' ','')
Augusta's avatar
Augusta committed
	E=E.replace('/_','/')
Augusta's avatar
Augusta committed
	try:
F CZ's avatar
F CZ committed
		res,E=getUnit(E,0)
		print('trans got',res)
Augusta's avatar
Augusta committed
		return cancel(ratsimp(expand_log(simplify(res))))
Augusta's avatar
Augusta committed
	except BaseException as e:
		print(e)
		return 'error'
Augusta's avatar
Augusta committed
def Trans_equal(E):
Augusta's avatar
Augusta committed
	for i in range(len(E)):
		if E[i]=='=':
			return Trans('('+E[:i]+')-('+E[i+1:]+')')
F CZ's avatar
F CZ committed
	print("Trans_equal",E)
Augusta's avatar
Augusta committed
	return Trans(E)
Augusta's avatar
Augusta committed
if __name__=='__main__':
	# E=input('')
Augusta's avatar
Augusta committed
	E='\\lnx^3'
Augusta's avatar
Augusta committed
	res=Trans(E)
Augusta's avatar
Augusta committed
	print(res)