Основная задача MathML состоит в представлении математической информации в виде, пригодном для ее передачи и обработки в сети Internet, так же как гипертекст позволил подобную функциональность для текстовой, а затем и мультимедийной информации. Мы можем работать в глобальной сети с текстом и картинками, с видео — и аудиопотоками, даже с геолокационными данными! Неужели у нас нет средств для отображения каких-то интегралов и пределов? Конечно есть.
MathML (Mathematical Markup Language) — это XML-язык, первая реализация которого появилась еще в 1998 году и тогда же была рекомендована W3C в качестве стандарта. Хотя история непредставления математической информации в электронном виде началась еще до широкого распространения Интернета. В частности, свои стандарты в этой области предлагали SGML (Standard Generalized Markup Language) и TEX. Предложение о включении HTML Math в прототип HTML 3.0 внес Dave Raggett еще в 1994 году. В ноябре 1995 года команде W3C было выдвинуто предложение о реализации поддержки математики в рамках HTML. В марте 1997 года была первая W3C Math Working Group. Вторая появилась в июле 1998 года, и именно ей удалось добиться стадии рекомендации W3C. Казалось бы, цель была достигнута, но производители браузеров (в отличие от ученых мужей в консорциуме) не очень спешили поддерживать реализацию стандарта, и долгое время MathML существовал и развивался просто как один из XML-языков разметки. И доразвился в октябре 2010 года до версии 3.0, которую в настоящее время мы уже можем использовать для отображения в современных браузерах без дополнительных плагинов.
Что собой на деле представляет MathML-разметка? Примерно вот это:
<math>
<mstyle displaystyle=’true’> <munderover>
<mo>∑</mo>
<mrow>
<mi>i</mi>
<mo>=</mo>
<mn>0</mn>
</mrow>
<mi>∞</mi>
</munderover>
<msub>
<mi>x</mi>
<mi>i</mi>
</msub>
</mstyle>
</math>
Результат можно видеть на рис. 116. Впечатляет? Тогда пойдем дальше.
В общем-то, это только одна сторона MathML. Любой человек, знакомый с математикой чуть дальше школьной программы, может понять, что основной проблемой создания языка разметки для математического контента является необходимость одновременно реализовывать представление математической нотации (формы) и содержание представляемых математических идей и объектов. Этот дуализм отражен делением элементов разметки MathML на
Рис. 116. MathML в браузере
Два класса — элементов представления (Presentation MathML) и элементов содержания (Content MathML). Разницу между ними можно продемонстрировать на примере. Запишем хорошо известное со школы квадратное уравнение (ну или квадратный трехчленный полином, как его называют в народе), используя Presentation MathML, а заодно и познакомимся с практикой применения MathML на вебстранице. Сейчас для этого надо совсем немного — просто вставить в нужном месте HTML-контейнер <math></math>:
<!DOCTYPE html>
<html>
<head>
<title>MathLM in action</title> </head>
<body>
<math>
</math>
</body>
</html>
<math>
<mrow>
<mn>5</mn>
<msup>
<mi>x</mi>
<mn>2</mn>
</msup>
<mo>+</mo>
<mn>8</mn><mi>x</mi>
<mo>+</mo>
<mn>7</n>
<mo>=</mo>
<mn>0</mn>
</mrow>
</math>
Результат можно видеть на рис. 117. Теперь запишем то же выражение, пользуясь разметкой Content MathML:
<mrow>
<apply>
<plus/>
<apply>
<times/>
<cn>5</cn>
<apply>
<power/>
<ci>x</ci>
<cn>2</cn>
</apply>
</apply>
<apply>
<times/>
<ci>x</ci>
<cn>8</cn>
</apply>
<cn>7</cn>
</apply>
</mrow>
Ничего не понятно? Это не страшно, мы еще подробно рассмотрим разметку содержания, пока стоит лишь сказать, что при записи
(§) MathLM in action — Mozilla I
Рис. 117. Квадратное уравнение, записанное с помощью MathML-разметки
Арифметических действий тут применяется прямая польская (префиксная) нотация. То есть выражение 1+2 будет записано как + 1 2, то есть сначала записывается оператор, потом список элементов, к которым он применяется. Результат данной разметки в браузере не увидишь, что закономерно, она предназначена не для отображения.
Ну а теперь давайте рассмотрим оба этих инструмента подробнее. Начнем с разметки представления.
Presentation MathML — разметка представления
Конечно, мы в большинстве своем не математики, а веб-программисты и именно визуальное представление математического контента должно нас волновать в большей степени. Как MathML с этим справляется? Давайте вернемся к нашему квадратному уравнению и рассмотрим элементы разметки. Прежде всего это контейнеры <mi>, <mn> и <mo>, содержащие, соответственно, представления для переменных (идентификаторов), чисел и операций. Как их будет интерпретировать браузер, это, в соответствии с духом современных веб-стандартов, его, браузера, дело, но обычно они отображаются разными стилями: числа — прямым шрифтом, идентификаторы — курсивом, а вокруг операторов оставляется дополнительное свободное пространство.
Эти элементы в терминах MathML называются «токены» (token elements), в качестве содержимого имеют текстовые символы. Также к токенам относятся элементы, предназначенные для представления литералов <ms> текста <mtext> и пробельных символов <mspace>.
Другой вид тегов Presentation MathML называется элементами схемы (layout schemata), их содержимое — другие элементы.
Вернемся к нашему уравнению. Контейнер <msup> добавляет верхний индекс. У него два аргумента — основание (x) и сам индекс (2). Самый же верхнеуровневый контейнер данного примера <mrow> формирует ряд данных с выравниванием по горизонтали. Его можно (и нужно) применять чуть более гибко. Давайте сейчас перепишем отображение квадратного уравнения, заодно представив его в более общем виде:
<mrow> |
|
<mrow> |
|
<mi>a</mi> |
|
<msup> |
|
<mi>x</mi> |
|
<mn>2</mn> |
|
</msup> |
|
<mo>+</mo> |
|
<mi>b</mi> |
|
<mi>x</mi> |
|
<mo>+</mo> |
|
<mi>c</mi> |
|
<mrow> |
|
<mo>=</mo> |
|
<mn>0</mn> |
|
</mrow> |
|
Теперь напишем решение для нашего |
Уровнения. Саму формулу |
Можно видеть на рис. 118, а отображает |
Ее следующий код: |
<math>
<msub>
<mi>x</mi>
<mrow>
<mn>1</mn> <mo>, </mo>
<mn>2</mn>
</mrow>
</msub>
<mo>=</mo>
<mfrac>
<mrow>
<mo>-</mo>
<mi>b</mi>
<mo>±</mo> <msqrt>
<msup>
<mi>b</mi>
<mn>2</mn>
</msup>
<mo>-</mo>
<mn>4</mn>
<mi>a</mi>
<mi>c</mi>
</msqrt>
</mrow>
<mrow>
<mn>2</mn>
<mi>a</mi>
</mrow>
</mfrac>
</math>
Что нового мы тут видим? Ну, во-первых, контейнер <msub> , переводящий основание в нижний индекс. Затем контейнер <mfrac>, создающий представление дроби. Да, для элементов-контейнеров можно указывать атрибуты, и это не только «style» (тут вообще не должно быть никаких вопросов, ведь это часть разметки), нужен фиолетовый знак квадратного корня — делайте!). Например, у <mfrac> имеется атрибут linethickness, который отвечает за толщину разделительной линии дроби, и атрибут bevelled, ответственный за его прямое или «слэшевое» написание.
Контейнер <msqrt> помещает свое содержимое под знак квадратного корня, для корня (радикала) с другим основанием существует тег <mroot>:
<mroot>
<mrow>
<mi>b</mi>
<mo>+</mo>
<mi>c</mi>
</mrow>
<mn>3</mn>
</mroot>
Для изображения знака плюс-минус мы используем сочетание символов «±», это то, что в XML называется «ссылочной сущностью». MathML определяет несколько десятков таких сущностей, среди которых есть такая полезная, как «⁢», создающая небольшой неразрывный пробел, используемый вместо знака умножения (сущность не позволит сделать разрыв строки между множителями). Другие сущности представлены в примере ниже:
<math> |
|
<mstyle displaystyle=’true’> |
|
<munderover> |
|
<mo>∫</mo> |
|
<mn>0</mn> |
|
<mn>1</mn> |
|
</munderover> |
|
<mi>f</mi> |
|
<mrow> |
|
<mfenced> |
|
<mi>x</mi> |
|
</mfenced> |
|
</mrow> |
|
<mtext>  </mtext> |
|
<mo>ⅆ</mo> |
|
<mi>x</mi> |
|
</mstyle> |
|
</math> |
|
Результат — на рис. 120. |
|
Кроме символов интеграла и дифференциала, в |
Этом примере |
Стоит обратить внимание на контейнер <mfenced>, группирующий |
|
Элементы в скобки, и <munderover>, добавляющий |
Символы над и |
Под базовым символом (естественно, можно разделить эти опера- |
|
Ции — теги <mover> и <munder>). |
|
Не будем останавливаться, на рис. 121 отображена довольно удач- |
|
Ная, на мой взгляд, попытка показать пересечение |
Множеств. Это |
Сделано с помощью следующей разметки: |
<math>
<mrow>
<mrow>
<munderover>
<mrow>
Рис. 120. Интеграл, дифференциал, что еще нужно?
Рис. 121. Теория множеств на веб-странице
<mo>∩</mo> </mrow>
<mrow>
<mi>i</mi>
<mo>=</mo>
<mn>0</mn>
</mrow>
<mrow>
<mi>∞</mi> </mrow> </munderover>
</mrow>
<mrow>
<mi>A</mi>
<mo>∩</mo> <mi>B</mi>
</mrow>
</mrow>
</math>
Hу и закончим разговор про Presentation MathML матрицей. Куда же без нее? Вот код:
<math>
<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>
</math>
Рис. 122. Матрица!
Content MathML — «содержательная» разметка
Как уже отмечалось, цель Content MathML сильно отличается от presentation. Это отображение структуры математического выражения, а не внешней формы записи, которая в этом случае совершенно не важна. В браузере Content MathML разметка по умолчанию не отображается. Это, конечно, можно исправить, применив таблицу стилей, но, как правило, такой необходимости нет — контент, организованный с помощью Content MathML, не предназначен к просмотру в обозревателе. Он должен предоставлять материал для машинной обработки анализа и индексации, и эти задачи будут в целом посложнее, чем показ формул на веб-странице. Неудивительно, что Content MathML содержит около 150 элементов (против 30 Presentation MathML). Всех их мы рассматривать не будем, но общее представление о разметке содержания получить попробуем.
Прежде всего вернемся к примеру с квадратным уравнением, размеченным Content MathML. Мы видим, что здесь тоже есть токены. Контейнеры <ci>,<cs> и <en> содержат, соответственно, переменные, строки и числа. Они не в пример сложнее презентационных элементов, так как несут больше смысловой нагрузки.
Так, содержимым тега <cn> может быть число со знаком, с десятичной точкой или предопределенная константа (выраженная сущностью π, ⅇ, γ). Тег может иметь атрибуты:
— type — тип числа. По умолчанию он принимает значение «real» (действительное число). Может принимать значения «integer», «real», «double», «hexdouble», «e-notation», «rational», «complex-cartesian», «complex-polar», «constant» и «text»;
— base — основание системы счисления.
Пример записи чисел применением Content MathML:
<cn type="hexdouble">7F800000</cn>
Шестнадцатеричное число двойной точности
<cn type="rational">22<sep/>7</cn>
Рациональное число, где тег <sep/> выступает разделителем между числителем и знаменателем.
<cn type="complex-polar"> 2 <sep/> 3.1415 </cn>
Комплексное число, записанное в полярной (геометрической) форме, где <sep/> разделяет расстояние до начала координат (модуль) и угол радиус-вектора.
<cn type="constant">π</cn>
Тут все просто константа пи, предоставленная XML-сущностью. Тег <ci> также может иметь атрибут type и содержать внутри составные Presentation MathML-конструкции:
<ci>
<msup>
<mi>C</mi>
<mn>2</mn>
</msup>
</ci>
Еще к токенам относится тег <csymbol>, содержащий символы, определенные во внешних документах. URL такого документа определяется в атрибуте definitionURL:
<csymbol encoding="text"
DefinitionURL="Http://www. sbml. org/sbml/symbols/delay > myVar </csymbol>
Операторы тут в токенах содержаться не могут, они сами представляют собой отдельные элементы, мы их видим в нашем примере. Ключевым здесь является тег <apply>, который указывает на применение функции или операции к набору аргументов. При этом, как уже упоминалось, используется прямая польская нотация. К примеру, выражение 2*(x+1) будет записано как
<apply>
<times/>
<cn>2</cn>
<apply>
<plus/>
<ci>x</ci>
<cn>1</cn>
</apply>
</apply>
Контейнер <apply/> принимает оператор (или функции) в качестве первого аргумента. Нетрудно догадаться, что тут тег <times/> соответствует оператору умножения, а <plus/> — сложения.
Сложные функции и операции требуют применения дополнительных элементов — квалификаторов (Quantifiers). Разберем следующий несложный пример:
<apply>
<int/>
<bvar><ci>x</cix></bvar> <lowlimit><cn>0</cn></lowlimit> <u plim it><cn>K</cn></u plim it> <apply>
<power/>
<ci>x</ci>
<cn>2</cn>
<apply>
</apply>
Тут в качестве квалификаторов выступает тег <bvar>, определяющий переменную, по которой происходит интегрирование, контейнеры <lowlimitx> и <uplimit>, задающие пределы интегрирования.
Для представления функциональных концепций Content MathML предлагает контейнер <lambda>, предназначенный для построения функций, определяемых пользователем. В следующем примере мы определим функцию sin(x+1):
<math>
<lambda>
<bvar>
<ci> x </ci> </bvar>
<apply>
<sin/>
<apply>
<plus/>
<ci> x </ci> <cn> 1 </cn> </apply> </apply>
</lambda>
</math>
Еще один важный элемент Content MathML, <declare>, используется для связи заданного идентификатора с математический объектом. Вот так можно с помощью него определить вектор с заданными координатами:
<declare>
<ci> A </ci> <vector>
<ci> a </ci> <ci> b </ci> <ci>c </ci> </declare>
Теперь идентификатор «A» может быть использован для обозначения вектора с координатами a, b и c. Эта конструкция особенно важна для разметки содержания, которая может обрабатываться системами компьютерной алгебры.
Добавить комментарий