% language=us runpath=texruns:manuals/lowlevel

\environment lowlevel-style

% \setupalign
%   [depth]

% \setuplayout
%   [vz=2]

% \enabletrackers
%  [layout.vz]

% \showmakeup[line]

\setlocalshowmakeup

\startdocument
  [title=pages,
   color=middleyellow]

\startsectionlevel[title=Introduction]

There are several builder in the engine: paragraphs, math, alignments, boxes and
if course pages. But where a paragraph is kind of complete and can be injected on
a line by line basis, a page is less finished. When enough content is collected
the result so far is handled over to the output routine. Calling it a routine is
somewhat confusing because it is not really a routine, it's the token list \type
{\output} that gets expanded and what in there is supposed to something with the
result, like adding inserts (footnotes, moved around graphics aka floats, etc.),
adding headers and footers, possibly using marks, and finally wrapping up and
shipping out.

The engine primarily offers a single column page so two or more columns are done
by using tricks, like typesetting on a double height and splitting the result. If
columns need to be balanced some extra work has to be done, and it's definitely
non trivial when we have more that just text.

In this chapter we will discuss and collect some mechanisms that deal with pages
or operate at the outer vertical level. We might discuss some primitive but more
likely you will see various solutions based on \TEX\ macros and \LUA\ magic.

{\em This is work in progress.}

\stopsectionlevel

\startsectionlevel[title=Rows becoming columns]

{\em This is an experimental mechanism. We need to check|/|decide how to deal
with penalties. We also need to do more checking.}

Conceptually this is a bit strange feature but useful nevertheless. There are
several multi-column mechanisms in \CONTEXT\ and each is made for a specific kind
of usage. You can, to some extent, consider tabulate to produce columns too,
however it demands a bit of handy work. Say that you have this:

\startbuffer
\starttabulate[|l|l|]
\NC 1 \NC one   \NC \NR
\NC 2 \NC two   \NC \NR
\NC 3 \NC three \NC \NR
\NC 4 \NC four  \NC \NR
\NC 5 \NC five  \NC \NR
\stoptabulate
\stopbuffer

\typebuffer

but you don't want to waste space. So you might want:

\startrows[n=2,before=\blank,after=\blank]
\getbuffer
\stoprows

or maybe even this:

\startrows[n=3,before=\blank,after=\blank]
\getbuffer
\stoprows

but still wants to code like this:

\typebuffer

You can do this:

\starttyping
\startcolumns[n=3]
\getbuffer
\stopcolumns
\stoptyping

The (mixed) columns mechanism used here normally works ok but because of the way
columns are packaged they don't work well with for instance \quote {vz}. Page
columns do a better job but don't mix with single columns that well. Another
solution is this:

\starttyping
\startrows[n=3,before=\blank,after=\blank]
\getbuffer
\stoprows
\stoptyping

Here the result is collected in a vertical box, post processed and flushed line
by line. We need to explicitly handle the before and after spacing here because
it gets discarded (if added at all). When a slice of the box is part of the
shipped out page the cells are swapped so that instead of going horizontal we go
vertical. Compare the original

\start\showmakeup[line,hbox]
\startrows[n=3,before=\blank,after=\blank,order=horizontal]
\getbuffer
\stoprows
\stop

with the swapped one:

\start\showmakeup[line,hbox]
\startrows[n=3,before=\blank,after=\blank,order=vertical]
\getbuffer
\stoprows
\stop

This is not really a manual but let's mention a few configuration options. The
\type {n} parameter controls the number of columns. In order to support swapping
this mechanism adds empty pseudo cells for as far as needed. By default the \type
{order} is \type {vertical} but one can set it to \type {horizontal} instead. In the
next example we have set \type {height} to \type {2\strutht} and \type {depth} to
\type {2\strutdp}:

\start\showmakeup[line,hbox]
\startrows[n=3,before=\blank,after=\blank,height=2\strutht,depth=2\strutdp]
\getbuffer
\stoprows
\stop

When you set \type {height} and \type {depth} to \type {max} all cells will
get these dimensions from the tallest cell. Compare:

\startbuffer
\starttabulate[|l|l|]
\NC 1 \NC \im {y = x + 1}           \NC \NR
\NC 2 \NC \im {y = x^2 + 1}         \NC \NR
\NC 3 \NC \im {y = \sqrt{x^2} + 1}    \NC \NR
\NC 4 \NC \im {y = \frac{1}{x^2} + 1} \NC \NR
\stoptabulate
\stopbuffer

\start\showmakeup[line,hbox]
\startrows[n=2,before=\blank,after=\blank]
\getbuffer
\stoprows
\stop

with:

\start\showmakeup[line,hbox]
\startrows[n=2,before=\blank,after=\blank,height=max,depth=max]
\getbuffer
\stoprows
\stop

In the examples with tabulate we honor the original dimensions but you can also
set the \type {width}, combined with a \type {distance}. Instead of a dimension
the \type {width} parameter can be set to \type {fit}.

\start\showmakeup[line,hbox]
\startrows[n=3,width=fit,distance=2em,align={verytolerant,stretch},before=\blank,after=\blank]
In case one wonders, of course regular columns can be used, but this is an
alternative that actually gives you balancing for free, but of course with the
limitation that we have lines (or cells in tables) that can be swapped. For as
far as possible footnotes are supported but of course floats are not.

So, this rows based mechanism is not the solution for all problems but when used
in situations where one knows what goes in, it is quite powerful anyway. It
also has a relatively simple implementation.
\stoprows
\stop

In the previous rendering we have set the width as mentioned but also set \type
{align} to \typ {verytolerant,stretch} so that we don't overflow lines. The \type
{before} and \type {after} parameters are set to \type {\blank}.

\stopsectionlevel

\stopdocument

% \startbuffer
%     % watch the much appreciated ; operator here
%     \protected\def\foo#1%
%       {\iftrialtypesetting\orelse\ifnum\numexpr#1;10\relax=\plustwo
%          \footnote{NOTE @ #1}%
%        \fi}%
%     \normalexpanded {\starttabulate[|||]
%         \expandedrepeat 500 {
%             \NC test \foo{\the\currentloopiterator}%
%             \NC test \the\currentloopiterator
%             \NC \NR
%         }
%     \stoptabulate}
% \stopbuffer
%
% \startrows[n=4]
%     \getbuffer
% \stoprows

