/// <summary> /// LaTeX的な数式を普通の数式に変換 /// </summary> /// <param name="s"></param> /// <returns></returns> public static string LaTeXtoFormula(string s) { if (s.Contains("{")) { for (int i = 0; i < s.Length; i++) { if (s[i] == '~') { var LaTeXFuncName = Regex.Replace(s.Substring(i), "^~(\\w+)\\{.*$", "$1"); switch (LaTeXFuncName) { case "frac": var Numor = OperateBrackets.TakeoutInsideofBracket(s.Substring(i + LaTeXFuncName.Length + 1), 0, "{}"); var Denor = OperateBrackets.TakeoutInsideofBracket(s.Substring(i + LaTeXFuncName.Length + 1 + Numor.Length + 2), 0, "{}"); s = s.Remove(i, 9 + Numor.Length + Denor.Length); s = s.Insert(i, "(" + LaTeXtoFormula(Numor) + ")/(" + LaTeXtoFormula(Denor) + ")"); break; case "root": var rootindx = OperateBrackets.TakeoutInsideofBracket(s.Substring(i + LaTeXFuncName.Length + 1), 0, "{}"); var radicant = OperateBrackets.TakeoutInsideofBracket(s.Substring(i + LaTeXFuncName.Length + 1 + rootindx.Length + 2), 0, "{}"); s = s.Remove(i, 9 + rootindx.Length + radicant.Length); s = s.Insert(i, "#$root$#(" + LaTeXtoFormula(rootindx) + "," + LaTeXtoFormula(radicant) + ")"); break; default: var parameters = new List <string>(); var searchingindex = 0; while (true) { var inside = OperateBrackets.TakeoutInsideofBracket(s.Substring(LaTeXFuncName.Length + 1 + i), searchingindex, "{}"); parameters.Add(inside); searchingindex += inside.Length + 2; if (s.Length <= searchingindex + LaTeXFuncName.Length + 1 || (s.Length > searchingindex + LaTeXFuncName.Length + 1 && s[searchingindex + LaTeXFuncName.Length + 1] != '{')) { break; } } s = s.Remove(i, LaTeXFuncName.Length + 1 + searchingindex); s = s.Insert(i, "#$" + LaTeXFuncName + "$#(" + string.Join(",", parameters) + ")"); break; } } else if (s[i] == '^' && i + 1 < s.Length && s[i + 1] == '{') { var content = OperateBrackets.TakeoutInsideofBracket(s.Substring(i + 1), 0, "{}"); s = s.Remove(i, 3 + content.Length); s = s.Insert(i, "^(" + LaTeXtoFormula(content) + ")"); } } } return(s); }
/// <summary> /// 文字式(未整理)の累乗を処理 /// </summary> /// <param name="f"></param> /// <returns></returns> public static async Task <string> ExpandPowAsync(string f) { if (f.Contains("^")) { f = Regex.Replace(f, "^\\^(\\+|-)?(\\d|\\.)*", ""); //頭の累乗記号+数字は消す f = Regex.Replace(f, "\\^$", ""); //末尾の累乗記号も消す f = Regex.Replace(f, "\\^([a-z|A-Z])", "$1"); //文字で累乗されている場合は累乗をなかったことにする f = Regex.Replace(f, "[a-z|A-Z]\\^(\\d)+", Match => { return(new string(Match.Value.First(), int.Parse(Regex.Replace(Match.Value, "(.*)(\\d+)(.*)", "$2")))); }); while (f.Contains("^")) { int PowIndex = f.IndexOf('^'); if (PowIndex == 0) { throw new Exception(AppResources.PowerMustTop); } string Powed = "1"; if (f[PowIndex - 1] == ')') { //Xamarin.Forms.DependencyService.Get<IToastService>() //.Show("括弧に'^'は付けられません"); Powed = "(" + OperateBrackets.TakeoutInsideofBracket(f, PowIndex - 2) + ")"; throw new Exception(AppResources.CantAddPowerAfterParenthes); } else if (Regex.IsMatch(f[PowIndex - 1].ToString(), "(\\+|-)?(\\d|\\.)")) { Powed = Regex.Match(f.Substring(0, PowIndex), "(\\+|-)?(\\d+|\\.)$").Value; } else { Powed = f[PowIndex - 1].ToString(); } Double Powist = 1.0; if (f[PowIndex + 1] == '(') { var content = OperateBrackets.TakeoutInsideofBracket(f, PowIndex + 1); if (Regex.IsMatch(content, "[a-z]")) { throw new Exception(AppResources.CantAddPowerAfterChar); } Powist = await SolveNumFormulas.SolveNumFormula(content); f = f.Remove(PowIndex - 1, content.Length + 4);//^の分(1)+カッコの分(2)+ } else { var content = Regex.Match(f.Substring(PowIndex), "^(\\+|-)?(\\d|\\.)+").Value; Powist = double.Parse(content); f = f.Remove(PowIndex - 1, content.Length + 2); } var repeated = ""; if (double.TryParse(Powed, out double Poweddouble)) { repeated = Math.Pow(Poweddouble, Powist).ToString(); } else { repeated = string.Concat(Enumerable.Repeat(Powed, (int)Powist)); } f = f.Insert(PowIndex - 1, repeated); } } return(f); }