Латех и веб-технологии
В прошлый раз я рассказал о своем сервисе, который генерирует для веба картинки с математическими формулами на латехе. Теперь я расскажу, как заставить программное обеспечение (TeX Live, nginx,
Аналоги
Как я уже упоминал, источником вдохновения был сервис CodeCogs. В одном из вариантов его использования на страницу подключается специальный JS, который ищет формулы, ограниченные специальными символами, например $...$
\[...\]
У такого подхода несколько достоинств.
Интерфейс сервиса: клиентская часть
Поиск привел к статье о решении проблемы с базовой линией в латехе. Я занялся адаптацией этого решения для веба. Его суть в том, что с помощью специальных команд латех записывает в отдельный файл размеры и положение базовой линии будущей формулы. Это положение регулируется на
Очевидный способ — парсинг
После генерации postMessage
и передачей размеров и положения базовой линии. Вот пример:
<script type="text/ecmascript">
if (window.parent.postMessage)
window.parent.postMessage("1.14|40.1|14.3|" + window.location, "*");
</script>
На основной message
. В этом скрипте помимо обработчика есть функция обхода $$...$$
В браузерах поддержка сообщений между документами даже шире, чем поддержка SVG. Скрипты в img
. Я выбирал между тегами embed
, object
и iframe
, по результатам тестирования остановился на первом. В старых браузерах, показывающих растровые картинки, проблема базовой линии остается нерешенной, но с этим можно жить.
Устройство сервиса: серверная часть
При первом обращении по адресу, например, http://tex.s2cms.ru/svg/x%5E2
вызывается главный postMessage
, как описано выше. Ответ в запрошенном формате возвращается клиенту и соединение с ним разрывается функцией fastcgi_finish_request()
. Содержимое картинок сохраняется в кеше, а
Кеш — это набор файлов и папок, имена которых определяются
location /svg {
set_by_lua $file_path '
local md5 = ngx.md5(ngx.var.request_uri);
return "/cache/" .. md5:sub(1, 3) .. "/" .. md5:sub(4);
';
try_files $file_path @latex;
}
Если в кеше нужного файла нет, тогда запрос передается интерпретатору PHP и обрабатывается описанным выше способом. Модуль HttpLuaModule не входит в nginx. Но, как выяснилось, в Дебиане можно обойтись без компиляции исходников. В пакете
Запуск латеха — относительно тяжелая операция для сервера: время генерации картинок сравнимо с секундой. В связи с этим кеш имеет принципиальное значение для функционирования сервиса. В обычных условиях использования повторные обращения к старым формулам происходят гораздо чаще, чем обращения к новым формулам (у текстов один автор и множество читателей). Повторные обращения обслуживаются
Опыт эксплуатации и доработка
Как показала практика, метод определения положения базовой линии (depth в терминах теха) и размеров формулы через команды \lrbox
и \usebox
небезупречен. Иногда штрихи символов могут выходить за пределы области, и тогда размеры (и положение базовой линии) определяются неточно. И dvipng, и dvisvgm умеют находить правильные границы самостоятельно. Но если положение границы корректируется, становится неточной информация о базовой линии.
На помощь пришла особенность утилиты dvisvgm. Она поддерживает набор специальных команд, которые выводят в комментариях итогового
\special{dvisvgm:bbox new formula}
\special{dvisvgm:raw<!--start {?x} {?y} -->}
...
\special{dvisvgm:raw<!--bbox {?bbox formula} -->}
Они выводят координаты левого верхнего и правого нижнего угла ({?bbox}), а также координаты точки ({?x} и {?y}), которая по счастливому стечению обстоятельств оказалась на базовой линии. С такой информацией определение положения базовой линии — дело обычного вычитания. Этот метод работает безупречно.
Комментарии
MathJax is an open source JavaScript display engine for mathematics that works in all browsers.
И еще такой вопрос: вашим сервисом можно свободно пользоваться вне вашего движка? Вы справитесь с нагрузкой, если он станет популярен?
Вообще популярность бывает разная. В случае запредельной нагрузки будущие активные клиенты могут спонсировать переезд на более мощный сервер. Или сделать свою копию сервиса, его код открыт:
а подскажи как ты php под nginx запускаешь pdflatex? не могу его запустить никак :(
exec('pdflatex --help') — без проблем выдает справку, но exec('pdflatex formula') молча отрабатывает.
та же команда в php но из командной строки без проблем генерит pdf
Спасибо
Однако ваша проблема в другом. Нужно запустить команду composer install (или php composer.phar install).
Я не зря описал требования к системе и последовательность развертывания:
Если их не выполнить, система не заработает.
Спасибо Вам за сервис tex.s2cms.ru. Очень выручает. Вот только кириллица в формулах и картинках {picture} не отображается. :(
Оставьте свой комментарий