Re: Maths?


My book is being reviewed at the moment. As soon as it is accepted, I will
announce when and where it is released. The title is "Real Analysis For
Blind Students". Real Analysis is the sub-branch of mathematics where
calculus resides. Actually, it is a subbranch of the analysis branch - the
other subbranch being complex analysis. The book is intended for blind
students whose declared major is mathematics.
A disclaimer is in order. Every character in the book can be found on a
standard English keyboard. There is no integral sign on a standard keyboard.
I want the student to be able to write equations as well as read them. It is
easier and faster to type "INT:" rather than hunting up the code for an
integral sign. With a few exceptions like this one, the notation in the book
conforms to that in a print (or electronic) text. A mathematics professor
should consider the deviation from the standard very minor. If you want to
insert an integral sign into an e-mail for instance (or any other document),
remember its special code and create a regular expression so that NVDA will
recognize it.
The modifications specified in the appendix only cover what is in the book
and not any article on the internet.
Add your own regular expressions to those I describe to cover cases I
An equal sign stands between two expressions which are the same. I can make
a similar statement using a different relation such as greater than or less
than.An equation or inequality is between two expressions.

-----Original Message-----
From: [] On Behalf Of Damien
Sent: Sunday, April 01, 2018 11:44 AM
Subject: Re: [nvda] Maths?

That book actually sounds quite interesting. What branch of maths does it
cover, and what level would you expect your audience to be at? I've never
quite been a maths buff in my schooldays and, as with a lot of other
now I'm learning (or trying to learn) at my own pace, I'm finding I
understand a lot more. I'd still say I was only at a basic level though.
Currently getting my head around scientific notation.
However, I digress. Back to my particular problems.
Problem 2 would seem to be that it is in MathML, in which case a message
would be helpful for those, like me until about ten minutes ago, who don't
have Mathplayer installed.
Problem 3 seems to be to do with font changes (apparently there is a font
called superscript which is used to denote exponents which I never knew
about, hence the 102 instead of 10^2). Of course this is going to cause
problems for people like me who have font announcement turned off. But the
thing is, other than that, why else would you need to know when/if the
of something changed? If fonts are going to be used to represent numbers
mathematical operations then surely they should be announced
I don't know enough about fonts and formatting to know how this kind of
thing works.
As for MathPlayer, has anyone had any luck with it? There may be a
navigation commands document but I just can't get my head around it,
especially since it talks about expressions and equations (Aren't they the
same thing?), not to mention making the content sound much more advanced
than is really necessary. Then, there also doesn't seem to be a way to
or I guess the more accurate word would be convert, the mathematical
into plaintext, for pasting into a text document. The joys of incompatible
-----Original Message-----
From: Michael
Sent: Sunday, April 01, 2018 3:00 PM
Subject: Re: [nvda] Maths?

The material below is from the appendix to a calculus book for blind
students I have written. Its position in the market place has not yet been
I hope it helps you.
Appendix 2 How To Modify The Speech Dictionary In NVDA

NVDA is a screen reading program produced by NV Access(R). It speaks the
information about various parts of the active window in response to
keystrokes pressed by the user. If the keystroke is not an NVDA command,
NVDA merely echoes the keystroke. But, if it is an NVDA command keystroke
such as NVDA-key + t, NVDA tells the user something about the active
In the case of NVDA-Key + t, NVDA announces the title of the active
NVDA commands take the form of the NVDA-key followed by a letter. The
key is by default the NVDA-key. However, NVDA allows the user to change
NVDA-key to the CapsLock key if desired.
The user can control how NVDA announces a string of characters. If the
wants NVDA to speak a particular string of characters a certain way, he or
she can make an entry in its speech dictionary for that particular string
characters. After this entry is saved into the speech dictionary, whenever
that particular string of characters is encountered, NVDA speaks it
according to the entry just made in the speech dictionary.
For example, NVDA ordinarily speaks the word tortilla with an "L" sound
rather than a "y" sound. To force NVDA to pronounce it with the "y"
there must be an entry in the speech dictionary to instruct NVDA to speak
the string of characters "torteeya" as desired.
To make such an entry do the following.
STEP 1: Put focus on the main NVDA menu with the keystroke NVDA-key + n.
The user can arrow down through a list of submenus. Or, press the letter
"p" to go to the preferences menu. The first menu under "Preferences" is
'General'. The user may arrow down the the Speech Dictionary or type 'd"
NVDA will jump into the
default speech dictionary, There are three entries. They are respectively
"voice", and "temporary". I suggest putting my changes into the default
But before entering the default dictionnary, a word about the other two
choices is in order.
The user can arrow once to the voice dictionary which is the dictionary
to the synthesizer currently running. For instance, if the Microsoft
Platform synthesizer is running, arrowing to the Voice Dictionary opens
dictionary whose entries govern the speech under that synthesizer. The
entries in this
dictionary apply to the Microsoft Speech Platform session and not to any
other synthesizer that has been installed. Whatever synthesizer is
the entries in the default speech dictionary apply.
The tempory dictionary is like the voice dictionary, but it is erased when
you exit the NVDA session.
Entering the default dictionary. A list of entries will appear. The user
may add a new entry or arrow down to an entry he or she wishes to change.
add a new entry Tab once. To change an entry, arrow down the the entry in
question and tab twice. Or to remove the entry in question, tab three
But the object of this appendix is to add entries in support of the
So, tab only once to add an entry. Focus will be on the "Add" button.
the ENTER key to activate it. NVDA says "add a dictionary entry dialogue,
pattern edit". Focus is now in an edit box. The string of characters to be
entered here is the string of characters as they appear in the text, that
is, the actual character string encountered by the reading cursor. As an
example, type in the word tortilla. Press the TAB key ". again, and the
focus will be in another edit box. NVDA will say "replacement pattern
The replacement string to be typed will force NVDA to pronounce the word
tortilla with a 'y' sound rather than an 'l' sound. That pattern is
Tab again to put focus in a comment edit box. Tabbing again puts focus on
check box called "Case sensitive". Its default value is "not checked". To
make the replacement happen only when tortilla is upper case (either its
first letter or all of them), press the space bar to check it.
Tabbing again puts focus on a combo box whose entries are respectively
"anywhere, "forward", and "regular expression". The "anywhere" choice
means that the pattern being replaced may appear either by itself or
anywhere in a longer string of
non-blank characters. The "forward" choice means that the pattern being
replaced must appear at the very front of a longer string of characters.
course, it may appear by itself and not part of a longer string of
characters. If the "forward" choice is picked, and the pattern being
replaced appears following one or more non-blank characters, NVDA will
speak using the replacement pattern.

Regular expressions are required to address certain situations where more
flexibility is needed, and they will be discussed later. For now, suffice
to say, that in the case of a regular expression, the pattern to be

and the replacement pattern will contain special characters that will
cause a more suffisticated replacement to take place.
Now, the user is ready to implement the changes specified below.
However, since NVDA supports regular expressions, some of them will not be
entered into the NVDA speech dictionary.
The speech dictionary dialog may ask you if the Actual Pattern should be
sensitive. If you check "no", then any characters in the Actual Pattern
may be either upper or lower case. If however, you check "yes", then the
characters in the Actual Pattern string must exactly match the case of the
characters encountered in the text before the Replacement Pattern will be
The changes listed below do not need case sensitivity unless otherwise

SECTION0.1 Modifications For Chapter 1 Number Systems

Chapter 1 discusses number systems which uses * for multiplication, / for
division, + for addition, and - for subtraction.
One change for chapter 1 is that for section headings, "SECTION".
Actual Pattern="SECTION", Replacement Pattern="section"
The other change is that Subscripts in this book are indicated by the
suffix underscore plus an integer. An example is x_0 for x sub zero.
Actual Pattern=_", Replacement Pattern="sub"
Some readers may wish to hear x^2 read as x squared rather than x raised
exponent 2 and also x^3 read as x cubed. . If the reader is willing to
treat these two cases as special cases, the preferred reading can be
supported as follows. Use two carot symbols instead of one, and preceed
carots with a space. Without that space, the variable name may not be
clearly. For example, write x cubed as x ^^3.
This will require the user to make the following changes to the speech
Add the following entry.
Actual Pattern ^^2 and Replacement Pattern squared.
The change for x cubed is similar.

SECTION0.2 Modifications for Chapter 2 Functions
Chapter 2 discusses functions of one and of two variables. I introduce
notation for exponents, denominators, and absolute value.
Below is a list of changes I propose to make to the speech dictionary for
chapter 2.
It would be nice if the characters "f(x)" is spoken as
"f of x". But, we also want "g(t)" to be read as "g of t".
IN other words, we want the function name to be any character upper or

case and to have a subscript. We also want flexibility in the number of
independent variables and also flexibility of variable names.
Three regular expressions working together accomplish this goal.

Regular expression recognizing the function name and opening parenthesis.:
Actual Pattern:
Replacement Pattern:
"\1 of open parenthesis "

Regular expression recognizing all arguments which are followed by a
Actual Pattern:
"*([a-zA-Z]?)(\_?\d*)([/\.]?\d*) *([-]|[+]?) *([a-zA-
Replacement Pattern:
"\1 \2 \3 \4 \5 \6 \7 , "

Regular expression recognizing an argument not followed by a comma:
Actual Pattern:
"*([a-zA-Z]*)(\_?\d*)([/\.]?\d*) *([-]|[+]?) *([a-zA-
Replacement Pattern:
"\1 \2 \3 \4 \5\6 \7 close parenthesis "

H(x0) will be read as "h of x". The function name (f, g, h, or any other
does not matter.
The following changes do not involve regular expressions.

actualPattern=:R->R, Replacement Pattern= maps R into R

Actual Pattern="+/-", Replacement Pattern="plus or minus"
Actual Pattern="<=", Replacement Pattern="less than or equal to"
Actual Pattern=">=", Replacement Pattern="greater than or equal to"
ActualPattern=!, Replacement Pattern=factorial
ActualPattern=_, Replacement Pattern=sub

Actual Pattern="(/", Replacement Pattern="open parenthesis begin
Actual Pattern="/)", Replacement Pattern="end of denominator close
Actual Pattern="(^", Replacement Pattern="open parenthesis begin exponent"
Actual Pattern="^)", Replacement Pattern="end of exponent close
Actual Pattern="(|", Replacement Pattern="open parenthesis begin absolute
Actual Pattern="|)", Replacement Pattern="end of absolute value close

Actual Pattern="}/", Replacement Pattern="open brace begin denominator"
Actual Pattern="/}", Replacement Pattern="end of denominator close brace"
Actual Pattern="{^", Replacement Pattern="open brace begin exponent"
Actual Pattern="^}", Replacement Pattern="end of exponent close brace"
Actual Pattern="{|", Replacement Pattern="open brace begin absolute value"
Actual Pattern="|}", Replacement Pattern="end of absolute value close

Actual Pattern="[/", Replacement Pattern="open bracket begin denominator"
Actual Pattern="/]", Replacement Pattern="end of denominator close
Actual Pattern="[^", Replacement Pattern="open bracket begin exponent"
Actual Pattern="^]", Replacement Pattern="end of exponent close bracket"
Actual Pattern="[|", Replacement Pattern="open bracket begin absolute
Actual Pattern="|]", Replacement Pattern="end of absolute value close

NOTE: In the text, I only use parentheses to specify begin and end of
exponents, denominators, and absolute value. It is up to you whether to
braces and brackets as well. But, if you do decide to use braces and
n addition to parentheses, I strongly suggest
that the Replacement Pattern mentions the brace or bracket . unless you
the speech will not help you keep track of opening and closing braces and
brackets. If documents you send to your professor do not have an equal
of opening and closing braces/brackets/parentheses, he or she will think
you are confused and maybe lower your grade.

SECTION0.3Modifications For Chapters 3, 4, and 5
The chapter on limits only needs two changes to the speech dictionary. No
changes are needed for chapters 4 and 5.

Actual Pattern="lim:", Replacement Pattern="limit as"
Actual Pattern="->", Replacement Pattern="approaches"

SECTION0.4Modifications For Chapters 6, 7, and 8

Regular expression for what variable a derivative is taken with respect
Actual Pattern:
Replacement Pattern:
"with respect to \2"

Actual Pattern= (d0
Replacement Pattern="Open parenthesis ze rowth derivative"

Actual Pattern="(d1"
Replacement Pattern="Open parenthesis first derivative"

Actual Pattern= "(d2"
Replacement Pattern=" Open parenthesis second derivative"

Actual Pattern= "(d3"
Replacement Pattern="Open parenthesis third derivative"
Ordinary derivative whose differentiation level is specified by an
Fourth derivative:
Actual Pattern:
Replacement Pattern:
"open parenthesis fourth derivative"

Eighth derivative:
Actual Pattern:
Replacement Pattern:
"Open parenthesis eighthth derivative "

The first, second, third, fourth, and eighth derivatives are entries that
not regular expressions. They are more understandable when not handled by
regular expression.
However, the fifth, sixth, seventh, and ninth derivatives are all handled
regular expression. Their replacement patterns are very understandable.
Regular expression recognizing fifth, sixth, seventh, and ninth
Actual Pattern:
Replacement Pattern:
"open parenthesis \2 th derivative"

Ordinary derivatives whose differentiation level is specified by an index
This regular expression comes into play in a future chapter, but it fits
Actual Pattern:
Replacement Pattern:
"open parenthesis \2 th \3 \4 derivative"

SECTION0.5 Modifications For Chapter 9, Rieman Integration
This chapter introduces notations for summation and for integrals.
I leave it to the reader whether or not to make this group case sensitive.
mean demanding that the characters "int" should be upper case to prevent
collisions in the text.

Actual Pattern="INT:", Replacement Pattern="integral"

Actual Pattern="INT:{", Replacement Pattern="integral lower bound"

Actual Pattern="}{", Replacement Pattern="and upper bound"

Actual Pattern="}:", Replacement Pattern="of the integrand"

Actual Pattern="INT{}", Replacement Pattern="indefinite integral"

Actual Pattern="INT{}:", Replacement Pattern="indefinite integral of the

Actual Pattern="INT:{}", Replacement Pattern="integral"

I found myself entering the above integral notations using brackets
of braces, so I recommend including the following just to make the
text more forgiving.
Actual pattern="INT [", replacement pattern="integral lower bound"
actual pattern ="][", replacement pattern ="and upper bound"
actual pattern ="]:", replacement pattern ="of the integrand"
actual pattern ="INT[]", replacement pattern ="indefinite integral"
actual pattern ="INT[]:", replacement pattern ="indefinite integral of the

Your professor might prefer the representation of an upper bound used in
latex which is "\to".
Actual Pattern="\to", Replacement Pattern="and upper bound"

Actual Pattern="INTI:", Replacement Pattern="inner integral"

Actual Pattern="INTM:", Replacement Pattern="middle integral"

Actual Pattern="INTO:", Replacement Pattern="outer integral"

SECTION0.6 Modifications for Chapter 12 Vectors

actual pattern={||x+y||},
Replacement Pattern=open brace begin norm x+y end norm close brace

Actual pattern=DET2, Replacement Pattern=second order determinant

Actual pattern=DET3, Replacement Pattern=third order determinant

Actual pattern=(.), Replacement Pattern=dot product

Actual pattern=(*), Replacement Pattern=cross product

SECTION0.7 Modifications For Chapter 13

Partial derivative whose differentiation level is specified by an integer:
Fourth partial derivative:
Actual Pattern:
Replacement Pattern:
"open parenthesis fourth partial derivative"

Eighth partial derivative:
Actual Pattern:
Replacement Pattern:
"open parenthesis eighth partial derivative"

Regular expression recognizing fifth, sixth, seventh, and ninth partial
Actual Pattern:
"(\()pd([5679] )"
Replacement Pattern:
"open parenthesis \2 th partial derivative

Partial derivative whose differentation level is specified by an index
Actual Pattern:
Replacement Pattern:
open parenthesis \2 th \3 \4 partial

SECTION0.8 Modifications For Chapters 14, 15, 16, and 17

actualWord=:R->Rn Replacement Pattern=maps R into R n

actualWord=:R2->R2 Replacement Pattern=maps R2 into R2

actualWord=:R3->R3 Replacement Pattern=maps R3 into R3

actualWord=:Rn->Rn Replacement Pattern=maps R n into R n

actualWord=:R2->R Replacement Pattern=maps R2 into R

actualWord=:R3->R Replacement Pattern=maps R3 into R

actualWord=:RN->R Replacement Pattern=maps RN into R

This group is case sensitive.

Actual Pattern="DINT::", Replacement Pattern="double integral"

Actual Pattern="LINT::", Replacement Pattern="line integral over curve"

Actual Pattern="SINT::", Replacement Pattern="surface integral"

Actual Pattern="TINT::", Replacement Pattern="triple integral"

There is a set of notations for derivatives for which I made no entries
the speech dictionary. It is not uncommon to represent a derivative by
following the function name with an apostrophe. For example, f'(x)
represents the first derivative of f(x). Likewise, f''(x) is the second
derivative of f(x). You may occasionally encounter three apostrophes for
third derivative such as for example f'''(x). However, it is unlikely that
the student will ever see more than three apostrophes for differentiation.
In fact, the use of apostrophe for differentiation is more prevalent in
differential equations books than in a calculus text.
So, if the student hears y' or y'', he or she should understand that
differentiation is being represented. Just get used to it.
Testing regular expressions involving carrot and parenthesis exposed a
problem in two of the seven synthesizers I exercised. Those two are
Microsoft Speech Platform and Microsoft SAPI5. The other five synthesizers
passed the test.
I tested regular expressions for beginning and ending exponential
My syntax for these exponential expressions is that the expressions are
bracketed between (^ and ^).

Regular expression to recognize beginning of exponential expression:
Actual Pattern:
Replacement Pattern:
Begin exponent

Regular expression to recognize end of exponential expression:
Actual Pattern:
Replacement Pattern:
end of exponent

The regular expression for the end of an exponential expression fails to
recognize the end.
The regular expression for the beginning exponential expression works as
The two regular expressions are very similar. Why does one work and not
Here are some test cases:
(^ ^)
I then wrote a regular expression to recognize the pair "()", and NVDA
the closing parenthesis but not the opening one. Puzzling!

The following synthesizers execute these regular expressions correctly.
ESpeak NG,
Soft Voice,
Speech Player ESpeak,
SVox Pico Synthesizer,
The following synthesizers did not execute these regular expressions
Microsoft Speech API Version 5,
Microsoft Speech Platform
For these last two synthesizers, I input the regular expressions into
Voice Dictionaries.

(^ w + 3^)
Begin exponent is recognized but not the end of exponent.

This is not a fix but what I did to expose the problem.
NOTE: The number of spaces specified in the replacement patterns for
expressions should not be ignored. Some parts of the replacement string
be spoken so quickly, that you, the listener, may hear them as a
nonintelligible blip.
C Michael R. Cross

-----Original Message-----
From: [] On Behalf Of
Sent: Sunday, April 01, 2018 8:29 AM
Subject: Re: [nvda] Maths?

You can find extensive examples of problem 3 at:
Problem 2 can be seen at:
Can't find one containing problem 1 off the top of my head, though like
said, problem 2 is becoming more common now.
-----Original Message-----
From: Antony Stone
Sent: Sunday, April 01, 2018 2:23 PM
Subject: Re: [nvda] Maths?

Please point us at an example of such an article so we can see for
what it seems to contain.

Otherwise we're just guessing, based on your guesses, about what might
going on.


On Sunday 01 April 2018 at 14:31:53, Damien Garwood wrote:

Not sure whether it's NVDA, or me.
When I attempt to read articles that explain mathematical operations,
explanations of scientific notation being a great example, I generally
experience one or more of the following:

1. Graphics which, I assume would seem to have some sort of formula in
but using strange symbols like | and _ where I might expect to see
like +, -, * or /. Though I'm not seeing these as often as I used to

2. Spaces, sometimes contained in lists, without anything in them, and
text following it which attempts to explain something which just
seem to exist. This seems to have replaced the "graphical formula"

3. A formula written out in plaintext, but with some of the operators
missing, making NVDA announce it as a big number (mainly happens when
dealing with exponentiation), for example 102 instead of 10^2.

Is there something I should be doing differently here?

I would have thought reading maths would be like reading anything
wrong I am. Cheers. Damien.
Most people have more than the average number of legs.

Please reply to the
please *don't*

Join to automatically receive all group messages.