在Javascript中评估Latex数学

hkk*_*hkk 11 javascript interpreter latex renderer

我正在研究一个基于html的计算器,我想渲染一个表达式,然后对它进行评估,所有这一切都必须在Javascript中完成.我更喜欢用LaTeX编写表达式,并且可以交互式编辑渲染表达式,但其他语言可以工作.

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

目前,我看到三种方法:

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

做这个的麻烦方法是什么?

更新1:在查看altJS提供的替代语言列表后,我认为我可以使用Python,Ruby或Basic作为用户输入的语言.如果我这样做,它将为渲染它开辟如此多的可能性(从技术上讲,它不是"渲染",而只是考虑那里有多少语法荧光笔).但是,我不希望用户访问这些语言的更高级元素,因为它会给我的用户增加混乱,也可能不安全(如使用eval).我只希望用户能够使用数学运算,变量(只有我指定的那些,也可以是用户创建的)和函数(只有我指定的那些,他们可以,也是用户定义的).有没有办法限制可以使用的语言子集?

更新2:我看了看周围的一些altJS页的详细,并发现几乎所有的语言被设计成编译语言XYZ为JavaScript,然后在网页上运行JavaScript的,而不是运行语言XYZ 在页面上.我没有看过每一个,但大多数看起来都像这样.其他人,比如Brython,似乎被设计为在浏览器中运行语言XYZ,但作为JavaScript的替代/补充,而不是作为用户的输入语言.是否有一些解决方法,所以我可以使用这些方法作为输入?

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

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

除最后一项外,LaTeXCalc似乎满足所有这些要求.此外,它似乎不是在Javascript中.

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

Spa*_*Dog 7

看起来你想做两件事,很好地展示方程并对其进行评估.所以你需要一个能同时做到这一点的工具 Latex更侧重于表示而不是评估,尽管可以评估它(参见这个答案:是否有一个带LaTeX语法的计算器?)至少对于一个子集.

这很大程度上取决于你想要计算器的复杂程度 - 你想要允许的操作.如果您使用的是一个小子集(听起来像是这样),那么手工编写转换器非常容易.我会研究具有表示和语义标记的MathML - 以及许多可用的工具.但是,它可能不是您的用户最容易掌握的.

如果用户熟悉乳胶,并且所包含符号的子集很小,那么将乳胶解析为可以直接评估的格式就足够了.

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

编辑 - 响应您的更新

好吧,你危险地接近编写一个完整的编程语言(你需要的只是条件和循环 - 或标签).所以重新发明轮子并不是一个好主意.在这种情况下,我绝对不认为你想要LaTeX作为你的输入语言,理想情况下你想要用户更熟悉的东西.

以下是我会做什么,并在那里,如果我将开始打算这样做,这不是一个明确的答案,并开始,以确保我不会重复劳动之前,我会做更多的事情的研究.

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

离线执行此操作,在C中,我会转向Lex和Yacc(或Flex和Bison等),快速Google会发现有一个等效的Javascript:Jison.这将为您提供语言解析器的主干,您可以修改它.

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

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

之后你可能想看看改进显示的输出,也许你想尝试简化输入或重新排序以使其更有意义.这需要从解析器中获取内部表示并在其上执行一些聪明的操作.但要先迈出第一步.

你希望这个离线工作,所以我的另一个想法是服务器托管你引用的其他一些示例程序是行不通的(使用Wolfram Alpha或Google是一个很好的选择 - 但是,正如你所说,什么是程序的重点然后).但是你也可以考虑一下你是否能用更好的基础语言开始写这个 - 尽管我猜你想要HTML/JS/CSS的可移植性.

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

最后的想法,你不一定限制Javascript作为这种方法的输入.如果您认为您的用户将使用反向波兰表示法,那么手动编写解析器很容易 - 但是您必须做一些很好的格式化输出的工作.