Курсовая работа: Отображение математических формул в формате LaTeX на форуме PHPBB3
4. Верхние и нижние
индексы
Верхний
индекс задается при помощи крышки ^. Символ, непосредственно следующий за
крышкой, будет служить верхним индексом для того, что стоит перед крышкой:

Код:
|
[math]$4^2 = 2 ^ 4 $,
exp(x) – это то же самое, что и $e ^x$[/math] |
Аналогично
нижний индекс задается знаком _:

Код:
|
[math] Рассмотрим
числовую последовательность $a_n = \frac 1 n$[/math] |
Верхний и
нижний индексы можно сочетать, причем порядок следования индексов не важен:

Код:
|
[math]
$C_n^0 = C ^n _n = 1 $[/math] |
Если в
качестве верхнего или нижнего индекса вы хотите использовать не один символ, а
целое выражение, то это выражение необходимо окружить фигурными скобками:

|
[math]$C_n^k = C_{n-1}^k
+ C_{n-1}^{k-1}$[/math] |
3.
Постановка задачи
Передо
мной была поставлена задача: создать решение проблемы отображения
математических и других формул для форума физико-математического факультета
Орловского государственного университета, используя установленный форумный
движок phpBB3, издательскую систему TeX, пакет расширений LaTeX и пакет для обработки
графических файлов ImageMagick.
Рассмотрим
вкратце то, что из перечисленного не было рассмотрено ранее.
LaTeX
LaTeX
(произносится как «лэйтех» или «латех» аналогично TeXу; ударение допустимо на
любой из слогов) – наиболее популярный набор макрорасширений (или макропакет) к
TeX, который облегчает набор сложных документов. Важно заметить, что ни один из
макропакетов для TeX'а не может расширить TeX'овских возможностей (всё, что
можно сделать в LaTeX’е, можно сделать и в Plain TeX'е), но благодаря различным
упрощениям использование макропакетов зачастую позволяет избежать весьма
изощрённого программирования.
Пакет
позволяет автоматизировать многие задачи набора текста и подготовки статей,
включая набор текста на нескольких языках, нумерацию разделов и формул,
перекрёстные ссылки, размещение иллюстраций и таблиц на странице, ведение
библиографии и др. Кроме базового набора существует множество пакетов
расширения LaTeX. Первая версия была выпущена Лесли Лампортом (Leslie Lamport)
в 1984, текущая версия – LaTeX2ε, после создания в 1994 году
испытывала некоторый период нестабильности, окончившийся к концу 90-х годов, а
в настоящее время стабилизировалась (хотя раз в год выходит новая версия).
Общий
внешний вид документа в LaTeX определяется стилевым файлом. Существует
несколько стандартных стилевых файлов для статей, книг, писем и т.д., кроме
того, многие издательства и журналы предоставляют свои собственные стилевые
файлы, что позволяет быстро оформить публикацию, соответствующую стандартам
издания.
Во
многих развитых компьютерных аналитических системах, например, Maple,
Mathematica, Maxima возможен экспорт документов в формат *.tex. Для
представления формул в Википедии также используется TeX-нотация.
Распространяемый
под лицензией GNU GPL, LaTeX относится к свободному программному обеспечению.
LaTeX-редакторы
Для
облегчения набора и сборки документов LaTeX существует несколько интегрированных
сред, например:
·
Emacs + auctex + reftex + preview-latex
·
Kile
·
LEd
·
LyX (http://www.lyx.org/)
·
TeXmacs (http://www.texmacs.org/)
·
Winefish (http://winefish.berlios.de/)
·
Texmaker
(англ.)
·
TeXnicCenter (англ.)
·
WinEdt
– единственный коммерческий из перечисленных.
ImageMagick
ImageMagick – свободный и
многоплатформенный пакет программ для неинтерактивной (пакетной) обработки
графических файлов. Поддерживает множество графических форматов, выпущен под
лицензией GPL. Может использоваться с языками Perl, C, C++, Python, Ruby, PHP,
Pascal, Java, в скриптах командной оболочки или самостоятельно. В его состав
входят такие программы как convert, dvips, identify.
4.
Реализация поставленной задачи
Сначала
опишем сам процесс, направленный на получение отображения необходимой формулы:
участник форума во время написания сообщения может использовать тег [TeX] (обязателен закрывающий
тег [/TeX]), внутри которого необходимо написать требуемую формулу,
используя язык разметки TeX.
Далее
первый хук перехватывает весь текст сообщения и изменяет теги [TeX] и [/TeX] на теги вида [TeX:$uid] и [/TeX:$uid] для возможной дальнейшей
более тесной интеграции с форумом.
Второй
хук выполняет непосредственные преобразования всех формул, заключенных в теги [TeX] и [/TeX] в картинки необходимого
формата (gif или png) с последующим вставлением картинок в отправляемый текст сообщения.
При наведении курсора на картинку всплывает исходный текст формулы.
Преобразование
формул в картинки происходит следующим образом:
1.
весь
текст между тегами формул заносится в массив для удобной обработки;
2.
далее
идет обработка каждой формулы: проверка на корректность;
3.
во
временной директории создается файл с расширением tex, который содержит стандартное
оформление документа с отдельной формулой, и случайным именем;
4.
создается
dvi файл, используя latex;
5.
этот dvi файл конвертируется в Postscript (ps), используя dvips (tetex);
6.
конвертирование,
обрезка и добавление прозрачности, используя convert из пакета ImageMagick, в результате получается
требуемая картинка;
7.
далее
имя конечной картинки рассчитывается через применение функции необратимого
шифрования md5 (), которая является стандартной в языке PHP, параметром этой функции
является текст формулы; полученное имя является уникальным для данной формулы;
8.
очистка
временной директории от использовавшихся файлов;
9.
в
текст сообщения передается ссылка на получившуюся картинку;
10.
в
случае ошибки при данном процессе выводится соответствующее предупреждение («[unparseable
or potentially dangerous latex formula]»).
Практическая
часть.
Часть
php-скрипта («posting.php»)
форума, в которую были внесены необходимые изменения(хуки) для перехвата текста
сообщения:
if ($submit || $preview || $refresh) // Отправка, предварительный
просмотр написанного сообщения
{
$post_data ['topic_cur_post_id'] = request_var ('topic_cur_post_id',
0);
$post_data ['post_subject'] = utf8_normalize_nfc (request_var ('subject',
«, true));
$text = utf8_normalize_nfc (request_var ('message', «, true)); //
Перехват сообщения
include_once ('latexrender/phpbb_hook_1.php'); // Первый хук
include_once ('latexrender/phpbb_hook_2.php'); // Второй хук
$message_parser->message = $text; // Дальнейшая обработка
сообщения средствами форума
$post_data['username'] = utf8_normalize_nfc (request_var ('username',
$post_data['username'], true));
…
Первый хук:
<? php
$text = preg_replace(«#\[tex\] (.*?)\[/tex\]#si», «[tex:$uid]\\1 [/tex:$uid]»,
$text);
?>
Второй хук:
<? php
$latexrender_path = «latexrender»;
$latexrender_path_http = «latexrender»;
include_once ($latexrender_path. "/class.latexrender.php»);
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 |