Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №12/2008


Спецвыпуски

Подготовка математических текстов средствами MathML

С распространением глобальных компьютерных сетей (в частности, Интернет) появилась необходимость размещения в ней в том числе и математических текстов.

Язык MathML является подмножеством языка XML (eXtensible Markup Language — расширяемый язык разметки), который часто служит для создания других языков. Такое использование XML сегодня вполне естественно и хорошо зарекомендовало себя и в других случаях, когда применение HTML для передачи данных новых типов наталкивалось на ограничения этого формата. К настоящему времени консорциум W3C опубликовал 2-е издание версии 2.0 спецификации языка MathML, что говорит о жизнеспособности и устойчивости проекта.

Языки разметки, основанные на XML:

  • Wireless Markup Language (WML): формат данных для (беспроводных) устройств, работающих с протоколом WAP (мобильные телефоны);
  • Synchronized Multimedia Integration Language (SMIL):
  • Задает временную разметку, внешний вид и т.д. для мультимедийных презентаций;
  • Определяет порядок воспроизведения мультимедийных файлов;
  • Для просмотра требуется SMIL-совместимый плеер (AMBULANT, MS IE6);
  • Руководство и примеры: http://www.multimedia4everyone.com/
  • Scalable Vector Graphics (SVG): для описания двухмерной векторной графики;
  • Mathematical Markup Language (MathML): для описания математических обозначений (формул);
  • Chemical Markup Language (CML): для представления химических формул;
  • другие.

Среди целей, которые ставились рабочей группой W3C по математике при создании MathML, были:

  • обеспечение кодирования материалов математического характера для коммуникаций всех уровней образовательного и научного типа;
  • обеспечение кодирования как математической символики, так и ее значений;
  • поддержка создания шаблонов и других приемов математического редактирования;
  • обеспечение преобразования в другие математические форматы как чисто презентационного, так и семантического характера, а также — из этих форматов в создаваемый язык математической разметки. Форматы вывода должны включать средства для отображения графической информации, синтеза речи, представления текста в форме, пригодной для ввода ее в системы компьютерной алгебры, совместимость с другими языками описания математических текстов, такими, как ТДО, возможность отображения “чистого” текста (т.е. не включающего математических символов и выражений), возможность вывода текстов на печать в различной форме, включая вывод по системе Брайля. При этом преобразования между различными форматами могут приводить к потерям информации;
  • возможность передачи информации с учетом особенностей конкретных программ визуализации;
  • поддержка эффективных процессов просмотра длинных математических выражений;
  • обеспечение расширяемости возможностей (способами, которые заранее не известны).

Общий принцип использования MathML состоит в том, что математические конструкции встраиваются в обычный HTML-документ и (если браузер либо специальная программа поддерживает эту спецификацию) адекватно воспроизводятся при загрузке документа из сети.

Первое, с чем приходится столкнуться в MathML и что отличает данный язык разметки от аналогов, — это использование двух способов кодирования выражений. Один из них основан на непосредственной передаче синтаксиса формулы (presentation), другой, напротив, отражает семантику выражения (content). Презентационная разметка описывает математическую символику с выражениями, которые строятся с использованием некоторых схем вывода, с заданием способов размещения подвыражений, таких, как дроби, верхние и нижние индексы. Семантическая разметка описывает математические объекты и функции, где для каждого узла конструируется дерево выражения согласно некоторой конкретной схеме, а ветви этого дерева отвечают подвыражениям.

На настоящий момент веб-страницы, созданные с использованием MathML, можно просматривать в следующих браузерах (знак “+” означает, что более новые версии тоже работают): [1]

  • Windows:

o IE 5.0 с плагином Techexplorer

o IE 5.5 с плагинами MathPlayer или Techexplorer

o IE 6.0+ (необязательно) с плагинами MathPlayer или Techexplorer

o Netscape 6.1 с плагином Techexplorer

o Netscape 7.0+

o Amaya, все версии (только Presentation MathML)

o Mozilla 0.9.9+

  • Macintosh:

o IE 5.0+ с плагином Techexplorer

o Mozilla 0.9.9+

  • Linux/Unix:

o Netscape 6.1 с плагином Techexplorer

o Netscape 7.0+

o Mozilla 0.9.9+

o Amaya, все версии (только Presentation MathML)

Все элементы MathML делятся на три группы: элементы представления, элементы содержания и интерфейсные элементы.

Элементы представления описывают визуально ориентированную двухмерную структуру математической нотации. Например, элемент mrow обычно применяется для обозначения горизонтального ряда частей выражения, и элемент msup, который отмечает верхний индекс. Как правило, каждый элемент представления соответствует одному типу нотационной схемы, такой, как ряд, верхний индекс, нижний индекс и т.д. Любая формула состоит из частей, которые могут состоять из простейших элементов, таких, как цифры, буквы или другие символы.

Наиболее важными элементами представления являются mi, mn и mo, используемые для представления идентификаторов, чисел и операторов соответственно. Обычно эти элементы отображаются разными стилями: числа — прямым шрифтом, идентификаторы — наклонным, вокруг операторов оставляется дополнительное свободное пространство.

В терминах разметки, большинство элементов MathML определяются открывающим и закрывающим тегами, которые ограничивают содержание элемента. Некоторые элементы, например знаки операций (<plus/>), определяются одиночным тегом.

Рассмотрим более подробно некоторые элементы, необходимые для верстки математических формул, на примере презентационной разметки.

Токены (token elements) представляют индивидуальные символы, названия, числа, обозначения и т.д. В основном в качестве содержания токены могут иметь только символы.

MathML игнорирует пробельные символы, встречающиеся вне токенов. Непробельные символы здесь запрещены. Пробельные символы, встречающиеся в содержании токенов, удаляются на концах, то есть удаляются все пробельные символы в начале и конце содержания. Пробельные символы, расположенные внутри содержания элементов MathML, свертываются канонически, то есть каждая последовательность из 1 или более таких символов заменяется на 1 (иногда называемый пустым символом).

Основные элементы

Индексы

Некоторые математические операции, которые можно использовать с тегом <mo>.

<mo> + </mo> +
<mo> &lt; </mo> >
<mo> &le; </mo> <
<mo> &lt;= </mo> >=
<mo> ++ </mo> ++
<mo> .NOT. </mo> not
<mo> and </mo> and
<mo> &InvisibleTimes; </mo> невидимый знак умножения
<mo mathvariant='bold'> + </mo> +

Рассмотрим несколько примеров формул в MathML.

1) sin2α + cos2α = 1

<msup>

<mo class="MathClass-op">sin</mo>

<mn>2</mn>

</msup>

<mrow>

<mi>&#x03B1;</mi>

</mrow>

<mo class="MathClass-bin">+</mo>

<msup>

<mo class="MathClass-op"> cos</mo>

<mn>2</mn>

</msup>

<mrow><mi>&#x03B1;</mi></mrow>

<mo class="MathClass-rel">=</mo>

<mn>1</mn>

Греческую букву α получаем с помощью кода &#x03B1; (напоминаем, что используется Unicode).

Результат

Напоминаем также, что для работы с MathML в Internet Explorer необходимо установить MathPlayer.

В любом файле, содержащем разметку MathML, перед заголовочной частью документа должны присутствовать строки

<?xml version="1.0" encoding="windows-1251"?>

<?xml-stylesheet type="text/xsl" href="http://www.w3.org/Math/XSL/pmathml.xsl"?>

<html xmlns="http://www.w3.org/1999/xhtml">

Кроме того, любой код MathML открывается тегом

<math xmlns="http://www.w3.org/1998/Math/MathML">

и закрывается тегом </math>.

2)

<mfrac>

<mrow>

<msup><mi>a</mi><mn>2</mn></msup>

<mo>+</mo>

<mi>a</mi>

<mi>b</mi>

<mo>+</mo>

<msup><mi>b</mi><mn>2</mn></msup>

</mrow>

<mrow>

<mi>a</mi>

<mo>+</mo>

<mi>b</mi>

</mrow>

</mfrac>

3)

<mfrac>

<mrow>

<mn>1</mn>

<mo>+</mo>

<msup>

<mo class="MathClass-op">sin</mo>

<mn>2</mn>

</msup>

<mfenced separators="" open="(" close=")">

<mi>x</mi><mo>+</mo><mi>y</mi>

</mfenced>

</mrow>

<mrow>

<mn>2</mn>

<mo>+</mo>

<mfenced separators="" open="|" close="|">

<mrow>

<mi>x</mi>

<mo>-</mo>

<mfrac>

<mrow><mn>2</mn><mi>x</mi></mrow>

<mrow>

<mn>1</mn>

<mo>+</mo>

<msup><mi>x</mi><mn>2</mn></msup>

<msup><mi>y</mi><mn>2</mn></msup>

</mrow>

</mfrac>

</mrow>

</mfenced>

</mrow>

</mfrac>

<mo>+</mo>

<mi>x</mi>

Рассмотрим элементы для верстки таблиц и матриц.

Пример 1.

<mfenced separators="" open="(" close=")">

<mtable>

<mtr>

<mtd><mn>1</mn></mtd>

<mtd><mn>1</mn></mtd>

<mtd><mn>1</mn></mtd>

<mtd><mn>1</mn></mtd>

<mtd><mn>1</mn></mtd>

</mtr>

<mtr>

<mtd><mn>1</mn></mtd>

<mtd><mn>0</mn></mtd>

<mtd><mn>0</mn></mtd>

<mtd><mn>0</mn></mtd>

<mtd><mn>1</mn></mtd>

</mtr>

<mtr>

<mtd><mn>1</mn></mtd>

<mtd><mn>0</mn></mtd>

<mtd><mn>0</mn></mtd>

<mtd><mn>0</mn></mtd>

<mtd><mn>1</mn></mtd>

</mtr>

<mtr>

<mtd><mn>1</mn></mtd>

<mtd><mn>0</mn></mtd>

<mtd><mn>0</mn></mtd>

<mtd><mn>0</mn></mtd>

<mtd><mn>1</mn></mtd>

</mtr>

<mtr>

<mtd><mn>1</mn></mtd>

<mtd><mn>1</mn></mtd>

<mtd><mn>1</mn></mtd>

<mtd><mn>1</mn></mtd>

<mtd><mn>1</mn></mtd>

</mtr>

</mtable>

</mfenced>

Пример 2.

<mfenced separators="" open="{" close="">

<mtable>

<mtr>

<mtd>

<mi>a</mi><mi>x</mi><mo>+</mo><mi>b</mi><mi>y</mi>

<mo>=</mo><mi>c</mi>

</mtd>

</mtr>

<mtr>

<mtd>

<msub><mi>a</mi><mn>1</mn></msub><mi>x</mi><mo>+</mo>

<msub><mi>b</mi><mn>1</mn></msub><mi>y</mi><mo>=</mo>

<msub><mi>c</mi><mn>1</mn></msub>

</mtd>

</mtr>

</mtable>

</mfenced>

Различные математические символы при необходимости нужно отыскивать в кодировочной таблице Unicode.

Пример.

<mi>S</mi>

<mo>=</mo>

<mn>1</mn>

<mo>-</mo>

<mfrac>

<mn>1</mn>

<mn>2</mn>

</mfrac>

<mo>+</mo>

<mfrac>

<mn>1</mn>

<mn>4</mn>

</mfrac>

<mo>-</mo>

<mfrac>

<mn>1</mn>

<mn>8</mn>

</mfrac>

<mo>+</mo>

<mi>&#x2026;</mi>

<mo>+</mo>

<msup>

<mrow>

<mfenced separators="" open="(" close=")">

<mn>-1</mn>

</mfenced>

</mrow>

<mi>n</mi>

</msup>

<mfrac>

<mn>1</mn>

<msup>

<mn>2</mn>

<mi>n</mi>

</msup>

</mfrac>

<mo>=</mo>

<munderover>

<mi>&#x03A3;</mi>

<mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow>

<mi>n</mi>

</munderover>

<mfrac>

<mn>1</mn>

<msup>

<mn>2</mn>

<mi>i</mi>

</msup>

</mfrac>

Довольно значительное количество примеров с интегралами можно найти на [4], поэтому не будем здесь на них останавливаться, рекомендуем читателю ознакомиться с примерами на указанном ресурсе.

Как отмечалось выше, MathML позволяет использовать презентационное и семантическое представления. Здесь мы сосредоточились на презентационном как наиболее удобоваримом и чаще используемом. Тем не менее, чтобы дать хотя бы некоторое представление о другом варианте, рассмотрим небольшой иллюстративный пример и запишем его в двух вариантах представления.

Пример. x2 - 6x + 9 = 0

Конечно, набор формул в MathML — занятие довольно длительное и требует определенных усилий. Впрочем, кто работал достаточно долго в LaTeX, особой разницы не заметит. Тем не менее чаще пользователь предпочитает применять различные инструменты. Назовем некоторые [5].

Во-первых, математические пакеты, скажем, Mathematica или Maple, позволяют сохранять набранные в них формулы в формате MathML.

Amaya (http://www.w3.org/Amaya/) — это веб-редактор, то есть программа, предназначенная для создания и редактирования документов непосредственно в сети. В этой программе предусмотрены возможности просмотра документов и их локального и удаленного редактирования. Работа над этой программой была начата консорциумом W3C в 1996 году с целью продемонстрировать, что инструменты создания веб-документов, использующие различные веб-технологии, можно организовать в одном окружении веб-клиента. Вначале Amaya был редактором HTML + CSS, но потом была добавлена поддержка XML и различных форматов, основанных на XML, в частности, MathML. Мы не будем описывать возможности данного программного продукта, предлагаем читателю ознакомиться с ними самостоятельно. На странице http://www.w3.org/Amaya/User/BinDist.html можно найти дистрибутив Amaya для операционных систем Windows NT/2000/XP/Vista, для основных дистрибутивов Linux и MacOS. Также доступны исходники программы. Установка программы описана на той же странице.

Текстовый редактор Open Office Writer, входящий в пакет Open Office, позволяет вставлять в текст математические формулы, подготовленные с помощью редактора формул, входящего в тот же пакет (см. выше). Еcли навести указатель мыши на формулу и нажать правую кнопку, то появится меню, в котором есть пункт “Сохранить копию как”. При выборе этого пункта открывается диалоговое окно, где надо выбрать тип файла MathML. Будет создан файл с расширением mml, содержащий разметку, адаптированную для IE+MathPlayer. Тем не менее Firefox и Mozilla правильно отображают этот файл без всякого плагина, если этот файл сохранен с расширением xml.

GNU TeXmacs (http://www.texmacs.org/tmweb/home/welcome.en.html) — это свободно распространяемая программная среда, специально предназначенная для обработки научных текстов. Она включает в себя WYSIWYG-редактор с поддержкой математических формул и редактор изображений. Texmacs имеет собственный формат файлов, которые экспортируются в различные форматы, включая MathML.

Itex2MML — консольная утилита, которая преобразует текст, содержащий формулы в нотации WebTeX — TeX-подобного языка разметки, предназначенного для подготовки текстов для публикации в сети; см. http://stuff.mit.edu/afs/athena/software/webeq/currenthome/docs/webtex/webtex.html в текст, содержащий формулы в MathML нотации. При этом остальной текст не изменяется.

Пакет tex4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/), созданный профессором университета Огайо Eitan M. Gurari, является полнофункциональным конвертором из TeX в различные веб-форматы, в том числе в MathML.

В настоящее время в Интернете представлен ряд конверторов в формат MathML, которые позволяют произвести конвертацию в режиме on-line.

ASCIIMathML (http://www1.chapman.edu/~jipsen/asciimath.html)

Этот ресурс использует Java-скрипт ASCIIMathML.js (ver 2.0; сентябрь 2007; http://www1.chapman.edu/~jipsen/mathml/asciimath.html, автор скрипта — Peter Jipsen), работающий на компьютере пользователя, который загружается при загрузке демонстрационной страницы http://www1.chapman.edu/~jipsen/mathml/asciimathdemo.html. Поэтому, в частности, этот ресурс может использоваться локально: достаточно сохранить упомянутую демонстрационную html-страницу и можно производить конвертацию простых формул без подключения к Интернету.

В заключение отметим, что MathML как средство разметки также неплохо подходит при генерации различных математических заданий (см. примеры выше). При этом для программирования можно использовать, например, JavaScript, тогда пользователь получит возможность генерировать произвольное количество вариантов заданий по своему усмотрению. Также можно предусмотреть и генерацию ответов ко всем заданиям, что весьма несложно.

Рассчитываем, что на этом знакомство читателя со средствами верстки математических текстов не завершается и далее он сможет самостоятельно выбрать заинтересовавший его инструмент, а может быть, и применить на практике описанные технологии.

Литература и ресурсы Интернета

1. http://www.w3.org/Math/XSL/Overview-Russian.html.

2. http://www.w3.org/TR/2003/REC-MathML2-20031021/ — последняя версия MathML.

3. Гуссенс М., Ратц С. Путеводитель по пакету LaTeX и его web-приложениям: Пер. с англ. М.: Мир, 2001, 601 с., илл.

4. http://beshenov.ru/mh/ — Примеры использования MathML.

5. Елизаров А.М., Липачев Е.К., Малахальцев М.А. Основы MathML. Представление математических текстов в Internet: Практическое руководство. Казань: Издательство Казанского математического общества, 2003, 56 с.

6. W3C MathML 2.0 Specification. — http://www.w3.org/Math (частичный русский перевод — на http://www.raleigh.ru/MathML/MathML2/overview.html).

Т.. Н.. Катанова ;
А.. П.. Шестаков

TopList