# The table render plugin
This plugin requires a two-deminsional array of terms.
#### Synopsis
    :- use_rendering(table).
    :- use_rendering(table, Options).
    
#### Options supported
   
   - header(HeaderSpec)
     Specify the header for a table whos rows match the structure of
     HeaderSpec.  Each column header may be an arbitrary Prolog
     term.
   - float_format(+Format)
     Render floating point numbers using `format(Format,Float)`
     
Other options are passed to write_term/2     
     
#### Reconised terms
The table render plugin expects a proper list of _rows_.  Each row must have the same
number of columns and, if a header is provided, the header list must have the same length as the number of columns.  Each *Row* must have the same shape and contain the same number of columns.  The following terms are supported to represent a row:
  - A _list_
  - A _compound term_, using any functor
  - A _dict_.  In this case the keys of the dict are using to add a header.
## Examples
The table render plugin is used in the demo program [Einstein's Riddle](example/houses_puzzle.pl).  Try the `?- houses(Houses).` query.
We start with an example from the [rendering overview](rendering.swinb).  As
defined above, we can use both lists and terms for the table.  The latter is illustrated in the second query.  We use the _pair_ representation as this data structure is produced by many libraries.
:- use_rendering(table).
X = [ [ 'Amsterdam', 'The Netherlands' ],
      [ 'London', 'United Kingdom' ],
      [ 'Paris', 'France' ]
    ].
X = [ 'Amsterdam' - 'The Netherlands',
      'London' - 'United Kingdom',
      'Paris' - 'France'
    ].
### Specify column headers
Next, we use the header(Columns) option to specify the column header.
:- use_rendering(table, [header('Capital' - 'Country')]).
X = [ 'Amsterdam' - 'The Netherlands',
      'London' - 'United Kingdom',
      'Paris' - 'France'
    ].
*If* we specify a header, only data with a matching number of columns is rendered as a table.  The query below will *not show a table* because the row terms do not match the
header('Capital' - 'Country') header.
X = [ capital('Amsterdam', 'The Netherlands', 825 080),
      capital('London', 'United Kingdom', 8 416 535),
      capital('Paris', 'France', 2 241 346)
    ].
We can make the table render again by specifying the proper row term.  Multiple header options may be provided to specify the rendering of rows of different shapes.
:- use_rendering(table,
                 [ header('Capital' - 'Country'),
                   header(capital('Capital', 'Country', 'Population'))
                 ]).
X = [ capital('Amsterdam', 'The Netherlands', 825 080),
      capital('London', 'United Kingdom', 8 416 535),
      capital('Paris', 'France', 2 241 346)
    ].
## Any term may appear in a cell
Neither columns nor cell values are restricted to simple types.  The cell content is simply passed to the generic term rendering.
:- use_rendering(table).
findall(row(Len,List), (between(1,10,Len), length(List,Len)), Rows).