在 Javascript 中评估 Latex Math



我正在研究一个基于html的计算器,我想渲染一个表达式,然后计算它,所有这些都必须在Javascript中完成。我希望表达式是用 LaTeX 编写的,并且可以交互式地编辑渲染的表达式,但其他语言也可以工作。

我之前尝试过的是用MathQuill以交互方式呈现表达式,然后用MathJS评估它。然而,这在某种程度上是有效的,因为这两个包的设计目标不同(MathQuill渲染LaTeX,而MathJS有一个自定义的数学语法),它不能很好地工作(例如,如果用户输入frac{5}{17*x}并假设它是正确的语法,然后评估它并从MathJS得到一个错误)。

目前,我看到三种方法可以继续:

  • 继续我所拥有的(或者切换到MathJax - 哪个更好?
  • 查找同时进行渲染和评估的工具(无论是乳胶还是其他语言)
  • 查找两个用于使用接近(如果不是相同)语法进行渲染和评估的工具
  • 按照此处的建议编写我自己的渲染和评估工具。我宁愿不这样做,因为它看起来有点乏味,而且我不想重新发明轮子。
这样做

的韧皮方法是什么?

更新 1:在浏览了 altJS 提供的替代语言列表后,我认为我可以使用 Python、Ruby 或 Basic 作为用户输入的语言。如果我这样做了,它将为渲染它开辟很多可能性(从技术上讲,它不是"渲染",但只要想想那里有多少语法突出显示器)。但是,我不希望用户访问这些语言的更高级元素,因为这会增加我的用户的困惑,并且也可能不安全(例如使用eval)。我只希望用户能够使用数学运算、变量(只有那些我指定他们可以,也是用户创建的)和函数(只有我指定他们可以使用的函数,以及用户定义的函数)。 有没有办法限制可以使用的语言子集?

更新 2:我在 altJS 页面上查看了更多内容,并意识到几乎所有语言都被设计为将语言 XYZ 编译为 JavaScript,然后在页面上运行 JavaScript,而不是在页面上运行语言 XYZ。我没有研究过每一个,但大多数似乎都是这样的。其他的,如Brython,似乎被设计为在浏览器中运行XYZ语言,但作为JavaScript的替代/补充,而不是作为用户的输入语言。是否有一些解决方法,以便我可以使用这些方法作为输入?

更新3:感谢您@SpaceDog提供的信息,并指出我没有具体说明用户应该能够实现的目标。所以,这是我想要实现的功能:

  1. 基本运算(加法、减法、乘法、除法/分数、幂、根、模数)
  2. 函数
  3. (三角函数、日志等)
  4. 常量(e、pi 等)
  5. 变量(赋值、重新赋值和使用它们)
  6. 用户定义的函数

LaTeXCalc似乎满足所有这些要求,除了最后一个。此外,它似乎不在Javascript中。

这让我想到了另一个想法:使用类似 MathJax 的东西进行演示,然后使用 Wolfram Alpha API 来实际处理计算。好处是它将为输入和输出提供更高级的选项。但是,应用程序将变得无用(如果计算器实际上只是一个克隆,为什么不直接使用 wolframalpha.com?),它需要花钱,并且应用程序无法离线工作(它是一个桌面应用程序,用HTML/CSS/JS编写)。对此有何看法?

似乎你想做两件独立的事情,很好地显示方程并对其进行评估。因此,您需要一个可以同时执行这两项操作的工具。Latex更关注呈现而不是评估,尽管至少对于一个子集,可以对其进行评估(请参阅此答案:是否有带有LaTeX语法的计算器?

这在很大程度上取决于你想使计算器有多复杂——你想允许什么操作。如果您使用的是一小部分(听起来像是这样),那么手动编写转换器会非常容易。我会研究MathML,它既有表示标记,也有语义标记,还有许多可用的工具。但是,对于您的用户来说,它可能不是最容易掌握的。

如果用户熟悉 latex,并且包含的符号子集很小,那么将 latex 解析为可以直接评估的格式就很容易了。

我认为您需要准确定义允许用户访问的内容,以便任何人都可以提供更好的示例来说明什么是"最佳"。

编辑 -- 响应您的更新

好吧,你已经危险地接近编写一个完整的编程语言(你所需要的只是条件和循环 - 或标签)。因此,重新发明轮子听起来不是一个好主意。在这种情况下,我绝对不认为您希望LaTeX作为您的输入语言,理想情况下,您希望用户更熟悉一些语言。

接下来是我会做什么以及如果我要这样做我会从哪里开始,这不是一个明确的答案,在开始确保我没有重复努力之前,我会做更多的研究。

我会构建一个接受JavaScript子集的解析器,这个解析器将做两件事(或者会有两个解析器),一个是将代码转换为LaTeX或MathML,第二个是评估/执行代码。

离线执行此操作,在C中,我会转向Lex和Yacc(或Flex和Bison等),快速Google显示有一个Javascript等价物:Jison。这将为您提供该语言解析器的骨干,您可以对其进行修改。

或者从现有的JS解析器开始可能会有所帮助,试试这个答案:JavaScript中的JavaScript解析器。T

一旦你有了解析主干,你一开始就可以保持简单——翻译成可显示的语言应该相当容易,为了进行评估,你可能会冒着只使用eval的风险——因为解析器已经确保输入只使用你允许的内容。但是,我建议不要在生产版本中这样做(测试很好),并且将令牌映射到内部函数不需要太多额外的工作。

之后,您可能想改进显示的输出,也许您想尝试简化输入或重新排序以使其更有意义。这需要从解析器中获取内部表示并在其上做一些聪明的事情。但是,首先要让第一步起作用。

希望它离线工作,所以我的另一个想法是托管你引用的其他一些示例程序的服务器是行不通的(使用 Wolfram Alpha 或 Google 是一个不错的选择 - 但是,正如你所说,程序的意义何在)。但是你也可以考虑一下,如果你能更好地开始用不同的基础语言来写这个——尽管我猜你想要HTML/JS/CSS。

您链接的其他内容是所有其他可能的想法,我只是认为您将在内部拥有自己的解析器而不是依赖每个应用程序的第三方代码获得更多好处。使用您自己的解析器,您可以在以后轻松添加功能或语言功能。

最后的想法是,你不一定限制Javascript作为这种方法的输入。如果你认为你的用户会应付反向波兰符号,那么很容易手动编写一个解析器——但你必须做一些工作来很好地格式化它以获得输出。

最新更新