Repository navigation
Releases: daisy/MathCATForPython
Releases · daisy/MathCATForPython
Release list
Development Build (using version 0.7.8-alpha)
Commits
- e035b65: update version number (nsoiffer)
- 992ca6d: run the build on all branches and for PRs (nsoiffer)
- b7dd0dc: update version # (nsoiffer)
- 892302d: Update translations (github-actions)
- aac5a32: Merge tag 'release-candidate' (nsoiffer)
- df517a3: Update translations (github-actions)
- 949db0e: update version #s (nsoiffer)
- aa5d892: Merge branch 'main' of https://github.com/daisy/MathCATForPython (nsoiffer)
- f09f732: Update translations (github-actions)
- 1ef53fc: fix broken merge (nsoiffer)
- 61df4d0: Merge branch 'main' of https://github.com/daisy/MathCATForPython (nsoiffer)
V0.7.7
Changes since V0.7.5
User-facing highlights
| Area | Since 0.7.5 |
|---|---|
| NVDA addon | Single universal addon with both 32- and 64-bit binaries; new logo with hi-DPI rendering, dark-mode contrast pill, and rules-engine version label; last tested on NVDA 2026.2 |
| Languages | New: Greek, French, Hungarian, Polish, Russian; improvements German, Norwegian, Swedish, Traditional Chinese; translated navigation rules; column/row separator announcements |
| Braille | New: Russian, French braille; major UEB BANA/ICEB updates; Nemeth 2022-ish fixes; Nemeth ⋄ fix; unicode ranges; BrailleCode refactor |
| Content | Augmented matrices; chemistry (atomic-number scoring, arc-like symbols); multi-line script positions; currency/mtext cleanup; SSML fix; uptack → “perpendicular” |
| Packaging | Minified Rules-minimized.zip; unified Rust rules packaging for CI, include-zip, and releases |
| Quality | Fuzzing; better errors; dual no-unsafe CI track; CI on all branches and PRs |
Details
NVDA addon (MathCATForPython)
- Single addon build — one
.nvda-addonships bothlibmathcat_py_x86.pydandlibmathcat_py_x64.pyd; a bitness-aware loader picks the correct binary at runtime (#108) - Preferences dialog — new MathCAT logo artwork; sharp hi-DPI rendering via
BitmapBundle; light rounded pill behind the logo on dark backgrounds; MathCAT rules-engine version shown below the logo (#109) - Compatibility —
addon_lastTestedNVDAVersionupdated to 2026.2 - CI / release workflow — automatic builds and pre-releases on all branches (not just
main); per-branch release tags; consolidatedbuild-addonjob; l10n sync remains main-only and no longer blocks builds on feature/release branches
Languages & speech
- French (
fr) — new - Greek (
el) — new - Hungarian (
hu) — new - Polish (
pl) — new - Russian (
ru) — new; speech changes merged (#689) - Norwegian (
nb) — speech + navigation enhancements; navigation zoom no longer says “in” for prefix/silent intents (e.g. “b” instead of “in b” for-b) - Swedish (
sv) — translation update (#682); same navigation zoom fix as Norwegian - German (
de) — digit rules, units, and other speech fixes; set grammar; unit plurals and definitions; absolute-value ending; integral/logical symbols; “ray” → “Strahl”; “ruthe” → “Rute”; inverse grammar fixes - Traditional Chinese (
zh-tw) — navigation / related rule updates; translation refresh from English (2026-06-15 baseline, #618) - English — core concept names (#381); principal Log vs log; identity / augmented matrices; black circled Latin letters; circled-number support; unit-definition cleanups
- Navigation rules — initial multi-language translation of navigation command names
- Cross-language — column and row separator announcements in matrices/tables (#679); multi-line script positions (mtable or nested munder/mover) separated by commas;
uptack(⊥) speaks as “perpendicular” (#330); non-terse square root speech restored (#668);lgrecognized as ASCIIMath function; better speech for missing/parse-error characters - Intent — inference tweaks; richer
definitions.yamlformat with|alternatives; intents aligned to core concepts with tests
Braille
- Russian — new
- French braille — new braille code with rules, unicode tables, and chemistry tests (initial release; some open questions remain)
- Nemeth — 2022-oriented updates (ellipses, multipurpose between scripts, currency, typeform prefs cleanup, bugfixes); fixed braille for ⋄ (diamond operator, #703)
- UEB — updated to latest BANA/ICEB guidance:
- Grade-1 indicator rules revised; new G1 BANA/GTM mode preference
- Expanded grade-2 contractions; fixed be / con / dis contractions at word starts
- mtable row-start and row-terminator handling for linear braille (some rules provisional, pending ICEB feedback)
- New accented-letter patterns (e.g. Ñ) and Hebrew alphabet indicator
- Narrowed overly broad pseudo-script rule (also cleaned up in other braille codes)
- Unicode tables — collapse to ranges + range fixups
- Refactor —
BrailleCodetrait + registry - Table-related braille/rules work
- Remove incomplete ASCIIMath-fi packaging that broke builds
Canonicalization, chemistry, robustness
- Chemistry — mmultiscripts/scripts merge, atomic-number scoring and lookup table, chem-element intent/heuristics, chem test fixes; prescripts matching atomic number boost chemistry detection; primes on chem symbols (e.g.
R') no longer rejected - Arc-like symbols — merge under restricted conditions (#698); arc look-alike chars fixed after canonicalization change
- Bad mmultiscripts / empty bases /
data-splitcleanup - Currency symbols split out of
mtext/mi/mn; less aggressive?fill-in - Empty
<mi>/ degree edge cases; mtext-as-number →mnwhere appropriate - Stronger panic/error reporting (tests + containers)
- SSML — stopped incorrectly escaping SSML (#585)
Internals
- Rust edition 2024;
lazy_static→LazyLock; API cleanups (AsRef<str>, etc.) - anyhow instead of error-chain
- Optional
no-unsafeviasxd-document-no-unsafe/sxd-xpath-no-unsafe(default = classic mode) - Rules packaging — unified Rust
package-rulesfor CI,include-zip, and release zips;Rules-minimized.zip(flow-style YAML) for smaller downloads - CI — build/test/clippy for default and
no-unsafe; fuzz both configs; CI on all branches and PRs; Python tooling CI; coverage; pre-release fixes - cargo-fuzz harness, dictionary, corpus cache, regression helpers
- audit-translations and related Python/uv tooling; new
--excludeoption with tests - Parallel tests — serialized rules unzip/YAML reads to avoid races
Docs
- README / product-page copy; AT notes (JAWS, Orca, Kurzweil, etc.)
- User guides / translators’ guide work; example HTML for translator testing
- New logo with hi-DPI rendering, dark-mode contrast pill on many pages.
- User guide and translator’s guide revisions; updated acknowledgements; MathCAGT demo link in developer docs
0.7.6 beta 9
User-facing highlights
| Area | Since 0.7.5 |
|---|---|
| Languages | New: Greek, French, Hungarian, Polish, Russian; Improvements German, Norwegian, Traditional Chinease |
| Braille | New: Russian; Nemeth 2022-ish fixes; unicode ranges; BrailleCode refactor |
| Content | Augmented matrices; chemistry; currency/mtext cleanup; SSML fix |
| Quality | Fuzzing; better errors; dual no-unsafe CI track |
Details
Languages & speech
- Polish (
pl) — new - French (
fr) — new - Greek (
el) — new - Hungarian (
hu) — new - Russian (
ru) — new - Norwegian (
nb) — speech + navigation enhancements - German (
de) — digit rules, units, other speech fixes - Traditional Chinese (
zn-tw) — navigation / related rule updates - English — core concept names (#381); principal Log vs log; identity / augmented matrices; black circled Latin letters; circled-number support; unit-definition cleanups
- Intent — inference tweaks
Braille
- Russian — new
- Nemeth — 2022-oriented updates (ellipses, multipurpose between scripts, currency, typeform prefs cleanup, bugfixes)
- Unicode tables — collapse to ranges + range fixups
- Refactor —
BrailleCodetrait + registry - Table-related braille/rules work
- Remove incomplete ASCIIMath-fi packaging that broke builds
Canonicalization, chemistry, robustness
- Chemistry — mmultiscripts/scripts merge, atomic-number scoring, chem-element intent/heuristics, chem test fixes
- Bad mmultiscripts / empty bases /
data-splitcleanup - Currency symbols split out of
mtext/mi/mn; less aggressive?fill-in - Empty
<mi>/ degree edge cases; mtext-as-number →mnwhere appropriate - Stronger panic/error reporting (tests + containers)
- SSML — stopped incorrectly escaping SSML (#585)
Internals
- Rust edition 2024;
lazy_static→LazyLock; API cleanups (AsRef<str>, etc.) - anyhow instead of error-chain
- Optional
no-unsafeviasxd-document-no-unsafe/sxd-xpath-no-unsafe(default = classic mode) - CI — build/test/clippy for default and
no-unsafe; fuzz both configs; CI on all branches; Python tooling CI; coverage; pre-release fixes - cargo-fuzz harness, dictionary, corpus cache, regression helpers
- audit-translations and related Python/uv tooling
- AGENTS.md, CODEOWNERS, CLI /
mathml2textpath - Dependency bumps; BrailleDocs publish exclude
Docs
- README / product-page copy; AT notes (JAWS, Orca, Kurzweil, etc.)
- User guides / translators’ guide work; example HTML for translator testing
V0.7.5
Bugs Fixed
- If MathML is directly embedded inside of a MathML leaf element, it will be spoken well.
- Improved Chemistry so that if the intent property
:chemical-formulais used, it is inherited and overrides heuristics to determine if something is a chemical formula. For example, "A=B" will now speak "=" as "double bond". - Fix bug in German translation for division involving units (=> "pro")
- Fix bug in MathCAT dialog that prevented proper selection of Norwegian
- For ASCIIMath, added translations for chars with umlauts and also for ß (goes to "ss" because there is no defined encoding for it)
- Added literal speech for "‼" and "/" to English.
API Additions
- Added calls for
GetSupportedLanguages,GetSupportedSpeechStyles, andGetSupportedBrailleCodes.
V0.7.4-rc.1
Bugs Fixed
- If MathML is directly embedded inside of a MathML leaf element, it will be spoken well.
- Improved Chemistry so that if the intent property
:chemical-formulais used, it is inherited and overrides hueristics to determine if something is a chemical formula. For example, "A=B" will now speak "=" as "double bond". - Fix bug in German translation for division involving units (=> "pro")
- Fix bug in MathCAT dialog that prevented proper selection of Norwegian
- For ASCIIMath, added translations for chars with umlauts and also for ß (goes to "ss" because there is no defined encoding for it)
- Added literal speech for "‼" and "/" to English.
API Additions
- Added calls for
GetSupportedLanguages,GetSupportedSpeechStyles, andGetSupportedBrailleCodes.
V0.7.3
No real changes.
The previous build was rejected because buildVars.py used "v" in the version number. The version number is updated here, but otherwise, there are no changes from 0.7.2.
V0.7.2
- Added German translation. There is still more work to do on this, but I'm told it is usable.
- Added Norwegian translation
- Improved reading of "neuter" units
- Changed some character wording ("if and only if", "implies", "triangle")
- Fix problems with the zip files and regional variants. This should allow en-gb and zh-tw to be available.
- Fixed bugs in navigating in character mode and simple mode.
- Changed the names of some characters to be more semantic (e.g., "long double left right arrow" is not "if and only if").
- Add some "literal" (not semantic) names for characters for LiteralSpeak and navigation.
- Fixed some bugs dealing with "intent"
- Fix a bug with generating id's that could cause a crash once every 36^4 times
- Add another heuristic to prevent something from being a potential function (when the potential function name appears within the argument)
- Fixed reading of a degree symbol followed by "F" or "C".
- Corrected the rule for what is allowed for "intent"
- Improved the inference rules for units (supports "mi" if it is marked as "normal")
- Fixed a navigation bug with log, ln, and lg
- Improved error messages -- these should aid in reporting problems in speech and navigation
- Improved speech for fractions that involve units ("meters per second")
- Many improvements to the recognition of Chemistry
- Fixed a Nemeth bug where a script end and baseline indicator were emitted when neither should have been present.
- Added varepsilon character to UEB
- Fixed off-by-one error when computing what to highlight in braille.
- Add definitions for "ⅆ", "ⅇ", "ⅈ" to braille codes
MathCAT 0.6.10 (Build for NVDA 2025.1)
Main change is to make this to work with NVDA 2025.1
The zip library version that MathCAT users was withdrawn and this is built on a newer version of zip.
MathCAT 0.6.9 (Build for NVDA 2025.1)
Changes since last release
- Update manifest to indicate compatibility with 2025.1
- Fix unhandled exception when opening up a new user preference file
- Strip '_' and '-' from unmatched intent names (and literals). For example "my-function" should be "my function".
- Add rule for "x check" (inverted hat)
- Add rule for repeating decimals for 'en'. This only handles the line over the repeating part, not other notations.
MathCAT 0.6.8 (Build for NVDA 2024.4)
MathCAT Update Log
Note: this works with an early March, 2025 NVDA alpha build, but there is no guarantee it will work with 2025.1.
Version 0.6.8
Lots of changes because it has been a while since the last official release. These are the improvements since 0.5.6 (sorry, I didn't make a clean up
Languages and braille systems currently supported:
- Languages: Chinese (Taiwan), English, Finnish, Indonesian, Spannish, Swedish, Vietnamese
- Braille: CMU (Portuguese, Spanish), Finnish AsciiMath, LaTeX (as used in German braille), Nemeth, Swedish, UEB, Vietnamese
Speech
- Added "LiteralSpeak" style that does not infer what the meaning of the math and therefore, how that meaning spoken.
- Added more cases where invisible times is spoken (before roots)
- Added ability for authors to insert pauses (English only at the moment)
- Added a pause before row/equation/line labels
- Added inference for cross-product and dot-product
- Added inference for div, grad, and curl
- Added special speech for zero, identity, and diagonal matrices in English
- Be more restrictive when inferring a table
- Add speech for coordinates ("the point at 1 comma 2")
- Added pauses for a ","
- Added an experimental
:pause-long,:pause-medium,:pause-shortfor intent - Added an 'xlong' pause
- Increased the meaning of short/medium/long pauses from 150ms/300ms/600ms to 200ms/400ms/800ms. As always, these are scaled to the speech rate.
- In MathML 4,
mlabedtris deprecated. A workaround is to use the intent property:equation-labelon anmtdand this is now supported - Added speech for units (e.g., "km", "in") -- won't work for single letter units such as "m" and "s" unless marked as a unit
- Terse mode now says "of" for functions except for trig/log functions. It was a little too terse before.
Navigation
- Added "Speech" to copy menu when navigating so that you can copy out the text used to speak the focus point in the expression being explored.
- Substantial rewrite of the navigation rules so that follow the inferred meaning. For example, if MathCAT says "absolute value of x" and you "zoom in", then you move to the "x", not to a vertical bar. As another example, if MathCAT determines that a table consists of rows of equations, navigation won't concatenate the columns so that the table acts like there is only one column.
- "Speak Overview" didn't do anything (fixed). Overviews remain under-developed.
Braille
- Added preferences so that Nemeth users can remap typeforms (e.g, map BlackBoard Bold to a different character).
- Changed Blackboard typeform indicator to reuse italic indicator instead of reusing the script indicator. By changing the Nemeth typeform values in NVDA's addon subdirectory
addons\MathCAT\globalPlugins\MathCAT\Rulesprefs.yaml or adding it to%AppData%\MathCAT\prefs.yaml`, you can restore the old mapping.
Other
- Fixed a bug with double-struck numbers for Nemeth.
- Several fixes for recognizing chemistry.
Fixes
- Fixed (I hope) a bug in espeak that caused the speech to get slower and slower
- Forgot to implement relative slowdown when navigating -- fixed
- Fixed sans-serif indicator for Nemeth braille.
- Fixed a bug where empty cells in a table that is piecewise, m:system-of-equations or lines were spoken.
- Fixed bug where open/closed intervals were inferred when brackets/parens were nested (can't be an interval).