When an <msubsup> has a prime as its superscript, Enhanced and Simple navigation appear to assign the wrong structural roles to its children.
Possibly related to #415, but this seems to involve the special handling for prime/pseudo-script superscripts rather than the ordinary <msubsup> path.
MathML
<math id="0" display="block" xmlns="http://www.w3.org/1998/Math/MathML">
<msubsup id="1">
<mi id="2">x</mi>
<mi id="3">i</mi>
<mo id="4">′</mo>
</msubsup>
</math>
Settings
- Language: English
- Speech style: SimpleSpeak
- Speech verbosity: Medium
- Overview: False
- Navigation verbosity: Verbose
- Auto zoom out: True
Tested through NVDA, with the latest build of MathCAT as an addon.
Observed behaviour
Enhanced and Simple
Both modes behave identically.
-
ZoomIn
- land on
id="2"
- hear:
"zoom in; in base; x"
-
MoveNext
- land on
id="3"
- hear:
"move right; in superscript; i"
-
MoveNext
- land on
id="4"
- hear:
"move right; prime"
The structural labels appear to be shifted. In the source MathML, i is the subscript, not the superscript, and ′ is the superscript.
(Character navigation behaves as expected.)
Expected behaviour
My expectation for Enhanced and Simple is that the semantic structure should preserve the indexed base, similarly to an ordinary <msubsup>, while treating the prime specially rather than as an exponent:
skip-super(indexed-by(x, i), prime)
This would give two semantic parts: the indexed expression x sub i as the base, and the prime as the superscript.
I would therefore expect approximately:
-
ZoomIn
- land on the generated semantic node for
x sub i
- hear:
"zoom in; in base; x sub i"
-
MoveNext
- land on
id="4"
- hear:
"move right; in superscript; prime"
-
MoveNext
- reach the end of the expression
Possible cause
Rules/Intent/general.yaml contains a skip-super rule for both msup and msubsup:
name: skip-super
tag: [msup, msubsup]
...
- intent:
name: "skip-super"
...
children: [x: "*"]
For this <msubsup>, that gives the skip-super intent three children:
x
i
′
However, NavigationParts in Rules/Languages/en/definitions.yaml defines:
"skip-super": "base; superscript",
so skip-super has navigation names for only two children.
This appears consistent with the observed behaviour:
- child 1 (
x) → base
- child 2 (
i) → superscript
- child 3 (
′) → no navigation part name
The ordinary <msubsup> inference creates an indexed-by intent around the first two children before adding the superscript.
Perhaps the msubsup version of skip-super needs to preserve the indexed-by(base, subscript) structure rather than passing all three children directly to skip-super.
(Disclosure: I asked ChatGPT for help when digging into the possible cause, so these guesses might by all means be wrong.)
When an
<msubsup>has a prime as its superscript, Enhanced and Simple navigation appear to assign the wrong structural roles to its children.Possibly related to #415, but this seems to involve the special handling for prime/pseudo-script superscripts rather than the ordinary
<msubsup>path.MathML
Settings
Tested through NVDA, with the latest build of MathCAT as an addon.
Observed behaviour
Enhanced and Simple
Both modes behave identically.
ZoomInid="2""zoom in; in base; x"MoveNextid="3""move right; in superscript; i"MoveNextid="4""move right; prime"The structural labels appear to be shifted. In the source MathML,
iis the subscript, not the superscript, and′is the superscript.(Character navigation behaves as expected.)
Expected behaviour
My expectation for Enhanced and Simple is that the semantic structure should preserve the indexed base, similarly to an ordinary
<msubsup>, while treating the prime specially rather than as an exponent:skip-super(indexed-by(x, i), prime)This would give two semantic parts: the indexed expression
x sub ias the base, and the prime as the superscript.I would therefore expect approximately:
ZoomInx sub i"zoom in; in base; x sub i"MoveNextid="4""move right; in superscript; prime"MoveNextPossible cause
Rules/Intent/general.yamlcontains askip-superrule for bothmsupandmsubsup:For this
<msubsup>, that gives theskip-superintent three children:xi′However,
NavigationPartsinRules/Languages/en/definitions.yamldefines:so
skip-superhas navigation names for only two children.This appears consistent with the observed behaviour:
x) →basei) →superscript′) → no navigation part nameThe ordinary
<msubsup>inference creates anindexed-byintent around the first two children before adding the superscript.Perhaps the
msubsupversion ofskip-superneeds to preserve theindexed-by(base, subscript)structure rather than passing all three children directly toskip-super.(Disclosure: I asked ChatGPT for help when digging into the possible cause, so these guesses might by all means be wrong.)