Тег math в HTML: что это и как записать формулу

Тег <math> (от английского mathematics, «математика») задаёт одну математическую формулу, записанную на языке MathML. Браузер сам рисует дроби, степени, корни и знаки суммы, и картинки с формулами для этого не нужны. Тег парный: закрывающий </math> обязателен.

Внутри math пишутся свои теги: mi, mn, mo, mrow, mfrac и другие. Отдельными страницами в шпаргалке они не описаны, их разбирают разделы этой страницы. Как и svg, формула подчиняется правилам отдельного языка внутри HTML, и многие привычки обычной разметки здесь не работают.

HTML
<math>
  <mi>x</mi>
  <mo>=</mo>
  <mfrac>
    <mn>1</mn>
    <mn>2</mn>
  </mfrac>
</math>

Тег math в HTML: что это и чем он похож на svg

MathML (от английского Mathematical Markup Language) описывает формулу вложенными тегами. Разбор страницы помещает math и всё внутри в отдельное пространство имён MathML. У такого элемента свой класс MathMLElement, а вложенные теги считаются MathML-тегами со своими правилами.

Поэтому document.createElement("math") создаёт не формулу, а неизвестный HTML-элемент: разметка выглядит так же, но вместо формулы на экране просто цифры подряд. Для формулы из скрипта нужен createElementNS с адресом пространства имён.

JavaScript
const NS = "http://www.w3.org/1998/Math/MathML";
const bad  = document.createElement("math");     // HTMLUnknownElement
const good = document.createElementNS(NS, "math"); // MathMLElement

Пример: что создаёт браузер

Результат

Кнопки собирают одну и ту же дробь тремя способами. Класс и пространство имён читаются из страницы после каждого нажатия.

Поддерживают все браузеры: по MDN, тег доступен везде с января 2023 года. Формат описан в спецификации MathML Core.

Как записать формулу: mi, mn, mo и mrow

Формула собирается из мелких частей, и у каждой части свой тег. Тег mi (identifier) записывает переменную или название функции, mn (number) число, mo (operator) знак действия, скобку или запятую. Тег mrow объединяет несколько частей в одну группу, чтобы остальные теги считали её одним целым: например, числитель из трёх частей в mfrac.

Отступы вокруг знаков браузер подбирает сам, поэтому пробелы между тегами не нужны. Текст, записанный прямо внутри math без этих тегов, на экране не появляется: ширина и высота такой формулы равны нулю.

HTML
<math>
  <mrow>
    <mi>a</mi><mo>+</mo><mi>b</mi>
  </mrow>
  <mo>=</mo>
  <mi>c</mi>
</math>

display: формула в строке или отдельным блоком

По умолчанию формула строчная: она стоит в одной строке с текстом и сжимается, чтобы не раздвигать строки. Атрибут display="block" выносит формулу в отдельный блок на всю ширину, и в нём она рисуется крупнее: пределы суммы стоят над и под знаком. Значение inline совпадает с поведением по умолчанию. В CSS у такой формулы своё значение display: math для строчной и block math для блочной.

HTML
<p>Сумма ряда <math display="inline">...</math> сходится.</p>
<math display="block">...</math>

Пример: display inline и block

Результат

Одна и та же формула в трёх состояниях. Ширина, высота и значение display читаются из формулы после каждого нажатия.

Дроби, степени и корни: mfrac, msup, msqrt

Для дроби нужен mfrac с двумя вложенными частями: числитель и знаменатель. Степень задаёт msup (основание и показатель), индекс внизу msub, оба сразу msubsup. Квадратный корень пишется msqrt, корень другой степени mroot с основанием и показателем. Знак суммы с пределами собирается из munderover: пределы стоят снизу и сверху. Теги munder и mover ставят надпись только снизу или только сверху. У знака интеграла пределы обычно ставят сбоку через msubsup.

HTML
<math display="block">
  <mi>x</mi><mo>=</mo>
  <mfrac>
    <mrow><mo>-</mo><mi>b</mi></mrow>
    <mrow><mn>2</mn><mi>a</mi></mrow>
  </mfrac>
</math>

Пример: теги для разных формул

Результат

Кнопки показывают формулу и разметку, из которой она собрана.

Таблицы и матрицы: mtable, mtr и mtd

Матрицу и выровненные по столбцам расчёты собирают три тега. Тег mtable задаёт таблицу, mtr строку, mtd ячейку. По смыслу они совпадают с table, tr и td в HTML, но пишутся только внутри math. Скобки вокруг матрицы пишутся отдельными тегами mo в обёртке mrow.

HTML
<math>
  <mtable>
    <mtr><mtd><mn>1</mn></mtd><mtd><mn>2</mn></mtd></mtr>
    <mtr><mtd><mn>3</mn></mtd><mtd><mn>4</mn></mtd></mtr>
  </mtable>
</math>

Матрицу 2 на 2 можно посмотреть в примере выше, кнопка «Матрица».

Какие теги пишут внутри math

Основные теги внутри math

ТегЧто записывает
miпеременную или название функции
mnчисло
moзнак действия, скобку, запятую
mtextобычный текст внутри формулы
mspaceпробел заданной ширины
mrowгруппу частей
mfracдробь
msqrt, mrootкорень
msub, msup, msubsupнижний и верхний индексы
munder, mover, munderoverнадпись под символом и над ним
mtable, mtr, mtdтаблицу, строку и ячейку

Устаревший mfenced

Тег mfenced когда-то добавлял скобки и запятые вокруг списка. Он устарел и в стандарт не вошёл: скобки рисует только Safari. Вместо него пишут mrow с тегами mo.

Результат

Ширина формулы показывает, нарисованы ли скобки и запятая.

Обычный HTML внутри math

Обычные HTML-теги внутри math не работают. Разбор страницы выносит div наружу, и все теги после него тоже оказываются вне формулы. Исключение: текстовые теги mtext, mi, mn, mo и ms. Внутри них разметка остаётся на месте, например тег b.

Результат

Кнопки показывают, где оказывается div и остаётся ли b внутри mtext.

Цвет и размер формулы: CSS и атрибуты

Формула наследует color и font-size от родителя, как обычный текст. Поэтому размер формулы меняется размером шрифта, а цвет свойством color. Те же задачи решают атрибуты mathcolor, mathsize и mathbackground, но MDN считает их устаревшими, поэтому лучше писать CSS.

CSS
math {
  font-size: 1.25em;
  color: seagreen;
}

Пример: цвет, размер и фон

Результат

Итоговые значения прочитаны браузером после каждого нажатия.

Доступность формулы

У тега math есть неявная роль math, и программы чтения экрана читают формулу по структуре. Если формула читается плохо, ей добавляют название через aria-label.

HTML
<math aria-label="x в квадрате">
  <msup><mi>x</mi><mn>2</mn></msup>
</math>

Проверка: что видит программа чтения экрана

РазметкаЧто видит программа чтения экрана (по снимку браузера)
<math><msup>...</msup></math>формула «x 2»: роль math, название из содержимого
<math aria-label="x в квадрате">...</math>формула «x в квадрате»

Атрибуты тега math

Тег принимает глобальные атрибуты (id, class, style, aria-*) и собственные атрибуты MathML.

АтрибутЧто делаетЗначение по умолчанию
displayblock: формула отдельным блоком; inline: в строкеinline
displaystyleкрупный вид формулы; true делает, например, дробь вышезависит от display
mathcolorцвет формулы; устарел, лучше CSS colorнет
mathbackgroundфон формулы; устарел, лучше CSS backgroundнет
mathsizeразмер шрифта формулы; устарел, лучше CSS font-sizeнет
scriptlevelуровень вложенности для размера индексов; Safari не поддерживаетнет
dirнаправление письма: ltr или rtlнет
xmlnsпространство имён: нужен в XML-документе, в HTML не нуженнет

Полное описание есть на странице MDN.

Поддержка браузерами: где работает math

Формулы понимают все современные браузеры. Версии в таблице взяты из базы совместимости MDN.

JavaScript
const ok = typeof MathMLElement === "function";

Пример: таблица поддержки

БраузерС какой версииЗаметка
Chrome109работает; в версии 24 была частичная реализация, в версии 25 её убрали
Edge109работает на том же движке
Firefox4работает; до версии 4 была частичная реализация только в XHTML
Safari5.1работает
Chrome для Android, Firefox для Android, Safari на iOS109, 4 и 5работает

Частые ошибки с тегом math

Чаще всего формулу пишут как обычный текст или как HTML, а так она не работает.

ОшибкаЧто получитсяКак исправить
<math>\frac{1}{2}</math> (запись из LaTeX)Ничего не выводится: ширина и высота равны нулюЗаписать теги MathML или подключить MathJax или KaTeX
mfencedВ большинстве браузеров скобок и запятых нетmrow с тегами mo
<div> или <p> внутри mathТег выносится наружу вместе со всем, что идёт после негоИспользовать mtext
document.createElement("math")Неизвестный HTML-элемент, формулы нетcreateElementNS с адресом пространства имён MathML (он записан в примере выше)
Формула без display там, где нужна отдельная строкаФормула сжата и стоит в строке с текстомdisplay="block"
Текст формулы без тегов mi, mn, moФормула пустаяКаждую часть записать своим тегом
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×