MathML / Latex in UIView

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • MathML / Latex in UIView

    Hallo Leute,

    ich habe da mal eine Frage was mathematische Formeln und das liebe Cocoa-Touch-Framework angeht: Ich bräuchte eine Möglichkeit, mathematische Formeln aus der "informatischen" Schreibweise in eine für den Laien lesbare umzuwandeln, also schön mit Bruchstrichen und Mal-"Punkten" und so weiter und so fort. Natürlich habe ich sofort an LaTex gedacht, anscheinend gibt es da auch Scripts, die den Code in ein PNG umwandeln, aber irgendwie komme ich damit nicht klar. Oder doch besser MathML und dann ab damit in ein UIWebView? Und wie komme ich von der eingegebenen Formeln in "informatischer" Schreibweise auf meinen darzustellenden MathML/LaTex-Code?
    Fragen über fragen, ich hoffe ihr könnt mir helfen!
    Danke! :rolleyes:
  • Für das, was Du machen möchtest, musst Du drei Probleme lösen:
    1. Das Erkennen und Verarbeiten (Parsen) von Textformeln sowie deren Umwandlung in eine andere Sprache. Das kannst Du am einfachsten über einen Top-Down-Parser machen. Am einfachsten ist dabei der rekursive Abstieg.
    2. Wie soll die schöne Darstellung Deiner Formeln aussehen? Das ist nicht so trivial, wie es auf den ersten Blick scheint. Sobald die Formeln etwas komplizierter werden, nicht nur aus Grundrechenarten bestehen oder vielleicht sogar Kettenbrüche oder Integrale enthalten, wird's kniffelig. In LaTeX hast Du dafür eine Fülle von Optionen.
    3. LaTeX auf's Telefon zu bekommen, halte ich für sehr schwierig. Selbst, wenn Du die ganzen Binaries usw. angepasst bekommen solltest, ist eine Installation schnell mehrere GB groß und besteht aus mehreren Programmen. Mit MathML bekommst Du im Safari / UIWebView anscheinend auch ganz ordentliche Ergebnisse hin. Hier ist eine nette Beispielseite: lykt.info/mathml/mini/stress.xhtml
    „Meine Komplikation hatte eine Komplikation.“
  • Mhm, danke für die Antwort erstmal :)
    1.) Ja, darum komme ich wahrscheinlich nicht drum rum, die rekursvie Vorgehensweise ist mir vom theoretischen auch geläufig allerdings habe ich noch nie selber einen eigenen Parser geschrieben, steh also etwas auf dem Schlauch wie ich das machen müsste. Gibt es da im Internet irgendwelche Tutorials oder so was in der Art?
    2.) Also ich glaube ich habe mich jetzt für MathML entschieden, die Renderung eines UIWebViews (also auch WebKit, wie du es verlinkt hast) reicht mir dabei aus!
    3.) Gibt es denn irgendwelche MathML Generatoren für Objective-C oder zumindest C (dann kann ich aber nicht selber basteln, nur benutzen :D)?
  • scriptedSheep schrieb:

    1.) Ja, darum komme ich wahrscheinlich nicht drum rum, die rekursvie Vorgehensweise ist mir vom theoretischen auch geläufig allerdings habe ich noch nie selber einen eigenen Parser geschrieben, steh also etwas auf dem Schlauch wie ich das machen müsste. Gibt es da im Internet irgendwelche Tutorials oder so was in der Art?

    Der Wikipedia-Artikel enthält einen Parser in C. Ein Rekursive Abstieg ist wirklich recht einfach. Soetwas habe ich sogar in meiner Schulzeit schon ohne Tutorial hinbekommen und da gab's auch noch kein Internet.

    scriptedSheep schrieb:

    3.) Gibt es denn irgendwelche MathML Generatoren für Objective-C oder zumindest C (dann kann ich aber nicht selber basteln, nur benutzen )?

    Nicht das ich wüsste. Dein Parser kann die Eingabeformel entweder in einen Syntaxbaum umwandeln oder direkt in den MalhML-Ausdruck. Das ist ja simples XML und standardisiert.
    „Meine Komplikation hatte eine Komplikation.“
  • Ja, wie gesagt, ich weiß auch wie ein Rekursiver Parser funktioniert, nur mit der Implementierung ist es nicht weit her :) Ich habe im Internet eine Art Library zum "bauen" eines eigenen Parsers gefunden, nennt sich ParseKit. Ich denke ich werde das versuchen, dann kriege ich den mathematischen Ausdruck auf jeden Fall schon ein mal geparst. Stellt sich dann nur noch die Frage, wie ich den dann umwandel in MathML...Meine Idee (also eher eine Vorgehensweise...):
    1. Ich lasse den mathematischen Ausdruck parsen und erhalte dann einen Baum mit mehreren Ebenen und meinem "zerlegten" Ausdruck
    2. Jedes Element meines Parser kennt ja seine Parents und Childs, also die Verzweigungen. Dann könnte ich das doch so gestalten, dass ich in die Blätte des Baumes einbaue:

      Quellcode

      1. if(self.childs == nil){ [self transformToMathML:self.content];}
      Also so in der Art habe ich mir das zumindest vorgestellt.
    3. Nun muss ich den MathML-Code nur wieder zusammen setzten...Da komme ich ins stolpern...Hat jemand eine Idee bzw. kann mir ungefähr sagen wie man das macht? ?(
  • Ich finde Deine Gedankengänge viel zu kompliziert. Rekursiver Abstieg ist einfach eine Methode für jeweils Strich-, Punktrechnung, Potenzierung, Negation und Faktoren (Konstanten, Klammern usw.).

    Die MathML-Darstellung ist letztlich nur eine lange Zeichenkette, die sich rekursiv aufbauen lässt.
    „Meine Komplikation hatte eine Komplikation.“
  • Sollte ein kleiner Taschenrechner werden, mehr oder weniger für den eigenen Gebrauch...Ich dachte mir das so, dass ich zwei Strings habe, einmal der "normale", den ich dann durch den GCMathParser laufen lasse und dann die MathML-Version zur Darstellung, müsste halt immer synchron gehalten werden. Dazu hatte ich auch schon eine Idee und zwar mittels des Mathe-Parser. Könnte man nicht einfach eine "globale" Variable (NSString) machen und dann immer wenn der Parser etwas erkannt hat, dann dementsprechend zu dieser was in MathML hinzufügen? Wäre eigentlich echt nice! Aber ich bin mir nicht sicher ob das geht, ich habe zwar den Quelltext des Parsers, aber kann damit nicht wirklich was Anfangen weil ich da nicht ganz durchsteige, ist in C geschrieben...Wen es interessiert, der kann sich den ja mal runterladen (einfach googeln :D) oder ich kann auch hier ausschnittweise was posten wenn Bedarf besteht :) Oder es auch anhängen^
  • Habe mir am freitag auch einen parser geschrieben.
    Der kann schon alles was man braucht.
    Funktionen mit mehreren Argumenten, variablen, und rechnen ^^

    Mein parser kann mehr als der GCMathParser :P
    weil man ganz einfach eigene Funktionen hinzufügen kann.
    Variablen könne beliebig lang sein, also nicht nur 1 buchstabe usw.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OnkelHeinz ()

  • Jopp "frei hand" allerdings habe ich mich bissle "belesen" -> shunting yard algo.
    Jopp. den code kannst du haben, ABER wenn ein fehler auftritt wie z.B. (5*5)) dann stürzt er ab. Er erkennt keine fehler.

    Ist in Obj-C geschrieben und nutzt hauptsächlich den NSScanner zum finden der tokens.
    Ich programmieren auch erst seit ca. 1 Jahr in Obj-C, vorher in BASIC *würg* :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von OnkelHeinz ()

  • habe dir Den code per mail geschickt.

    Viel spass damit :)

    EDIT:

    Du musst noch nen par NSLog's entfernen, da des ding noch ziemlich viel in die Konsole ausgibt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von OnkelHeinz ()

  • Ja, also Fehlerbehebung kriege ich selber hin, das sollte nicht schwer sein, und wenn nicht, dann macht man doch einfach ein

    Quellcode

    1. try{ [parser parse];} catch { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:.....]; [alert show];}

    oder? :D
    Okay, dann habe ich meine Tokens, ich glaube das wird aber nicht wirklich ein Zuckerschlecken dann daraus den MathML-Code zu machen. Aber dann ist ein Schritt auf jeden Fall schon mal gemacht^^

    EDIT: Danke! Ich muss jetzt erst Mal in Bett, sSchule wartet morgen wieder aufm ich, aber wenn ich weitermachen konnte und mit dem umwandeln etwas weiter bin, dann melde ich mic h wieder, versprochen!

    EDIT 2: Okay, mal ein schneller Blick, also ich denke den EvaluatOr werde ich nicht nehmen, erstens brauche ich den nicht, und zweitens ist der anscheinend noch nicht ganz fertig. Zum Beispiel, wenn ein Operand auftritt: Warum werden nur die letzten 2 Objekte vom Stack in die Rechnung mit einbezogen. Man müsste das wahrscheinlich mit einem nebenherlaufendem Integer machen, der dann immer von dem letzten Zwischenergebnis weiterrechnet. Und was ist mit Klammer-vor-Punkt-vor-Strich-Rechnung :) Guck dir doch einfach mal diesen CG/GCMathParser an, der sieht (für mich) ganz gut aus!

    EDIT 3: Okay. Also ich dachte mir, ich nehme einfach den Rückgabewert von der

    Quellcode

    1. [parser convertInfixToPostfix:...];
    -Methode und gucke mir das mal an, aber warum sind denn da immer generell die Zahlen am Anfang? Und wo sind die Klammern hin? ;)...Mhm, ich muss mal gucken, weil ich müsste das ganze ja rekursiv aufbauen, muss ja immerhin den Code ordentlich zusammenbauen. Und dann werde ich an deinem Converter herumspielen müssen. Hoffe du hast nichts dagegen....:)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von scriptedSheep ()

  • wenn ein Operand auftritt: Warum werden nur die letzten 2 Objekte vom Stack in die Rechnung mit einbezogen


    weil ein operator maximal 2 zahlen benötigt.
    zahl1 + zahl2
    zahl1 / zahl2
    .... usw. ist schon richtig so!

    punkt vor strich ist drinnen.
    () sind auch integriert, der CConverter entfernt sie nur, was aber das ERGEBNIS um 1000% NICHT beeinflusst, da man sie in der postfix notation nicht braucht.

    Hast du ihn ausprobiert?
    wenn ja, hat er was falsches gerechnet? ist bei mir noch nicht der fall gewesen, wenn doch sag es mir ^^
    Ich habe meiner meinng nach schon bissle ahnung, was MEINEN parser angeht, wie kommst dann auf die idee er könne kein punkt vor strich?

    Eins stimmt aber. Die klasse CEvaluator (der name ist doof ^^) ist nicht serh übersichtlich geproggt und ist etwas "überldaen". ich hätte das ganze in 2 klassen aufteilen sollen.
    Aber sie macht was sie soll.

    wenn du dir sicher sein willst das alles 100% funzt dann nimm lieber den GCMathParser.