Ein Vortrag im Rahmen des Proseminars "XML-basierte Technologien" im Sommersemester 2004 an der TU Chemnitz.
Bearbeiter: | Marcus Zelend |
Datum: | 2004-07-20 |
Download: | MathML-Vortrag als Powerpoint-Präsentation (267 kByte) |
MathML steht für Mathematical Markup Language und stellt eine Beschreibungssprache für mathematische Inhalte dar.
Entwickelt wurde MathML von der Math Working Group des World Wide Web Consortiums (W3C) mit Unterstützung einiger namhafter Firmen, unter anderem auch Microsoft und IBM, sowie Herstellern verschiedener Mathematik-Programme wie Waterloo Maple Inc. und Wolfram Research (Mathematica). Ziel war es, einen gemeinsamen Standard zu schaffen, um mathematische Inhalte für Computer-Verarbeitung oder elektronische Kommunikation aufzubereiten.
Zuvor waren die Möglichkeiten mathematische Audrücke in HTML einzubinden sehr beschränkt.
Bereits 1994 gab es erste Vorschläge, wie mathematische Inhalte auf Webseiten eingebunden werden können. Diese Vorschläge zu "HTML Math" wurden ins Working Draft zu HTML 3.0 aufgenommen.
Es folgten weitere Treffen und Diskussionen, aus denen das "HTML Math Editorial Review Board" hervor ging. Diese Gruppe wiederum wurde im März 1997 zur ersten "W3C Math Working Group" neu zusammen gesetzt.
Etwa Jahr später, im April 1998, wurde die erste Version von MathML als Empfehlung des W3C veröffentlicht. Seit Oktober 2003 wird die derzeit aktuellste Version 2.0 (Second Edition) empfohlen.
MathML stellt eine Erweiterung von XML dar, daher ist der Gebrauch von XML für MathML-Dokumente zwingend erforderlich. Der Aufbau von MathML ist dabei an andere Markup-Sprachen wie zum Beispiel HTML angelehnt. Ziel war es, dass MathML der Standard für mathematische Inhalte wird, so wie HTML der Standard für Textinformationen im Internet ist.
Leider wird MathML nicht von allen aktuellen Browsern von Haus aus unterstützt. Aktuell können Mozilla ab Version 0.9.9, Netscape ab Version 7.0, Microsoft Internet Explorer ab Version 6.0 und der W3C-eigene Browser "Amaya" MathML-Inhalte darstellen. Unter Umständen müssen hierbei Schriftarten mit mathematischen Symbolen aus dem Internet nachgeladen werden.
Bei anderen Browsern kann man eventuell mit Plug-Ins wie techexplorer oder MathPlayer (nur Internet Explorer) nachhelfen.
Es gibt 2 Möglichkeiten, MathML-Dokumente zu erstellen. Zum einen kann man mit einem Texteditor die Inhalte von Hand erstellen. Dies wird aber vor allem bei größeren mathematischen Konstrukten schnell sehr aufwändig, unübersichtlich und damit fehleranfällig.
Alternativ dazu kann man einen Formeleditor wie zum Beispiel WebEQ oder professionelle Mathematik-Programme wie Maple oder Mathematica nutzen, um Formeln zu erstellen und in MathML zu exportieren. Allerdings sind solche Programme zumeist kostenpflichtig.
MathML kann direkt im Quelltext von XML-Dokumenten eingebunden werden. Um dem XML-Parser mitzuteilen, dass der folgende Code als MathML interpretiert werden soll, muss dieser in die Tags <math></math>
eingeschlossen werden. Zudem muss zudem eine Namespace-Angabe vorhanden sein.
Dieses Beispiel stellt eine Art mathematisches "Hello World!" dar. Es werden 2 Variablen a und b addiert und das Ergebnis quadriert. (Hinweis: !DOCTYPE-Angabe und XML-Deklaration wurden weggelassen.)
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <title>MathML's Hello Square</title> </head> <body> <p>This is a perfect square:</p> <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> <msup> <mfenced> <mrow> <mi>a</mi> <mo>+</mo> <mi>b</mi> </mrow> </mfenced> <mn>2</mn> </msup> </mrow> </math> </body> </html>
Prinzipiell gibt es 2 Möglichkeiten, mathematische Inhalte zu beschreiben: Nach dem Aussehen der Formel (Präsentationsbeschreibung) oder nach ihrer mathematischen Bedeutung (semantische oder inhaltiche Beschreibung). Mit MathML können mathematische Ausdrücke auf beide Arten codiert werden.
Mit der Präsentationsbeschreibung werden mathematische Ausdrücke nach ihrem Aussehen codiert. Diese Beschreibungsart eignet sich besonders, um mathematische Inhalte zum Beispiel auf Webseiten darzustellen.
Beispiel 1: x² + 4x + 4 = 0
<mrow> <mrow> <msup> <mi>x</mi> <mn>2</mn> </msup> <mo>+</mo> <mrow> <mn>4</mn> <mo>⁢</mo> <mi>x</mi> </mrow> <mo>+</mo> <mn>4</mn> </mrow> <mo>=</mo> <mn>0</mn> </mrow>
mrow
dient dazu, Teile einer Formel als zusammengehörigen Ausdruck zu kennzeichnen. Dadurch wird die Formel gegliedert, was sich in der Ausgabe zum Beispiel im Abstandsverhalten oder bei Zeilenumbrüchen bemerkbar macht.
Die Entity ⁢
gibt an, dass für den Ausdruck 4x spezielle Abstandsregeln gelten und dass zwischen 4 und x kein Zeilenumbruch erfolgen darf.
Ein Exponent wird in MathML mit dem Element msup
gekennzeichnet. Dabei gibt das erste Kindelement die Basis, das zweite den Exponenten an.
Weitere Elemente sind:
mi | Es folgt ein Identifier. Dabei kann es sich um eine Variable, eine Funktion oder eine Konstante handeln. |
mn | Es folgt eine numerische Angabe, d.h. eine Zahl. |
mo | Es folgt ein Operationszeichen. |
Beispiel 2:
<mrow> <mi>x</mi> <mo>=</mo> <mfrac> <mrow> <mrow> <mo>-</mo> <mi>b</mi> </mrow> <mo>±</mo> <msqrt> <mrow> <msup> <mi>b</mi> <mn>2</mn> </msup> <mo>-</mo> <mrow> <mn>4</mn> <mo>⁢</mo> <mi>a</mi> <mo>⁢</mo> <mi>c</mi> </mrow> </mrow> </msqrt> </mrow> <mrow> <mn>2</mn> <mo>⁢</mo> <mi>a</mi> </mrow> </mfrac> </mrow>
mfrac
wird benutzt, um einen Bruch darzustellen. Hierbei gilt: das erste Kindelement gibt den Zähler an, das zweite den Nenner.
Mit msqrt
beginnt ein Wurzelausdruck. Der auf dieses Element folgende Term wird unter einer Wurzel angezeigt.
Um ein "Plus oder Minus"-Zeichen darzustellen, bietet MathML die Entity ±
an. ±
und ⁢
sind nur 2 Beispiele für die vielen mathematischen Symbole, die MathML bereit stellt, um mathematische Inhalte auf allen Medien korrekt wieder zu geben.
Beispiel 3:
<mrow> <mi>A</mi> <mo>=</mo> <mfenced open="[" close="]"> <mtable> <mtr> <mtd><mi>x</mi></mtd> <mtd><mi>y</mi></mtd> </mtr> <mtr> <mtd><mi>z</mi></mtd> <mtd><mi>w</mi></mtd> </mtr> </mtable> </mfenced> </mrow>
mtable
kennzeichnet eine Tabelle. Analog zu Tabellen in HTML werden die Reihen mit mtr
und die Zellen mit mtd
gekennzeichnet.
Viele Elemente in MathML können mit Attributen versehen werden, die Details zur Darstellung angeben. Beispiel hier ist das Element mfenced
, dass einen Klammerausdruck kennzeichnet. Zusätzlich wurde hier die Art der öffnenden und schließenden Klammern angegeben. Diese Angaben sind aber optional. Werden diese Angaben weg gelassen, wird eine Standard-Ausgabe verwendet.
Um Formeln für weiterverabreitende Programme wie zum Beispiel mathematische Anwendungen zu speichern gibt es die inhaltliche Beschreibung. Im Gegensatz zur Präsentationsbeschreibung, bei der mathematische Ausdrücke nach ihrem Aussehen codiert werden, wird hierbei die mathematische Bedeutung des Ausdrucks codiert.
Die inhaltliche Beschreibung ist nicht direkt auf die Darstellung übertragbar!
Die Formel wird in Prefix notiert, die Abarbeitung entspricht daher der Pre-Order-Traversierung eines Baumes.
Beim Pre-Order-Baum wird zunächst der Wurzelknoten bearbeitet, danach der linke Sohn gefolgt vom rechten Sohn.
Die Formel (a + b) × (c - d) würde demnach wie folgt in einen Pre-Order-Baum eingetragen werden:
In MathML würde die Formel dann wie folgt beschrieben:
<apply> <times/> <apply> <plus/> <ci>a</ci> <ci>b</ci> </apply> <apply> <minus/> <ci>c</ci> <ci>d</ci> </apply> </apply>
Analog zur Präsentationsbeschreibung werden die auszuführenden Terme bei der inhaltlichen Beschreibung in apply
-Tags, Bezeichner in ci
-Tags und numerische Angaben in cn
-Tags eingeschlossen.
Wegen der Prefix-Notation werden die Operatoren vor den Operanden notiert. Somit wird Klammersetzung überflüssig, die Abarbeitungsreihenfolge wird durch die Prefix-Notation festgelegt.
Die Operatoren erwarten unterschiedlich viele Argumente. Es gibt unäre Operatoren (genau 1 Kindelement, z.B. not
), binäre Operatoren (genau 2 Kindelemente, z.B. minus
) und n-äre Operatoren (beliebig viele Kindelemente, z.B. plus
). Manche Operatoren können abhängig von ihrer Verwendung verschieden klassifiziert werden. Zum Beispiel kann minus
unär oder binär sein.
Operatoren sind leere Elemente, d.h. sie haben kein Abschluss-Tag. Deswegen müssen sie XML-konform als inhaltsleer gekennzeichnet werden, z.B. <plus/>
.
Die Operatoren:
times | Die nachfolgenden Ausdrücke werden multipliziert. |
plus | Die nachfolgenden Ausdrücke werden addiert. |
minus | Das zweite Kindelement wird vom ersten subtrahiert. |
Da es für Computer-Algebra-Systeme wichtig sein kann, welchen Typ oder Wert eine Variable hat, gibt es das declare
-Konstrukt. Hiermit kann einer Variable ein bestimmter Typ oder Wert zugewiesen werden.
Beispiel: Der Bezeichner A wird als spezieller Vektor (a, b, c) deklariert.
<declare> <ci> A </ci> <vector> <ci> a </ci> <ci> b </ci> <ci> c </ci> </vector> </declare>
Beispiel 1: x² + 4x + 4 = 0
<apply> <eq/> <apply> <plus/> <apply> <power/> <ci>x</ci> <cn>2</cn> </apply> <apply> <times/> <cn>4</cn> <ci>x</ci> </apply> <cn>4</cn> </apply> <cn>0</cn> </apply>
Mit eq
wird eine Gleichung definiert. Die linke Seite besteht aus einem Term, der sich wiederum aus der Addition zweier weiterer Terme und der Zahl 4 zusammen setzt. Die rechte Seite besteht nur aus der Zahl 0.
Potenzen werden durch das Element power
definiert. Das erste Kindelement gibt hierbei die Basis an, das zweite den Exponenten.
Beispiel 2:
<apply> <eq/> <ci>x</ci> <apply> <divide/> <apply> <csymbol>±</csymbol> <apply> <minus/> <ci>b</ci> </apply> <apply> <root/> <degree><cn>2</cn></degree> <apply> <minus/> <apply> <power/> <ci>b</ci> <cn>2</cn> </apply> <apply> <times/> <cn>4</cn> <ci>a</ci> <ci>c</ci> </apply> </apply> </apply> </apply> <apply> <times/> <cn>2</cn> <ci>a</ci> </apply> </apply> </apply>
Der Bruch wird in der inhaltlichen Beschreibung mit dem binären Operator divide
notiert. Dabei ist das erste Kindelement der Zähler, das zweite der Nenner.
Wurzeln werden mit root
eingeleitet. Zunächst wird der Grad der Wurzel mit degree
angegeben, danach folgt der Term unter der Wurzel.
Die inhaltliche Beschreibung stellt direkt keinen "Plus oder Minus"-Operator zur Verfügung. Deshalb wird dieser hier mit dem csymbol
-Element als Symbol eingebunden. Nachteil dabei ist, dass der Operator vom Parser eventuell nicht als solcher erkannt und somit falsch dargestellt wird.
Beispiel 3:
<apply> <eq/> <ci>A</ci> <matrix> <matrixrow> <ci>x</ci> <ci>y</ci> </matrixrow> <matrixrow> <ci>z</ci> <ci>w</ci> </matrixrow> </matrix> </apply>
Matrizen werden mit dem Element matrix
definiert, die Reihen heißen matrixrow
. Anders als in der Präsentationsbeschreibung werden die Terme hier direkt nach dem matrixrow
-Element notiert.
Die umschließenden Klammern werden in diesem Beispiel automatisch angezeigt und müssen daher nicht extra angegeben werden.
Um mathematische Formeln nur für die Präsentation zum Beispiel auf Webseiten zu optimieren, ist die Präsenationsbeschreibung geeignet, die inhaltliche Beschreibung ist für mathematische Anwendungungen gedacht. Allerdings liegen viele Anwendungen, die MathML nutzen, zwischen diesen beiden Extremen.
Um auch diese Anwendungen bedienen zu können, ist es möglich, Präsentationsbeschreibung und inhaltliche Beschreibung parallel zu verwenden und sogar zu mischen.
Zur Realisierung dieser Mischungen existiert das semantics
-Element. Mit diesem Element ist es möglich, Präsentationsbeschreibungen in inhaltliche Beschreibungen einzubinden und umgekehrt. Es ist sogar geeignet, um völlig andere semantische Spezifikationen, wie zum Beispiel OpenMath, in MathML-Ausdrücke einzubinden.
Die Bindung selbst wird mit dem Element annotation
bzw. annotation-xml
vorgenommen. Dieses Element erwartet als encoding
-Attribut den Typ der Annotation. Es ist auch möglich, mehrere Annotationen anzugeben.
Beispiel:
<mrow> <semantics> <mrow> <msubsup> <mo>∫</mo> <mn>1</mn> <mi>t</mi> </msubsup> <mfrac> <mrow> <mo>ⅆ</mo> <mi>x</mi> </mrow> <mi>x</mi> </mfrac> </mrow> <annotation-xml encoding="MathML-Content"> <apply> <int/> <bvar><ci>x</ci></bvar> <lowlimit><cn>1</cn></lowlimit> <uplimit><ci>t</ci></uplimit> <apply> <divide/> <cn>1</cn> <ci>x</ci> </apply> </apply> </annotation-xml> </semantics> </mrow>
In diesem Beispiel wird die inhaltliche Beschreibung an die Präsentationsbeschreibung gebunden. Es ist natürlich auch anders herum möglich.
Der obere Teil stellt die Präsentationsbeschreibung dar. Mit dem Element msubsup
wird das Intervall mit seinen Grenzen definiert. Das Intervallzeichen selbst wird durch die Entity ∫
dargestellt, das Differential-d durch ⅆ
.
Im unteren Teil wird zunächst mit bvar
die Integrationsvariable definiert, danach die untere und obere Integrationsgrenze lowlimit
bzw. uplimit
. Im Gegensatz zur Präsentationsbeschreibung muss das Differential-d nicht extra angegeben werden, deshalb reduziert sich der zu integrierende Term auf 1/x.
Auf die selbe Weise, wie gemischtes MathML-Markup erstellt wird, können auch Grafiken in MathML-Dokumente eingebettet werden. Dies ist zum Beispiel nützlich, um den Funktionsgraphen parallel zu einer gegebenen Funktion zu zeichnen.
Beispiel: Schnitt zweier Mengen A und B
<semantics> <apply> <intersect/> <ci>A</ci> <ci>B</ci> </apply> <annotation-xml encoding="SVG1.1"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 290 180"> <clipPath id="a"> <circle cy="90" cx="100" r="60"/> </clipPath> <circle fill="#AAAAAA" cy="90" cx="190" r="60" style="clip-path:url(#a)"/> <circle stroke="black" fill="none" cy="90" cx="100" r="60"/> <circle stroke="black" fill="none" cy="90" cx="190" r="60"/> </svg> </annotation-xml> <annotation-xml encoding="application/xhtml+xml"> <img xmlns="http://www.w3.org/1999/xhtml" src="intersect.gif" alt="A intersect B"/> </annotation-xml> </semantics>
In diesem Beispiel wird nach dem semantics
-Element als erstes Kindelement eine inhaltliche Beschreibung in MathML gegeben. Es folgen 2 annotation
-Elemente, die alternative Beschreibungsarten enthalten. Die erste gibt dabei eine Beschreibung im "Scalable Vector Graphics"-Format SVG an, die zweite enthält ein img
-Element, das als XHTML-Fragment in die MathML-Beschreibung eingebettet wurde.
Der größte Vorteil von MathML ist sicherlich die Dynamik. Mathematische Ausdrücke können schnell und ohne großen Aufwand verändert und erweitert werden.
Ein weiterer Vorteil ist die Möglichkeit der Verarbeitung von mathematischen Inhalten in Computer-Algebra-Systemen.
Im Vergleich zur Präsentation mathematischer Inhalte mit Hilfe von Grafiken hat MathML außerdem den Vorteil, dass es aufgrund der Struktur schneller übertragen werden kann.
Durch die Verwendung von Schriften statt Pixelinformationen sind die Formeln zudem verlustfrei skalierbar.
Der wohl größte Nachteil ist die mangelende Implementierung von MathML in den Browsern. Allerdings unterstützen einige aktuelle Browser zumindest MathML-Präsentationsbeschreibungen. Für andere Browser gibt es verschiedene Plug-Ins, die MathML-Unterstützung herstellen.
Ein weiterer Nachteil liegt in der aufwändigen Art, wie mathematische Ausdrücke in MathML codiert werden. Selbst einfache Formeln können sehr langen Quelltext verursachen. Dadurch wird der Code fehleranfällig.
Da MathML eine Erweiterung von XML ist, sind zumindest Grundkenntnisse dieser Markup-Sprache notwenig. Es gibt zwar viele Tools und Anwendungen, mit denen man mathematische Formeln in MathML konvertieren kann. Diese Software ist allerdings meist kostenpflichtig.
MathML ist eine recht ausgereifte Technik, um mathematische Inhalte darstellen zu können. Die wenigen Nachteile liegen somit auch weniger bei MathML selbst.
MathML ist die sinnvollste Möglichkeit, mathematische Inhalte in XHTML-Dokumente einzubinden. Wegen der mangelhaften Browser-Implementierung ist es allerdings nicht immer vorzuziehen. Welche anderen Möglichkeiten gibt es also, um mathematische Inhalte auf Webseiten anzuzeigen?
Die erste Möglichkeit ist, Formeln im ASCII-Format zu notieren und in pre
-Tags einzuschliessen. Nachteil dieser Methode ist die fehlende Möglichkeit der Weiterverarbeitung.
Beispiel 1: x² + 4x + 4 = 0
So sieht's aus:
x² + 4x + 4 = 0
Quellcode:
<pre>
x² + 4x + 4 = 0
</pre>
Einfache Formeln lassen sich so recht gut darstellen, allerdings wird es bei komplizierteren Konstrukten sehr schwer bis unmöglich, diese darzustellen.
Beispiel 2:
So sieht's aus:
-b ± √b² - 4ac
x = ----------------
2a
Quellcode:
<pre>
-b ± √<span style="text-decoration:overline">b² - 4ac</span>
x = ----------------
2a
</pre>
Eine weitere Möglickeit besteht darin, Formeln als Grafiken abzuspeichern und per img
-Tag einzubinden.
Nachteile hierbei sind die Dateigrößen und die damit verbundenen erhöhten Ladezeiten, die fehlende Dynamik und Weiterverarbeitungsmöglichkeiten sowie die schlechte Skalierbarkeit bei Pixelgrafiken.
Ebenfalls möglich ist die Verwendung von Java-Applets zur Anzeige von mathematischen Formeln. Neben der fehlenden Dynamik und den erhöhten Ladezeiten kommt hier als Nachteil noch hinzu, dass der Anwender Java installiert und aktiviert haben muss.
OpenMath ist ein Standard, der entwickelt wurde, um mathematische Inhalte anhand ihrer Semantik zu beschreiben. Zeil von OpenMath ist es, mathematische Inhalte zwischen Computer-Programmen auszutauschen, in Datenbanken zu speichern und im Internet zu veröffentlichen.
MathML wurde in erster Linie zur Präsentation von mathematischen Ausdrücken entwickelt, OpenMath setzt mehr auf die inhaltliche Beschreibung. Da es möglich ist, OpenMath in MathML einzubetten, ergänzen sich beide Standards sehr gut.
Seit 16. Juli 2004 liegt OpenMath in der Version 2.0 vor. Weiterführende Informationen können auf der OpenMath-Website abgerufen werden.
Eine der Stärken von LaTeX liegt in der Fähigkeit, mathematische Inhalte darstellen zu können.
LaTeX stellt dabei Befehle für eine ganze Reihe mathematischer Konstrukte wie zum Beispiel Pfeile, Integrale, Brüche, Binominalkoeffizienten, Fallunterscheidungen oder komplexe Gleichungssysteme zur Verfügung. Sogar automatisch durchnummerierte Sätze und Definitionen sind möglich.
Reichen die Standard-Befehle von LaTeX nicht aus, können weitere Pakete nachgeladen werden.
Es gibt noch weitere Möglichkeiten, mathematische Formeln darzustellen. Hierzu gehört zum Beispiel auch das PostScript-Format (z.B. Adobe PDF).