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

  • mom... ich schaue mir mal den GCMathParser an.

    achso.... wenn du doch meinen parser verwendest ist ein credits eintrag mit dem namen meines parsers in deinem app (falls du es veröffentlichst) pflicht! :D

    EDIT:

    was bei meinem parser zz. wirklich ein problem ist, das er bei jedem gebrauch einer variable oder einer funktion abstürzt. hängt mit dem NSAutoreleasePool zusammen. KA warum

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

  • Hallo scriptedSheep,

    keine Angst, ich will Dir Deinen Parser nicht klauen. Willst Du denn das ganze nur fuer einen Taschenrechner bauen? Es waere doch einfach damit auch die Eingabe von Formeln zu ermoeglichen. Die Anzeige, die Du im Taschenrechner hast kannst Du ja dann auch fuer die Anzeige der Formeln nutzen, oder?

    Dominik
  • Naja, du hast dir mein Update bestimmt schon angeguckt, ich wollte das in den integrierten Taschenrechner mit einbauen und dann auch eine eigene Taschenrechner-App (die natürlich mehr kann, aber mehr Infos gibt es erst mal nicht :D)...
    Ich habe das mit dem Parsen mehr oder weniger, zumindest für einfache Ausdrücke hinbekommen, aber irgendwie habe ich ein Problem mit Smultron (damit habe ich zum ausprobieren ein paar HTML-Documente erstellt...): Ich habe im Internet Beispielcode gefunden zur einbettung von MathML in HTML und dachte mir, einfach mal Copy´n´Paste in meine LOKALE Testdatei. Der Quelltext sieht so aus:

    Quellcode

    1. 1. 2. 4. 5. 6. 7. 8. 9. 10. XHTML+MathML Example 11. 12. 13. 14. 15. ∑ 16. 17. i 18. = 19. 1 20. 21. N 22. 23. 24. a 25. i 26. 27. 28. 29. 30. 31.

    Ich probiere nebenbei das ganze auch mit Firefox aus, Safari kann das (angeblich) noch nicht. Den Quelltext habe ich per "Quelltext anzeigen" bekommen. So, wenn ich mir die Seite auf einem anderen Server angugcke, dann geht auch alles, aber wenn ich das aus meiner lokalen Datei anschauen will, dann sieht das ganze ziemlich komisch und auf jeden Fall nicht richtig aus, in etwa so:

    [Blockierte Grafik: http://img42.imageshack.us/img42/8779/bildschirmfoto20100913u.png]

    Wohlgemerkt, es wird auch nicht richtig dargestellt, wenn ich da ganze auf meinen Server packe und dann als "normaler" Internetnutzer das aufrufe...
    Jemand eine Idee, was ich vergessen habe? Eigentlich braucht man doch da gar keine Packages für, oder?^^

    EDIT: Ich habe versucht, das ganze mal mit einem <object></object>-Tag zu relaisieren und dann kam unter Firefox folgende Meldung:
    "Your browser does not support application/xml."

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

  • Okay, es liegt anscheinend irgendwie doch an Firefox, obwohl in der Wikipedia und anderen Texten stand, dass der das angeblich kann...Habe mir das WebKit runtergeladen (also Safari in Gold...eigentlich ist aber Safari Webkit in Silber, oder? :D) und habe dann noch mal meine lokale HTML/MathML-Datei aufgerufen. Immerhin ist die Darstellung schon um einiges besser. Das das "a+b" so weit oben liegt könnte auch die Schrift sein, oder?
    [Blockierte Grafik: http://img638.imageshack.us/img638/6088/bildschirmfoto20100914u.png]
  • Danke, sieht zwar noch nicht perfekt aus, aber mit meinen kleinen CSS-Grundkentnissen kriege ich das selber "poliert". Jetzt muss nur noch der Code generiert werden, also momentan habe ich das so, dass ich z.B. den String

    Quellcode

    1. 2+(3*4)-3

    mittels meinen kleinen Parsers in alle einzelnen Zeichen unterteilen kann, "geplant" ist dann noch, dass er die Klammerausdrücke erst noch ein zweites mal parsen muss, um die Struktur des MathML ausreichend erzeugen zu lassen :)
    Die Ausgabe des geparsten Strings oben ist dann wie folgt

    Quellcode

    1. 2010-09-14 15:28:34.549 xxxxxxxx[69678:207] (2) (2.0) : <Number «2»>
    2. 2010-09-14 15:28:34.551 xxxxxxxx[69678:207] (+) (0.0) : <Symbol «+»>
    3. 2010-09-14 15:28:34.552 xxxxxxxx[69678:207] (() (0.0) : <Symbol «(»>
    4. 2010-09-14 15:28:34.552 xxxxxxxx[69678:207] (3) (3.0) : <Number «3»>
    5. 2010-09-14 15:28:34.553 xxxxxxxx[69678:207] (*) (0.0) : <Symbol «*»>
    6. 2010-09-14 15:28:34.553 xxxxxxxx[69678:207] (4) (4.0) : <Number «4»>
    7. 2010-09-14 15:28:34.554 xxxxxxxx[69678:207] ()) (0.0) : <Symbol «)»>
    8. 2010-09-14 15:28:34.555 xxxxxxxx[69678:207] (-3) (-3.0) : <Number «-3»>
  • Was Du da hast, ist meines Erachtens ein Lexer und kein Parser. Ein Parser erkennt die Struktur. Intern sollte Dein Ausdruck so aussehen:

    Quellcode

    1. 2
    2. /
    3. + 3
    4. / \ /
    5. - *
    6. \ \
    7. 3 4

    Wenn Du diesen Baum in der Rechts-Mitte-Links-Reihenfolge durchläufst, bekommst Du wieder Deinen Ausdruck (ohne die überflüssigen Klammern).
    „Meine Komplikation hatte eine Komplikation.“
  • Naja, mehr oder weniger. Ich habe dieses ParseKit (habe ich am Anfang mal verlinkt...) benutzt und den "modifiziert". Ich kann ihm sagen, dass er normale buchstaben (also von a-z ohne x und y) als variablen erkennen soll und x und y als Funktionsdigits. Und dann kann ich ihm (reintheoretisch) sagen, dass er einen Klammerausdruck (also (...) ) erstmal als String speichern soll und dann anschließend noch mal nur den String parsed (rekursiv also!), um die Umformung in MathML zu ermöglichen/zu vereinfachen. Mit den Tokens aus dem Log will ich gar nicht rechnen, ich habe parallel einfach noch den 2. String mit dem informatisch korrekten Rechenausdruck der dann durch den CGMathParser läuft, der 1. wird einfach nur zur Darstellung verwurstet :)

    EDIT: Das mit den Bäumen ist mir schon bewusst, und so wird es dann (wenn ich fertig bin.... >.<) auch bei mir aussehen, glaub mir, so war das ja auch gedacht. Für MathML will/brauch ich einfach mal die Klammern, da es ja auch Formeln mit denen gibt und der Nutzer das natürlich auch so sehen will wie er es eingegeben hat :D
  • Ist mir schon klar, ich habe das auch schon mal benutzt, aber soweit bin ich noch gar nicht! Ich dachte mir das so, dass ich den den HTML (mit dem MathML drin) Code erst mal in einem String in mehreren Schritten zusammensetze und den dann dem Webview übergebe, wenn ich mit der Generierung des Codes fertig bin. Aber dafür muss ich den HTML-Code, so zusagen das Grundgerüst, erst mal in einen NSString packen :D

    EDIT: TADA! Jetzt habe ich es schon fast geschafft, das generieren sollte eigentlich nicht mehr so schwer werden :D Hier mal der erste Code aus dem Simulator:
    [Blockierte Grafik: http://img841.imageshack.us/img841/6088/bildschirmfoto20100914u.png]

    EDIT 2: Klammerausdrücke gehen schon mal, der Rest sollte mehr oder weniger einfach sein, wenn ich mir noch weiter die MathML-Syntax raufschaffe. Ich glaube, wenn ich fertig bin, dann veröffentliche ich das doch als "MathMLGenerator"...Ich glaube das können viele Leute gebrauchen^^
    [Blockierte Grafik: http://img215.imageshack.us/img215/6088/bildschirmfoto20100914u.png]

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

  • Ja, der kommt noch weg, macht man im MathML Quelltext, war ich bloß n
    och "zu faul" zu :) Codegenerierung klappt super, das einzige was komisch ist, ist dass er Brüche irgendwie nicht anzeigen will. Ich habe mir mal nach dem parsen den zusammengebastelten String ausgeben lassen und dann auf meinem Rechner eine neue lokale .html-Datei gemacht, den da reinkopiert und dann mit WebKit aufgemacht...Alles problemlos! Irgendjemand eine Idee wodran das liegen könnte? Hier mal der String der als Resultat ausgegeben wird:


    EDIT: Habe das Problem gelöst, lag an der URL des UIWebView
    Hier noch mal ein Bild mit PUNKT (!)
    [Blockierte Grafik: http://img192.imageshack.us/img192/3101/bildschirmfoto20100914ug.png]

    EDIT 2: Irgendwie scheint die Bruch-Anzeige arg verbuggt zu sein...Also ich habe Code von der W3C Homepage genommen, also von den Eltern sozusagen, und selbst der wird falsch dargestellt, auch das Stylesheet von macmoonshine bringt irgendwie nichts...Warum hat denn da keiner Erfahrung mit gemacht oO

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

  • Hallo,

    ich wende mich doch noch mal mit einer Frage an euch. Und zwar kann ich jetzt alles was ich brauche generieren, nur die Bearbeitung durch den Benutzer, die ja eigentlich mit ein Hauptziel der Sache war, hapert es noch ein bisschen. Ich habe das jetzt so eingerichtet, dass ich, wenn der Benutzer zum Beispiel auf die "Bruch"-Taste drückt in dem Darstellungs-View ein Template eingefügt wird, also im Prinzip nur ein Bruchstrich und oben und unten anstatt konkreter Zahlen ein Platzhalter, ein Viereck oder irgendwas halt. Jetzt muss der Benutzer in seinen Bruch natürlich noch Zahlen einfügen bzw. andere Ausdrücke. Deswegen dachte ich mir, es wäre doch voll cool, wenn er dadrauf tippt(die Anzeige wird ausreichend groß sein so das eine ausreichende Genauigkeit gewährleistet wird...) dann da so ein "Editor-Strich hinkommt (den kennt ihr ja alle^^) und er dann die Zahlen eingeben kann. Die Coordinaten des Touches kenne ich ja, habt ihr eventuell eine Idee, wie man dann weiß, auf welches Element der User zugreifen will? Oder macht man das doch besser mit Pfeiltasten (also vor und zurück) und wie realisiert man dann das einfügen?
  • in der methode touchesBegan:withEvent: kannst Du feststellen, wo der Touch war. Hier ein bisschen Code:

    Quellcode

    1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    2. NSEnumerator *enumerator = [touches objectEnumerator];
    3. UITouch *touch = [enumerator nextObject];
    4. CGPoint location = [touch locationInView: myView];
    5. }


    Die location ist dann in den Koordinaten des myView. Und diesen Wert vergleichst Du dann mir den Koordinaten der Platzhalter.
  • Es ist übrigens auch möglich, das über das Target-Action-Paradigma zu lösen und auf diese ekligen touches-Irgendwas-Methoden zu verzichten. Dazu muss für die Action-Methode nur die Form mit zwei Parametern genommen werden (developer.apple.com/library/io…c/uid/TP40002974-CH7-SW14). Dann bekommst Du in Deiner Action-Methode auch das auslösende Event-Objekt mitgeliefert und Du kannst die Fingerposition ermitteln.
    „Meine Komplikation hatte eine Komplikation.“