Re: Use a nicer Format for differences
- To: mathgroup at smc.vnet.net
- Subject: [mg6496] Re: Use a nicer Format for differences
- From: soiffer (Neil Soiffer)
- Date: Thu, 27 Mar 1997 02:42:24 -0500 (EST)
- Organization: Wolfram Research, Inc.
- Sender: owner-wri-mathgroup at wolfram.com
In article <5gqk1u$93s at smc.vnet.net> Ersek_Ted%PAX1A at mr.nawcad.navy.mil writes:
>
>If you have a difference of two terms Mma presents them so they are in
>standard order. Consider the following:
>
>In[1]:= y-d
>
>Out[1]= -d+y
>
>It puts "-d" before "y", and most would find this unapealing.
>You can get the nicer result by using TraditionalForm.
>
>In[2]:= y-d//TraditionalForm
>
>Out[2]=y-d
>
> ----------------------------------------------------------------------------
> -----------------------
>You can also get the nicer result by writing your own Format.
>Dave Withoff at WRI helped me get this working.
>However, he hasn't seen my latest version.
>
>In[3]:=Unprotect[Plus];
>
> Format[(n_Real | n_Integer | n_Rational)*a_.+b_/;
> (Head[b]=!=Plus)&&(n<0)&&OrderedQ[{n*a,b}]]:=
> SequenceForm[b,"-",-n*a]
>
> Protect[Plus];
>
> ----------------------------------------------------------------------------
> ----------------------
>After entering In[3] any of the following are displayed as a difference in
>Out[n].
> y-d
> y-3 d
> y-2/3 d
> y-1.25 d
> y-2/3
> y-a b
>
>Also this format is used when the difference is inside another function.
>As in: 1/Log[y-3 d]
>
>However, this format is not used when more that two terms are added /
>subtracted.
>This is the way I wanted it.
Dave Withoff's solution is simple and correct. However, it has the drawback
in V3.0 of using an InterpretationBox for the output. This is not a good
thing in general because it means what is displayed is not necessarily
what the meaning is when evaluated. In V3.0, it usually better to
use MakeBoxes[]. Here is Dave's suggestion rewritten using MakeBoxes[]:
MakeBoxes[(n_Real | n_Integer | n_Rational)*a_.+b_/;
(Head[b]=!=Plus)&&(n<0)&&OrderedQ[{n*a,b}],form_]:=
RowBox[{
MakeBoxes[b,form],
"-",
Apply[MakeBoxes,{-n*a,form}]
}];
MakeBoxes[] will produce an output that is editable and can be used as
input without hidden meaning. There are two important things to notice:
1. You need to apply MakeBoxes recursively to its arguments
2. MakeBoxes is HoldAllComplete. This means you need to use Apply instead
of the simpler MakeBoxes[-n*a,form] so that the '-n' evaluates.
>Eventually I will have the above Format used automatically as soon as Mma is
>opened. However, I have yet to figure out that part.
Put this in your init.m file and this function will take effect whenever
you run your kernel.
Neil Soiffer
Wolfram Research