% author    : Hans Hagen
% copyright : PRAGMA ADE & ConTeXt Development Team
% license   : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin    : the ConTeXt distribution
%
% comment   : Because this manual is distributed with TeX distributions it comes with a rather
%             liberal license. We try to adapt these documents to upgrades in the (sub)systems
%             that they describe. Using parts of the content otherwise can therefore conflict
%             with existing functionality and we cannot be held responsible for that. Many of
%             the manuals contain characteristic graphics and personal notes or examples that
%             make no sense when used out-of-context.
%
% comment   : Some chapters might have been published in TugBoat, the NTG Maps, the ConTeXt
%             Group journal or otherwise. Thanks to the editors for corrections. Also thanks
%             to users for testing, feedback and corrections.

\dontcomplain

\definepagebreak[mine][yes]

% A complete otf optima pack is too expensive for this (I only have the
% type one set).
%
% \usetypescriptfile
%   [type-ghz]
%
% \usetypescript
%   [sans]
%   [optima-nova]
%
% \setupbodyfont
%   [optima-nova,11pt]
%
% \definefont[QuiteLarge][SansBold sa 3]
% \definefont[NotSoLarge][SansBold sa 1.5]
%
% So we could use:
%
% \setupbodyfont
%   [pagella,11pt]
%
% \definefont[QuiteLarge][Bold sa 2.50]
% \definefont[NotSoLarge][Bold sa 1.25]
%
% But this one has a matching sans:

\setupbodyfont
  [dejavu,11pt]

\definefont[QuiteLarge][SansBold sa 2.50]
\definefont[NotSoLarge][SansBold sa 1.25]

\setuplayout
  [backspace=.1\paperwidth,
   topspace=.025\paperheight,
   header=0.025\paperheight,
   footer=0.025\paperheight,
   headerdistance=0.025\paperheight,
   footerdistance=0.025\paperheight,
   width=middle,
   height=middle]

\setuppagenumbering
  [alternative=doublesided,
   location=]

\setupwhitespace
  [line]

\setupblank
  [line]

\setuptyping
  [blank=halfline]

\startsetups [pagenumber]
    \hbox to .2\paperwidth {
        \hss
        Page \pagenumber
        \hss
    }
\stopsetups

\setupfooter [before=\vfill,after=\vfill,style=\bf,color=color-4]
\setupheader [before=\vfill,after=\vfill,style=\bf,color=color-4]

\setupfootertexts [] [\setups{pagenumber}]
\setupheadertexts [] [\setups{chapterhead}]

\startsetups [chapterhead]
    \hbox to .2\paperwidth {
        \hss
        \getmarking[chapter]
        \hss
    }
\stopsetups

\setuphead
  [chapter]
  [header=empty]

\definecolor[color-1][.5(red,green)]
\definecolor[color-2][.5(green,blue)]
\definecolor[color-3][.5(blue,red)]
\definecolor[color-4][.5(white,black)]
\definecolor[color-5][.5(white,color-4)]
\definecolor[color-6][.2(white,color-4)]

\usemodule[typesetting]

\setupcombination
  [style=mono]

\startuseMPgraphic{page}
StartPage ;
    path p ;
    numeric n; n := PageNumber ;
    numeric w; w := bbwidth(Page) ;
    numeric h; h := bbheight(Page) ;
    def DrawBit (expr bit, dx, dy) =
        path p ; p := unitsquare xyscaled(w/5,h/40) shifted (dx*w/10,dy*(h-h/40)) ;
        if n div bit > 0 :
            n := n - (n div bit)*bit ;
            fill p withcolor \MPcolor{color-1} ;
        else :
            fill p withcolor \MPcolor{color-2} ;
        fi ;
    enddef ;
    DrawBit(32,7,1) ;
    DrawBit(16,4,1) ;
    DrawBit( 8,1,1) ;
    DrawBit( 4,7,0) ;
    DrawBit( 2,4,0) ;
    DrawBit( 1,1,0) ;
StopPage ;
\stopuseMPgraphic

\startuniqueMPgraphic{frame}
    fill OverlayBox withcolor \MPcolor{color-5} ;
\stopuniqueMPgraphic

\startuniqueMPgraphic{contrast}
    fill OverlayBox withcolor \MPcolor{color-4} ;
\stopuniqueMPgraphic

\defineoverlay[page]    [\useMPgraphic{page}]
\defineoverlay[frame]   [\useMPgraphic{frame}]
\defineoverlay[contrast][\useMPgraphic{contrast}]

\setuphead
  [chapter]
  [style=\QuiteLarge,
   color=color-3,
   number=no]

\setuplist
  [chapter]
  [command=\MyListCommand,
   alternative=command]

\starttexdefinition unexpanded MyListCommand #1#2#3
    \snaptogrid
        [line,-line]\vbox {
            \tfb
            \setstrut
            \strut#2
            \quad#3
        }
\stoptexdefinition

\setupmargindata
  [style=\tttf,
   color=color-3]

\starttexdefinition unexpanded ShowFile #1
    \margintext
        {\cldcontext{string.match("#1","\letterpercent d+")}}
    \typefile
        [range={environment}]
        {#1}
\stoptexdefinition

% \typefile[range=4]  {...}
% \typefile[range={=}]{...} % start after comment lines

\starttexdefinition unexpanded ShowEnvironmentFile #1
    \margintext
        {\cldcontext{string.match("#1","\letterpercent d+")}}
    \typefile
        [range={=startenvironment}]
        {#1}
\stoptexdefinition

\startdocument

\startMPpage
StartPage ;
    path p ; numeric w, h, d ; picture q ;
    if true :
        q := image(draw textext.urt("\ssbf COLUMNS") withcolor \MPcolor{color-6}) ;
    else :
        q := image(draw textext.urt("\ssbf COLUMNSETS") withcolor \MPcolor{color-6}) ;
    fi ;
    w := bbwidth(Page) ;
    h := bbheight(Page) ;
    d := h/100 ;
    fill Page withcolor \MPcolor{color-1} ;
    p := Page xysized (w,d) ;
    for i := 5d step 2d until h-5d :
        fill p shifted (0,i) withcolor \MPcolor{color-2} ;
    endfor
    p := Page xysized(w/10,h) ;
    for i = 0, .3, .6, .9 :
        fill p shifted (i*w,0) withcolor \MPcolor{color-1} withtransparency(1,.75) ;
    endfor ;
    def do_it(expr sz, sh) =
        p := Page xysized sz ;
        fill p shifted sh withcolor \MPcolor{color-3} withtransparency(1,.5) ;
        draw q xysized (bbwidth(p),bbheight(p)) shifted sh ;
    enddef ;
    do_it ((2w/10,17d),(.1w,20d)) ;
    do_it ((2w/10,15d),(.1w,56d)) ;
    do_it ((2w/10,21d),(.4w,66d)) ;
    do_it ((2w/10,13d),(.7w,38d)) ;
    do_it ((5w/10,13d),(.4w,13d)) ;
    draw textext.urt("\ssbf Hans Hagen")
        xysized (5w/10,5d)
        shifted (.4w,6d)
        withcolor \MPcolor{color-5} ;
StopPage ;
\stopMPpage

\page[empty] \setuppagenumber[number=1]

\setupbackgrounds
  [page]
  [background=page]

\starttitle[title=Contents]

    \placelist[chapter]

\stoptitle

\startchapter[title=Introduction]

This manual introduces {\em column sets}, one of the output routines of \CONTEXT.
Although column sets are mainly meant for typesetting journals in a
semi||automated way, you can also use them for books. We assume that the user is
familiar with \CONTEXT\ and only discuss the commands that are related to column
sets.

This mechanism performs okay but it needs to be used with care: an occasional
manual intervention is needed to get optimal results. After all, we're operating
in the area where normally click and point desktop publishing is used.

{\bf For the moment you need to load the new code with: \type{\usemodule[newcolumnsets]}}

\startlines
Hans Hagen
PRAGMA ADE
Hasselt, 2003\endash2016
\stoplines

\stopchapter

\startchapter[title=Basics]

As soon as enough content is collected to build a page, \TEX\ will invoke the
output routine. This is not a fixed piece of code, but a collection of macro
calls. The default output routine is a meant for typesetting a single column, as
in this document. A multi||column output routine is available as well. This
routine mixes well with the single column one, and is activated by:

\starttyping
\startcolumns
some text ...
\stopcolumns
\stoptyping

In \MKIV\ a new mixed column mechanism has been introduced that will be
developped further and eventually replace the old multi column handler. In \MKII\
there is also a columnset mechanism that can be used to construct complex multi
column pages. In \MKIV\ this gets replaced by grid columns. All these multi
column mechanisms have in common that the output routine is more complex because
now a page is in fact a collection of pages wrapped onto one. Each column is
(from \TEX's perspective) similar to a one narrow column page. Here we focus on
columnsets (page grids).

There are some limitations to what you can do with this kind of multi columns,
which is why we have a third routine at out disposal: {\em column sets}. This
routine can be used for rather complex layouts with graphics all over the place,
and text spanning columns or even spreads. There are of course some shortcomings,
which we will discuss later.

In the examples that follow we use the following style to set up the layout. The
number in the margin serves a reference to the file where this snippet of \TEX\
is stored.

\ShowEnvironmentFile{columnsets-000}

\page[mine]

Before we will demonstrate more complex layouts, we will introduce a few
features. In the next series of examples we use fake text. You can enlarge the
pages in your viewer if you want to see more detail.

\FourSpread{columnsets-001}

These pages were typeset with the following code:

\ShowFile{columnsets-001}

We will showmost examples on a spread, so we don't show a first page. On a
spread like above we number columns from~1 to~4, which in practice means that in
this case columns starting on right page start with column~3!

\SixPages{columnsets-001}

\page[mine]

The number of columns is not fixed to two. You can even have a different number
of columns on left and right pages.

\FourSpread{columnsets-002}

This time the input is:

\ShowFile{columnsets-002}

Again, we started on a right page but showed the spreads. You can see it from the
positioning of the header texts.

\SixPages{columnsets-002}

\page[mine]

In order to get the balancing you want, you can manually influence the height of
a column.

\FourSpread{columnsets-003}

When you set the number of column lines to a positive value, that will be the
number of lines. A negative value will be subtracted from the maximum number of
lines.

\ShowFile{columnsets-003}

\page[mine]

In articles you may want to let the introduction span multiple columns. A column
span is defined independent of a column set and shows up as follows:

\FourSpread{columnsets-004}

Here we've given the span a background so that it stands out.

\ShowFile{columnsets-004}

\page[mine]

A column span can be positioned like any graphic. Later we will discuss the
placement options in more detail, for the moment all you need to know is that
\type {btlr} tells \CONTEXT\ to place the graphic in the left bottom of the the
text area.

\FourSpread{columnsets-005}

Here we pass the \type {default} placement as parameter to the span, but you can
also set it at definition time. We use a brute force simple column splitter to
fake columns inside the span.

\ShowFile{columnsets-005}

\page[mine]

You are not limited to one column span. In this sense a span is like a graphic:
as long as there is room, it will be placed where you want it to be placed. The
main difference between a span and a graphic is that a span expects text and
tries to align the baselines with the rest of the text. In many ways a column
span behaves like a framed text.

\FourSpread{columnsets-006}

This time we flushed one of the spans from bottom to top, starting at the right
edge: \type {btrl}.

\ShowFile{columnsets-006}

\page[mine]

Column spans are treated like graphics, which means that they will float if
needed. In the process, the width is limited to the available space, which in
some cases may lead to a smaller span than you may expect. Think of a column
span, calculated (and prepared) in the last column and ending up on the next page
in the first column, where a broader span would have been possible.

\FourSpread{columnsets-007}

\ShowFile{columnsets-007}

\stopchapter

\startchapter[title=Graphics]

Most documents have graphics, and therefore column sets can contain them. The
main thing that you have to keep in mind when placing graphics, is that column
sets are based on grids. Therefore spacing around graphics is also grid based.

\FourSpread{columnsets-101}

\ShowFile{columnsets-101}

\page[mine]

You can tell \CONTEXT\ where it should place the graphic, but this will only be
honored when there is still place.

\EightSpread{columnsets-102}

The prefered location is passed as a four character directive:

\ShowFile{columnsets-102}

\page[mine]

The following directives are available:

\starttabulate[|lT|p|]
\NC btlr     \NC flush from bottom to top    and left to right  \NC \NR
\NC btrl     \NC flush from bottom to top    and right to left  \NC \NR
\NC tblr     \NC flush from top    to bottom and left to right  \NC \NR
\NC tbrl     \NC flush from top    to bottom and right to left  \NC \NR
\NC lrbt     \NC flush from left   to right  and bottom to top  \NC \NR
\NC lrtb     \NC flush from left   to right  and top to bottom  \NC \NR
\NC rlbt     \NC flush from right  to left   and bottom to top  \NC \NR
\NC rltb     \NC flush from right  to left   and top to bottom  \NC \NR
\NC here     \NC try to place the graphic here                  \NC \NR
\NC fixd     \NC force the graphic here and don't float         \NC \NR
\NC fxtb:c*r \NC place the graphic at (c,r) or lower if needed  \NC \NR
\NC fxbt:c*r \NC place the graphic at (c,r) or higher if needed \NC \NR
\NC tops     \NC place the graphic at the top of the page       \NC \NR
\NC bots     \NC place the graphic at the bottom of the page    \NC \NR
\NC page     \NC place the graphic at a separate page           \NC \NR
\stoptabulate

In the next example we show the directional locations:

\OneSpread{columnsets-103}

\ShowFile{columnsets-103}

\stopchapter

\startchapter[title=Areas]

So far we have seen texts and graphics that span multiple columns using span
commands and floats placement commands. We have also seen that you can define a
different number of columns for left and right pages. Now that we have arrives at
column areas you will see how we can span information over not only a page but
also over pages in a spread.

\FourSpread{columnsets-201}

Being a framed text, by default an area is aligned at the baseline. You can lower
an area by setting the \type {location} to \type {depth}.

\ShowFile{columnsets-201}

\page[mine]

You can position areas on the left, right or next page or on both pages. When you
set \type {state} to \type {repeat}, an area is repeated, otherwise it is only
placed once.

\FourSpread{columnsets-202}

Here we just repeat the areas. Normally this only make sense when the content is
worth repeating.

\ShowFile{columnsets-202}

\page[mine]

Areas can span a spread, as is demonstrated in the next example.

\FourSpread{columnsets-203}

\ShowFile{columnsets-203}

\page[mine]

An application of a spread area is a title. In the next example we show two
spread pages.

\FourSpread{columnsets-204}

Watch how we explicitly go to a left page.

\ShowFile{columnsets-204}

\page[mine]

The \type {\GapText} macro is an experimental fun macro and is used to make sure
that we don't end up with a clipped character.

\startlinecorrection[blank]
\startcombination
  {\scale[width=.4\textwidth]{\clip
     [nx=2,ny=6,x=2,y=2]
     {\typesetfile[columnsets-204.tex][page=2]}}}
  {left page}
  {\scale[width=.4\textwidth]{\clip
     [nx=2,ny=6,x=1,y=2]
     {\typesetfile[columnsets-204.tex][page=3]}}}
  {right page}
\stopcombination
\stoplinecorrection

This is a typical example of the kind of optimizations that are needed when you
make documents of styles with text that spans a spread. In the next clip we
visualize the gap.

\startlinecorrection[blank]
\startcombination
  {\scale[width=.4\textwidth]{\clip
     [nx=2,ny=6,x=2,y=2]
     {\typesetfile[columnsets-205.tex][page=2]}}}
  {left page}
  {\scale[width=.4\textwidth]{\clip
     [nx=2,ny=6,x=1,y=2]
     {\typesetfile[columnsets-205.tex][page=3]}}}
  {right page}
\stopcombination
\stoplinecorrection

At some moment you may want to set up an area in advance as we have done in the
following example.

\FourSpread{columnsets-206}

The \type {page} key is used to specify the page in the column set that the area
should go into. Column set pages start numbering at~1. The \type {fixed} stands
for left or right, whatever comes first.

\ShowFile{columnsets-206}

\stopchapter

\startchapter[title=Columns]

You can use \type {\page} to go to a new page in a column set. Likewise you can
use \type {\column} to force a column break.

\FourPages{columnsets-301}

This example demonstrates that you can supply \type {\column} with explicit
directives.

\ShowFile{columnsets-301}

You can use \type {\column[page]} as an alternative for \type {\page}.

\stopchapter

\startchapter[title=Details]

This chapter will cover a couple of cosmetic details of column sets. {\em Some
features need to be improved, especially in combination with areas, graphics and
alike. We will also provide side floats etc.}

\FourSpread{columnsets-401}

You can set the distance between columns for each pair of columns. {\em Todo:
left and right page distances and margins.}

\ShowFile{columnsets-401}

\page[mine]

When you can the distance of the first column as well. This creates a margin.

\FourSpread{columnsets-402}

This time we used equal distances:

\ShowFile{columnsets-402}

\page[mine]

The width of columns is normally calculated automatically, but you can also set
the width explicitly:

\FourSpread{columnsets-403}

In code:

\ShowFile{columnsets-403}

\page[mine]

For special effects, you can set the width per column. In that case you need to
be aware of the fact that \TEX\ works its way through the document per paragraph.
Changing the width halfway a paragraph is possible but will affect the whole
paragraph. Therefore, this feature works best when you also goto the next column
explicitly.

\FourSpread{columnsets-404}

In code:

\ShowFile{columnsets-404}

\page[mine]

If you really want to change the width in the middle of a paragraph, you can do a
trial run and include a breakpoint at the palce where you want it to occur:

\FourSpread{columnsets-405}

In the second spread you see how the narrow hsize carries on in the wider
column. A \type {\column} command will synchronize the hsize.

\ShowFile{columnsets-405}

% \page[mine]

\stopchapter

\startchapter[title=Directions]

\FourSpread{columnsets-601}

The direction of flushing columns is determined by the \type {direction}
parameters as demonstrated below.

\ShowFile{columnsets-601}

% \page[mine]

\stopchapter

\startchapter[title=Backgrounds]

As with many \CONTEXT\ components, column sets can have backgrounds.

\FourSpread{columnsets-701}

Watch how we use the \type {each} keyword to tell \CONTEXT\ that we want to apply
the background to each column of the set.

\ShowFile{columnsets-701}

\page[mine]

Normally, if you apply backgrounds this way, you will also set the background
offset. In a similar fashion you can apply backgrounds to areas and spans. Such
backgrounds can be a color, or any overlay or layer you want.

\FourSpread{columnsets-702}

Here we've set the background offset as well as the frame.

\ShowFile{columnsets-702}

\page[mine]

When dealing with areas, you need to be aware of the fact that they are clipped,
the content as well as the background.

\FourSpread{columnsets-703}

De default clip offset is two times the lineheight, except in the binding, where
it is set to zero points. You can set the clip offset with the \type {clipoffset}
parameter.

\ShowFile{columnsets-703}

\page[mine]

The text background mechanism is rather well adapted to column sets. The
following example is a variant on an example shown in the manual titled
{details}.

\EightSpread{columnsets-704}

Watch how we adapt the background to the fact and extent that the text spans one
or more columns.

\ShowFile{columnsets-704}

Backgrounds that follow the paragraph shape also work ok in column sets.

{\em todo: an example of a bleeding graphic with column feed back (from
techniek)}

% \page[mine]

\stopchapter

\startchapter[title=Numbering lines]

\FourSpread{columnsets-901}

This example shows how numbering lines in columns works out. In a two column
layout the numbers end up in the outer margins by default. If you want you can
set the \type {location} to for instance \type {left} or \type {right}.

\ShowFile{columnsets-901}

\page[mine]

\FourSpread{columnsets-902}

In a three column setup the numbers end up in the left margins.Make sure you make
the distance large enough.

\ShowFile{columnsets-902}

% \page[mine]
%
% \FourSpread{columnsets-903}
%
% This example shows again lune numbers but here we made sure that there is no
% stretch in the whitespace.
%
% \ShowFile{columnsets-903}

\stopchapter

% \startchapter[title=Spanning and More]
%
% {\em todo: explanation} \page
%
% \TwoPages{columnsets-801} \ShowFile{columnsets-801} \page[mine]
% \TwoPages{columnsets-802} \ShowFile{columnsets-802} \page[mine]
% \TwoPages{columnsets-803} \ShowFile{columnsets-803} \page[mine]
% \TwoPages{columnsets-804} \ShowFile{columnsets-804} \page[mine]
% \TwoPages{columnsets-805} \ShowFile{columnsets-805} \page[mine]
% \TwoPages{columnsets-806} \ShowFile{columnsets-806} \page[mine]
%
% \stopchapter

\stopdocument
