ГлавнаяСтатьиПроектыФотографияМатериалыКарта узлаО себеКарта сайтаНовости(версия для печати)

Сценарий для отображения математических формул

HTForT (HTml Formula Translator) — небольшой сценарий на языке PHP для генерации HTML-представления математических формул по записи на языке SGML. Идея написать этот сценарий, возникла у меня довольно давно, но всё никак не доходили руки... Я допускаю, что подобная идея приходила в голову многим людям, поэтому, не претендуя на авторство идеи, выложил этот сценарий сюда.

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

 
•
Описание
 
•
Достоиства
 
•
Недостатки
 
•
Текущая реализация
 
•
Изменения
 
•
Совместимость
 
•
Установка
 
•
Развитие

Описание

Для представления математических формул (далее просто формул) в HTML-документах проще всего использовать графические изображения. Обычно, формула конструируется в каком-либо редакторе, а потом её графический растровый «слепок» вставляется в документ в виде изображения. При этом сложность и выразительность отрисованных формул ограничивается только используемым редактором. Но в таком подходе есть недостаток: если необходимо подправить формулу, вам придётся искать первоисточник представления формулы, пригодный для редактирования в соответствующем редакторе. Кроме того, растровое изображение плохо масштабируется и при печати на бумагу выглядит зачастую трудночитаемым.

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

Третий способ, собственно, заключается в «наделении математическим смыслом» элементов языка разметки. Любая формула имеет иерархическую структуру, которую можно представить в виде размеченного текста на языке SGML. Существуют (и специальные дополнения к обычным браузерам), поддерживающие спецификацию MathML, которая расширяет семантику элементов языка HTML графической нотацией математических символов.

Есть и другой подход, можно попытаться автоматизировать ручной (второй) способ формирования представления формулы средствами HTML. Для этого можно написать сценарий, который на лету (или по заказу) транслировал бы записанную, например, на XML математическую формулу в подходящий набор элементов языка HTML. Можете взглянуть на следующие формулы (это не сплошные растровые изображения!):

M
(
d
i
, q
)
= 2
T
d
T
q
T
d
+
T
q

2
x+3
sin
x+
1
2

Dst
k
=
7
i=0
c
i
· Src
8i
cos
π
8
k+
1
2
i

А теперь взгляните на источник этой страницы и вы оцените масштабы «катастрофы» :).

Достоиства

 
•
Удобство сопровождения содержимого формулы
 
•
Имитация векторного представления, высокое качество при печати на бумагу
 
•
Сохранение семантики формулы, потенциальная возможность интеграции с LATEX.
 
•
Компактность внешнего представления, экономия при передаче (графическое изображение имеет больший объём)

Недостатки

 
•
Существенные выразительные ограничения, обусловленные как самим HTForT, так и языком HTML
 
•
Непрямоугольные математические символы представляются графическими изображениями, которые хоть и компактны сами по себе, но являются по сути растровыми объектами
 
•
Проблемы отображения системой, корректно не поддерживающей CSS 2.0, например, Opera или MS Word.

Текущая реализация

В данный момент альфа-версия HTForT 0.5 поддерживает следующий DTD:

<!ENTITY %formula "(b| i| sub| sup| fraq| pow| sqrt| fence| sym|
                    cos| sin| tg|ctg| exp| log| ln| lg| sh| ch|
                    arccos| arcsin| arctg| arcctg| arcsh| arcch )"
>
<!ELEMENT f - - (%formula; | PCDATA )* >
<!ELEMENT b - - (PCDATA) >
<!ELEMENT i - - (PCDATA) >
<!ELEMENT fraq  - - (num,den) >
<!ELEMENT num   - - (%formula;)* >
<!ELEMENT den   - - (%formula;)* >
<!ELEMENT pow   - - (f,index) >
<!ELEMENT index - - (%formula;)* >
<!ELEMENT sqrt  - - (index,f) >
<!ELEMENT fence - - (%formula;)* >
<!ATTLIST fence
     type ( circle | square | flat ) #IMPLIED
>
<!ELEMENT sub  - - (%formula;)* >
<!ELEMENT sum  - - (to,from,f)* >
<!ELEMENT to   - - (%formula;)* >
<!ELEMENT from - - (%formula;)* >
<!ELEMENT sup  - - (%formula;)* >
<!ELEMENT sym  - - (  "greater or equal" | "greater than" |
                      "less than" | "less or equal" |
                      "intersection" | "union" |
                      "differential" | "infinity" |
                      "approxequal"  |"nonequal" |
                      "identical" | "delta cap" |
                      "pi cap"    |  "pi small" )
                   )
>

Изменения

 
—
v0.6 (9 декабря 2004). Идёт работа по исправлению ошибок отображения в браузере Mozilla.
 
—
v0.5 (11 августа 2004). Некоторые математические символы выводятся текстом, а не с помощью графических примитивов.
 
—
v0.4 (10 мая 2004). Полностью переработана схема отрисовки. Размер генерируемого кода увеличился, но теперь не надо вручную подбирать размеры графических элементов символа суммы и корня.
 
•
Заложен фундамент корректного выравнивания по высоте строки.
 
•
Отрисовка круглых скобок производится адаптивно с учётом высоты скобочного выражения: если размер меньше порога, то в качестве скобок используются обычные символы "(" и ")", а иначе используются графические примитивы.
 
•
Вывод символов курсивом, а цифр без курсива автоматизирован.
 
•
Добавлены элементы, обозначающие имёна математических функций.
 
—
v0.1 (30 марта 2004).
 
•
Реализованы квадратные и круглые скобки (для элемента fence добавлены занчения атрибута type).
 
•
Исправлен анализатор XML (не обрабатывался внутренний текст между вложенными элементами).
 
•
Повышена наглядность исходного кода.
 
—
v0.0 (25 января 2003) Реализована поддержка корня квадратного, степени, суммы, индексов, дроби.

Совместимость

Пока что работоспособность HTForT проверена на интерпретаторе PHP 4.x.x и браузере MS IE 4.x/5.x/6.x, а также ведутся работы по адаптации к Mozilla.

Установка

Скачайте себе архив  htfort.zip (14.08 Кбайт) и распакуйте его. Укажите в переменной $HTForTPath путь к каталогу (относительно корня www), в котором установлен HTForT. Для генерации представления в своём PHP-сценарии напишите следующие команды:

include_once ( "htfort.php" );
echo HTForTStyle ();
$HTForT = new Formula;
// ...
echo "Квадратное уравнение:
\n
"; echo $HTForT->PrintFormula ( " ax2+bx+c=0 " ); echo ( "
"
); // ...

При этом получится нечто следующее:

Квадратное уравнение:

a
x
2
+bx+c=0

Развитие

Если вы дошли до этого абзаца, значит вам интересна идея HTForT :) Если вам хочется расширить возможности HTForT — флаг вам в руки! Я буду немного развивать его по мере необходимости для своих нужд. Но если вам что-то хочется добавить, а вы не в силах это сделать сами, пишите мне: mNaOxS@PaAxMo!fNiObSePrA.Mo!rNgO.SrPuA.

25 января 2003—09 декабря 2004
Максим Проскурня
© 1997–2009 AxoFiber, axofiber.org.ru