Re: Question concerning MakeBoxes
- To: mathgroup at smc.vnet.net
- Subject: [mg60420] Re: Question concerning MakeBoxes
- From: Paul Abbott <paul at physics.uwa.edu.au>
- Date: Fri, 16 Sep 2005 03:48:59 -0400 (EDT)
- Organization: The University of Western Australia
- References: <dg8loi$rf1$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
In article <dg8loi$rf1$1 at smc.vnet.net>,
Cca <cca at gregosetroianos.mat.br> wrote:
> Let's start a new Mathematica (5.1) session and note that
>
> FormatValues[And]
>
> is the empty list. I want to define a rule for formatting logical
> conjunctions and disjunctionsin in such a way that, for example,
> the conjunction
>
> p&&q&&r
>
> is formatted in TraditionalForm as
>
> RowBox[{"\[And]",
> RowBox[{StyleBox["{",SpanMaxSize->\[Infinity]],
> GridBox[{{"p"},{"q"},{"r"}},ColumnAlignments->{Left}],
> StyleBox["}",ShowContents->False]}]," "}]//DisplayForm
Note that you can use \[AutoRightMatch] instead of hiding the right "}".
> (As far as I know, the idea for this interesting and convenient "grid
> notation" is due to Bruno BuchBerger, but this is another history.)
Perhaps there an implementation of this notation in Theorema then? See
http://www.risc.uni-linz.ac.at/people/buchberg/theorema_project.html
> For me, one obvious solution to this problem should be something like
>
> Unprotect[And];
> And/:MakeBoxes[And[c__],TraditionalForm]:=
> RowBox[{"\[And]",
> RowBox[{StyleBox["{",SpanMaxSize->\[Infinity]],
> GridBox[{#}&/@(MakeBoxes[#,TraditionalForm]&/@{c}),
> ColumnAlignments->{Left}],
> StyleBox["}",ShowContents->False]}]," "}];
> Protect[And];
>
> In fact,
>
> p&&q&&r//TraditionalForm
>
> is now displayed as intended. However, it works only once: evaluating again
>
> p&&q&&r//TraditionalForm
>
> gives the built-in traditional formatting. After inspecting
>
> FormatValues[And]
>
> we see what is going on: my formatting rule is the LAST on the list. So, in
> order to
> force Mathematica to apply my definition first, I evaluate
>
> Unprotect[And];
> FormatValues[And]=Reverse@FormatValues[And];
> Protect[And];
>
> This solves my problem, but in a somewhat inelegant way.
>
> My questions are:
>
> (1) what is the explanation for this behavior?
> (2) how can I get the intended result without reversing FormatValues[And]?
I would expect that you could use the Notation package to do what you
want more directly.
Cheers,
Paul
_______________________________________________________________________
Paul Abbott Phone: 61 8 6488 2734
School of Physics, M013 Fax: +61 8 6488 1014
The University of Western Australia (CRICOS Provider No 00126G)
AUSTRALIA http://physics.uwa.edu.au/~paul