Набор и верстка математических текстов.

Набор и верстка математических текстов.

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

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

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

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

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

обеспечение кодирования материалов математического характера для коммуникаций всех уровней образовательного и научного типа;

обеспечение кодирования как математической символики, так и ее значений;

поддержка создания шаблонов и других приемов математического редактирования;

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

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

поддержка эффективных процессов просмотра длинных математических выражений;

обеспечение расширяемости возможностей (способами, которые заранее не известны).

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

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

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

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

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

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

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

Netscape 7.0+

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

Mozilla 0.9.9+

Все элементы 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, тогда пользователь получит возможность генерировать произвольное количество вариантов заданий по своему усмотрению. Также можно предусмотреть и генерацию ответов ко всем заданиям, что весьма несложно.

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

Список литературы

Информатика, 2008, № 12(565), 48 с.