---
layout: default
lang: ru
ref: index
title: MathCAT
---
# MathCAT: средство обеспечения доступности математики
<img src="../logo.png" style="position: relative; top: 16px; z-index: -1;">
— библиотека, которая преобразует MathML в:

* текст для озвучивания со встроенными командами речевого синтезатора;
* Брайль (код Немета, технический вариант UEB, а в дальнейшем и другие математические системы записи Брайля);
* представление для навигации по математическим выражениям, в том числе с возможностью обзора.

Цель MathCAT — предоставить программам экранного доступа и другим вспомогательным технологиям удобную библиотеку для качественного озвучивания MathML и преобразования MathML в Брайль. MathCAT продолжает идеи MathPlayer (подробнее об этом будет сказано ниже) и использует накопленный в этом проекте опыт, чтобы ещё лучше озвучивать математические выражения, представлять их в Брайле и обеспечивать навигацию по ним. В MathCAT применяются новые идеи, которые разрабатывает [рабочая группа MathML](https://mathml-refresh.github.io/charter-drafts/math-2020.html): они позволяют авторам указывать смысл использованного обозначения. Например, $(3, 6)$ может обозначать точку на плоскости, открытый интервал или даже сокращённую запись наибольшего общего делителя. Если эта информация передана в MathML, MathCAT использует её для более естественного озвучивания.

Предстоит сделать: подключить сторонние библиотеки для поддержки общего подмножества математических команд TeX и ASCIIMath.


# Документация для разных пользователей MathCAT

MathCAT используют разные аудитории с различными потребностями и задачами. Подробности приведены в соответствующих разделах документации:
* Пользователи вспомогательных технологий: [информация о доступных настройках](users.md).
* Разработчики вспомогательных технологий и пользователи библиотеки: [информация об API MathCAT](callers.md).
* Переводчики и авторы правил: [информация о файлах, которые необходимо перевести](helpers.md).
* Разработчики MathCAT: [информация о процессе разработки и тестировании](developers.md).

# Некоторые технические подробности
MathCAT написан на Rust и может использоваться из многих языков программирования. На данный момент есть интерфейсы для:
* [C/C++](https://github.com/NSoiffer/MathCATForC);
* [Python](https://github.com/NSoiffer/MathCATForPython) — этот интерфейс используют [дополнение NVDA](https://addons.nvda-project.org/addons/MathCAT.en.html) и программа экранного доступа [Orca](https://help.gnome.org/users/orca/stable) для Linux, написанные на Python;
* [Java](https://github.com/mwhapples/MathCAT4J) — сейчас этот интерфейс используется для экспериментов с MathCAT в [BrailleBlaster](https://www.brailleblaster.org/);
* [WebAssembly (Wasm, отчасти похожий на JavaScript)](https://github.com/NSoiffer/MathCATDemo/) — этот интерфейс используется в веб-демонстрации MathCAT.

MathCAT применяет несколько эвристик, чтобы исправлять некачественный MathML и приводить его к рекомендованному виду. Например, конвертеры TeX и WYSIWYG-редакторы могут разделить число «1,234» в выражении «1,234+1» по запятой. MathCAT распознаёт такую ситуацию и объединяет число в один элемент `mn`. Другие исправления затрагивают структуру: MathCAT создаёт элементы `mrow` с учётом словаря операторов MathML и при необходимости добавляет невидимые знаки применения функции, умножения, сложения (для смешанных дробей) и разделители (например, между $i$ и $j$ в $a\_{ij}$). Это упрощает генерацию речи и кода Немета, а также может быть полезно другим приложениям. Сейчас очистка MathML не доступна через API, но в дальнейшем может стать ещё одной функцией MathCAT. В целом MathCAT исправляет MathML достаточно осторожно. Иногда результат может оказаться неверным, однако ожидается, что правильных исправлений будет значительно больше. Поиск типичных ошибок в конвертерах MathML и исправление некачественного MathML остаются постоянной задачей проекта.

## Текущее состояние (обновлено 27.03.2026)

MathCAT активно развивается. DAISY принимает деятельное участие в разработке, и вклад новых участников приветствуется. MathCAT распространяется с открытым исходным кодом. [Репозиторий проекта доступен на GitHub](https://github.com/daisy/MathCAT). [О проблемах дополнения MathCAT, относящихся к NVDA, можно сообщить здесь](https://github.com/daisy/MathCATForPython/issues).

* MathCAT поддерживает озвучивание и навигацию для английского, немецкого, испанского, финского, индонезийского, норвежского, шведского, вьетнамского и китайского языков (традиционное письмо).
* MathCAT поддерживает код Немета, UEB, CMU, вьетнамскую систему записи Брайля, а также немецкую и австрийскую системы записи LaTeX и ASCIIMath.
* Существует [дополнение NVDA](https://addons.nvda-project.org/addons/MathCAT.en.html). Оно может заменить MathPlayer для пользователей английского языка и поддерживаемых переводов. Начиная с NVDA 2026.1 MathCAT встроен в NVDA, поэтому скачивать дополнение не нужно.

Преобразование в код Немета в MathCAT значительно качественнее, чем в MathPlayer и других конвертерах MathML → код Немета. Оно также интегрировано с навигацией: точки 7 и 8 обозначают текущий узел, а маршрутизация курсора Брайля работает во время навигации. Благодаря высокому качеству вывода [BrailleBlaster](https://www.brailleblaster.org/) использует MathCAT для преобразования MathML в код Немета и UEB.

Ряд других разработчиков вспомогательных технологий также включили MathCAT в свои продукты. Среди них особенно выделяется Vispero/JAWS. Сейчас JAWS поддерживает озвучивание MathCAT на английском и испанском языках, а также вывод в коде Немета и UEB. В дальнейшем появятся другие языки и системы записи Брайля. В средстве просмотра математических выражений JAWS доступны все предусмотренные MathCAT команды озвучивания и навигации, в том числе навигации по Брайлю. Настройки MathCAT находятся в центре настроек JAWS.

Другие вспомогательные технологии, использующие MathCAT:

* программа экранного доступа Orca для Linux использует MathCAT для озвучивания, навигации и вывода в Брайле;
* Dolphin EasyReader использует MathCAT;
* Kurzweil 3000 использует озвучивание MathCAT и одновременно выделяет соответствующее подвыражение двумя цветами, обеспечивая наглядное визуальное сопровождение для зрячих пользователей;
* Microsoft объявила, что Экранный диктор будет использовать MathCAT в одной из будущих версий.

[_Другим компаниям_: если вы включили MathCAT в свой продукт и хотите, чтобы он был упомянут здесь, напишите мне по электронной почте или создайте issue с предложением обновить документацию.]

Была разработана [демонстрационная версия](https://nsoiffer.github.io/MathCATDemo/), которая показывает некоторые возможности MathCAT и помогает при отладке. Сообщайте, пожалуйста, обо всех найденных ошибках. Эта демонстрация _не_ отражает типичный способ взаимодействия пользователей вспомогательных технологий с MathCAT, но показывает функции, которые такие технологии потенциально могут предоставить конечным пользователям: выделение озвучиваемого фрагмента, навигацию и вывод в Брайле.

Планы дальнейшей работы:

* Добавить другие языки. Если вы хотите перевести MathCAT на язык, который пока не поддерживается, создайте issue в [репозитории MathCAT на GitHub](https://github.com/daisy/MathCAT/issues).
* Поддержать дополнительные системы записи Брайля. Для добавления такой поддержки нужны три составляющие:
  * спецификация системы;
  * возможность задавать вопросы специалисту по соответствующей системе записи Брайля;
  * человек, готовый перенести не менее 200 примеров из спецификации в используемый для тестов формат: MathML и строку символов Брайля в Unicode. Это может занять 30 часов или больше.

  Если вы можете собрать всё необходимое, создайте issue в [репозитории MathCAT на GitHub](https://github.com/daisy/MathCAT/issues).
* Реализовать преобразование _из_ Брайля _в_ MathML.
* Разработать двумерные варианты систем записи Брайля для многострочных обновляемых дисплеев Брайля, например Monarch и Canute 360.


<a id="why-mathcat"></a>
## Почему MathCAT?

MathCAT — продолжение MathPlayer. Я начал разрабатывать функции доступности MathPlayer в компании Design Science в 2004 году вскоре после прихода в компанию. В то время MathPlayer был главным образом подключаемым модулем C++ для Internet Explorer (IE), отображавшим MathML на веб-страницах. Долгое время это была наиболее полная из доступных реализаций MathML. Первоначальную работу над отображением математических выражений выполнили основатель Design Science Пол Топпинг и технический директор компании, ныне покойный Роберт Майнер. Позже по ряду причин IE отказался от интерфейса, который MathPlayer использовал для отображения, и не предложил ему замену: веб переходил к использованию JavaScript в браузере и отказывался от рисков безопасности, связанных с внешним кодом. После этого MathPlayer стал библиотекой, предназначенной исключительно для обеспечения доступности и вызываемой другими программами, главным образом NVDA. MathPlayer был проприетарным, но распространялся бесплатно.

В начале 2017 года я покинул Design Science. Позже в том же году WIRIS приобрела компанию. Я предложил бесплатно исправлять ошибки MathPlayer, и сначала эта инициатива получила поддержку. Но когда пришло время выпускать новую версию, многие сотрудники, работавшие в компании во время приобретения, уже ушли, а оставшаяся команда не была заинтересована в поддержке MathPlayer. Окончательное решение было принято только в конце 2020 года. В 2021 году я начал работать над заменой MathPlayer. В качестве дополнительной задачи я решил изучить Rust и реализовал проект на нём. Rust — низкоуровневый язык со строгой типизацией и безопасной работой с памятью, но без автоматической сборки мусора или подсчёта ссылок. Его часто называют более безопасной заменой C/C++.

Rust достаточно эффективен. На компьютере с Core i7-770K (мощным по меркам примерно 2017 года процессором) для выражения среднего размера
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow>
    <msup>
      <mi>e</mi>
      <mrow>
        <mo>&#x2212;</mo>
        <mfrac>
          <mn>1</mn>
          <mn>2</mn>
        </mfrac>
        <msup>
          <mrow>
            <mrow>
              <mo>(</mo>
              <mrow>
                <mfrac>
                  <mrow>
                    <mi>x</mi>
                    <mo>&#x2212;</mo>
                    <mi>&#x03BC;</mi>
                  </mrow>
                  <mi>&#x03C3;</mi>
                </mfrac>
              </mrow>
              <mo>)</mo>
            </mrow>
          </mrow>
          <mn>2</mn>
        </msup>
      </mrow>
    </msup>
  </mrow>
</math>
требуется около 4 мс, чтобы создать строку ClearSpeak на английском языке
"_e raised to the exponent, negative 1 half times; open paren; the fraction with numerator; x minus mu; and denominator sigma; close paren squared, end exponent_"
и строку в коде Немета "⠑⠘⠤⠹⠂⠌⠆⠼⠈⠡⠷⠹⠭⠤⠨⠍⠌⠨⠎⠼⠾⠘⠘⠆".
Примерно 2 мс занимают очистка MathML, 1 мс — генерация речи, ещё 1 мс — генерация Брайля. Сюда входит проверка актуальности всех файлов правил, которая оказывается достаточно затратной. Эту проверку можно отключить с помощью настройки: она нужна главным образом при отладке. Если проверка отключена, время уменьшается до 2,3 мс.
На более мощном процессоре Intel Core Ultra 9 285 2025 года генерация речи и Брайля в одном потоке занимает около 1 мс.

<details>
<summary>Показать MathML этого выражения</summary>
<pre>
&lt;math&gt;
  &lt;mrow&gt;
    &lt;msup&gt;
      &lt;mi&gt;e&lt;/mi&gt;
      &lt;mrow&gt;
        &lt;mo&gt;&#x2212;&lt;/mo&gt;
        &lt;mfrac&gt;
          &lt;mn&gt;1&lt;/mn&gt;
          &lt;mn&gt;2&lt;/mn&gt;
        &lt;/mfrac&gt;
        &lt;msup&gt;
          &lt;mrow&gt;
            &lt;mrow&gt;
              &lt;mo&gt;(&lt;/mo&gt;
              &lt;mrow&gt;
                &lt;mfrac&gt;
                  &lt;mrow&gt;
                    &lt;mi&gt;x&lt;/mi&gt;
                    &lt;mo&gt;&#x2212;&lt;/mo&gt;
                    &lt;mi&gt;&#x03BC;&lt;/mi&gt;
                  &lt;/mrow&gt;
                  &lt;mi&gt;&#x03C3;&lt;/mi&gt;
                &lt;/mfrac&gt;
              &lt;/mrow&gt;
              &lt;mo&gt;)&lt;/mo&gt;
            &lt;/mrow&gt;
          &lt;/mrow&gt;
          &lt;mn&gt;2&lt;/mn&gt;
        &lt;/msup&gt;
      &lt;/mrow&gt;
    &lt;/msup&gt;
  &lt;/mrow&gt;
&lt;/math&gt;
</pre>
</details>

Для генерации речи и Брайля MathCAT использует внешние правила.
Их загрузка занимает около 40 мс. Она выполняется только при первом использовании правил или после изменения стиля речи, языка либо другой внешней настройки. Ещё 50 мс требуется для загрузки полных файлов Unicode для речи и Брайля, однако исследования показали, что в подавляющем большинстве англоязычных математических материалов для школьного обучения используются лишь немногие символы.
Судя по книгам по математике с открытым исходным кодом, первоначально загружаемого набора должно быть достаточно как минимум для 99,99 % символов, встречающихся в выражениях англоязычных школьных учебников математики.

Размер библиотеки составляет около 3 МБ.

Если вы разрабатываете решение для работы непосредственно в браузере, то есть используете JavaScript или другой браузерный язык, MathCAT, вероятно, не будет оптимальным выбором. При этом я, скорее всего, выделю из [MathCATDemo](https://github.com/NSoiffer/MathCATDemo/) интерфейс JavaScript, на котором построена демонстрационная версия. Пока обратите внимание на [Speech Rule Engine](https://github.com/zorkow/speech-rule-engine) (SRE) Фолькера Зорге. Он написан на TypeScript и, вероятно, подойдёт для браузерного решения, если вам не требуется Брайль. MathCAT поддерживает несколько систем записи Брайля и как минимум для кода Немета обеспечивает более качественный результат.

# Благодарности

Проекту помогали многие люди, и я очень признателен им за это!

* Дэвид Карлайл — оказал неоценимую помощь с некоторыми выражениями сопоставления XPath.
* Сьюзан Джолли — терпеливо консультировала по генерации кода Немета и UEB, а также давала обратную связь о правильных и ошибочных результатах. Кроме того, она помогла мне при разработке эвристик для химических формул.
* Элейн А. Мур — помогла определить, что следует и не следует произносить для химических формул, а также какие записи имеют смысл с точки зрения химии.
* Ричард Орм — полностью разработал диалог настроек MathCAT для NVDA.
* Сэм Дули, Мюррей Сарджент и Фолькер Зорге — предоставили таблицы перевода символов в код Немета и тесты этого кода.
* Мориц Гросс ([Math4VIP](https://www.math4vip.de/)) — работал над различными частями кодовой базы Rust и создал инструмент Python для отслеживания прогресса локализации.

Переводчики:

* Китайский язык (традиционное письмо) — Хон-Джанг Янг.
* Финский язык — Сами Мяяття, Accessibility Library Celia и независимый специалист Эсси Вииппола.
* Немецкий язык — Назли Анджич, Роберт Граф и Пол Либбрехт (IU International University of Applied Sciences).
* Индонезийский язык — доктор Пинта Дениянти Сампоэрно, магистр наук; доктор Мейлиасари, бакалавр педагогических наук, магистр наук; Ари Хендарно, бакалавр педагогических наук, магистр компьютерных наук.
* Норвежский язык — Марте Гьельстад, Национальная библиотека Норвегии, Kvile.
* Русский язык — Данил Костенков.
* Испанский язык — Ноэлия Руис Мартинес, которая также помогала в разработке дополнения NVDA, и Мария Алло Рольдан.
* Шведский язык — Тим Арбореалис Лётберг, Шведское агентство доступных медиа (MTM), и Андерс Эклунд, SPSM.
* Вьетнамский язык — Данг Хоай Фук и Транг Фам.
* Другие языки??? — присоединяйтесь, чтобы я мог указать вас здесь...

Первоначальный перевод многих символов Брайля для систем записи, разработанных в 2024 году и позднее, был существенно упрощён благодаря таблице, которую мне предоставил Георгиос Курупретроглу и над которой работала большая команда. Для получения подробной информации обратитесь к:

* [MathBrailleCodes Repository](https://access.uoa.gr/mathbraille/index.php/en/), Speech and Accessibility Lab, National and Kapodistrian University of Athens, Greece: P. Riga, T. Antonakopoulou, D. Kouvaras, S. Lentas and G. Kouroupetroglou (2021) “[The BrailleMathCodes Repository](https://access.uoa.gr/mathbraille/index.php/en/)”, Proceedings of the 4th International Workshop on “[Digitization and e-Inclusion in Mathematics and Science 2021](https://workshop.sciaccess.net/deims2021/DEIMS2021_Proceedings.zip)” DEIMS2021, February 18-19, 2021, Tokyo, pp. 105-114.

Спасибо всем участникам!

# Обо мне

Я работаю над обеспечением доступности математических выражений с 2002 года. В то время я занимался WYSIWYG-редактором формул Mathematica и другими элементами пользовательского интерфейса. Профессор Джон Гарднер, потерявший зрение пятнадцатью годами ранее, спросил, могу ли я сделать интерфейс Mathematica доступным. Мне удалось выполнить, вероятно, около 80 % работы, но компания не захотела продолжать проект. В конечном итоге я ушёл, а компания удалила код. Так начался мой путь в сфере доступности: шаг вперёд, шаг назад и снова вперёд, потому что возможность дать _каждому_ шанс открыть для себя радость математики и науки наполнила мою жизнь смыслом.

Затем я перешёл в компанию Design Science, Inc (DSI), заинтересованную в обеспечении доступности математики. Незадолго до этого DSI разработала MathPlayer — подключаемый модуль для IE6, отображавший MathML. Я добавлял в него новые функции и при поддержке компании подал заявку на грант NSF для обеспечения доступности MathPlayer. Заявка была одобрена, а работа оказалась весьма успешной. В последующие годы я продолжал развивать MathPlayer. Однако из соображений безопасности Internet Explorer удалил интерфейс, от которого зависел MathPlayer. Возникает соблазн сказать, что именно это и погубило IE... После этого MathPlayer стал дополнением NVDA, предназначенным исключительно для обеспечения доступности. Дальнейшая работа по гранту IES совместно с ETS помогла усовершенствовать возможности MathPlayer. Финансируемые грантом пользовательские исследования дали ценную информацию.

Подробнее об истории MathPlayer и появлении MathCAT вы можете узнать в разделе [«Почему MathCAT?»](#why-mathcat).

На протяжении всего этого времени я стремился обеспечить поддержку математических выражений в интернете и сделать их доступными. Работая в Wolfram Research, я помог запустить проект W3C MathML и с тех пор участвую в деятельности рабочей группы. Сейчас я являюсь сопредседателем рабочей группы W3C Math. За эти годы я также участвовал в работе нескольких других комитетов и активно добивался включения доступности математических выражений в их стандарты. Среди таких групп — NIMAS, EPUB и PDF/UA.

Для меня большая честь, что в 2023 году Национальная федерация слепых присудила мне премию Джейкоба Болотина в размере <span>$</span>25 000. Из этой суммы я пожертвовал <span>$</span>15 000 проекту _Open Collective_ для улучшения поддержки MathML в браузерах. [По этой ссылке можно узнать, как помочь улучшить поддержку MathML в браузерах](https://opencollective.com/mathml-core-support).
