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

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

x–2
x+3
sin
x+
1
2

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

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

Достоиства

Недостатки

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

В данный момент альфа-версия 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" )
                   )
>

Изменения

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

Пока что работоспособность 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 "Квадратное уравнение:<br>\n<center>";
echo $HTForT->PrintFormula ( "
  <f> a<pow><f>x</f><index>2</index></pow>+bx+c=0 </f>"
);
echo ( "</center>" );
// ...

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

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

a
x
2
+bx+c=0

Развитие

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

25 января 2003—09 декабря 2004
Максим Проскурня
1997–2024 Axofiber, axofiber.info