Mathematical Markup Language to język znacznikowy, który umożliwia osadzanie wzorów matematycznych na stronach WWW. Artykuł opisuje, w jaki sposób przygotowywać dokumenty XHTML zawierające wstawki MathML, tak by były zgodne ze standardami oraz poprawnie wyświetlane w przeglądarkach Firefox i IE.
Dlaczego MathML?
Z powodu ograniczeń HTML-a matematycy, a także naukowcy z wielu innych dziedzin, przez wiele lat byli skazani na publikowanie formuł w postaci obrazów dołączanych do strony WWW znacznikiem {html}{/html}. Jedyną alternatywą były formaty PDF oraz PostScript. Wymienione rozwiązania pozwalają wprawdzie na tworzenie stron WWW zawierających dowolnie złożone wzory, jednak dokumenty takie są dostępne wyłącznie dla przeglądarek graficznych. Ani przeglądarki czytające treść stron WWW, ani roboty wyszukiwarek internetowych nie odczytają treści matematycznych zawartych w plikach graficznych czy PDF-ach.
Rozwiązaniem problemu dostępności treści matematycznych jest Mathematical Markup Language, czyli matematyczny język znacznikowy, w skrócie oznaczany jako MathML. Formuły zapisane w MathML-u mogą być nie tylko wyświetlane w postaci graficznej na monitorze, ale także automatycznie przetwarzane przez różnego rodzaju oprogramowanie. W ten sposób treści matematyczne opublikowane w sieci WWW będzie można katalogować i przeszukiwać podobnie jak dokumenty HTML.
W języku MathML wzory matematyczne są tworzone z licznych znaczników, np. mfrac (ułamek), msqrt (pierwiastek kwadratowy) oraz mn (liczba). Wzór \”pierwiastek z dwóch przez dwa\” przyjmuje w MathML-u postać:
Po wyświetleniu w przeglądarce Firefox powyższy kod MathML będzie wyglądał tak, jak na rys. 1.
MathML prezentacyjny, znaczeniowy i mieszany
Od początku prac nad MathML-em równolegle rozwijane są dwa dialekty języka: prezentacyjny (ang. presentational markup) oraz znaczeniowy (ang. content markup). W dialekcie prezentacyjnym nacisk położono na wizualny skład wyrażeń, zaś znaczeniowy MathML ma przede wszystkim kodować zawartą we wzorze treść.
Wzór x2 + 4x + 4 = 0 w dialekcie prezentacyjnym przyjmuje postać:
Ten sam wzór zapisany w znaczeniowym MathML-u wygląda następująco:
Pierwszy z wzorów zawiera operatory +, ⁢ = oraz indeksację msup. Wzór zapisany w sposób znaczeniowy operuje zaś znacznikami plus, times, power oraz eq.
Oba dialekty, prezentacyjny i znaczeniowy, można łączyć. Otrzymany w ten sposób zapis składa się z dwóch fragmentów, z których jeden zawiera instrukcje do wizualnego przedstawienia wzoru, a drugi reprezentuje treść matematyczną. Można to porównać do znacznika img oraz atrybutu alt. Mieszany MathML jest zawarty w elemencie semantics. Prezentacyjna część znajduje się bezpośrednio po znaczniku {html}
Pierwsza strona WWW z wzorami matematycznymi
W jaki sposób przygotować stronę WWW zawierającą MathML? Wzory matematyczne osadzamy w dokumencie XHTML w postaci wstawek math. Specyfikacja MathML-a 2.0 (punkt A.2.3) zaleca następujący typ dokumentu:
Każda ze wstawek math powinna mieć atrybut xmlns ustalający przestrzeń nazewniczą (por. specyfikacja MathML-a 2.0, punkt 7.1.1):
Jeśli przygotujemy dokument przyklad-2.xml przedstawiony na listingu 1, po czym otworzymy go w przeglądarce Firefox, ujrzymy stronę taką, jak na rys. 1. Zwróćmy uwagę na nazwę pliku, gdyż po zmianie rozszerzenia z xml na html przykład nie będzie działał.
MathML - przykład #2
Wzó na wysokość trójkąta równobocznego
Obsługa MathML-a w Firefoksie
Pod względem obsługi MathML-a przeglądarka Firefox zdeklasowała konkurencję. Do niedawna była to jedyna przeglądarka, która ma wbudowaną obsługę języka MathML (obsługa MathML-a pojawiła się w Operze 9.5, jednak jest to wstępna implementacja zawierająca wiele niedociągnięć). Pewnym minusem jest to, że w obecnej wersji Firefox obsługuje wyłącznie prezentacyjny MathML. Na szczęście ograniczenie to możemy łatwo obejść.
W celu korzystania z MathML-a w Firefoksie wystarczy zainstalować czcionki dostępne na stronie: http://www.mozilla.org/projects/mathml/fonts/.
Tworząc strony WWW zawierające MathML i przeznaczone dla Firefoksa trzeba pamiętać o czterech szczegółach:
- dokumenty powinny zawierać podany powyżej typ DOCTYPE,
- elementom math należy nadać atrybut xmlns,
- we wzorach może być stosowany wyłącznie prezentacyjny MathML,
- pliki należy opatrzyć jednym z typów xml, np. application/xml (najprostsza metoda: nadać plikowi rozszerzenie xml)
Strony przestrzegające powyższych reguł będą zgodne z zaleceniami dokumentacji MathML 2.0. Przykład takiego dokumentu jest przedstawiony na listingu 1.
Rozszerzanie Firefoksa o obsługę znaczeniowego MathML-a
Firefox zawiera wyłącznie obsługę prezentacyjnego MathML-a. W celu wykorzystania dialektu znaczeniowego należy wzory znaczeniowe przekształcić na prezentacyjne. Zadanie to może być wykonane automatycznie przy użyciu transformacji XSLT zaimplementowanych przez Davida Carlisle\’a i opisanych w artykule pt. \”Putting mathematics on the Web with MathML\” (http://www.w3.org/Math/XSL/).
Po pobraniu trzech plików XSLT:
- pmathml.xsl
- mathml.xsl
- ctop.xsl
na początku strony WWW dodajemy instrukcję:
Wówczas w dokumentach przeglądanych Firefoksem można stosować zarówno prezentacyjny, znaczeniowy, jak i mieszany MathML. Na listingu 2 przedstawiony jest kod kompletnej strony WWW, na której zawarto znaczeniowy MathML. Podany przykład będzie wyświetlany poprawnie w Firefoksie pod warunkiem, że zostanie zapisany w pliku o rozszerzeniu xml oraz, że w tym samym folderze umieszczone będą trzy pliki pmathml.xsl, mathml.xsl i ctop.xsl.
MathML - przykład #4
Znaczeniowy MathML
Niestety, wbrew temu, co jest napisane w artykule \”Putting mathematics on the Web with MathML\” nie można stosować zdalnych adresów URL dołączających transformacje XSLT. Strony zawierające instrukcję:
PRZYKŁAD NIEPOPRAWNY
nie będą poprawnie wyświetlane. Trzy wyżej wymienione pliki .xsl musimy umieścić na swoim serwerze.
Internet Explorer
Wprawdzie Internet Explorer nie ma wbudowanej obsługi MathML-a, jednak dzięki wtyczce MathPlayer strony WWW zawierające MathML mogą być przeglądane we wszystkich wersjach tej popularnej przeglądarki od 6.0 wzwyż.
Po pobraniu i zainstalowaniu wtyczki http://www.dessci.com/en/products/mathplayer/ możemy przystąpić do tworzenia stron WWW przeznaczonych dla przeglądarki IE.
Stosujemy DOCTYPE podany w specyfikacji MathML 2.0:
Następnie w nagłówku dokumentu dołączamy kontrolkę MathPlayer:
...
W treści strony stosujemy element math z atrybutem xmlns:
Kompletny dokument, przedstawiony na listingu 3, zapisujemy w pliku o nazwie przyklad-6.xml.
MathML - przykład siódmy
Po otworzeniu dokumentu w przeglądarce Internet Explorer ujrzymy stronę przedstawioną na rys. 4. W zależności od konfiguracji przeglądarki IE koniecznym może okazać się włączenie wykonywania skryptów. Zadanie to wykonujemy klikając w żółty pas zabezpieczeń i wybierając opcję Zezwalaj na zablokowaną zawartość, jak to pokazano na rys. 5. Czasami pojawia się także okno dialogowe przedstawione na rys. 6. W nim także musimy zezwolić na blokowaną zawartość.
Podczas uruchamiania przykładu Internet Explorer wyświetli logo wtyczki MathPlayer, widoczne na rys. 7.
Warto zwrócić uwagę, że dokumenty tworzone w taki sposób mogą zawierać zarówno prezentacyjny, jak i znaczeniowy MathML.
Opera
Obsługa MathML-a pojawiła się w Operze dopiero w wersji 9.5. Podobnie jak w Firefoksie jest to cecha wbudowana przeglądarki, nie wymagająca instalacji żadnych wtyczek. Co więcej, w przypadku Opery nie musimy również instalować dodatkowych czcionek.
Opera 9.5 radzi sobie z prostymi dokumentami, które zawierają prezentacyjny MathML. Strona z listingu 1 wyświetlona w Operze została przedstawiona na rys. 7. Niestety, znaczeniowy MathML nie jest obsługiwany. Problemy pojawiają się także podczas stosowania encji, np. ⅈ czy ⁢, co ilustruje rys. 8.
Najlepsze rozwiązanie
Implementacja języka MathML w przeglądarkach Firefox oraz Internet Explorer jest na tyle dopracowana, że obecnie możemy już tworzyć strony WWW, które będą poprawnie wyświetlane w obu przeglądarkach. Od grupy tej odstaje Opera, która nie radzi sobie jeszcze ani ze znaczeniowym MathML-em, ani z encjami matematycznymi.
Przygotowując strony WWW zawierające MathML napotkamy znacznie więcej problemów, niż w przypadku tworzenia stron WWW. Interpretacja stron WWW zależy od:
- rodzaju przeglądarki (np. IE/FF/Opera),
- wersji przeglądarki (np. 6.0/2.0/9.5),
- trybu pracy przeglądarki (np. quirksmode/standardmode).
W przypadku stron WWW, które zawierają MathML dodatkowymi czynnikami na które należy zwrócić uwagę są:
- obsługa prezentacyjnego MathML,
- obsługa znaczeniowego MathML,
- obsługa mieszanego MathML,
- obsługa encji matematycznych.
Ponadto istotne jest:
- czy dokument otwieramy lokalnie (URL file:///) czy zdalnie (URL http://),
- rozszerzenie xml nazwy pliku (ogólniej: typ MIME dokumentu),
- czy stosujemy oryginalny dokument DTD czy zmodyfikowany.
W celu przygotowania dokumentu, który będzie poprawnie wyświetlany w Firefoksie oraz Internet Explorerze zarówno z sieci, jak i lokalnie, należy przygotować okrojony dokument DTD języka MathML, gdyż oryginalny plik pobierany ze strony W3C powoduje problemy w Internet Explorerze.
Przygotowanie dokumentu DTD z encjami
Oryginalny dokument DTD dostępny pod adresem:
http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd
przetwarzamy wyszukując encje pasujące do wyrażenia regularnego:
Przykładem takiej encji jest:
Wszystkie znalezione encje zapisujemy do pliku o nazwie mathml-entities.dtd. Kompletny skrypt PHP, który tworzy plik z encjami jest przedstawiony na listingu 4.
/imsU\';
preg_match_all($re, $plk, $m);
file_put_contents(\'mathml-entities.dtd\', implode(\"\r\n\", $m[0]));
?>
Strona WWW zawierająca MathML dla przeglądarek Firefox oraz Internet Explorer
Listing 5 przedstawia przykładową stronę WWW, która będzie poprawnie wyświetlana przez przeglądarkę Firefox z zainstalowanymi czcionkami matematycznymi oraz przez przeglądarkę Internet Explorer z zainstalowaną wtyczką MathPlayer. Dokument taki może zawierać prezentacyjny, znaczeniowy i mieszany MathML oraz wykorzystywać encje matematyczne. Będzie on poprawnie wyświetlany zarówno po umieszczeniu na serwerze, jak i po otworzeniu z dysku.
MathML - przykład #10
Kompletny przykład składa się z pięciu plików:
- mathml-entities.dtd
- ctop.xsl
- mathml.xsl
- pmathml.xsl
- przyklad-10.xml
Plik mathml-entities.dtd jest konieczny dla przeglądarki IE, gdyż oryginalne, pełne DTD z W3C powoduje błędy. Pliki ctop.xsl, mathml.xsl oraz pmathml.xsl to opisana wcześniej transformacja XSLT.
Strona WWW musi być zapisana w pliku o rozszerzeniu .xml. Wstawki matematyczne oznaczamy znacznikami math wzbogaconymi o atrybut xmlns:
Jedyną wadą takiego rozwiązania jest to, że Internet Explorer pracuje w trybie quirksmode. Jeśli zechcemy wymusić na przeglądarce tryb standardów, wówczas jedynym rozwiązaniem wydaje się tzw. cloaking, czyli wysyłanie różnych wersji dokumentu do różnych przeglądarek.
Jeśli treść dokumentu ograniczymy do prezentacyjnego i mieszanego MathML-a, wówczas możemy zrezygnować z transformacji XSLT.
Matematyczne strony WWW w PHP
Strona WWW zawierająca MathML, generowana w PHP, powinna zawierać instrukcję ustalającą typ MIME w nagłówku HTTP:
Podany w specyfikacji MathML (por. punkt 7.1.3) typ application/mathml+xml nie jest obecnie obsługiwany ani przez Firefoksa, ani przez IE.