Remark и Rehype — это мощные инструменты для парсинга и трансформации Markdown и HTML в экосистеме JavaScript. В случае работы с математическими выражениями требуется подключение MathJax для корректного отображения формул как в инлайновом, так и в блочном формате. Рассмотрим детально шаги интеграции, особенности конфигурации и оптимизацию производительности.
Remark представляет Markdown как абстрактное синтаксическое дерево
(AST). Для работы с математикой удобно использовать плагины, такие как
remark-math:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkMath from 'remark-math';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
const processor = unified()
.use(remarkParse)
.use(remarkMath)
.use(remarkRehype)
.use(rehypeStringify);
const markdown = `
Инлайновая формула: $E = mc^2$
Блочная формула:
$$
\\int_0^\\infty e^{-x} dx = 1
$$
`;
const html = processor.processSync(markdown).toString();
console.log(html);
Ключевые моменты:
remark-math преобразует математические формулы в узлы
inlineMath и math в AST, которые затем могут
быть обработаны Rehype.$$...$$, инлайновые — в
$...$.<span class="math"> для инлайновых и
<div class="math"> для блочных формул, что упрощает
их обработку MathJax.Rehype предоставляет возможность модифицировать HTML через плагины. Для интеграции MathJax используется рендеринг на стороне клиента или генерация HTML с необходимыми тегами и атрибутами.
Пример настройки:
import rehypeMathjax from 'rehype-mathjax';
const processor = unified()
.use(remarkParse)
.use(remarkMath)
.use(remarkRehype)
.use(rehypeMathjax)
.use(rehypeStringify);
const html = processor.processSync(markdown).toString();
console.log(html);
Особенности rehype-mathjax:
SVG (по
умолчанию), CommonHTML..use(rehypeMathjax, {
output: 'svg',
scale: 1.2,
macros: {
RR: '\\mathbb{R}'
}
});
output — формат вывода (svg,
chtml или mml).scale — масштаб формул.macros — пользовательские макросы, которые можно
использовать в формуле.Для больших Markdown-документов или документации с множеством формул важно учитывать производительность:
Ленивая загрузка MathJax: Подключение MathJax только при необходимости уменьшает время первоначальной загрузки страницы.
Пакетная обработка формул: Если генерация HTML
происходит на сервере, рекомендуется использовать пакетную генерацию
MathJax через rehype-mathjax в режиме SVG, что
снижает нагрузку на клиент.
Минимизация CSS и скриптов: Для формул можно подключать только необходимые стили и шрифты MathJax, чтобы не увеличивать размер страницы.
Кэширование результатов рендеринга: Если Markdown не меняется часто, удобно сохранять сгенерированный HTML с рендеренными формулами, чтобы повторно не запускать MathJax на клиенте.
При использовании React полезно оборачивать HTML с формулами в
компонент с dangerouslySetInnerHTML, а MathJax запускать
через хук useEffect:
import { useEffect } from 'react';
import { typeset } from 'mathjax-full/js/mathjax';
function MathContent({ html }) {
useEffect(() => {
typeset();
}, [html]);
return <div dangerouslySetInnerHTML={{ __html: html }} />;
}
typeset() инициирует рендеринг всех формул на
странице.rehype-mathjax.MathJax поддерживает пользовательские команды для удобства написания сложных выражений:
.use(rehypeMathjax, {
macros: {
RR: '\\mathbb{R}',
bold: ['\\mathbf{#1}', 1]
}
});
macros можно определять функции с аргументами, что
упрощает повторяющееся форматирование формул.Remark + Rehype позволяют различать эти типы формул на уровне AST и HTML, что обеспечивает точное визуальное представление.
MathJax 3.x использует модульную архитектуру:
<script type="module">
import { mathjax } from 'mathjax/es5/tex-svg.js';
mathjax.startup.defaultReady();
</script>
rehype-mathjax автоматически генерирует HTML,
совместимый с этим подходом.displayAlign, font, scale, через
объект MathJax перед рендерингом.remark-parse +
remark-math).remark-rehype).rehype-mathjax).Эта цепочка обеспечивает точную конвертацию математических выражений из Markdown в HTML с полноценной визуализацией, удобной для образовательных ресурсов, документации и научных публикаций.