目前的工作内容需要开发一个类似 GeoGebra 的可视化输入函数绘图工具,目标用户是非专业人员,需要支持完全通过鼠标操作进行可视化输入。公式可以通过 LaTeX 渲染,但是不能让用户感知到有 LaTeX 的存在。公式有可能会复杂一点,比如下面这样:
y=\frac{2\tan\left(x\right)}{\log_{2}{\left|\sqrt[3]{3x}\right|}}
其实已经做了一部分了,基于 Web 前端开发,用了 MathQuill 库作为 LaTeX 表达式的渲染和可视化编辑;
另一方面通过 JS 函数绘图的方法也搞定了,没有使用现成的库,但是tan(x)
这种存在间断点的函数也是能正确绘制的;
目前最大的问题还是不知道怎么把用户通过 MathQuill 的库自定义输入的 LaTeX 表达式编译成 JS 函数。比如上面的tan(x)
,通过软键盘的方式输入过后,实际得到的 LaTeX 字符串是:
\tan\left(x\right)
又或者说进一步复杂点的对数函数,软键盘的方式输入(调用 MathQuill 的实例将当前的 LaTeX 表达式设置为\log_{2}{x}
)过后再次编辑,把 x 改成 x+1 ,表达式就会变成下面这样:
\log_2x+1
非常头疼。
本身我没有学过计算机专业课,不过大概知道这一块算是编译原理需要解决的内容,我在做的东西应该是一个基于 LaTeX 语法的 JS 表达式引擎,但光是知道这些还是不太够。
目前的成果是,找到了一款名叫 filtrex 的 npm 库,他是基于另一个叫做 jison 的库提供了基础的 JS 表达式引擎功能,而这个 jison 是 Bison 的 JS 版本,Bison 则是一款专业的语法分析工具。
通过 GPT-4o 添加了一些我设定的语法规则,实际用起来发现只能做到正确解析我预设的函数,真正的用户输入和 MathQuill 的输出千变万化,无法一一穷举。
比如我可以做到解析(x)^{2}
,但是把(x)
编辑成(x+1)
过后,整个式子会变成(x+1)^2
,jison 提示“Expecting 'LBRACE', got 'NUMBER'”,又无法解析了。更不要说\log_2x+1
这种看起来就没法解析的 LaTeX 了。
各位 V 友有什么好的建议吗?是不是我走的方向有点错误,不应该从直接解析 LaTeX 入手?还是说这个问题的复杂程度其实是我无法胜任的应该尽量改变需求?
1
tinytoadd 108 天前
|