# two dimensional formatting

We have seen that nets (see Net) are potentially useful for two dimensional formatting of output to an ascii terminal with limited graphical ability. We present now a few more hints about putting this idea into practice. Nets are used extensively in Macaulay2 for formatting, for example, for formatting of polynomials and matrices.
 i1 : R = ZZ/101[x,y,z]; i2 : f = random(R^1,R^{5:-3}) o2 = | 24x3-36x2y-29xy2-10y3-30x2z+19xyz-29y2z+19xz2-8yz2-22z3 ------------------------------------------------------------------------ -29x3-24x2y-16xy2+34y3-38x2z+39xyz+19y2z+21xz2-47yz2-39z3 ------------------------------------------------------------------------ -18x3-13x2y-15xy2+38y3-43x2z-28xyz+2y2z-47xz2+16yz2+22z3 ------------------------------------------------------------------------ 45x3-34x2y-47xy2-16y3-48x2z+47xyz+7y2z+19xz2+15yz2-23z3 ------------------------------------------------------------------------ 39x3+43x2y-11xy2+35y3-17x2z+48xyz+11y2z+36xz2-38yz2+33z3 | 1 5 o2 : Matrix R <--- R
Output of routines such as betti and net that return nets can be easily incorporated into more complex displays using standard operations on nets (see Net).
 i3 : C = resolution cokernel f 1 5 9 5 o3 = R <-- R <-- R <-- R <-- 0 0 1 2 3 4 o3 : ChainComplex i4 : be = betti C 0 1 2 3 o4 = total: 1 5 9 5 0: 1 . . . 1: . . . . 2: . 5 . . 3: . . 9 5 o4 : BettiTally i5 : "Betti numbers of " | net C | " are " | (net be)^2 0 1 2 3 total: 1 5 9 5 1 5 9 5 0: 1 . . . o5 = Betti numbers of R <-- R <-- R <-- R <-- 0 are 1: . . . . 2: . 5 . . 0 1 2 3 4 3: . . 9 5
You could even learn how to display algebraic expressions with nets.
 i6 : "x" | "2"^1 2 o6 = x
There is an easier way to display algebraic expressions, using a type of thing called an Expression. It allows you to set up things that print out as powers, sums, products, matrices, and so on. There are various types of expression, such as Power, Sum, Divide, Minus, and Product that we can use for this.
 i7 : Divide(Minus a,b) -a o7 = -- b o7 : Expression of class Divide i8 : Power(Sum(3,4,5),7) 7 o8 = (3 + 4 + 5) o8 : Expression of class Power i9 : Sum(1,2, Minus 3, 4,5) o9 = 1 + 2 - 3 + 4 + 5 o9 : Expression of class Sum
Actually, the formation of such expressions is contagious, in the sense that the basic algebraic operations will construct expressions for you if one of their two operands is already an expression.
 i10 : Minus a / b -a o10 = -- b o10 : Expression of class Divide i11 : (Sum(3,4,5))^7 7 o11 = (3 + 4 + 5) o11 : Expression of class Power i12 : 1 + 2 + Minus 3 + 4 + 5 o12 = 3 - 3 + 4 + 5 o12 : Expression of class Sum
In the last example above, 1 + 2 was evaluated first, so it yielded 3 but after that the contagion set in.

The function expression can be used to prepare things such as polynomials for formatting using the mechanism introduced above.

 i13 : g = (x+y)^2 2 2 o13 = x + 2x*y + y o13 : R i14 : e = expression g 2 2 o14 = x + 2x*y + y o14 : Expression of class Sum i15 : peek e 2 2 o15 = Sum{x , 2x*y, y }
In the example above, we see that peek extracts only one level of the structure. We may use peek' to display the structure of e to depth 2.
 i16 : peek'(2,e) o16 = Sum{Power{x, 2}, Product{2, x, y}, Power{y, 2}}
Other types of Expression that can be used for formatting nested lists as two dimensional arrays are MatrixExpression and Table.
 i17 : Table{{1,2,3},{a,bb,ccc}} o17 = 1 2 3 a bb ccc o17 : Expression of class Table i18 : MatrixExpression{{1,2,3},{a,bb,ccc}} o18 = | 1 2 3 | | a bb ccc | o18 : Expression of class MatrixExpression i19 : Table{{"Example 1","Example 2"}, {Table{{1,2},{3,4}},Table{{11,22},{3,444}}}} o19 = Example 1 Example 2 1 2 11 22 3 4 3 444 o19 : Expression of class Table