Библиотека Remark предоставляет возможность работать
с Markdown-документами на уровне абстрактного синтаксического дерева
(AST). Для включения математических выражений используются расширения,
такие как remark-math, которое распознаёт блоки и
встроенные выражения LaTeX:
import remark from 'remark';
import math from 'remark-math';
import html from 'remark-html';
remark()
.use(math)
.use(html)
.process('E = mc^2', function(err, file) {
console.log(String(file));
});
remark-math поддерживает
инлайн-математику $E=mc^2$ и
блочную математику $$E=mc^2$$.remark-html, который превращает AST в строку HTML.Для обеспечения доступности важно, чтобы математические выражения отображались корректно для вспомогательных технологий:
MathML позволяет
скринридерам корректно интерпретировать формулы.rehype-katex или rehype-mathjax
позволяет конвертировать LaTeX в HTML + CSS или MathML.Пример цепочки Remark → Rehype с поддержкой KaTeX:
import remark from 'remark';
import math from 'remark-math';
import remark2rehype from 'remark-rehype';
import rehypeKatex from 'rehype-katex';
import rehypeStringify from 'rehype-stringify';
remark()
.use(math)
.use(remark2rehype)
.use(rehypeKatex)
.use(rehypeStringify)
.process('$$\\int_0^1 x^2 dx$$', function(err, file) {
console.log(String(file));
});
remark2rehype переводит Markdown AST в Rehype AST (HTML
AST).rehype-katex преобразует математические блоки в
корректный HTML с CSS для рендеринга.rehype-stringify выводит конечный HTML.Для математического контента важно добавить ARIA-атрибуты и описания:
role="math" – обозначает блок как математический.aria-label или aria-labelledby –
предоставляет текстовую альтернативу.alttext для картинок с формулами (при
fallback на PNG).Пример добавления ARIA-атрибутов через Rehype:
import rehypeAutolinkHeadings from 'rehype-autolink-headings';
import rehypeAccessibleAttributes from 'rehype-accessible-attributes';
rehype()
.use(rehypeAccessibleAttributes, { mathRole: 'math', includeLabels: true })
Такой подход позволяет скринридерам корректно воспринимать формулы и обеспечивает соответствие стандартам WCAG.
В React-проектах можно использовать Remark + Rehype для генерации HTML-элементов на лету:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkMath from 'remark-math';
import remarkRehype from 'remark-rehype';
import rehypeKatex from 'rehype-katex';
import rehypeReact from 'rehype-react';
import React from 'react';
import ReactDOM from 'react-dom';
const processor = unified()
.use(remarkParse)
.use(remarkMath)
.use(remarkRehype)
.use(rehypeKatex)
.use(rehypeReact, { createElement: React.createElement });
const htmlContent = processor.processSync('$$a^2 + b^2 = c^2$$').result;
ReactDOM.render(htmlContent, document.getElementById('root'));
Для пользователей, которые не могут видеть визуальные формулы, важна возможность:
Remark и Rehype позволяют создать pipeline, который одновременно:
Для учебников и научных статей:
next.js или Gatsby совместно с Remark/Rehype
повышает производительность и доступность.Такой подход обеспечивает максимальную доступность математического контента, одновременно сохраняя высокое качество визуального отображения и гибкость интеграции в современные веб-приложения.