+
+## Информация для разработчиков ассистивных технологий и пользователей библиотеки
+
+При использовании MathCAT вызовы обычно выполняются в следующем порядке:
+1. Задаётся расположение каталога `Rules` MathCAT с помощью [SetRulesDir].
+2. С помощью вызовов [`SetPreference`] задаются необходимые ассистивной технологии настройки. Обычно указываются `Language` и используемый движок `TTS`, если он есть. Настоятельно рекомендуется задать движок.
+3. MathML передаётся с помощью [`SetMathML`].
+4. Ассистивная технология вызывает [`GetSpokenText`] для получения текста для озвучивания и [`GetBraille`] для получения Брайля в Unicode. Если указан идентификатор узла, соответствующие ячейки Брайля будут выделены.
+
+Для навигации можно вызывать:
+* [`DoNavigateKeyPress`] — принимает события клавиатуры;
+* [`DoNavigateCommand`] — принимает команды, в которые внутри программы преобразуются события клавиатуры.
+
+Оба вызова возвращают строку для озвучивания.
+Для выделения текущего узла навигации используются атрибуты `id`. Если они ещё не заданы,
+[`SetMathML`] возвращает строку MathML с атрибутами `id` у всех узлов, для которых такие атрибуты отсутствовали.
+Текущий узел можно получить с помощью:
+* [`GetNavigationMathMLId`];
+* [`GetNavigationMathML`] — возвращает строку MathML выбранного узла.
+
+Примечание: оба вызова также возвращают второе целое число. Это смещение символа в листовом узле.
+Оно необходимо для посимвольной навигации по листовым узлам из нескольких символов, например `sin` и `1234`.
+Сейчас значение всегда равно `0`: эта функция требует дальнейшей разработки.
+
+Текущие значения настроек можно получить с помощью вызова [`GetPreference`].
+
+Все функции могут возвращать код ошибки.
+
+Примечание: MathCAT выполняет значительную работу по исправлению некачественного MathML. В частности, генераторы MathML часто разделяют на части числа с запятыми и точками. MathCAT пытается собрать их обратно, но для этого должен знать региональные правила использования разделителей групп цифр и десятичных разделителей. Например, в США запись `1,234.0` является допустимым числом, а в Европе — нет, поскольку запятая используется как десятичный разделитель. Региональные настройки определяются страной, для которой создан документ, а не языком озвучивания математических выражений. Допустимый вид числа задают настройки `BlockSeparators` и `DecimalSeparators`. Вызывающая программа должна устанавливать эти значения, если они известны. По умолчанию используется американский формат чисел.
+
+## Для пользователей Rust
+MathCAT написан на Rust. Достаточно собрать MathCAT и добавить в файл `Cargo.toml` своего проекта запись наподобие следующей:
+```
+[dependencies.MathCAT]
+mathcat = 0.2.0 # проверьте актуальную версию и используйте её
+```
+
+Точные сигнатуры функций с комментариями:
+```
+/// Задаёт каталог Rules.
+/// ВАЖНО: это должен быть самый первый вызов MathCAT, если только не задана переменная среды MathCATRulesDir.
+pub fn set_rules_dir(dir: String) -> Result<()>
+
+/// Возвращает номер версии сборки из Cargo.toml.
+pub fn get_version() -> String
+
+/// Заменяет ранее заданный MathML.
+/// Возвращает канонический MathML с атрибутами 'id' у всех узлов, у которых не было идентификатора.
+/// Идентификаторы можно использовать для синхронного выделения, если настройка API `Bookmark` равна true.
+pub fn set_mathml(mathml_str: String) -> Result
Руководство переводчика и разработчика правил
+
+## Информация для разработчиков правил и переводчиков MathCAT
+Эта страница находится в процессе подготовки.
+
+## Начало работы
+Если вы планируете участвовать в разработке MathCAT, используйте GitHub:
+1. Создайте форк репозитория MathCAT `github.com/NSoiffer/MathCAT`.
+2. Клонируйте форк, чтобы получить локальную копию для работы.
+3. Переключитесь на созданную для вашей работы ветку, обычно названную кодом языка перевода, и работайте в ней.
+
+Если вы ещё не знакомы с этими действиями, найдите одно из многочисленных руководств. Они достаточно просты, поэтому отсутствие опыта не должно вас останавливать.
+
+
+## Переводчикам на другие языки
+Если вы хотите перевести MathCAT, свяжитесь с @NSoiffer. Он подготовит начальный вариант перевода, который может значительно сэкономить время. В результате будут созданы файлы в каталоге `Rules/Languages/xx`, где `xx` — код языка, например `fr`, `de` или `el`. Перевод выполняется в этом каталоге. Необходимо отредактировать четыре категории файлов:
+1. `definitions.yaml`: содержит переводы числительных, в том числе количественных и порядковых. Проверьте начальный перевод и внесите необходимые исправления. Эти числительные используются, например, при озвучивании фразы «три пятых». На некотором этапе образование числительных в языках становится регулярным, поэтому некоторые списки в файле можно сократить, а некоторые следует дополнить. Подробнее см. английские комментарии в файле.
+2. Файлы `xxx_Rules.yaml`, сейчас это `ClearSpeak_Rules.yaml` и `SimpleSpeak_Rules.yaml`. Они соответствуют разным стилям речи. Настоятельно рекомендуется сначала выбрать только один стиль. Эти файлы обычно содержат слова, описывающие структуру выражения, например «дробь» и «степень», а также связующие слова. Поскольку стили речи во многом похожи, существует также каталог `SharedRules` с общими файлами правил. Они подключаются в `ClearSpeak_Rules.yaml` и `SimpleSpeak_Rules.yaml` с помощью правил `- include: file_name`. Их тоже необходимо перевести.
+
+— библиотека, которая преобразует 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.
+
+
+
+## Почему 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 года процессором) для выражения среднего размера
+
+требуется около 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 мс.
+
++<math> + <mrow> + <msup> + <mi>e</mi> + <mrow> + <mo>−</mo> + <mfrac> + <mn>1</mn> + <mn>2</mn> + </mfrac> + <msup> + <mrow> + <mrow> + <mo>(</mo> + <mrow> + <mfrac> + <mrow> + <mi>x</mi> + <mo>−</mo> + <mi>μ</mi> + </mrow> + <mi>σ</mi> + </mfrac> + </mrow> + <mo>)</mo> + </mrow> + </mrow> + <mn>2</mn> + </msup> + </mrow> + </msup> + </mrow> +</math> ++
Руководство пользователя
+
+## Рекомендации по выбору голоса
+
+В NVDA можно использовать разные синтезаторы речи. Для выбора откройте `Параметры:Настройки...` в NVDA, а затем выберите категорию `Речь`. Обычно доступны как минимум три варианта: eSpeak NG, Microsoft Speech API и голоса Windows OneCore. Все синтезаторы работают, но голоса Windows OneCore неправильно произносят «a», поэтому рекомендуется выбрать другой вариант. В частности, хорошей заменой голосам OneCore служит Microsoft Speech API.
+
+## Информация для пользователей MathCAT
+
+MathCAT поддерживает ряд настроек озвучивания, Брайля и навигации. Они описаны ниже.
+Пока поддерживаются не все настройки. Для каждой настройки указано текущее состояние поддержки. Символ ✓ перед настройкой означает, что она поддерживается хотя бы частично.
+
+Примечание: в NVDA настройки задаются в диалоге параметров MathCAT. Чтобы открыть его, перейдите в параметры NVDA, выберите «Параметры», а затем «Настройки MathCAT...». Настройки разделены на три категории: «Речь», «Навигация» и «Брайль». Такое же разделение используется ниже.
+
+MathCAT поддерживает несколько режимов навигации. Способ входа в режим навигации и выхода из него зависит от используемой вспомогательной технологии (подробнее в списке ниже). MathCAT принимает те же команды и сочетания клавиш, что и MathPlayer. Они [перечислены в этом документе](nav-commands.md).
+Документация описывает множество полезных способов навигации по математическим выражениям. Чтобы быстро начать работу:
+
+* Используйте клавиши-стрелки для перемещения влево, вправо, вверх и вниз по структуре математического выражения, например для входа в дробь и выхода из неё.
+* Внутри таблицы нажимайте Ctrl+стрелка для перемещения по ячейкам.
+* Нажимайте Home и End для перехода к началу и концу выражения.
+* Нажимайте пробел для озвучивания текущей позиции.
+* Нажимайте Shift+стрелка вверх или Shift+стрелка вниз для изменения режима навигации (см. [документацию по навигации](nav-commands.md)).
+
+Чтобы начать навигацию:
+
+* NVDA: нажмите NVDA+Alt+M или пробел для входа в режим навигации по математическому выражению, а для выхода нажмите Escape.
+
+Навигация MathCAT работает одинаково в Word и в браузере.
+
+При навигации по выражению сочетание Ctrl+C в NVDA копирует математическое содержимое текущего узла. Поддерживаются следующие форматы:
+
+* MathML (по умолчанию);
+* LaTeX;
+* ASCIIMath;
+* текст для озвучивания.
+
+## Список настроек
+
+Ниже перечислены настройки. Большинство из них принимают только ограниченный набор значений, который указан в описании.
+Значение по умолчанию приведено в \[квадратных скобках\].
+
+### Настройки речи
+
+* ✓Impairment: [Blindness]
+ * Значения: Blindness, LowVision, LearningDisability.
+ * Описание: определяет, следует ли устранять неоднозначность некоторых обозначений при озвучивании.
+ * Состояние: основное внимание уделялось значению Blindness, но другие значения также частично поддерживаются. Эту поддержку необходимо улучшить.
+
+* ✓Language: [en]
+ * Значения: любой известный код языка и подкод, например `en-uk`.
+ [Список вариантов приведён на этом сайте](https://www.venea.net/web/culture_code).
+ * Описание: определяет используемый язык.
+ Если региональный вариант не найден среди правил озвучивания, используется основной язык. Если не найдены и правила для основного языка, используется английский язык (`en`).
+ * Состояние: сейчас поддерживаются только английский, испанский, финский, индонезийский, шведский, вьетнамский и китайский языки.
+ Другие языки будут добавляться с помощью добровольцев.
+
+* ✓SpeechStyle: [ClearSpeak]
+ * Значения: любой реализованный стиль речи. Сейчас доступны только ClearSpeak и SimpleSpeak.
+ * Описание: стиль речи, то есть согласованный подход к озвучиванию выражения.
+ * ClearSpeak был разработан ETS для важных экзаменов, например SAT. [Подробности спецификации ClearSpeak приведены в этом документе Word](../ClearSpeakRulesAndPreferences.docx).
+ * SimpleSpeak стремится сократить озвучивание: простые выражения, например $\frac{a}{b}$, читаются быстро, без обрамляющих слов («a over b»). Они отличаются от более сложных выражений, например $\frac{a}{b+1}$, в которых обрамляющие слова используются всегда («fraction a over b plus 1 end fraction»).
+ * Состояние: сейчас реализованы только ClearSpeak и SimpleSpeak, но в дальнейшем, вероятно, будет реализован MathSpeak.
+
+* ✓Verbosity: [Medium]
+ * Значения: Terse, Medium, Verbose.
+ * Описание: определяет количество дополнительных слов при озвучивании. Например, в подробном режиме квадратный корень читается как «the square root of x», а в кратком — как «square root x».
+ * Состояние: настройка поддерживается, но со временем, вероятно, будет дорабатываться.
+
+* ✓MathRate: [100]
+ * Значения: число от 1 до 100.
+ * Описание: изменяет относительную скорость речи в процентах от стандартной скорости речевого синтезатора. Значение `100` означает, что математические выражения читаются с той же скоростью, что и обычный текст.
+ Настройка работает только в реализациях, которые указывают MathCAT создавать разметку речевого синтезатора, например SSML.
+ * Состояние: настройка должна работать в NVDA.
+
+* ✓PauseFactor: [50]
+ * Значения: число от 0 до 100.
+ * Описание: изменяет относительную длительность добавляемых MathCAT пауз. Значение 0 отключает все паузы, а значение 100 увеличивает обычную длительность пауз в десять раз.
+ Настройка работает только в реализациях, которые указывают MathCAT создавать разметку речевого синтезатора, например SSML.
+ * Состояние: настройка должна работать в NVDA.
+
+* ✓SpeechSound: [None]
+ * Значения: None, Beep.
+ * Описание: перед чтением выражения и после него воспроизводится звуковой сигнал.
+ * Состояние: настройка должна работать в NVDA.
+
+* SubjectArea: [General]
+ * Состояние: настройка использовалась в MathPlayer, но пока не реализована. Я жду дальнейшего обсуждения в рабочей группе MathML: возможно, эта настройка будет использоваться для задания разных значений `intent` по умолчанию.
+
+* Chemistry: [SpellOut]
+ * Значения: SpellOut, AsCompound, Off.
+ * Описание: определяет способ чтения химических формул. Примеры для $\mathrm{H}_2\mathrm{O}$:
+ * ✓SpellOut: «H 2 O» (настройка подробности определяет, произносятся ли слова `sub` и `super`);
+ * AsCompound: «Water»;
+ * ✓Off: «H sub 2 O».
+ * Состояние: реализовано множество эвристик для определения того, является ли запись химической формулой. Распознавание химических обозначений не всегда очевидно, поэтому MathCAT иногда может не распознать формулу или по ошибке принять другую запись за химическую. Работа группы MathML может существенно упростить авторам явное указание химических формул.
+
+SpeechOverrides:
+
+* ✓CapitalLetters: "cap" # слово-префикс для прописных букв, если оно не задано в unicode.yaml; пустая строка передаёт обработку программе экранного доступа
+* LeftParen: "" # переопределение слова
+* RightParen: "" # переопределение слова
+
+ClearSpeak содержит ряд настроек. Они предназначены для авторов, но могут задаваться и пользователями, хотя обычно не слишком им полезны.
+
+* ✓CapitalLetters: Auto, SayCaps или изменение высоты тона
+* ✓AbsoluteValue: Auto, AbsEnd, Cardinality, Determinant
+* ✓Fraction: Auto, Ordinal, Over, FracOver, General, EndFrac, GeneralEndFrac, OverEndFrac, Per
+* ✓Exponent: Auto, Ordinal, OrdinalPower, AfterPower
+* ✓Roots: Auto, PosNegSqRoot, RootEnd, PosNegSqRootEnd
+* ✓Functions: Auto, None
+* ✓Trig: Auto, TrigInverse, ArcTrig
+* ✓Log: Auto, LnAsNaturalLog
+* ✓ImpliedTimes: Auto, MoreImpliedTimes, None
+* ✓Paren: Auto, Speak, SpeakNestingLevel, Silent, CoordPoint, Interval
+* ✓Matrix: Auto, SpeakColNum, SilentColNum, EndMatrix, Vector, EndVector, Combinatorics
+* ✓MultiLineLabel: Auto, Case, Constraint, Equation, Line, None, Row, Step
+* ✓MultiLineOverview: Auto, None
+* ✓MultiLinePausesBetweenColumns: Short, Long
+* ✓Sets: Auto, woAll, SilentBracket
+* ✓MultSymbolX: Auto, By, Cross
+* ✓MultSymbolDot: Auto, Dot
+* ✓TriangleSymbol: Auto, Delta
+* ✓Ellipses: Auto, AndSoOn
+* ✓VerticalLine: Auto, SuchThat, Divides, Given
+* ✓SetMemberSymbol: Auto, Belongs, Element, Member
+* ✓Prime: Auto, Angle, Length
+* ✓CombinationPermutation: Auto, ChoosePermute
+* ✓Bar: Auto, Bar, Conjugate, Mean
+
+### Настройки навигации (см. [документацию по навигации](nav-commands.md))
+
+* ✓NavMode: Enhanced — Enhanced, Simple, Character.
+* ResetNavMode: false — запоминать и использовать предыдущее значение.
+* Overview: false — озвучивать выражение или давать его описание и обзор.
+* ResetOverView: true — запоминать и использовать предыдущее значение.
+* ✓NavVerbosity: Medium — Terse, Medium, Full (слова для произнесения команды навигации).
+* ✓AutoZoomOut: true — автоматически уменьшать детализацию двумерных выражений. Если настройка отключена, для принудительного уменьшения детализации используйте Shift+стрелка.
+ * `true`: если вы находитесь у края двумерного выражения, например дроби или надстрочного индекса, и пытаетесь выйти из него влево или вправо, перемещение разрешается, а уровень детализации устанавливается в соответствии с предыдущим или следующим элементом.
+ * `false`: перемещение влево или вправо за край двумерного выражения запрещено. Чтобы переместиться, необходимо уменьшить детализацию, возможно несколько раз, пока вы не перестанете находиться у края.
+* CopyMathAS: определяет формат копирования математического содержимого текущего узла навигации: MathML, LaTeX, ASCIIMath или текст для озвучивания.
+
+
+### Настройки Брайля
+
+* ✓BrailleCode: [Nemeth]
+ * Значения: любая реализованная система записи Брайля.
+ * Описание: используемая система математической записи Брайля.
+ * Состояние: сейчас поддерживаются ASCIIMath, ASCIIMath-Finnish, CMU, LaTeX, код Немета, шведская система, UEB и вьетнамская система. Поддержка других систем записи Брайля зависит от помощи новых участников.
+* ✓BrailleNavHighlight: [EndPoints]
+ * Значения: Off, FirstChar, EndPoints, All.
+ * Описание: выделяет выбранный узел навигации точками 7 и 8.
+* UEB:
+ * ✓START_MODE: [Grade2]
+ * Значения: Grade1, Grade2.
+ * Описание: предполагаемый начальный режим UEB. Значение Grade1 означает, что используется режим фрагмента Grade 1.
+ * ✓UseSpacesAroundAllOperators: [false]
+ * Значения: true/false.
+ * Описание: рекомендации UEB предполагают, что в младших классах может быть полезно добавлять пробелы вокруг таких операторов, как `+` и `-`. Обычно пробелы добавляются только вокруг операторов отношений, например `=` и `<`.
+
+Во многих системах записи Брайля можно определять пользовательские символы. MathCAT предоставляет для этого несколько настроек.
+
+В коде Немета определены начертания Bold, Italic, SansSerif и Script, но не определено начертание DoubleStruck (Blackboard Bold).
+Здесь можно задать определяемое транскрибатором изменение начертания. По умолчанию DoubleStruck сопоставляется с Italic.
+
+* Nemeth:
+ * ✓SansSerif: "⠠⠨"
+ * ✓Bold: "⠸"
+ * ✓DoubleStruck: "⠨"
+ * ✓Script: "⠈"
+ * ✓Italic: "⠨"
+
+В [руководстве UEB по техническим материалам](https://iceb.org/Guidelines_for_Technical_Material_2008-10.pdf) рекомендуется обычно обрабатывать Fraktur и DoubleStruck как Script.
+Вместо этого здесь можно задать пользовательский префиксный индикатор начертания.
+Примечание: префиксы с первого по пятый: "⠈⠼", "⠘⠼", "⠸⠼", "⠐⠼", "⠨⠼".
+
+* UEB:
+ * ✓DoubleStruck: "⠈" [script]
+ * ✓Fraktur: "⠈" [script]
+ * ✓SansSerif: "⠈⠼" [первый определяемый транскрибатором префиксный индикатор начертания]
+ * ✓GreekVariant: "⠨" [по умолчанию Greek]
+
+Набор определяемых символов для вьетнамской системы ещё обсуждается. Вероятно, некоторые значения изменятся.
+
+* Vietnam:
+ * ✓UseDropNumbers: [false]
+ * Значения: true, false.
+ * Описание: опускает цифры на строку ниже в простых числовых дробях.
+ * ✓DoubleStruck: "⠈" [script]
+ * ✓Fraktur: "⠈" [script]
+ * ✓SansSerif: "⠈⠼" [первый определяемый транскрибатором префиксный индикатор начертания]
+ * ✓GreekVariant: "⠨" [по умолчанию Greek]
+
+### Другие настройки
+
+MathCAT исправляет некачественный MathML. В MathML числа часто размечаются неправильно. Чтобы исправить их корректно, MathCAT должен знать региональные настройки: символы, которые могут разделять группы цифр, и символы десятичного разделителя. Обычно ассистивная технология задаёт эти параметры на основе кода страны в документе. Но код страны может отсутствовать, и тогда ассистивной технологии приходится определять формат по коду языка.
+
+* DecimalSeparators: "." # [по умолчанию]
+* BlockSeparators: ", \u00A0\u202F" # [по умолчанию; включает два варианта неразрывных пробелов]
diff --git a/src/braille.rs b/src/braille.rs
index b944578f..6b259776 100644
--- a/src/braille.rs
+++ b/src/braille.rs
@@ -50,6 +50,7 @@ pub fn braille_mathml(mathml: Element, nav_node_id: &str) -> Result<(String, usi
"CMU" => cmu_cleanup(pref_manager, braille_string),
"Finnish" => finnish_cleanup(pref_manager, braille_string),
"Swedish" => swedish_cleanup(pref_manager, braille_string),
+ "Russian" => russian_cleanup(pref_manager, braille_string),
"LaTeX" => LaTeX_cleanup(pref_manager, braille_string),
"ASCIIMath" => ASCIIMath_cleanup(pref_manager, braille_string),
"ASCIIMath-fi" => ASCIIMath_cleanup(pref_manager, braille_string),
@@ -2167,6 +2168,38 @@ fn swedish_cleanup(pref_manager: Ref