<?xml version="1.0" encoding="utf-8" ?>

<?xml-stylesheet type="text/xsl" href="STYLE/mathml.xsl" ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
 "STYLE/mathml.dtd">
<!-- "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd" -->

<html xmlns="http://www.w3.org/1999/xhtml" >
<!-- xmlns:math="http://www.w3.org/1998/Math/MathML" -->

<head>

<meta name="author" content="Jan Jełowicki, jasj@ozi.ar.wroc.pl" />

<title>Zajęcia z Podstaw Informatyki -- formatowanie dokumentów: notacja wyrażeń matematycznych</title>

<link rel="stylesheet" type="text/css" href="STYLE/jj.css" />

<style type="text/css">
div.rownanie { display: block; float: none; text-align: center; margin-top: 1ex; margin-bottom: 1ex }
table.rownanie {margin-left: 40% }
.demo { text-align: center; margin-top: 1ex; margin-bottom: 1ex; margin-left: 40%; font-size: small; background-color: inherit }
.lang-en, .lang-x-lacina {font-style: italic}
</style>

</head>
<body xml:lang="pl">

<div class="nawigacja">
<a href="../toc.html" rel="toc">Spis treści</a>
<a href="../indeks.html" rel="index">Skorowidz</a>
<a href="../index.html">Poziom główny</a>
<a href="../semi6.html#przykladyHTML">Poziom nadrzędny</a>
<a href="spislit.html">Wstecz</a>
<a href="../semi6.html#przykladyHTML">Dalej</a>
</div>

<h1>Notacja wyrażeń matematycznych</h1>

<h2 id="math-intro">Wprowadzenie</h2>

<p>
Język <acronym>HTML</acronym> zasadniczo nie jest przeznaczony 
do prezentacji wyrażeń matematycznych. 
Właściwszym narzędziem do ich zapisu jest
język <a href="../LINKS/link-w3c_math.html"><acronym>MathML</acronym></a>, 
opracowany przez specjalistów z firmy <span class="firma">Wolfram Research</span> 
i zalecany przez Konsorcjum <acronym>WWW</acronym>.
</p>

<p>
W kursie formatowania dokumentów, opisanym w tym przewodniku, język <acronym>HTML</acronym> 
pełni rolę <span class="lang-x-lacina">lingua latina</span>: wzorcowego środka wyrażania i przekazywania idei. 
Nie jest to jednak typowy techniczny kurs nauki <acronym>HTML</acronym>;
jego opanowanie może być najwyżej (prawda, że pożytecznym?) efektem ubocznym 
nauczenia się poprawnego projektowania dokumentów.
Z technicznego punktu widzenia <acronym>MathML</acronym> jest zupełnie innym (choć podobnie zbudowanym)
językiem znakowania i jego nauka wykracza poza obszar naszego zainteresowania.
W centrum zainteresowania pozostają za to związki między sensem przekazu a doborem środków wyrazu,
mające przełożenie na wszystkie możliwe środowiska lub języki formatowania.
Z tego punktu widzenia zapoznanie się z ideami <acronym>MathML</acronym> może być pożyteczne,
nawet jeżeli Czytelnik nie zamierza w sposób czynny korzystać z tego języka.
</p>

<p>
Niezdecydowanym przypomnę, że z notacji matematycznej korzystają nie tylko matematycy, ale także
przedstawiciele innych nauk ścisłych, nauk technicznych, inżynierowie, przedstawiciele nauk przyrodniczych
i w ogóle ci wszyscy, których interesują związki między wielkościami bądź danymi.
</p>

<h3 id="math-pre">Dziedzictwo przeszłości</h3> 

<p>
Tradycyjny <acronym>HTML</acronym> w czystej postaci powoli odchodzi do przeszłości, 
jednak wykształcił pewne nawyki autorów, wzmacniane przez dostępne oprogramowanie.
W języku tym nie ma możliwości bezpośredniego znakowania wyrażeń matematycznych, 
dlatego każde przyjęte rozwiązanie jest kompromisem. 
</p>

<h4 id="math-ascii">Formuły matematyczne w <acronym>ASCII</acronym> (<span class="lang-en">ASCII math</span>)</h4>

<p>
Najstarszy popularny sposób notacji matematycznej, wywodzący się z zamierzchłych czasów
urządzeń wyłącznie znakowych, polegał na zamieszczaniu wyrażeń matematycznych w 
<em>preformatowanej postaci znakowej</em>. 
</p>

<div class="rownanie">
<pre>
 2    2     2  
x  + y  =  R  .
</pre></div>

<p>
Sposób ten dane stosunkowo duże możliwości prezentacyjne. Nietrudno np. 
wyrazić w nim alternatywną postać równania okręgu, choć nie ma ona wiele 
wspólnego z opisem budowy odpowiedniej formuły matematycznej:
</p>

<div class="rownanie">
<pre>
    --------       
   / 2    2        
 \/ x  + y   =  R .
</pre></div>

<p>
Oczywiście można tym sposobem przedstawiać także bardziej 
skomplikowane struktury matematyczne:
</p>

<div class="rownanie">
<pre>
 2    2       
x    y        
-- + -- =  1 .
 2    2       
a    b        
</pre></div>

<p>
Obszar preformatowany jest tu traktowany jak rodzaj dwuwymiarowej planszy,
na której umieszcza się niezależne znaki, podobnie jak w <span class="lang-en">ASCII-art</span>.
Sposób ten, mimo że korzysta z kodu <acronym>ASCII</acronym>, ma zatem naturę graficzną. 
Oczywiście równanie można tylko czytać oczami, jego analiza automatyczna i wykorzystanie 
w rachunkach komputerowych nie są możliwe. Nie mówiąc już o tym, że estetyka tej notacji
również pozostawia wiele do życzenia, zwłaszcza w porównaniu ze współczesnymi 
wymaganiami użytkowników i możliwościami urządzeń. Tym niemniej jest ona ekstremalnie odporna:
wyrażenie będzie prawidłowo wyświetlone i wydrukowane przez dowolny program zdolny do 
przedstawiania zawartości plików znakowych; nic więcej nie jest potrzebne.
</p>

<h4 id="math-graf">Prezentacja matematyki przez obiekty graficzne</h4>

<p>
Inny sposób wiąże się z zamieszczaniem wyrażeń matematycznych w postaci <em>plików graficznych</em>:
</p>

<div class="rownanie">
<img src="../IMG/img/rownanie.gif" alt="Równanie okręgu" height="40" />
</div>

<p>
Mimo, że równanie może być doskonale sformatowane przed zapisaniem obrazka,
rozwiązanie takie uniemożliwia wszelkie dalsze przetwarzanie, czyli m.in.: 
automatyczne formatowanie (np. zmianę wielkości, dopasowanie do rozdzielczości, 
dopasowanie kroju czcionki), 
konwersję do innych postaci (poza ręcznym przepisaniem),
automatyczne przeszukiwanie zawartości,
edycję zawartości, a także odczyt na terminalu tekstowym (wielu ludzi wciąż ich używa).
Stosowanie tej techniki przez popularne edytory, lub co gorsza przez świadomych rzeczy autorów,
jest więc poważnym błędem metodycznym. Potrzebne jest inne rozwiązanie.
</p>

<h4 id="math-text">Prezentacja matematyki za pomocą znakowania <acronym>HTML</acronym></h4>

<p>
Proste formuły można zapisywać korzystając wprost ze znaczników <acronym>HTML</acronym>, 
zwłaszcza z indeksów górnych i dolnych oraz z dostępnych jednostek znakowych:
</p>
<div class="rownanie">
<var>x</var><sup>2</sup> + <var>y</var><sup>2</sup> = <var>R</var><sup>2</sup>.
</div>
<p>
Dotyczy to jednak tylko najprostszych zależności. Na przykład równoważnej postaci równania okręgu
z lewą stroną pod pierwiastkiem nie da się już napisać tą metodą.
</p>

<p>
<em>Tabela</em> jest uniwersalną postacią prezentacji danych tekstowych w dwuwymiarowym obszarze. 
Opis tabeli definiuje jej strukturę, zaś sformatowaniem zajmuje się przeglądarka klienta. 
Wyrażenie zapisane w postaci tabeli może być odczytane przez każdy program formatujący,
rozumiejący język <acronym>HTML</acronym>, nawet jeżeli nie potrafi 
wyświetlać grafiki. Tekst źródłowy formuły wymaga mniej miejsca do przechowywania,
niż odpowiedni czytelny obraz rastrowy. Na dodatek tabelę, jako część tekstu źródłowego,
można poddawać edycji za pomocą standardowych narzędzi.
</p>

<p>
Oto nasze testowe równanie zapisane za pomocą tabeli:
</p>

<table class="rownanie"><tr>
<td>
<var>x</var><sup>2</sup>
</td><td valign="middle">
+
</td><td>
<var>y</var><sup>2</sup>
</td><td valign="middle">
=
</td><td>
<var>R</var><sup>2</sup>
</td></tr>
</table>

<p>
o następującej budowie:
</p>

<div class="demo">
<table border="1" rules="all">
<tr><td>
<var>x</var><sup>2</sup>
</td><td valign="middle">
+
</td><td>
<var>y</var><sup>2</sup>
</td><td valign="middle">
=
</td><td>
<var>R</var><sup>2</sup>
</td></tr>
</table>
</div>

<p>
Tą metodą da się od biedy napisać także wersję z pierwiastkiem:
</p>

<table class="rownanie">
<tr>
  <td valign="bottom"  align="left" ><br /><big><big>&#8730;</big></big></td>
  <td valign="bottom"  align="center"><hr /><var>x</var><sup>2</sup> + <var>y</var><sup>2</sup></td>
  <td valign="bottom"  align="center"> = </td>
  <td valign="bottom"  align="center"><var>R</var><sup>2</sup></td>
  <td valign="bottom">.</td>
  </tr>
</table>

<p>
Tabela ma następującą budowę:
</p>

<div class="demo">
<table border="1" rules="all">
<tr>
  <td valign="bottom"  align="left" ><br /><big><big>&#8730;</big></big></td>
  <td valign="bottom"  align="center" ><hr /><var>x</var><sup>2</sup> + <var>y</var><sup>2</sup></td>
  <td valign="bottom"  align="center"> = </td>
  <td valign="bottom"  align="center"><var>R</var><sup>2</sup></td>
  <td valign="bottom">.</td>
  </tr>
</table>
</div>

<p>
Podobnie da się przedstawić także równanie elipsy. 
Ułamkowi <var>x</var><sup>2</sup><big>/</big><var>a</var><sup>2</sup> 
nadamy postać tabeli:
</p>

<div class="demo">
<table border="1" rules="all">
<colgroup>
<col align="center" />
</colgroup>
<tr><td><var>x</var><sup>2</sup></td></tr>
<tr><td><hr /></td></tr>
<tr><td><var>a</var><sup>2</sup></td></tr>
</table>
</div>

<p>
Strukturę całego równania elipsy oddajemy jednowierszową tabelą <acronym>HTML</acronym>, 
której elementami są kolejno:
</p>

<div class="demo">
<table border="1" rules="all">
<colgroup>
<col span="5" align="center" />
</colgroup>
<tr>
<td> ułamek<br />(tabela) </td>
<td> działanie<br />(znak) </td>
<td> ułamek<br />(tabela) </td>
<td> relacja<br />(znak) </td>
<td> stała<br />(znak) </td>
</tr>
</table>
</div>

<p>
czyli
</p>

<div class="demo">
<table border="1" rules="all">
<tr>
<td>
<table border="1" rules="all">
<colgroup>
<col span="3" align="center" />
</colgroup>
<tr><td><var>x</var><sup>2</sup></td></tr>
<tr><td><hr /></td></tr>
<tr><td><var>a</var><sup>2</sup></td></tr>
</table>
</td><td valign="middle">
+
</td><td>
<table border="1" rules="all">
<colgroup>
<col span="3" align="center" />
</colgroup>
<tr><td><var>y</var><sup>2</sup></td></tr>
<tr><td><hr /></td></tr>
<tr><td><var>b</var><sup>2</sup></td></tr>
</table>
</td><td valign="middle">
=
</td><td valign="middle">
1
</td>
</tr></table>
</div>

<p>
Mamy więc ostatecznie:
</p>

<table class="rownanie"><tr><td>
<table>
<colgroup>
<col span="3" align="center" />
</colgroup>
<tr><td><var>x</var><sup>2</sup></td></tr>
<tr><td><hr /></td></tr>
<tr><td><var>a</var><sup>2</sup></td></tr>
</table>
</td><td valign="middle">
+
</td><td>
<table>
<colgroup>
<col span="3" align="center" />
</colgroup>
<tr><td><var>y</var><sup>2</sup></td></tr>
<tr><td><hr /></td></tr>
<tr><td><var>b</var><sup>2</sup></td></tr>
</table>
</td><td valign="middle">
=
</td><td valign="middle">
1.
</td>
</tr>
</table>

<p>
Jednak żaden program nie będzie w stanie automatycznie obliczać, analizować ani przekształcać wyrażeń 
opisanych za pomocą takich tabel. Środki formatowania, którymi dysponuje autor znakowania, nie mają 
nic wspólnego z rzeczywistością matematyczną odwzorowanego równania (oprócz tego, że zagnieżdżanie 
tabel może odpowiadać zagnieżdżaniu wyrażeń); metoda ta, podobnie jak poprzednie, nie jest więc godna 
polecenia do ogólnego stosowania, choć w przypadkach szczególnych może okazać się przydatna.
</p>

<h3 id="math-mkup">Krok w przyszłość: <acronym>XHTML</acronym>+<acronym>MathML</acronym></h3> 

<p>
Wszystkie przedstawione wyżej metody mają poważne ograniczenia. Dlatego nadają się wyłącznie
do doraźnego wykorzystania. Całościowe rozwiązanie notacji matematycznej wymaga wprowadzenia
nowego narzędzia. Jedną z propozycji jest <acronym>MathML</acronym>.
W przeglądarkach rozumiejących wyłącznie dialekty <acronym>HTML</acronym>, 
znaczniki <acronym>MathML</acronym> nie będą interpretowane.
</p>

<p>
Język <acronym>MathML</acronym> nie jest częścią <acronym>HTML</acronym>, 
lecz raczej jego równorzędnym partnerem zbudowanym środkami metajęzyka <acronym>XML</acronym>.
Dlatego nie należy oczekiwać, że każdy program rozumiejący polecenia <acronym>HTML</acronym>
będzie poprawnie formatował wyrażenia <acronym>MathML</acronym>.
Tym niemniej wszystkie przeglądarki rozumiejące metajęzyk <acronym>XML</acronym> 
powinny sobie radzić z <acronym>MathML</acronym>. 
Teoretycznie powinny to być wszystkie współcześnie powstające przeglądarki.
</p>

<p>
Sztandarowym narzędziem do tworzenia i oglądania dokumentów zawierających kod <acronym>MathML</acronym> 
jest publicznie dostępny program o nazwie <span class="marka">Amaya</span>,
mający oficjalne wsparcie ze strony Konsorcjum <acronym>WWW</acronym>.
Zdolnością poprawnej interpretacji <acronym>MathML</acronym> mogą się poszczycić m.in.
przeglądarki <span class="marka">Mozilla Firefox</span>
i <span class="marka">Seamonkey</span> oraz ich pochodne,
a po niewielkim uzupełnieniu w postaci modułu 
<a href="http://www.dessci.com/webmath/mathplayer"><span class="marka">MathPlayer</span></a> firmy Design Science
także <span class="marka">Microsoft Internet Explorer</span>.
Liczba programów i środowisk rozumiejących ten język szybko wzrasta.
</p>

<div class="obrazek">
Załączona do opracowania galeria ilustracji przedstawia 
<a href="../INCLUDE/wordprocmath.html">środowiska użytkowe wspomagające edycję wyrażeń matematycznych</a>, 
m.in. środkami języka <acronym>MathML</acronym>.
</div>

<p>
Interpretacja znaczników <acronym>MathML</acronym> przez przeglądarkę wymaga,
by dokument miał format <acronym>XML</acronym>. Dlatego plik zawierający dokument 
<acronym>MathML</acronym> powinien nosić nazwę z rozszerzeniem <code>mml</code> 
lub <code>xml</code>, a nie <code>html</code>, zaś jego nagłówek powinien zawierać 
kilka magicznych sekwencji języka <acronym>XML</acronym>, których znaczenia 
nie będziemy wyjaśniać szczegółowo.
</p>

<h2 id="math-jednostki">Symbole matematyczne w <acronym>UNICODE</acronym>, w <acronym>HTML</acronym> i w <acronym>MathML</acronym></h2>

<p>
W definicji języka <acronym>HTML</acronym>, począwszy od wersji 4.0 z 1998 roku,
umieszczono wiele nazw jednostek znakowych odpowiadających znakom alfabetu <acronym>UNICODE</acronym>, 
w tym znakom symboli matematycznych. Oto niektóre z nich:
</p>

<table border="1" rules="groups">
<colgroup>
<col align="left" />
<col align="center" />
<col align="left" />
</colgroup>
<thead>
<tr><th>Nazwa jednostki</th> <th>Wygląd znaku</th> <th>Znaczenie</th> </tr>
</thead><tbody>
<tr><td><code>&amp;lt;</code></td> <td>&lt;</td> <td>nierówność ostra</td></tr>
<tr><td><code>&amp;gt;</code></td> <td>&gt;</td> <td>nierówność ostra</td></tr>
<tr><td><code>&amp;le;</code></td> <td>&le;</td> <td>nierówność słaba</td></tr>
<tr><td><code>&amp;ge;</code></td> <td>&ge;</td> <td>nierówność słaba</td></tr>
</tbody><tbody>
<tr><td><code>&amp;ne;</code></td> <td>&ne;</td> <td>zaprzeczona równość</td></tr>
<tr><td><code>&amp;asymp;</code></td> <td>&asymp;</td> <td>równość w przybliżeniu</td></tr>
</tbody><tbody>
<tr><td><code>&amp;lang;</code></td> <td>&lang;</td> <td>lewy nawias kątowy</td></tr>
<tr><td><code>&amp;rang;</code></td> <td>&rang;</td> <td>prawy nawias kątowy</td></tr>
</tbody><tbody>
<tr><td><code>&amp;larr;</code></td> <td>&larr;</td> <td>strzałka w lewo</td></tr>
<tr><td><code>&amp;rarr;</code></td> <td>&rarr;</td> <td>strzałka w prawo</td></tr>
<tr><td><code>&amp;uarr;</code></td> <td>&uarr;</td> <td>strzałka w górę</td></tr>
<tr><td><code>&amp;darr;</code></td> <td>&darr;</td> <td>strzałka w dół</td></tr>
<tr><td><code>&amp;rArr;</code></td> <td>&rArr;</td> <td>prowadzi do</td></tr>
</tbody><tbody>
<tr><td><code>&amp;minus;</code></td> <td>&minus;</td> <td>znak minus</td></tr>
<tr><td><code>&amp;plusmn;</code></td> <td>&plusmn;</td> <td>znak plus-minus</td></tr>
<tr><td><code>&amp;sdot;</code></td> <td>&sdot;</td> <td>iloczyn, iloczyn skalarny</td></tr>
<tr><td><code>&amp;times;</code></td> <td>&times;</td> <td>iloczyn wektorowy</td></tr>
<tr><td><code>&amp;radic;</code></td> <td>&radic;</td> <td>pierwiastek</td></tr>
</tbody><tbody>
<tr><td><code>&amp;isin;</code></td> <td>&isin;</td> <td>należy do</td></tr>
<tr><td><code>&amp;ni;</code></td> <td>&ni;</td> <td>zawiera element</td></tr>
<tr><td><code>&amp;notin;</code></td> <td>&notin;</td> <td>nie należy do</td></tr>
<tr><td><code>&amp;sub;</code></td> <td>&sub;</td> <td>jest podzbiorem, zawiera się</td></tr>
<tr><td><code>&amp;sup;</code></td> <td>&sup;</td> <td>jest nadzbiorem, zawiera zbiór</td></tr>
</tbody><tbody>
<tr><td><code>&amp;infin;</code></td> <td>&infin;</td> <td>nieskończoność</td></tr>
</tbody><tbody>
<tr><td><code>&amp;sum;</code></td> <td>&sum;</td> <td>operator sumy</td></tr>
<tr><td><code>&amp;prod;</code></td> <td>&prod;</td> <td>operator iloczynu</td></tr>
<tr><td><code>&amp;int;</code></td> <td>&int;</td> <td>całka</td></tr>
<tr><td><code>&amp;part;</code></td> <td>&part;</td> <td>pochodna cząstkowa</td></tr>
</tbody>
</table>

<p>
Ten sposób notacji należy traktować jako podstawowy, 
choć oczywiście te same znaki można umieścić w pliku 
źródłowym wieloma innymi sposobami.
Język <acronym>MathML</acronym> wprowadza dodatkowe jednostki,
odwołujące się do wielu innych znaków symboli matematycznych.
</p>

<p>
Oczywiście każda nazwana jednostka znakowa <acronym>HTML</acronym> lub <acronym>MathML</acronym>
odpowiada pewnemu znakowi <acronym>UNICODE</acronym>. 
Numerami znaków <acronym>UNICODE</acronym> można posługiwać się jawnie, 
umieszczając w tekście źródłowym nazwę jednostki w postaci numerycznej, 
a nie symboliczej. Na przykład symbol sumowania 
ma w <acronym>UNICODE</acronym> numer 8721, czyli 2211 w systemie szesnastkowym.
Tak więc ciągi znaków <code>&amp;#8721;</code>, <code>&amp;#x2211;</code> oraz <code>&amp;sum;</code> 
są poprawnymi jednostkami znakowymi generującymi symbol &bdquo;&sum;&rdquo;. 
Tym sposobem możemy wygenerować każdy symbol <acronym>UNICODE</acronym>, jeżeli znamy jego numer. 
Nie trzeba dodawać, że stosowanie nazw symbolicznych zwiększa czytelność pliku źródłowego, 
zaś stosowanie nazw numerycznych raczej ją utrudnia (ale tylko ludziom, bo automatom jest wszystko jedno). 
Jednak nie wszystkie znaki mają standardowo nadane nazwy symboliczne.
</p>

<p>
W starszych dokumentach i środowiskach edycji popularne były swego rodzaju
&bdquo;protezy&rdquo;. Polegały one na jawnym wskazaniu nazwy czcionki, 
zawierającej symbole matematyczne, i numeru znaku. Nie jest to rozwiązanie poprawne, gdyż:
</p>

<ul>

<li>
jawne posługiwanie się numerami znaków i nazwą czcionki zaciemnia strukturę dokumentu zamiast ją akcentować;
</li>

<li>
system operacyjny musi dysponować czcionką o wskazanej nazwie.
W innym systemie równoważną rolę może spełniać czcionka nosząca inną nazwę,
a odpowiedni znak może w niej nosić inny numer;
</li>

<li>
przeglądarka (klient) musi mieć możliwość sterowania czcionką.
Większość przeglądarek graficznych ma tę możliwość (choć może nie być włączona),
lecz przeglądarki tekstowe są jej pozbawione. 
Jest jednak możliwe, że symbole <acronym>UNICODE</acronym> będą konwertowane 
do odpowiadających im w przybliżeniu znaków dostępnego alfabetu, 
do połączeń kilku dostępnych znaków lub też do nazw symbolicznych.
Tak jest np. w przypadku przeglądarki <span class="marka">Lynx</span>.
</li>
</ul>

<p>
Rozważmy dla przykładu możliwe sposoby przedstawienia operatora sumowania.
Znak &bdquo;S&rdquo; przedstawia literę łacińską, mającą w zestawie 
<acronym>ASCII</acronym> numer 83.
Znak &bdquo;S&rdquo; zapisany czcionką Adobe Symbol ma postać graficzną 
wielkiej litery Sigma. Ale co z tego: czy masz tę czcionkę? jeżeli masz, 
to czy nazywa się ona &bdquo;Symbol&rdquo;? czy wszyscy czytelnicy Twojego dokumentu
na wszystkich możliwych maszynach będą mieć do dyspozycji tę właśnie czcionkę pod tą właśnie nazwą?
Pamiętaj, że znak &bdquo;S&rdquo; pozostaje cały czas znakiem numer 83, co uniemożliwi 
przeglądarkom i edytorom automatyczne dopasowanie dostępnych czcionek tak, by czytelnik 
widział prawidłowy symbol niezależnie od tego, z jakiego programu i w jakim środowisku korzysta.
Lepiej użyć jednostki znakowej <acronym>UNICODE</acronym>. Tylko której?
Jednostka <code>&amp;Sigma;</code> oznacza literę grecką &bdquo;&Sigma;&rdquo; 
(znak ten ma w zestawie <acronym>UNICODE</acronym> numer 931).
Jednostka o nazwie <code>&amp;sum;</code> oznacza inny znak <acronym>UNICODE</acronym> 
(o numerze 8721), przedstawiający właśnie operator sumowania &bdquo;&sum;&rdquo;. 
Jedynym poprawnym rozwiązaniem jest użycie tego ostatniego symbolu.
</p>

<h2 id="math-elementy">Elementy znakowania <acronym>MathML</acronym></h2>

<p>
Każde wyrażenie <acronym>MathML</acronym> musi być ujęte w znaczniki
<code>&lt;math&gt;&hellip;&lt;/math&gt;</code>. 
Wyrażenia matematyczne &bdquo;w tekście&rdquo; i &bdquo;wystawione&rdquo; różnią się jedynie wartością
atrybutu <code>mode</code>: 
<code>&lt;math mode="inline"&gt;&hellip;&lt;/math&gt;</code> oznacza wyrażenie zawarte w bieżącym wierszu tekstu,
zaś <code>&lt;math mode="display"&gt;&hellip;&lt;/math&gt;</code> wyrażenie wyeksponowane w osobnym bloku. 
Zależnie od zestawu stylów formatowania, tryby te mogą się różnić wielkością czcionek, 
zasadami dobierania odstępów i innymi szczegółami.
</p>

<p>
Język <acronym>MathML</acronym> ma dwie warstwy: prezentacyjną i treściową.
Znaczy to, że każde wyrażenie matematyczne można opisać dwoma różnymi sposobami.
Warstwa prezentacyjna nawiązuje raczej do opisu wyglądu formuły niż do sposobu 
jej obliczania. Zawiera elementy znakowania odpowiadające podstawowym grupom 
symboli matematycznych: 
nazwom zmiennych (<code>mi</code>),
nazwom i wartościom stałych (<code>mn</code>),
operatorom, symbolom działań i relacji (<code>mo</code>).
Dostępne są też znaczniki opisujące struktury matematyczne, takie jak
potęgi, ułamki, granice sumowania i całkowania, wektory i macierze, i wiele innych.
</p>

<p>
Tyle o notacji prezentacyjnej.
<acronym>MathML</acronym> obejmuje również notację treściową.
Umożliwia ona łatwiejsze obliczanie wartości wyrażeń (w oparciu o tzw. odwrotną notację polską)
i ich przekształcanie; są to zadania bliższe prowadzeniu obliczeń niż tworzeniu dokumentów.  
Wiele operatorów i funkcji posiada swoje własne elementy znakowania, co umożliwia rozpoznawanie
obiektów matematycznych przez programy. Mimo że notacja treściowa góruje precyzją nad notacją 
prezentacyjną, użytkownik nawykły do notacji graficznej może mieć pewne trudności z przestawieniem 
sposobu myślenia. Notacji treściowej nie będziemy omawiać szczegółowo; ograniczymy się do porównania 
obu notacji w kilku przykładach.
</p>

<p id="sameprzyklady">
W dalszej części tego artykułu zamieszczamy przykłady wyrażeń sformatowanych środkami języka
<acronym>MathML</acronym>, a czasami także <acronym>HTML</acronym>, opatrzone komentarzem.
</p>

<h2 id="math-test">Przykład podstawowy</h2>

<p>
W wyrażeniu <acronym>MathML</acronym> przedstawiającym równanie okręgu
zastosujemy następujące elementy znakowania logicznego: zmienne
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><mi>x</mi></math>,
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><mi>y</mi></math>
i
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><mi>R</mi></math>,
stałą
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><mn>2</mn></math>,
potęgi (element <code>msup</code>) oraz operatory (element <code>mo</code>).
Element <code>mrow</code> pełni rolę <em>niewidzialnego nawiasu grupującego</em>,
wymuszającego kolejność działań:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<mrow>
  <msup><mi>x</mi><mn>2</mn></msup>
  <mo>+</mo>
  <msup><mi>y</mi><mn>2</mn></msup>
</mrow>
<mo>=</mo>
<msup><mi>R</mi><mn>2</mn></msup><mtext>.</mtext>
</math></div>

<p>
To samo równanie zakodowane w notacji treściowej <acronym>MathML</acronym>
przedstawia się następująco:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
  <apply><eq />
    <apply><plus />
      <apply><power />
        <ci>x</ci>
        <cn>2</cn>
      </apply>
      <apply><power />
        <ci>y</ci>
        <cn>2</cn>
      </apply>
    </apply>
    <apply>
      <power />
      <ci>R</ci>
      <cn>2</cn>
    </apply>
  </apply>
  <mtext>.</mtext>
</math></div>

<p>
Pozostaje przedstawić jeszcze równanie okręgu w wersji &bdquo;z pierwiastkiem&rdquo;.
W <acronym>MathML</acronym> pisze się je następująco:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<msqrt>
  <msup><mi>x</mi><mn>2</mn></msup>
  <mo>+</mo>
  <msup><mi>y</mi><mn>2</mn></msup>
</msqrt>
<mo>=</mo>
<mi>R</mi><mtext>.</mtext>
</math></div>

<p>
Tekst źródłowy wyrażenia pod pierwiastkiem został umieszczony w obszarze między znacznikami 
<code>&lt;msqrt&gt;&hellip;&lt;/msqrt&gt;</code>,
Element <code>msqrt</code> generuje symbol pierwiastka w przeglądarce 
(a także obliczenie wartości pierwiastka w programach obliczeniowych).
</p>

<p>
Na koniec to samo równanie przedstawione za pomocą notacji treściowej <acronym>MathML</acronym>:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
  <apply><eq />
  <apply><root />
    <apply><plus />
      <apply><power />
        <ci>x</ci><cn>2</cn>
      </apply>
      <apply><power />
        <ci>y</ci><cn>2</cn>
      </apply>
    </apply>
  </apply>
  <ci>R</ci>
  </apply><mtext>.</mtext>
</math></div>

<h2 id="math-jak">Na pociechę</h2>

<p>
Z analizy kodu źródłowego przykładów oglądanych po raz pierwszy można wynieść wrażenie, 
że <acronym>MathML</acronym> jest bardzo trudny i skomplikowany. Ale są to pozory. 
Zresztą, jeżeli użyjemy programu <span class="marka">Amaya</span> lub podobnego, nie musimy <em>pisać</em> 
kodu samodzielnie; będziemy go raczej <em>konstruować</em> korzystając
z przyjaznego środowiska graficznego. 
Możemy też dowolnie mieszać edycję za pomocą narzędzi graficznych
i edycję generowanego kodu w postaci znakowej.
</p>

<p>
Na pociechę dodamy, że &mdash; w przeciwieństwie do <acronym>HTML</acronym>,
który zaprojektowano z myślą o ręcznej edycji kodu źródłowego, 
z możliwością użycia narzędzi wspomagających znakowanie &mdash; 
<acronym>MathML</acronym> powstał raczej dla wymiany informacji między programami. 
Tak więc podstawowym sposobem tworzenia wyrażeń <acronym>MathML</acronym> ma być zdaniem jego twórców 
korzystanie z edytorów wspomagających znakowanie (niekoniecznie <acronym>WYSIWYG</acronym>), 
zaś znakowy format przekazu ma ułatwić wymianę informacji i tworzenie narzędzi, 
jak również umożliwić ręczną edycję w sytuacjach awaryjnych.
</p>

<h2 id="math-przyklady">Dalsze przykłady</h2>

<h3>Stałe, zmienne, funkcje, działania&hellip;</h3>

<p>
Trzeba wiedzieć, że chociaż nazwy zmiennych zazwyczaj składa się kursywą, to nie należy jej
wymuszać znacznikami odnoszącymi się bezpośrednio do czcionek.
W <acronym>HTML</acronym> skorzystalibyśmy z elementu znakowania logicznego <code>var</code>
(<span class="lang-en">variable</span> oznacza zmienną) służącego do oznaczania zmiennych, 
niekoniecznie matematycznych. Nazwy własne stałych, funkcji i operatorów piszemy czcionką prostą.
</p>

<p>
W <acronym>MathML</acronym> wykorzystamy specjalny element <code>mi</code> dla nazw zmiennych 
matematycznych, np. <code>&lt;mi&gt;x&lt;/mi&gt;</code> da nam 
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><mi>x</mi></math>. 
Mamy też element <code>mn</code> przeznaczony specjalnie do oznaczania stałych liczbowych.
Tak więc 
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><msup><mi>x</mi><mn>2</mn></msup></math>
otrzymamy z 
<code>&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;</code>.
Nazwy funkcji w <acronym>MathML</acronym> poprzedzamy
operatorem <code>&amp;ApplyFunction;</code> (zastosuj funkcję), nakazującym traktowanie 
argumentu jako nazwy funkcji, czego skutkiem jest m.in. dobor właściwej czcionki.
Tak więc funkcja sinus to 
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><mo>&ApplyFunction;</mo><mi>sin</mi></math>,
zaś odpowiedni kod źródłowy ma postać 
<code>&lt;mo&gt;&amp;ApplyFunction;&lt;/mo&gt;&lt;mi&gt;sin&lt;/mi&gt;</code>.
Oto &bdquo;jedynka trygonometryczna&rdquo; i wzór Eulera zapisane w <acronym>MathML</acronym>-u:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<mo>&ApplyFunction;</mo><msup><mi>sin</mi><mn>2</mn></msup><mi>x</mi> 
<mo>+</mo> 
<mo>&ApplyFunction;</mo><msup><mi>cos</mi><mn>2</mn></msup><mi>x</mi>
<mo>=</mo> 
<mn>1</mn><mtext>,</mtext>
</math>

<math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<msup><mi>e</mi><mrow><mi>i</mi><mo>&InvisibleTimes;</mo><mi>x</mi></mrow></msup>
<mo>=</mo> 
<mo>&ApplyFunction;</mo><mi>cos</mi><mi>x</mi> 
<mo>+</mo> 
<mi>i</mi><mo>&InvisibleTimes;</mo><mo>&ApplyFunction;</mo><mi>sin</mi><mi>x</mi><mtext>.</mtext> 
</math></div>

<p>
Zgodnie z powszechną konwencją typograficzną, zastosowanie mnożenia można wyrazić zapisując 
czynniki obok siebie, bez widocznego symbolu działania. W języku <acronym>MathML</acronym> 
jest zdefiniowana jednostka <code>&amp;InvisibleTimes;</code> oznaczająca mnożenie, lecz pozbawiona 
postaci graficznej. Jednostki tej używamy jako nazwy operatora: wyrażenie
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline">
<mi>i</mi><mo>&InvisibleTimes;</mo><mo>&ApplyFunction;</mo><mi>sin</mi><mi>x</mi> 
</math>
otrzymano z poleceń <code>&lt;mi>i&lt;/mi>&lt;mo&gt;&amp;InvisibleTimes;&lt;/mo&gt;&lt;mo&gt;&amp;ApplyFunction;&lt;/mo&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;</code>.
</p>

<p>
Znaczniki treściowe <acronym>MathML</acronym> wyrażają wprost fakt, 
że &bdquo;jedynka trygonometryczna&rdquo; przyrównuje (element <code>eq</code>) 
do jedności (stała) sumę (element <code>plus</code>) potęg (element <code>power</code>) 
sinusa (element <code>sin</code>) i cosinusa o wykładniku dwa (stała) 
tej samej zmiennej <var>x</var>:
</p>
<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<apply>
<eq />
<apply>
<plus />
<apply><power /><apply><sin /><ci>x</ci></apply><cn>2</cn></apply>
<apply><power /><apply><cos /><ci>x</ci></apply><cn>2</cn></apply>
</apply>
<mn>1</mn>
</apply><mtext>.</mtext>
</math></div>

<p>
Widzimy, że zapis wyrażenia matematycznego w języku <acronym>MathML</acronym> 
dostarcza bardzo wiele informacji o tym wyrażeniu.
Ten sam tekst źródłowy może służyć zarówno do prezentacji równania w programie przeglądarki, 
jak i do przeprowadzenia obliczeń za pomocą programu do obliczeń numerycznych,
czy też do matematycznych przekształceń wyrażenia przy wykorzystaniu programu do rachunków symbolicznych.
</p>

<h3>Wyrażenia zawierające ułamki</h3>

<p>
W równaniu elipsy potrzebne są wyrażenia &bdquo;piętrowe&rdquo;.
W czystym <acronym>HTML</acronym> brakuje środka do wyrażenia ułamka 
za pomocą znaczników; na ogół zadowalaliśmy się notacją liniową 
<var>x</var><sup>2</sup><big>/</big><var>a</var><sup>2</sup>. 
</p>

<p>
W formułach o tym stopniu komplikacji użycie <acronym>MathML</acronym> 
będzie już łatwiejsze, niż zagnieżdżanie tabel <acronym>HTML</acronym>.
Lecz przede wszystkim będzie bardziej poprawne &mdash; zamiast tabeli odwzorowującej 
ułamek graficznie, stosujemy element <code>mfrac</code>, oznaczający właśnie ułamek:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<mfrac>
  <msup><mi>x</mi><mn>2</mn></msup>
  <msup><mi>a</mi><mn>2</mn></msup>
</mfrac>
<mo>+</mo>
<mfrac>
  <msup><mi>y</mi><mn>2</mn></msup>
  <msup><mi>b</mi><mn>2</mn></msup>
</mfrac>
<mo>=</mo>
  <mn>1</mn><mtext>.</mtext>
</math></div>

<p>
Oprócz ułamków w równaniu wystąpiły także: znaczniki działania potęgowania (<code>msup</code>)
oraz znaczniki operatora matematycznego (<code>mo</code>) zastosowane do symboli operacji dodawania i relacji równości. 
Równanie jest składane automatycznie.
Ułamki są tworzone automatycznie na podstawie opisu, bez &bdquo;rzeźbienia&rdquo; kreski ułamkowej! 
Przy bardziej złożonych formułach zalety <acronym>MathML</acronym> ujawnią się
jeszcze wyraźniej.
</p>

<p>
Na wyższej półce leży notacja treściowa, z której dostajemy:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<apply><eq/>

  <apply><plus />
    <apply><divide />
      <apply><power />
        <ci>x</ci><cn>2</cn>
      </apply>
      <apply><power />
        <ci>a</ci><cn>2</cn>
      </apply>
    </apply>

    <apply><divide />
      <apply><power />
        <ci>y</ci><cn>2</cn>
      </apply>
      <apply><power />
        <ci>b</ci><cn>2</cn>
      </apply>
    </apply>

  </apply>

  <cn>1</cn>

</apply><mtext>.</mtext>

</math></div>

<p>
Możemy też &bdquo;pomieszać&rdquo; obie notacje:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<apply><eq/>
<apply><plus />
<mfrac>
<apply><power />
<ci>x</ci>
<cn>2</cn>
</apply>
<apply><power />
<ci>a</ci>
<cn>2</cn>
</apply>
</mfrac>

<mfrac>
<apply><power />
<ci>y</ci>
<cn>2</cn>
</apply>
<apply><power />
<ci>b</ci>
<cn>2</cn>
</apply>
</mfrac>

</apply>

<cn>1</cn>

</apply><mtext>.</mtext>

</math></div>


<h3>Operator sumowania</h3>

<p>
Czas napisać wzór na sumę szeregu geometrycznego.
Korzystamy z jednostki <code>&amp;infin;</code> generującej symbol nieskończoności &bdquo;&infin;&rdquo;
Operator sumowania uzyskamy z symbolu <code>&amp;sum;</code> dającego &bdquo;&sum;&rdquo;
(należy odróżniać tę jednostkę od jednostki <code>&amp;Sigma;</code> oznaczającej grecką literę &Sigma;,
a także od litery S zapisanej czcionką Adobe Symbol).
Używając jednostek znakowych <acronym>UNICODE</acronym> zgodnie z ich przeznaczeniem 
oraz znaczników <acronym>MathML</acronym> dostaniemy:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<mrow>
<munderover>
    <mo>&sum;</mo>
    <mrow><mi>n</mi> <mo>=</mo> <mn>2</mn></mrow>
    <mi>&infin;</mi>
</munderover>
<mfrac><mn>1</mn><msup><mn>2</mn><mi>n</mi></msup></mfrac>
</mrow>
<mo>=</mo>
<mfrac><mn>1</mn><mn>2</mn></mfrac><mtext>.</mtext>
</math></div>

<p>
Oczywiście 
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><mo>&sum;</mo></math> 
to 
<code>&lt;mo&gt;&amp;sum;&lt;/mo&gt;</code>,
zaś struktura <code>munderover</code> umożliwia umieszczenie granic sumowania pod i nad operatorem.
</p>

<p>
To samo wyrażenie zapisane przy użyciu notacji treściowej
będzie się przedstawiało następująo:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<apply><eq />
    <apply><sum />
	<bvar><ci>n</ci></bvar>
	<lowlimit><cn>2</cn></lowlimit>
	<uplimit><infinity /></uplimit>
	<mfrac>
	    <mn>1</mn>
	    <apply><power /><cn>2</cn><ci>n</ci></apply>
	</mfrac>
    </apply>
    <mfrac>
	<mn>1</mn><mn>2</mn>
    </mfrac>
</apply>
<mtext>.</mtext>
</math></div>

<h3>Całka nieoznaczona</h3>

<p>
A oto pewna funkcja podcałkowa i jej funkcja pierwotna.
Znak całki tworzymy symbolem <code>&amp;int;</code>.
Jak już mówiliśmy, nazwy zmiennych powinny być złożone kursywą, 
lecz nazwy własne stałych, funkcji i operatorów składa się czcionką prostą.
Z odpowiedniej konstrukcji <acronym>MathML</acronym> dostaniemy
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<mo>&int;</mo> 
<mo>&ApplyFunction;</mo><mi>ln</mi> <mi>x</mi> 
<mo>d</mo><mi>x</mi>
<mo>=</mo>
<mi>x</mi>
<mo>&sdot;</mo>
<mrow><mo fence="true">(</mo>
<mo>&ApplyFunction;</mo><mi>ln</mi> 
<mi>x</mi>
<mo>&minus;</mo>
<mn>1</mn>
<mo fence="true">)</mo></mrow>
<mo>+</mo>
<mi>C</mi><mtext>.</mtext>
</math></div>

<p>
Stała całkowania 
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><mi>C</mi></math> 
mimo swej nazwy nie jest stałą, 
tylko zmienną, gdyż nie ma ustalonej z góry wartości.
W wyrażeniu 
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><mo>d</mo><mi>x</mi></math>, 
wskazującym na zmienną całkowania, operator różniczki
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"><mo>d</mo></math>
jest oznakowany jako <code>&lt;mo&gt;d&lt;/mo&gt;</code>.
</p>

<p>
Przy stosowaniu notacji treściowej wszystkie elementy pomocnicze,
jak nawiasy i symbol różniczki, zostaną wygenerowane automatycznie.
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<apply><eq/>
    <apply><int/>
	<bvar><ci>x</ci></bvar>
	<mrow><ci type="fn">ln</ci><ci>x</ci></mrow>
    </apply>
    <apply><plus />
	<apply><times />
	    <mi>x</mi>
		<apply><minus/>
	        <mrow><ci type="fn">ln</ci><ci>x</ci></mrow>
		<mn>1</mn>
		</apply>
        </apply>
	<ci>C</ci>
    </apply>
</apply>
<mtext>.</mtext>
</math></div>

<h3>Wyrażenia z macierzami i wyznacznikami</h3>

<p>
Na zakończenie przedstawimy kilka wyrażeń zawierających macierze i wektory.
Pierwsze z nich przedstawia sposób obliczania wyznacznika macierzy przekątniowej.
Korzystając z języka <acronym>MathML</acronym>, mamy do dyspozycji
struktury: 
<code>matrix</code> i <code>vector</code> przeznaczone specjalnie dla macierzy i wektorów,
oraz <code>mtable</code> opisującą tablice.
Nie musimy podpierać się konstrukcjami zastępczymi, możemy też wprowadzić poprawne nawiasy:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<mo>&ApplyFunction;</mo><mi>det</mi>

<mrow>
<matrix>
<mtr><mtd><msub><mi>a</mi><mn>1</mn></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><msub><mi>a</mi><mn>2</mn></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>a</mi><mn>3</mn></msub></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>a</mi><mn>4</mn></msub></mtd></mtr>
</matrix>
</mrow>

<mo>=</mo>

<mrow><mo fence="true">|</mo>
<mtable>
<mtr><mtd><msub><mi>a</mi><mn>1</mn></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><msub><mi>a</mi><mn>2</mn></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>a</mi><mn>3</mn></msub></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>a</mi><mn>4</mn></msub></mtd></mtr>
</mtable>
<mo fence="true">|</mo></mrow>

<mo>=</mo>

<mrow>
<msub><mi>a</mi><mn>1</mn></msub> <mo>&InvisibleTimes;</mo>
<msub><mi>a</mi><mn>2</mn></msub> <mo>&InvisibleTimes;</mo>
<msub><mi>a</mi><mn>3</mn></msub> <mo>&InvisibleTimes;</mo>
<msub><mi>a</mi><mn>4</mn></msub> 
</mrow><mtext>.</mtext>

</math></div>

<p>
Nie zapomnijmy o umieszczeniu operatora <code>&lt;mo&gt;&amp;InvisibleTimes;&lt;/mo&gt;</code> między
mnożonymi czynnikami.
</p>

<p>
Podobnym sposobem możemy napisać wzór na mnożenie macierzy przekątniowych:
</p>

<div class="rownanie"><math xmlns="http://www.w3.org/1998/Math/MathML" mode="display">
<mrow>

<mo>&ApplyFunction;</mo><mi>diag</mi>

<vector>
<msub><mi>a</mi><mn>1</mn></msub>
<msub><mi>b</mi><mn>1</mn></msub>
<msub><mi>c</mi><mn>1</mn></msub>
<msub><mi>d</mi><mn>1</mn></msub>
</vector>

<mo>&sdot;</mo>

<mo>&ApplyFunction;</mo><mi>diag</mi>

<vector>
<msub><mi>a</mi><mn>2</mn></msub>
<msub><mi>b</mi><mn>2</mn></msub>
<msub><mi>c</mi><mn>2</mn></msub>
<msub><mi>d</mi><mn>2</mn></msub>
</vector>

<mo>=</mo>

<matrix>
<mtr><mtd><msub><mi>a</mi><mn>1</mn></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><msub><mi>b</mi><mn>1</mn></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>c</mi><mn>1</mn></msub></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>d</mi><mn>1</mn></msub></mtd></mtr>
</matrix>

<mo>&sdot;</mo>

<matrix>
<mtr><mtd><msub><mi>a</mi><mn>2</mn></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><msub><mi>b</mi><mn>2</mn></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>c</mi><mn>2</mn></msub></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>d</mi><mn>2</mn></msub></mtd></mtr>
</matrix>

</mrow>

<mo>=</mo>

<matrix>
<mtr><mtd><msub><mi>a</mi><mn>1</mn></msub><mo>&InvisibleTimes;</mo><msub><mi>a</mi><mn>2</mn></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><msub><mi>b</mi><mn>1</mn></msub><mo>&InvisibleTimes;</mo><msub><mi>b</mi><mn>2</mn></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>c</mi><mn>1</mn></msub><mo>&InvisibleTimes;</mo><msub><mi>c</mi><mn>2</mn></msub></mtd><mtd><mn>0</mn></mtd></mtr>
<mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>d</mi><mn>1</mn></msub><mo>&InvisibleTimes;</mo><msub><mi>d</mi><mn>2</mn></msub></mtd></mtr>
</matrix>

<mo>=</mo>

<mo>&ApplyFunction;</mo><mi>diag</mi>

<vector>
<mrow><msub><mi>a</mi><mn>1</mn></msub><mo>&InvisibleTimes;</mo><msub><mi>a</mi><mn>2</mn></msub></mrow>
<mrow><msub><mi>b</mi><mn>1</mn></msub><mo>&InvisibleTimes;</mo><msub><mi>b</mi><mn>2</mn></msub></mrow>
<mrow><msub><mi>c</mi><mn>1</mn></msub><mo>&InvisibleTimes;</mo><msub><mi>c</mi><mn>2</mn></msub></mrow>
<mrow><msub><mi>d</mi><mn>1</mn></msub><mo>&InvisibleTimes;</mo><msub><mi>d</mi><mn>2</mn></msub></mrow>
</vector>

<mtext>.</mtext>

</math></div>

<p>
Przy okazji analizy powyższego przykładu możemy dostrzec, zrozumieć i docenić
zasady automatycznego dobierania wielkości nawiasów.
</p>

<address>
&copy; Copyright 2000&ndash;2003, 2008 by Jan Jełowicki, Katedra Matematyki Uniwersytetu Przyrodniczego we Wrocławiu<br />
&#x2709; <tt>janj@aqua.ar.wroc.pl</tt><br />
&#x2302; <tt>http://karnet.up.wroc.pl/~jasj</tt><br />
<img src="http://karnet.up.wroc.pl/~jasj/logo.php" alt="" width="0" height="0" />
</address>

<div class="logo">
<a href="http://validator.w3.org/check?uri=referer"><img 
src="IMG/valid_xhtml11.png" alt="Valid XHTML 1.1!" /></a>
<a href="http://validator.w3.org/check?uri=referer"><img 
src="IMG/valid_mathml.png" alt="Valid MathTML 2.0!" /></a>
<a href="http://jigsaw.w3.org/css-validator/check?uri=referer"><img 
src="IMG/valid_css.png" alt="Valid CSS!" /></a>
</div>

</body></html>

