Skip to content


STACK provides an inert function table for typesetting mathematical tables, provided originally to typeset truth tables in Propositional Logic.

You can create a table directly. Notice the first row is a heading row.


Really, the table operator does nothing (very much like a matrix). Like a matrix, the arguments must be identical length lists. However, there are some special rules for the tex display.

  1. The first row is considered to be a heading, and a horizontal line is printed after the first row.
  2. There are vertical bars between internal columns of the table.
  3. There are currently no options for customising printing of borders, etc.
  4. You can highlight entries in the table using the command texcolor("col", ex). Note however, this will also underline any entries (as colour alone is poor accessibility practice.).

The table T0 is displayed as .

table_bool_abbreviate:true is a boolean variable. If set to true (the default) boolean entries true/false will be abbreviated to T/F respectively when creating the LaTeX for display, to keep the table small and tidy looking. All other entries in the table are typeset normally. This only affects the LaTeX display, and table entries remain boolean.

table_zip_with(fn, T1, T2) combines two tables, using the binary function fn (much as zip_with combines two lists).

It is instructive to look at the code for table_difference which colours entries which differ in red.

table_difference(T1, T2) := table_zip_with(lambda([ex1,ex2], if ex1=ex2 then ex1 else texcolor("red", ex1)), T1, T2)$

This shows which elements of T1 differ from the corresponding elements of T2 by returning elements of T1 coloured in red.

If you want to identify which entries really are different then you could do something like the following.

table_zip_with(lambda([ex1,ex2], is(ex1=ex2)), T1, T2)

If you find yourself manipulating tables, the above function provides a starting point. Please ask the developers to add anything you use regularly.


You can create a table via some code such as the following. Notice the use of the list constructor function "[" within the zip_with command.

T0:apply(table, append([[x,fn(x)]], zip_with("[", vals, maplist(fn, vals))));

As a question variable, or directly within CAStext.

T1:truth_table(a implies b);
T2:table_difference(truth_table(a xor b), truth_table(a implies b));

Here we have two tables T1 is displayed as

and T2 gives Notice in both the effect of table_bool_abbreviate:true.