Фрагмент публикации Т.Н. Катанова, А.П. Шестаков. Набор и верстка математических текстов. //Информатика, 2008, № 12(565), 48 с.

 

Внимание! С просмотром приведенных примеров в Internet Explorer любой версии могут возникнуть проблемы, поэтому рекомендуется использовать FireFox Mozilla, Opera 9, 10, Ghrome, где не требуется что-либо дополнительно устанавливать.

 

Язык разметки математических текстов MathML

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

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

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

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

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

Из популярных броузеров с MathML работают (ОС Windows):

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

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

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

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

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

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

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

ТегОпределениеПример
miидентификатор (identifier)<mi>a</mi>
mnчисло (number)<mn> 2008 </mn>
moоператор (operator), ограничитель (fence) или разделитель (separator)<mo>+</mo>
mtextтекст (text)<mtext> Пример текста </mtext>
msтекстовая строка (string literal)<ms> абракадабра</ms>

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

ТегОпределениеПримерРезультат
mrowгруппирует любое количество подвыражений в строку (аналог операторных скобок)
<msqrt>
<mrow>
<mi>a</mi>
<mo>+</mo>
<mi>b</mi>
</mrow>
</msqrt>
mfracформирует дробь из двух подвыражений
<mfrac>
<mi>a</mi>
<mi>b</mi>
</mfrac>
mrootформирует радикал с определенной степенью
<mroot>
<mrow>
<mi>b</mi>
<mo>+</mo>
<mi>c</mi>
</mrow>
<mn>3</mn>
</mroot>
mpaddedрегулирует отступы вокруг содержимого
<mpadded width="+5em">
<mi>a</mi>
<mo>+</mo>
<mi>b</mi>
</mpadded>
<mo>-</mo>
<mi>c</mi>
mphantomделает содержимое невидимым, но сохраняет его размер
<mi> x </mi>
<mphantom>
<mo> + </mo>
<mi> y </mi>
</mphantom>
<mo> + </mo>
<mi> z </mi>
mfencedокружает содержимое парой скобок
<mfenced>
<mrow>
<mi>x</mi>
<mo> + </mo>
<mi> y </mi>
</mrow>
</mfenced>
(x+y)

Индексы

ТегОпределениеПримерРезультат
msubдобавляет нижний индекс к основанию
<msub>
<mi>x</mi>
<mn>1</mn>
</msub>
x1
msupдобавляет верхний индекс к основанию
<msup>
<mi>x</mi>
<mi>y</mi>
</msup>
xy
msubsupдобавляет верхний и нижний индексы к основанию
<msubsup>
<mi>x</mi>
<mn>14</mn>
<mn>12</mn>
</msubsup>
munderoverдобавляет символы одновременно и над, и под основанием
<m:munderover>
<m:mi>X</m:mi>
<m:mi>h</m:mi>
<m:mi>t</m:mi>
</m:munderover>

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

<msup>
<mo class="MathClass-op">sin</mo>
<mn>2</mn>
</msup>
<mrow> <mi>α</mi> </mrow>
<mo class="MathClass-bin">+</mo>
<msup>
<mo class="MathClass-op"> cos</mo>
<mn>2</mn>
</msup>
<mrow><mi>α</mi></mrow>
<mo class="MathClass-rel">=</mo>
<mn>1</mn>

Греческую букву α получаем с помощью кода x03B1.

Посмотреть результат (в новом окне) (если пример не отображется, сохраните файл на диске и откройте его)

Напоминаем также, что для работы с 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>.

<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>

Посмотреть результат (в новом окне) (если пример не отображется в IE, сохраните файл на диске, с помощью контекстного меню выберите Свойства, разблокируйте файл и откройте его)

<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>

Посмотреть результат (в новом окне) (если пример не отображется в IE, сохраните файл на диске, с помощью контекстного меню выберите Свойства, разблокируйте файл и откройте его)

 

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

ТегОпределение
mtableтаблица или матрица
mtrстрока в таблице или матрице
mtdодна ячейка в таблице или матрице

<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>

Посмотреть результат (в новом окне) (если пример не отображется в IE, сохраните файл на диске, с помощью контекстного меню выберите Свойства, разблокируйте файл и откройте его)

<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>

Посмотреть результат (в новом окне) (если пример не отображется в IE, сохраните файл на диске, с помощью контекстного меню выберите Свойства, разблокируйте файл и откройте его)

 

Различные математические символы, при необходимости, нужно отыскивать в кодировочной таблице 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>…</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>
<msup>
<mrow>
<mfenced separators="" open="(" close=")">
<mn>-1</mn>
</mfenced>
</mrow>
<mi>i</mi>
</msup>
<mfrac>
<mn>1</mn>
<msup>
<mn>2</mn>
<mi>i</mi>
</msup>
</mfrac>

Посмотреть результат (в новом окне) (если пример не отображется в IE, сохраните файл на диске, с помощью контекстного меню выберите Свойства, разблокируйте файл и откройте его)

Довольно значительное количество примеров с интегралами можно найти на http://beshenov.ru/mh/, поэтому не будем здесь на них останавливаться, рекомендуем читателю ознакомиться с примерами на указанном ресурсе.

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

Во-первых, математические пакеты, скажем, 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, позволяет вставлять в текст математические формулы, подготовленные с помощью редактора формул, входящего в тот же пакет. Если навести указатель мыши на формулу и нажать правую кнопку, то появится меню, в котором есть пункт «Сохранить копию как». При выборе этого пункта открывается диалоговое окно, где надо выбрать тип файла MathML. Будет создан файл с расширением mml, содержащий разметку, адаптированную для IE+MathPlayer. Тем не менее, Firefox и Mozilla правильно отображают этот файл без всякого плагина, если этот файл сохранен с расширением xml.

 

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

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

 


Рейтинг ресурсов УралWeb

 

© А.П. Шестаков, 2008-2009
Сайт создан в системе uCoz