Make mathematica treat $e_i^2$ as numeric
Everything depends on what you try to do with this. First you could use Subsuperscript
and get rid of one level which is introduced by your Power
Subscript[e,3]^2//FullForm
(* Power[Subscript[e,3],2] *)
Subsuperscript[e,3,2]//FullForm
(* Subsuperscript[e,3,2] *)
Both forms look equally in the front-end, but now you can use TagSet
to transform all e
with integer-subscript to a different form which displays as it would still be the normal e
:
e/:Subsuperscript[e,i_?IntegerQ,2]:=eNumeric[i,2];
e/:Subsuperscript[e,i_,2]:=eNonNumeric[i,2];
SetAttributes[eNumeric,{NumericFunction}];
(Format[#[i_,2]]:=TraditionalForm[Subsuperscript["e",i,2]])&/@{eNumeric,eNonNumeric};
Here is another way: you can fool the depth-1 tag rule for UpValues
with a few temporary symbols. Here is an example:
ClearAll[e];
e /: Subscript[e, i_?IntegerQ] := e /: Subscript[e, i] =
Module[{el},
el /: el^p_ := el /: el^p =
Module[{elp},
elp /: NumericQ[elp] = True;
Format[elp] := TraditionalForm[Subscript["e", i]^p];
elp
];
el /: NumericQ[el] = True;
Format[el] := TraditionalForm[Subscript["e", i]];
el]
What this does is to substitute Subscript[e, i_?IntegerQ]
by some symbol, which will print just as the original one, but will have some rules attached which will do what you need. Now,
NumericQ[Subscript[e,1]]
(* True *)
NumericQ[Subscript[e,1]^2]
(* True *)
The advantage of this method is that it is flexible. You are not tied to just powers of your subscript, it can be easily generalized to other functions.
You can use Notation
package to treat anything like function and then set whatever attributes to this function:
The only problem is that Notation
don't support test patterns, so to make an expression numeric with only integer indexes: