Введение в MathML

Основная задача 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>&sum;</mo>

<mrow>

<mi>i</mi>

<mo>=</mo>

<mn>0</mn>

</mrow>

<mi>&infin;</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>&PlusMinus;</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>

Для изображения знака плюс-минус мы используем сочетание символов «&PlusMinus;», это то, что в XML называется «ссылочной сущностью». MathML определяет несколько десятков таких сущностей, среди которых есть такая полезная, как «&InvisibleTimes;», создающая небольшой неразрывный пробел, используемый вместо знака умножения (сущность не позволит сделать разрыв строки между множителями). Другие сущности представлены в примере ниже:

<math>

<mstyle displaystyle=’true’>

<munderover>

<mo>&int;</mo>

<mn>0</mn>

<mn>1</mn>

</munderover>

<mi>f</mi>

<mrow>

<mfenced>

<mi>x</mi>

</mfenced>

</mrow>

<mtext>&VeryThinSpace; </mtext>

<mo>&dd;</mo>

<mi>x</mi>

</mstyle>

</math>

Результат — на рис. 120.

Кроме символов интеграла и дифференциала, в

Этом примере

Стоит обратить внимание на контейнер <mfenced>, группирующий

Элементы в скобки, и <munderover>, добавляющий

Символы над и

Под базовым символом (естественно, можно разделить эти опера-

Ции — теги <mover> и <munder>).

Не будем останавливаться, на рис. 121 отображена довольно удач-

Ная, на мой взгляд, попытка показать пересечение

Множеств. Это

Сделано с помощью следующей разметки:

<math>

<mrow>

<mrow>

<munderover>

<mrow>

Рис. 120. Интеграл, дифференциал, что еще нужно?

Рис. 121. Теория множеств на веб-странице

<mo>&cap;</mo> </mrow>

<mrow>

<mi>i</mi>

<mo>=</mo>

<mn>0</mn>

</mrow>

<mrow>

<mi>&infin;</mi> </mrow> </munderover>

</mrow>

<mrow>

<mi>A</mi>

<mo>&cap;</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> может быть число со знаком, с десятичной точкой или предопределенная константа (выраженная сущностью &pi;, &ee;, &gamma;). Тег может иметь атрибуты:

— 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">&pi;</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. Эта конструкция особенно важна для разметки содержания, которая может обрабатываться системами компьютерной алгебры.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *