Remark и Rehype представляют собой два ключевых компонента экосистемы обработки Markdown в Jav * aScript: Remark работает с синтаксисом Markdown, создавая AST (Abstract Syntax Tree) для Markdown-документов, а Rehype занимается обработкой и преобразованием HTML-деревьев. Интеграция этих библиотек с KaTeX позволяет реализовать рендеринг математических формул на веб-страницах с высокой точностью и производительностью.
Для работы потребуется несколько npm-пакетов:
npm install remark remark-rehype rehype-stringify rehype-katex katex
remark — ядро для обработки Markdown.remark-rehype — конвертация AST Markdown в HTML
AST.rehype-stringify — генерация финального HTML-кода из
HTML AST.rehype-katex — плагин для рендеринга формул KaTeX.katex — библиотека для математической разметки и
стилей.Для корректного отображения формул необходимо подключить CSS KaTeX в проект:
import 'katex/dist/katex.min.css';
Пример полной цепочки обработки Markdown:
import {remark} from 'remark';
import remarkRehype from 'remark-rehype';
import rehypeKatex from 'rehype-katex';
import rehypeStringify from 'rehype-stringify';
const markdownContent = `
# Пример формул
Инлайн формула: $E = mc^2$
Блочная формула:
$$
\\int_{0}^{\\infty} e^{-x^2} dx = \\frac{\\sqrt{\\pi}}{2}
$$
`;
remark()
.use(remarkRehype)
.use(rehypeKatex, {throwOnError: false, strict: 'ignore'})
.use(rehypeStringify)
.process(markdownContent)
.then((file) => {
console.log(String(file));
});
Особенности конфигурации:
throwOnError: false предотвращает остановку обработки
при ошибках синтаксиса формул.strict: 'ignore' позволяет рендерить некорректные
формулы без выброса исключений.remarkRehype для конвертации AST, затем
rehypeKatex, и только после этого
rehypeStringify для генерации HTML.$...$.$$...$$.rehype-katex автоматически распознаёт эти форматы и
применяет соответствующие классы CSS:
<span class="katex">...</span><div class="katex-display">...</div>Правильная обработка блочных формул критична для соблюдения типографики и выравнивания текста.
KaTeX может выбросить ошибки при синтаксических нарушениях в LaTeX. Конфигурация плагина позволяет гибко управлять этим:
rehypeKatex({
throwOnError: false,
errorColor: '#cc0000',
macros: {
"\\RR": "\\mathbb{R}"
}
});
errorColor задаёт цвет для некорректных формул.macros позволяет определить собственные сокращения
LaTeX для повторно используемых символов и операторов.Rehype поддерживает большое количество плагинов, что позволяет:
Пример интеграции с плагином для обработки ссылок и формул:
import rehypeAutolinkHeadings from 'rehype-autolink-headings';
import rehypeSlug from 'rehype-slug';
remark()
.use(remarkRehype)
.use(rehypeKatex)
.use(rehypeSlug)
.use(rehypeAutolinkHeadings)
.use(rehypeStringify);
В этой конфигурации создаются идентификаторы для заголовков и автоматически добавляются ссылки для навигации, при этом формулы KaTeX рендерятся корректно.
Для рендеринга Markdown с формулами в React можно использовать подход с dangerouslySetInnerHTML:
import React from 'react';
import {remark} from 'remark';
import remarkRehype from 'remark-rehype';
import rehypeKatex from 'rehype-katex';
import rehypeStringify from 'rehype-stringify';
function MarkdownRenderer({content}) {
const [html, setHtml] = React.useState('');
React.useEffect(() => {
remark()
.use(remarkRehype)
.use(rehypeKatex)
.use(rehypeStringify)
.process(content)
.then(file => setHtml(String(file)));
}, [content]);
return <div dangerouslySetInnerHTML={{__html: html}} />;
}
Особенности:
dangerouslySetInnerHTML требуется для вставки
сгенерированного HTML.macros и глобальные стили.Эта интеграция Remark / Rehype с KaTeX обеспечивает полное управление отображением математических формул в Markdown-документах, совместимость с современными фронтенд-фреймворками и гибкость настройки рендеринга.