2013-11-15 13 views
10

Ich arbeite an einem HTML-basierten Rechner, und ich möchte einen Ausdruck rendern, dann bewerten, und all dies muss in Javascript erfolgen. Ich würde es vorziehen, wenn der Ausdruck in LaTeX geschrieben wird und es möglich ist, den gerenderten Ausdruck interaktiv zu bearbeiten, aber andere Sprachen könnten funktionieren.Bewertung von Latex Math in Javascript

Was ich zuvor versucht habe, ist, den Ausdruck interaktiv mit MathQuill zu rendern und dann mit MathJS auszuwerten. Dies funktioniert bis zu einem gewissen Grad jedoch, da die beiden Pakete unterschiedliche Ziele haben (MathQuill macht LaTeX, während MathJS eine benutzerdefinierte mathematische Syntax hat), funktioniert es nicht perfekt (zB wenn ein Benutzer \frac{5}{17*x} eintippt und davon ausgeht) es ist die korrekte Syntax, dann wertet es aus und bekommt einen Fehler von MathJS).

Derzeit sehe ich drei Möglichkeiten fortzufahren: (? Oder vielleicht zu MathJax- wechseln, die besser ist)

  • weiter mit dem, was ich habe.
  • ein Werkzeug finden, das Rendering tut und Auswertung (ob es in Latex oder einer anderen Sprache ist)
  • Finden Sie zwei Werkzeuge für die Darstellung und Auswertung mit der Nähe (wenn nicht gleich) Syntax
  • mein eigenes Rendering schreiben und Bewertungswerkzeug, wie empfohlen here. Ich würde es vorziehen, dies nicht zu tun, weil es irgendwie langweilig erscheint, und ich möchte das Rad nicht neu erfinden.

Was ist der Bast Weg, dies zu tun?

Update 1: Nachdem bei altJS durch die Liste der alternativen Sprachen suchen, ich glaube, ich Python, Ruby, oder Basic als Sprache für die Benutzereingabe nutzen könnte. Wenn ich das tun würde, würde es so viele Möglichkeiten eröffnen, es zu rendern (technisch gesehen ist es kein "Rendering", sondern denke nur darüber nach, wie viele Syntax-Highlighter da draußen sind). Ich möchte jedoch nicht, dass Benutzer auf die fortgeschritteneren Elemente dieser Sprachen zugreifen können, da dies zu Verwirrung bei meinen Benutzern führen würde und auch unsicher sein könnte (wie bei Verwendung von eval). Ich möchte nur, dass Benutzer in der Lage sind, mathematische Operationen, Variablen (nur diejenigen, die ich angeben kann, und auch vom Benutzer erstellt) und Funktionen (nur diejenigen, die ich angeben kann, und auch benutzerdefiniert) zu verwenden. Gibt es eine Möglichkeit, die Teilmenge der Sprache zu beschränken, die verwendet werden kann?

Update 2: sah ich einige um mehr auf der altJS Seite, und erkennen, dass fast alle Sprachen entwickelt wurden Sprache XYZ JavaScript zu kompilieren, dann das JavaScript auf der Seite läuft, statt Laufe Sprache XYZ auf der Seite. Ich habe nicht jeden Einzelnen untersucht, aber die meisten scheinen so zu sein. Andere, wie Brython, scheinen so konzipiert zu sein, dass sie die Sprache XYZ im Browser ausführen, aber als Ersatz/Ergänzung zu JavaScript statt als Eingabesprache für den Benutzer. Gibt es eine Problemumgehung, damit ich diese Methoden als Eingabe verwenden kann?

Update 3: Vielen Dank an @SpaceDog für diese Informationen, und um darauf hinzuweisen, dass ich nicht spezifisch darin gewesen bin, was Benutzer erreichen sollten. So, hier ist die Funktionalität, die ich will erreicht werden:

  1. Grundfunktionen (Addition, Subtraktion, Multiplikation, Division/Fraktionen, Potenzierung, Wurzeln, Modul)
  2. Funktionen (trigonometrische Funktionen, Protokolle, usw.)
  3. Konstanten (e, pi, etc.)
  4. Variablen (Zuordnung, Neuzuordnung, und mit ihnen)
  5. Benutzerdefinierte Funktionen

LaTeXCalc all diesen Anforderungen gerecht zu werden scheint, mit Ausnahme der Letzter. Es scheint auch nicht in Javascript zu sein.

Dies bringt mich zu einer anderen Idee, die ich mir gedacht habe: Verwenden Sie etwas wie MathJax für die Präsentation, dann verwenden Sie Wolfram Alpha API, um tatsächlich die Berechnung zu behandeln. Die Vorteile sind, dass es viel mehr erweiterte Optionen für Eingabe und Ausgabe hätte. Allerdings wäre die Anwendung nutzlos (warum nicht einfach wolframalpha.com verwenden, wenn der Rechner praktisch nur ein Klon ist?), Es kostet Geld und die App würde nicht offline funktionieren (es ist eine Desktop-App, geschrieben in HTML)/CSS/JS). Gedanken dazu?

+0

Vielleicht kann meine Antwort auf [diese] (http://stackoverflow.com/a/42232776) ähnliche Frage helfen. – Jeff

Antwort

5

Es scheint, Sie wollen zwei getrennte Dinge tun, schön die Gleichung anzeigen und bewerten. Sie brauchen also ein Werkzeug, das beides tut. Latex konzentriert sich eher auf die Präsentation als auf die Bewertung, obwohl es möglich ist, zumindest für eine Teilmenge (siehe diese Antwort: Is there a calculator with LaTeX-syntax?) zu bewerten.

Eine Menge davon hängt davon ab, wie komplex Sie den Rechner machen wollen - welche Operationen Sie erlauben wollen. Wenn Sie eine kleine Teilmenge verwenden (und es klingt wie Sie sind), wäre es ziemlich einfach, den Konverter von Hand zu schreiben. Ich würde in MathML schauen, die sowohl Präsentation als auch semantisches Markup - und viele verfügbare Werkzeuge hat. Es ist jedoch möglicherweise nicht das einfachste für Ihre Benutzer zu erfassen.

Wenn Benutzer mit Latex vertraut sind und die Anzahl der enthaltenen Symbole klein ist, dann ist es einfach genug, Latex in ein Format zu parsen, das direkt ausgewertet werden kann.

Ich denke, dass Sie genau definieren müssen, was Sie dem Benutzer erlauben, um für jedermann zugänglich zu sein, um ein besseres Beispiel zu geben, was "am besten" ist.

EDIT - als Antwort auf das Update

Nun, sie ist eine vollständige Programmiersprache (alles, was Sie brauchen, sind Bedingungen und Schleifen - oder Etiketten) zu schreiben gefährlich nahe. Das Rad neu zu erfinden klingt nicht nach einer großartigen Idee. In diesem Fall glaube ich definitiv nicht, dass Sie LaTeX als Eingabesprache wünschen, im Idealfall möchten Sie etwas, das Ihren Benutzern vertrauter ist.

Was folgt, was ich tun würde und wo ich anfangen würde, wenn I würde dies tun, es ist keine definitive Antwort und ich würde viel mehr Forschung vor dem Start, um sicherzustellen, dass ich nicht Mühe duplizieren bin .

Ich würde einen Parser erstellen, der eine Teilmenge von JavaScript übernimmt, dieser Parser würde zwei Dinge tun (oder es gäbe zwei Parser) wäre der Code in LaTeX oder MathML zu übersetzen und der zweite wäre zu bewerten/Führe den Code aus.

Wenn ich das offline in C mache, wende ich mich an Lex und Yacc (oder Flex und Bison usw.) und ein schneller Google verrät, dass es ein Javascript-Äquivalent gibt: Jison. Das gibt dir das Rückgrat des Parsers für die Sprache und du kannst es ändern.

Alternativ starten Sie mit einem vorhandenen JS-Parser könnte helfen, versuchen Sie diese Antwort: JavaScript parser in JavaScript.T

Sobald Sie die Parse-Backbone Sie es einfach auf den ersten halten kann - auf eine darstellbare Sprache zu übersetzen sollte ziemlich einfach sein und für Sie die Bewertung konnte Risiko nur eval mit - weil der Parser bereits sichergestellt haben, dass Die Eingabe verwendet nur das, was Sie zulassen. Ich würde jedoch davon abraten in einer Produktionsversion (es ist gut für den Test) und es braucht nicht viel zusätzliche Arbeit, um die Token internen Funktionen zuzuordnen.

Danach möchten Sie möglicherweise die angezeigte Ausgabe verbessern, vielleicht möchten Sie versuchen, die Eingabe zu vereinfachen oder neu zu ordnen, um mehr Sinn zu machen. Das würde erfordern, dass Sie die interne Repräsentation von Ihrem Parser nehmen und einige clevere Sachen darauf machen. Aber zuerst die ersten Schritte machen.

Sie möchten, dass dies offline funktioniert, so dass meine andere Idee eines Servers, der einige der anderen Beispielprogramme hostet, nicht funktioniert (und die Verwendung von Wolfram Alpha oder Google ist eine gute Option dort - aber, als Sie sagen, was ist der Sinn des Programms dann). Aber Sie könnten auch überlegen, ob Sie einen besseren Einstieg in eine andere Basissprache erhalten würden - obwohl ich glaube, dass Sie die Portabilität von HTML/JS/CSS wollen.

Die anderen Dinge, die Sie verknüpfen, sind alle anderen möglichen Ideen, ich denke nur, dass Sie mehr Nutzen haben, wenn Sie Ihren eigenen Parser intern haben, anstatt sich auf 3rd-Party-Code für jede Anwendung zu verlassen. Mit Ihrem eigenen Parser können Sie später problemlos Funktionen oder Sprachfunktionen hinzufügen.

Schlussgedanke, Sie beschränken sich nicht notwendigerweise auf Javascript als Eingabe mit dieser Methode. Wenn Sie denken, dass Ihre Benutzer mit Reverse Polish Notation zurechtkommen, dann ist es einfach, einen Parser von Hand zu schreiben - aber Sie werden einiges an Formatierung für die Ausgabe tun müssen.

+1

MathJax ist JavaScript und arbeitet mit MathML, ja, ich würde das Parse direkt in JS schreiben. – SpaceDog