| 
     
      
      
      From: Leo B. <Leo...@um...> - 2022-08-25 16:18:22
      
     
   | 
On Wed, Aug 24 2022, Eduardo Ochs <edu...@gm...> wrote:
> On Wed, 24 Aug 2022 at 14:25, Leo Butler <Leo...@um...> wrote:
>
>> On Tue, Aug 23 2022, Eduardo Ochs <edu...@gm...> wrote:
>>
>> > Hi list,
>> >
>> > I am trying to learn how to define new operators that have "nice"
>> > representations in LaTeX and in display2d. Here is the example on
>> > which I am working. I want
>> >
>> >   Eq5(aa, bb, cc, dd, ee)
>> >
>> > to be displayed as:
>> >
>> >   aa = bb
>> >      = cc
>> >      = dd
>> >      = ee
>> >
>> > To configure its LaTeX output I simply adapted the example in the
>> > section about "texput" here,
>> >
>> >   (info "(maxima)Functions and Variables for TeX Output")
>> >
>> > and I wrote this:
>> >
>> >   texEq5(ex) :=
>> >     block([a,b,c,d,e], [a,b,c,d,e] : args (ex),
>> >       concat("\\begin{array}{rcl}",
>> >              tex1(a), "&=&", tex1(b), "\\\\",
>> >                       "&=&", tex1(c), "\\\\",
>> >                       "&=&", tex1(d), "\\\\",
>> >                       "&=&", tex1(e), "\\\\",
>> >              "\\end{array}"));
>> >   texput(Eq5, texEq5);
>> >   tex(Eq5(aa, bb, cc, dd, ee));
>> >
>> > Here's the output of the last line above, indented by hand:
>> >
>> >   $$\begin{array}{rcl}
>> >       {\it aa} &=& {\it bb} \\
>> >                &=& {\it cc} \\
>> >                &=& {\it dd} \\
>> >                &=& {\it ee} \\
>> >     \end{array}
>> >   $$
>> >
>> > This was easy to do, and works great. But I couldn't find much
>> > documentation on how to configure how display2d displays "Eq5"
>> > objects. I was only able to write this prototype for the first step:
>> >
>> >   MatrixEq5(ex) :=
>> >     block([a,b,c,d,e], [a,b,c,d,e] : args (ex),
>> >       matrix([a,"=",b],["","=",c],["","=",d],["","=",e]))$
>> >
>> > If I run this
>> >
>> >   MatrixEq5(Eq5(aa, bb, cc, dd, ee));
>> >
>> > the output is:
>> >
>> >       [ aa  =  bb ]
>> >       [           ]
>> >       [     =  cc ]
>> >       [           ]
>> >       [     =  dd ]
>> >       [           ]
>> >       [     =  ee ]
>> >
>> > So, questions:
>> >
>> >   1) How can I get rid of the outer "[]"s?
>> >   2) How can I get rid of the blank lines?
>> >   3) How can I make Eq5 objects be displayed with MatrixEq5?
>> >   4) Where can I find docs and examples about this?
>> >
>> > Thanks in advance! =)
>> >   Eduardo Ochs
>> >   http://angg.twu.net/eev-maxima.html
>>
>> It depends on how ambitious your goals are, but the alt-display package
>> is probably what you want.
>>
>> To elaborate: suppose that you want to print Eq5(...) using some
>> function printEq5; other things should just be printed as is. You can
>> define a custom printer that checks an expression to see if its op has a
>> custom printer; if so, dispatch that; otherwise, use the default.
>>
>> Here is a working POC:
>>
>> (%i1)
>> define_alt_display(ochs_display(form),
>>
>> block([alt_display1d:false,alt_display2d:false,x:second(form),p],
>>                             if mapatom(x) then displa(form) else if
>>                             (p:get(op(x),display2d_printer))#false then
>>                             p(form) else twod_display(form))) $
>>
>> (%i2) printEq5(x) := block([a:args(second(x))], printf(true,"BANG!~%~a ~{=
>> ~a ~}~%!GNAB",first(a), rest(a))) $
>>
>> (%i3) put(Eq5,printEq5,display2d_printer) $
>>
>> (%i4) Eq5(aa,bb);
>> BANG!
>> aa = bb
>> !GNAB
>>
>> (%i5) Eq5(aa,bb,cc,dd,ee);
>> BANG!
>> aa = bb = cc = dd = ee
>> !GNAB
>>
>> (%i6) 1/2+x;
>>                                          1
>> (%o6)                                x + -
>>                                          2
>>
>>
>> Leo
>
>
>  Hi Leo,
>
> your code looks like the right way to go, but it doesn't work here...
> does it need something that is in your init file?
>
> First attempt:
>
>   (%i1) define_alt_display(ochs_display(form),
>      block([alt_display1d:false,alt_display2d:false,x:second(form),p],
>        if mapatom(x) then displa(form) else if
>        (p:get(op(x),display2d_printer))#false then
>        p(form) else twod_display(form)))$
>
>   second: argument must be a non-atomic expression; found form
>    -- an error. To debug this try: debugmode(true);
>   (%i2)
>
> Second attempt:
>
>   (%i1) load("alt-display.mac")$
>
>   (%i2) define_alt_display(ochs_display(form),
>      block([alt_display1d:false,alt_display2d:false,x:second(form),p],
>        if mapatom(x) then displa(form) else if
>        (p:get(op(x),display2d_printer))#false then
>        p(form) else twod_display(form)))$
>
>   (%i3) printEq5(x) := block([a:args(second(x))],
>     printf(true,"BANG!~%~a ~{= ~a ~}~%!GNAB",first(a), rest(a)))$
>
>   (%i4) put(Eq5,printEq5,display2d_printer)$
>
Apologies, before %i5 you need to also enter:
display2d : true $ /* set default */
set_alt_display(2,ochs_display);
Leo
>   (%i5) Eq5(aa,bb);
>   (%o5)                             Eq5(aa, bb)
>   (%i6) Eq5(aa,bb,cc,dd,ee);
>   (%o6)                       Eq5(aa, bb, cc, dd, ee)
>   (%i7) 1/2+x;
>                                            1
>   (%o7)                                x + -
>                                            2
>   (%i8)
>
> Thanks in advance =/,
>   Eduardo
 |