Formatting MatrixPower in TraditionalForm
- To: mathgroup at smc.vnet.net
- Subject: [mg102530] Formatting MatrixPower in TraditionalForm
- From: cca at gregosetroianos.mat.br
- Date: Wed, 12 Aug 2009 04:36:15 -0400 (EDT)
Inverse has a 2D formatting in TraditionalForm, but MatrixPower does not.
FormatValues@Inverse
FormatValues@MatrixPower
Two methods (and there are others!) are given bellow to do this. I do not
know the situation with $VersionNumber>7. Anyway, I hope my short
exposition might be useful to reveal some of the new progresses made in
Mathematica with respect to notation programming.
------------------------------------------
Method 1.
The following rule formats MatrixPower as a power in TraditionalForm.
MakeBoxes[MatrixPower[m_, n_], TraditionalForm] :=
With[{fm = TraditionalForm},
TemplateBox[{Parenthesize[m, fm, Power, Left], MakeBoxes[n, fm]},
"MatrixPower", DisplayFunction -> (SuperscriptBox[#1, #2] &),
SyntaxForm -> SuperscriptBox, Tooltip -> Automatic]]
(If desired, one can attach this rule to MatrixPower using Unprotect and
TagSetDelayed. In this case, FormatValues@MatrixPower will show the rule.)
Some tests:
MatrixPower[m, n] // TraditionalForm
% // FullForm
Another way to see the formatting:
(1) paste the expression MatrixPower[m, n] in a StandardForm or
TraditionalForm cell;
(2) select the expression;
(3) go to menu Cell|Convert to|TraditionalForm.
The converted expression can be pasted in a StandardForm cell -- and will
retain its meaning even if you click on the "Paste Literally" button from
the "Pasting TraditionalForm" dialog box. There is no need of a FormBox
wrapper here because the semantics resides entirely in TemplateBox. For
example, the following two expressions evaluate to the same result:
ToExpression@
FormBox[TemplateBox[{"m", "n"}, "MatrixPower"], "TraditionalForm"]
ToExpression@TemplateBox[{"m", "n"}, "MatrixPower"]
Consequently, we can alter the MakeBoxes rule above to include StandardForm.
Bellow I give a button to use with Method 1.
Button[Tooltip[#, "MatrixPower"] &@
"\!\(\*SuperscriptBox[\"\[SelectionPlaceholder]\", \"\[Placeholder]\"]\)",
NotebookApply[InputNotebook[], #] &@
TemplateBox[{"\[SelectionPlaceholder]", "\[Placeholder]"}, "MatrixPower",
DisplayFunction -> (SuperscriptBox[#1, #2] &), Tooltip -> Automatic]]
Note. For $VersionNumber<6, very similar results can be achieved by using
InterpretTemplate (an old parent of TemplateBox).
------------------------------------------
Method 2.
We can use a simpler rule for MakeBoxes:
MakeBoxes[MatrixPower[m_, n_], TraditionalForm] :=
With[{fm = TraditionalForm},
TemplateBox[{Parenthesize[m, fm, Power, Left], MakeBoxes[n, fm]},
"MatrixPower"]]
Notice that this time we gave no formatting rule to TemplateBox. As an
example, try this:
RawBoxes@TemplateBox[{"m", "n"}, "MatrixPower"]
The pink rectangle indicates that a display function is missing. (The
default value of DisplayFunction is None) However, a TemplateBox is still
present, so the returned expression is interpreted as expected. Now, paste
the following cell on the stylesheet of your notebook and see what happens:
Cell[StyleData["MatrixPower"],
TemplateBoxOptions -> {DisplayFunction -> (SuperscriptBox[#1, #2] &),
Tooltip -> Automatic}] // CellPrint
With the appearance defined in the stylesheet, one can use the following
simpler button:
Button[Tooltip[#, "MatrixPower"] &@
"\!\(\*SuperscriptBox[\"\[SelectionPlaceholder]\", \"\[Placeholder]\"]\)",
NotebookApply[InputNotebook[], #] &@
TemplateBox[{"\[SelectionPlaceholder]", "\[Placeholder]"}, "MatrixPower"]]
------------------------------------------
Carlos Cesar de Araujo
Gregos & Troianos Educacional
www.gregosetroianos.mat.br
Belo Horizonte, MG, Brasil
(31) 3283-1122