Рендерим математические формулы с помощью AsciiMath

6 мая 2019

Время от времени возникает задача нарисовать картинку с некой математической формулой. Есть больше одного решения этой проблемы. Сегодня мне хотелось бы рассказать о решении, которое мне лично кажется наиболее простым и при этом достаточно универсальным. Оно заключается в использовании штуки под названием AsciiMath.

AsciiMath является языком для описания формул, а еще JavaScript-библиотекой для рендеринга формул в браузере. Также поддержка синтаксиса AsciiMath реализована в PlantUML. Реализация эта весьма продуманная. В частности, к ней можно обращаться через CLI, что наверняка пригодится при разработке собственных программ или скриптов.

Давайте же попробуем AsciiMath в действии. Качаем plantuml.1.2019.4.jar отсюда, а также файл plantuml-jlatexmath.zip по ссылке внизу этой страницы. К моменту, когда вы будете читать эти строки, номера версий и имена файлов могут измениться, но думаю, вы разберетесь.

Далее говорим:

cd ~/bin/
mkdir asciimath-files
cd asciimath-files
cp ~/Downloads/plantuml.1.2019.4.jar ./
cp ~/Downloads/plantuml-jlatexmath.zip ./
unzip plantuml-jlatexmath.zip
rm plantuml-jlatexmath.zip

Суммарный размер jar-файлов составил 12 Мб.

Также создаем скрипт ~/bin/asciimath и даем ему +x:

#!/bin/sh

set -e
java -jar ~/bin/asciimath-files/plantuml.1.2019.4.jar $1

У меня каталог ~/bin прописан в $PATH. Если у вас это не так, не забудьте его прописать.

Теперь создадим файл test.puml, например, такой:

@startmath
sum_(i=1)^n i^3=((n(n+1))/2)^2
@endmath

Говорим asciimath test.puml и открываем test.png. Должно получиться:

Пример формулы, нарисованной в AsciiMath

Интересно, что вы можете использовать и синтаксис LaTeX, но субъективно он не так удобен:

@startlatex
\sum_{i=1}^n i^3=\bigg ({\dfrac{n(n+1)}{2}} \bigg)^2
@endlatex

Синтаксис AsciiMath, конечно же, не ограничен скобочками, дробями и возведением в степень. С полным описанием синтаксиса вы можете ознакомиться на сайте asciimath.org.

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.