前提
数式の文字列をLATEXの数式モードで表示したいです。(こちらのページを参考)
プログラム自体はエラーなく通るものの、LATEXで数式を表示しようとするとエラーが出るので、正しく動作していないと思います。
実現したいこと
数式の文字列をLATEXの数式モードで出力するよう変換するプログラムの修正をしたい。
発生している問題・エラーメッセージ
以下、LATEXによるエラーメッセージです。
Missing } inserted. ...{e}}}{log(x)}}{+(-1)}\frac0.1\frac\frac{e} Ambiguous; you need another { and }. ...{e}}}{log(x)}}{+(-1)}\frac0.1\frac\frac{e} Extra }, or forgotten $. ...{e}}}{log(x)}}{+(-1)}\frac0.1\frac\frac{e} etc...
この3行のエラーが立て続けに出ています。
該当のソースコード
Python
1各リストの要素がもつ引数の値を返す関数.例えばaddならadd(1,x)=1+xを表し,引数は1とxの2つとなる. 2def getArity(name): 3 if name in ["x","-1","0","1","0.5","0.1","pi","e"]: 4 return 0 5 elif name in ["sin","cos","tan","log","exp","sqrt"]: 6 return 1 7 elif name in ["add","sub","mul","div"]: # 四則演算記号 8 return 2 9 else: 10 print("bug : not define ",name) 11 exit() 12 13# 演算記号とそれがもつ引数の数をタプルで返す。(例)('div', 2)、('sqrt', 1) 14def addArityInfo(array): 15 new_array = [(name,getArity(name)) for name in array] 16 return new_array 17 18# TeXの数式記述形式に変換する関数 19def transformTexForm(array): 20 def getEnd(start,array): 21 _sum = 1 22 for i in range(start,len(array)): 23 arity = array[i][1] 24 _sum += arity -1 25 if _sum == 0: 26 return i+1 27 mid_end_indexs = [] 28 loopflg = True 29 while loopflg: 30 loopflg = False 31 for i in range(len(array)): 32 name,arity = array[i] 33 if arity == 2: 34 loopflg = True 35 end = getEnd(i,array) 36 mid = getEnd(i+1,array) 37 if name == "add": 38 array.insert(mid,("+",1)) 39 del array[i] 40 if name == "sub": 41 array.insert(mid,("-",1)) 42 del array[i] 43 if name == "mul": 44 array.insert(mid,(" ",1)) 45 del array[i] 46 if name == "div": 47 array[i] = ("frac",1) 48 break 49 for i in range(len(array)): 50 if array[i][0] == "frac": 51 array[i] = ("\\frac",2) 52 if array[i][0] == "pi": 53 array[i] = ("\\pi",0) 54 str_arr = [""] 55 for node in array: 56 name,arity = node 57 for i in range(len(str_arr)): 58 if str_arr[i] == "": 59 if arity == 0: 60 str_arr = str_arr[:i] + [name] + str_arr[i+1:] 61 if arity == 1: 62 if name == "sqrt": 63 name = "\\"+name 64 str_arr = str_arr[:i] + [name,"{","","}"]+ str_arr[i+1:] 65 else: 66 str_arr = str_arr[:i] + [name,"(","",")"]+ str_arr[i+1:] 67 if arity == 2: 68 temp = [name,"{","","}{","","}"] 69 str_arr = str_arr[:i] + temp+ str_arr[i+1:] 70 break 71 if "" not in str_arr: 72 str_arr.append(name) 73 str_arr.append("") 74 return "".join(str_arr) 75 76# string: 変換する数式 77string = "div(cos(mul(0.5,0.1)),cos(add(cos(add(sin(e),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))),mul(div(div(div(0.1,div(div(e,x),div(0.1,e))),div(div(e,add(x,-1)),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),x),div(0.1,div(div(e,x),div(0.1,e))))),div(div(0.1,div(div(e,x),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))))))" 78array = [] 79s = "" 80for c in string: 81 if c in "(),": 82 if s != "": 83 array.append(s) 84 s = "" 85 else: 86 s+=c 87array = addArityInfo(array) 88print(transformTexForm(array))
ソースコードの出力
\frac{cos(0.5)}{ (0.1)}coscos(sin(e))+\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{log(x)}}{+(-1)}\frac0.1\frac\frac{e}{x}\frac0.1e+(\frac{\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{e}{x}}{+(-1)}}}{\frac{0.1}{e}})\frac\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{x}\frac0.1\frac\frac{e}{x}\frac0.1e (\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{log(x)}}{+(-1)}})\frac0.1\frac\frac{e}{x}\frac0.1e
試したこと
LATEXのエラーより、LATEXの数式コードに変換する際、{}が正しく出力されていない気がしています。
またソースコードの出力を見ると、cosのあとに()がなかったり、mulの書き換えがうまくできていないように思います。
LATEXでの掛け算記号は\timesとあったので、array.insert(mid,("times", 1))、if array[i][0] == 'times';
python
1array.insert(mid,("times", 1)) 2 3if array[i][0] == 'times'; 4array[i] = ('\\times)
とdivと同様に処理を書き換えたがうまくいかなかった。
簡単な数式で試した場合、
(例)cos(0.5*0.1) / cos(1+x)をLATEXで表示できるように変換したい。
string = "div(cos(mul(0.5,0.1)),cos(add(1,x)))"
として、変換を行うと、
\frac{cos(0.5)}{ (0.1)}cos1+x
と出力されます。\frac{cos(0.5*0.1)}{cos(1+x)}が正しい出力だと思います。
三角関数、根号、指数・対数関数の()内の処理が誤っているようです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー