% language=us

\environment details-environment

\startcomponent details-floatingaround

\startchapter[title={Floating around}]

\index {floats}

Graphics, tables and alike are often treated as floating bodies. This means that
when such a body does not fit on the current page, it will be moved to the next
one. In the examples we will use figures, but much of what we demonstrate here
applies to all floats.

A side float is a float which placement one way or another depends on the text
that follows it. In its simplest form, the text flows around it, for instance in:

\startbuffer
\placefigure[left,none]{caption}{\framed[height=1cm]{graphic}}
\stopbuffer

\typebuffer

The first keyword of such a call is treated as a placement directive, so this
figure will be placed left. The \type {none} directive nils the caption.

\getbuffer \fakewords{60}{80}

When the figure does not fit on the page, a page break is issued. A figure can
span multiple paragraphs. When a next graphic is placed the previous figure will
be padded if needed. First an example of multiple paragraphs.

\getbuffer \fakewords{30}{40} \par \fakewords{30}{40}

Multiple floats in a row will lead to padding. The amount of padding is a
combination of empty lines and the normal white space following the float. The
visual quality of the result depends on the graphic itself.

\start \tracesidefloatstrue

\getbuffer \fakewords{30}{40}

\getbuffer \fakewords{30}{40} \fakewords{30}{40}

\stop

Here we show the baseline of the first paragraph after the float as well as the
filler. The whitespace around a graphic also depends on the inter|-|paragraph
whitespace. As with many automated mechanisms, compromises are made. A one point
smaller figure may result in an extra empty line.

Later we will demonstrate a lot of tuning options, but first we give a few more
examples. Most of the tuning options can be driven by keywords as well as
(global) settings.

\startbuffer
\placefigure
  [left,nonumber]
  {caption} {\framed[height=1cm]{graphic}}
\stopbuffer

\typebuffer

The \type {nonumber} keyword suppresses the label and figure number. You can do
this for all figures with

\starttyping
\setupcaption[figure][number=no]
\stoptyping

The previous placement command results in the following side float.

\getbuffer \fakewords{80}{100}

Another handy keyword is \type {none}.

\startbuffer
\placefigure
  [left,none]{quoting knuth}
  {\framed[height=1cm]{graphic}}
\stopbuffer

\typebuffer \getbuffer \fakewords{80}{100}

Control over spacing is exercised by means of the keywords \type {high}, \type
{low} and \type {fit}.

\startbuffer
\placefigure
  [left,none,high]{}
  {\framed[height=1cm]{graphic}}
\stopbuffer

\typebuffer \getbuffer \fakewords{80}{100}

\startbuffer
\placefigure
  [left,none,high,low]{}
  {\framed[height=1cm]{graphic}}
\stopbuffer

\typebuffer \getbuffer \fakewords{80}{100}

\startbuffer
\placefigure
  [left,none,fit]{}
  {\framed[height=1cm]{graphic}}
\stopbuffer

\typebuffer \getbuffer \fakewords{80}{100}

In the examples so far, we saw additional spacing around the graphic. We will now
(for a while) disable the surrounding whitespace.

\startbuffer
\setupfloat
  [figure]
  [sidespacebefore=none,
   sidespaceafter=none]
\stopbuffer

\typebuffer

With these settings a simple left placement looks as follows. The top of the side
float aligns with the maximum height of a line.

\start \getbuffer \tracesidefloatstrue

\startbuffer
\placefigure
  [left,none]
  {} {\framed[height=1cm]{graphic}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40} \par \stop

You can change the alignment by setting the \type {sidealign} variable, for
instance:

\starttyping
\setupfloat
  [figure]
  [sidealign=line]
\stoptyping

The three keywords \type {height}, \type {line} and \type {depth} can also be
passed directly:

\startbuffer
\placefigure
  [left,none,height]{}
  {\framed[height=1cm]{graphic}}
\stopbuffer

\typebuffer

The three alignments disable the spacing before the float and show up as follows.

\bgroup \tracesidefloatstrue \getbuffer \fakewords{30}{40} \par \egroup

\startbuffer
\placefigure
  [left,none,line]{}
  {\framed[height=1cm]{graphic}}
\stopbuffer

\bgroup \tracesidefloatstrue \getbuffer \fakewords{30}{40} \par \egroup

\startbuffer
\placefigure
  [left,none,depth]{}
  {\framed[height=1cm]{graphic}}
\stopbuffer

\bgroup \tracesidefloatstrue \getbuffer \fakewords{30}{40} \par \egroup

So far the floats took up space in the main text body area. In addition to the
\type {left} (or \type {right}) directive we can use \type {inner} or \type
{outer} to force left or right placement depending in the spread.

Instead of spoiling paper in the text areas, we can use the margin and edges:
\type {leftmargin} and \type {leftedge}, \type {rightmargin} and \type
{rightedge}, but also \type {innermargin} and \type {outermargin}, \type
{inneredge} and \type {outeredge}.

The next couple of pages we will highlight the margins and edges so that we can
see what happens.

\setupbackgrounds [text] [leftedge]    [background=color]
\setupbackgrounds [text] [rightedge]   [background=color]
\setupbackgrounds [text] [leftmargin]  [background=color]
\setupbackgrounds [text] [rightmargin] [background=color]

\startbuffer
\placefigure
  [leftmargin,none]
  {} {\framed{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

\startbuffer
\placefigure
  [leftmargin,none]
  {} {\framed[width=1cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

\startbuffer
\placefigure
  [leftmargin,none]
  {} {\framed[width=1.5cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

The placement directives can be combined with setting distance and width
parameters, thereby not only opening a world of possibilities, but also creating
confusion. Therefore, we will illustrate these features by cloning floats.

\startbuffer
\definefloat
  [marginfigure]
  [figure]

\setupfloat
  [marginfigure]
  [leftmargindistance=-\leftmargintotal,
   default={left,none,low}]
\stopbuffer

\typebuffer \getbuffer

The definition command clones figure into a new class of figures. There are two
ways to use such a float :

\starttyping
\placefloat
  [marginfigure]
  {} {\framed[width=1.5cm]{!}}
\stoptyping

or directly:

\startbuffer
\placemarginfigure
  {} {\framed[width=1.5cm]{!}}
\stopbuffer

\typebuffer

Both placement calls will result in a figure sticking into the margin.

\getbuffer \fakewords{30}{40}

By manipulating the margin distance, you can align graphics to vertical grid
lines, like the edge:

\startbuffer
\definefloat
  [edgefigure]
  [figure]

\setupfloat
  [edgefigure]
  [leftmargindistance=-\innercombitotal,
   default={left,none,low,high}]
\stopbuffer

\typebuffer \getbuffer

The \type {\innercombitotal} is one of the many available dimensions. This
measure is the combined width of the margin and edge.

\startbuffer
\placeedgefigure
  {} {\framed[width=1.5cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

\startbuffer
\placeedgefigure
  {} {\framed[width=\innercombitotal]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

You need to be aware of the fact that the margins and edges are not related to
the backspace and cut space settings. When you set up a layout, you need to think
of the right page as starting point. In a double sided layout, the margins are
swapped in the page composition stage. Unless you explicitly go to a left or
right page, you don't know if your left margin will be swapped or not.

For this reason \CONTEXT\ provides the inner and outer margin|/|edge dimensions.
These are automatically synchronized when the float is constructed. So, if you
want to automatically adapt the float placement and width to the current left
margin in a double sided document, you can use the inner dimensions.

\starttabulate[||||]
\NC dimension                  \NC left page
                               \NC right page                 \NC\NR
\NC \type{\outermarginwidth}   \NC \type{\leftmarginwidth}
                               \NC \type{\rightmarginwidth}   \NC\NR
\NC \type{\innermarginwidth}   \NC \type{\rightmarginwidth}
                               \NC \type{\leftmarginwidth}    \NC\NR
\NC \type{\outermargindistance}\NC \type{\leftmargindistance}
                               \NC \type{\rightmargindistance}\NC\NR
\NC \type{\innermargindistance}\NC \type{\rightmargindistance}
                               \NC \type{\leftmargindistance} \NC\NR
\stoptabulate

Similar dimensions are available for the edges. You can save yourself some
calculations by using the following dimensions:

\starttabulate[|||||]
\NC \type{\leftmargintotal}  \NC left  margin width \NC + \NC left  margin distance \NC\NR
\NC \type{\rightmargintotal} \NC right margin width \NC + \NC right margin distance \NC\NR
\NC \type{\innermargintotal} \NC inner margin width \NC + \NC inner margin distance \NC\NR
\NC \type{\outermargintotal} \NC outer margin width \NC + \NC outer margin distance \NC\NR
\stoptabulate

As you may expect, the edge totals are available as well, which leave a few more
totals, namely the combinations of margin and edge.

\starttabulate[|||]
\NC \type{\leftsidetotal}   \NC left  margin width \NC + \NC left  edge total \NC\NR
\NC \type{\rightsidetotal}  \NC right margin width \NC + \NC right edge total \NC\NR
\TB
\NC \type{\innersidetotal}  \NC inner margin width \NC + \NC inner edge total \NC\NR
\NC \type{\outersidetotal}  \NC outer margin width \NC + \NC outer edge total \NC\NR
\TB
\NC \type{\leftcombitotal}  \NC left  margin total \NC + \NC left  edge total \NC\NR
\NC \type{\rightcombitotal} \NC right margin total \NC + \NC right edge total \NC\NR
\TB
\NC \type{\innercombitotal} \NC inner margin total \NC + \NC inner edge total \NC\NR
\NC \type{\outercombitotal} \NC outer margin total \NC + \NC outer edge total \NC\NR
\stoptabulate

Adaptive back- and cutspace dimensions are also available:

\starttabulate[|||||]
\NC \type{\innerspacewidth} \NC adaptive backspace \NC\NR
\NC \type{\outerspacewidth} \NC adaptive cutspace  \NC\NR
\stoptabulate

There is one drawback in using the inner and outer dimensions: if you also change
the height of the float dynamically, you may end up in a kind of loop because a
page break may occur at a non||expected place.

While negative values move float into the margin, positive values will move the
float into the text. It will be of no surprise that you can also set the right
margin distance. Keep in mind that this distance is not related to the text
margin, but to the float margin.

\startbuffer
\setupfloat
  [edgefigure]
  [leftmargindistance=-\outercombitotal,
   rightmargindistance=-\outercombitotal,
   default={outer,none,low,high}]
\stopbuffer

\typebuffer \getbuffer

The locations \type {inner} and \type {outer} change with the left or right page.

\startbuffer
\placeedgefigure
  {} {\framed[width=\outercombitotal]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

\startbuffer
\placeedgefigure
  {} {\framed[width=8cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

As a result of manipulating the floats margin settings, the side floats can start
in the margin (or edge). You should not confuse this with margin floats, i.e.\
side floats that are explicitly placed in the margins.

\startbuffer
\placefigure[leftmargin,none]
  {} {\framed{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

\startbuffer
\placefigure[leftmargin,none]
  {} {\framed[width=.5cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

\startbuffer
\placefigure[leftmargin,none]
  {} {\framed[width=1.5cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

\startbuffer
\placefigure[leftmargin,none]
  {} {\framed[width=5cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

The margin side floats align to the margin and the edge floats to the edge. This
way you can create bleeding figures.

\startbuffer
\placefigure[leftedge,none]
  {} {\framed{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

There are situations where you don't know the dimensions in advance. In order to
prevent unwanted side effects, for instance part of a graphic disappearing
outside the page boundary, \CONTEXT\ provides a few options. The most crude one
is setting the \type {criterium}, as in:

\starttyping
\setupfloat
  [figure]
  [criterium=.25\textwidth]
\stoptyping

This will automatically turn figures that are wider than 25\% of the text width
into normal floats instead of side floats. But let's not fall back on that
feature now.

You can use \type {maxwidth} and \type {minwidth} variables to control the
placement in more detail. The exact result depends on the settings of \type
{location}. By default we center, but you can set the location to \type {left} or
\type {right} to achieve a different alignment.

\startbuffer
\definefloat
  [midmarginfigure]
  [figure]

\setupfloat
  [midmarginfigure]
  [minwidth=\leftmarginwidth,
   default={leftmargin,none}]
\stopbuffer

\typebuffer \getbuffer

You can use \type {maxwidth} and \type {minwidth} variables to control the
placement in more detail. The exact result depends on the settings of \type
{location}. By default we center, but you can set the location to \type {left} or
\type {right} to achieve a different alignment.

\startbuffer
\placemidmarginfigure
  {} {\framed[width=1.5cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

The meaning of \type {maxwidth} depends on the kind of float. First we place a
left float with a width smaller than \type {maxwidth}.

\start

\startbuffer
\setupfloat[figure][maxwidth=2cm]
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\placefigure[left,none]{}{\framed[width=1cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

When the width exceeds the maxwidth, the float will be centered. This is because
we have no reference alignment point.

\startbuffer
\placefigure[left,none]{}{\framed[width=5cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

In margin floats, the \type {maxwidth} settings have a different result. First we
place a small graphic.

\startbuffer
\setupfloat[figure][maxwidth=\leftmarginwidth]
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\placefigure[leftmargin,none]{}{\framed[width=1cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

Because the left and right margin of this document are the same |<|the edges
differ|>| we don't need to use inner and outer dimensions.

\startbuffer
\setupfloat[figure][maxwidth=\leftmarginwidth]
\stopbuffer

\typebuffer \getbuffer

A wider than \type {maxwidth} graphic will behave like a mixture of a margin and
text side float. Watch how we align the float to the margin.

\startbuffer
\placefigure[leftmargin,none]{}{\framed[width=5cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

\stop

Instead of setting the width you can give \type {hanging} a try. The next
examples demonstrate this.

\startbuffer
\placefigure[leftmargin,hanging,none]{}{\framed[width=5cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

\startbuffer
\placefigure[left,hanging,none]{}{\framed[width=5cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

You can move down|/|up margin floats with the \type {\movesidefloat} macro. Such
shifts come in handy when you have multiple side floats near to each other.

\startbuffer
\movesidefloat [+2*line]
\placemidmarginfigure {} {\framed{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

Given the default placement template, this is equivalent to the following
command. Watch out, a simple \type {line} has a different effect (alignment).

\starttyping
\placemidmarginfigure
  [leftmargin,none,+2*line]
  {} {\framed{!}}
\stoptyping

Another nice keyword is \type {long}:

\startbuffer
\placefigure
  [leftmargin,none,long]
  {} {\framed[height=2cm,width=2cm]{!}}

Watch how we move down. The effect is that we skip over the margin figure.

\placefigure
  [leftmargin,none]
  {} {\framed[height=1cm,width=2cm]{!}}
\stopbuffer

\typebuffer \getbuffer \fakewords{30}{40}

\startbuffer
\placefigure
  [leftmargin,none]
  {} {\framed[height=2cm,width=2cm]{!}}

Do we clash or not?

\placefigure
  [leftmargin,none]
  {} {\framed[height=2cm,width=2cm]{!}}

Did we clash or not?
\stopbuffer

\typebuffer \getbuffer

There are a few macros that can be of help with solving clashes in side floats:

\starttabulate
\NC \tex {flushsidefloats} \NC
    This macro moves down as much as is needed to separate the side floats of
    each other. \NC \NR
\NC \tex {forgetsidefloats} \NC
    this macro kind of forgets that a side float is in progress. \NC \NR
\stoptabulate

Use these macros with care. If you change the dimensions of the graphic and|/|or
content involved, reconsider the use of these directives.

The next couple of spreads we will demonstrate some example definitions. These
placements are taken from one of the styles we made for typesetting a series of
school math books which illustrations and tables all over the pages.

First we fine tune the spacing around side floats and verbatim text.

\startbuffer[setupa]
\setupfloats
  [sidespacebefore=none,
   sidespaceafter=depth]

\setuptyping
  [margin=]
\stopbuffer

\typebuffer[setupa]

The placements have rather verbose names. In this case the word \quote {edge} is
used to identify bleeding floats (with an cut||off margin of 3mm). The \quote
{text} floats are side floats positioned in the main text flow.

\startbuffer[setupb]
\definefloat [marginfigure]       [marginfigures]       [figure]
\definefloat [middlemarginfigure] [middlemarginfigures] [figure]
\definefloat [middlefigure]       [middlefigures]       [figure]
\definefloat [textfigure]         [textfigures]         [figure]
\definefloat [leftfigure]         [leftfigures]         [figure]
\definefloat [rightfigure]        [rightfigures]        [figure]
\definefloat [bleedfigure]        [bleedfigures]        [figure]
\stopbuffer

\typebuffer[setupa]

Watch how we define fall backs for too wide content (\type
{criterium} as well as use \type {maxwidth} to manipulate
the placement of content that falls off the margins.

The black rules are set up with:

\startbuffer[setupc]
\setupblackrules[color=tred,depth=0pt,height=1.5cm]
\stopbuffer

\typebuffer[setupc]

\page[left]

\startbuffer[series]

\startbuffer
\setupfloat
  [marginfigure]
  [criterium=.5\textwidth,
   maxwidth=\rightmarginwidth,
   default={outermargin,none}]
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placemarginfigure{}{\blackrule[width=.25cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemarginfigure{}{\blackrule[width=.5cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemarginfigure{}{\blackrule[width=1cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemarginfigure{}{\blackrule[width=2cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemarginfigure{}{\blackrule[width=4cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemarginfigure{}{\blackrule[width=8cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemarginfigure{}{\blackrule[width=16cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\stopbuffer

{\getbuffer[setupa,setupb,setupc,series]} \page
{\getbuffer[setupa,setupb,setupc,series]} \page

\startbuffer[series]

\startbuffer
\setupfloat
  [middlemarginfigure]
  [minwidth=\rightmarginwidth,
   criterium=\backspace,
   location=middle,
   default={outermargin,none}]
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placemiddlemarginfigure{}{\blackrule[width=.25cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemiddlemarginfigure{}{\blackrule[width=.5cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemiddlemarginfigure{}{\blackrule[width=1cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemiddlemarginfigure{}{\blackrule[width=2cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemiddlemarginfigure{}{\blackrule[width=4cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemiddlemarginfigure{}{\blackrule[width=8cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placemiddlemarginfigure{}{\blackrule[width=16cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\stopbuffer

{\getbuffer[setupa,setupb,setupc,series]} \page
{\getbuffer[setupa,setupb,setupc,series]} \page

\startbuffer[series]

\startbuffer
\setupfloat
  [middlefigure]
  [default={here,none}]
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placemiddlefigure{}{\blackrule[width=.25cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placemiddlefigure{}{\blackrule[width=.5cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placemiddlefigure{}{\blackrule[width=1cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placemiddlefigure{}{\blackrule[width=2cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placemiddlefigure{}{\blackrule[width=4cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placemiddlefigure{}{\blackrule[width=8cm]}
\stopbuffer

\getbuffer \typebuffer

%\startbuffer
%\placemiddlefigure{}{\blackrule[width=16cm]}
%\stopbuffer
%
%\getbuffer \typebuffer

\stopbuffer

{\getbuffer[setupa,setupb,setupc,series]} \page
{\getbuffer[setupa,setupb,setupc,series]} \page

\startbuffer[series]

\startbuffer
\setupfloat
  [textfigure]
  [criterium=.5\textwidth,
   default={outer,none}]
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placetextfigure{}{\blackrule[width=.25cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placetextfigure{}{\blackrule[width=.5cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placetextfigure{}{\blackrule[width=1cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placetextfigure{}{\blackrule[width=2cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placetextfigure{}{\blackrule[width=4cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placetextfigure{}{\blackrule[width=8cm]}
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placetextfigure{}{\blackrule[width=16cm]}
\stopbuffer

\getbuffer \typebuffer

\stopbuffer

{\getbuffer[setupa,setupb,setupc,series]} \page
{\getbuffer[setupa,setupb,setupc,series]} \page

\startbuffer[series]

\startbuffer
\setupfloat
  [leftfigure]
  [criterium=.5\textwidth,
   default={left,none}]
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placeleftfigure{}{\blackrule[width=.25cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placeleftfigure{}{\blackrule[width=.5cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placeleftfigure{}{\blackrule[width=1cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placeleftfigure{}{\blackrule[width=2cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placeleftfigure{}{\blackrule[width=4cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placeleftfigure{}{\blackrule[width=8cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placeleftfigure{}{\blackrule[width=16cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\stopbuffer

{\getbuffer[setupa,setupb,setupc,series]} \page
{\getbuffer[setupa,setupb,setupc,series]} \page

\startbuffer[series]

\startbuffer
\setupfloat
  [rightfigure]
  [criterium=.5\textwidth,
   default={right,none}]
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placerightfigure{}{\blackrule[width=.25cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placerightfigure{}{\blackrule[width=.5cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placerightfigure{}{\blackrule[width=1cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placerightfigure{}{\blackrule[width=2cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placerightfigure{}{\blackrule[width=4cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placerightfigure{}{\blackrule[width=8cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placerightfigure{}{\blackrule[width=16cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\stopbuffer

{\getbuffer[setupa,setupb,setupc,series]} \page
{\getbuffer[setupa,setupb,setupc,series]} \page

\startbuffer[series]

\startbuffer
\setupfloat
  [bleedfigure]
  [criterium=.5\textwidth,
   leftmargindistance=-1mm,
   rightmargindistance=-1mm,
   default={backspace,none}]
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placebleedfigure{}{\blackrule[width=.25cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=.5cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=1cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=2cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=4cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=8cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=16cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\stopbuffer

{\getbuffer[setupa,setupb,setupc,series]} \page
{\getbuffer[setupa,setupb,setupc,series]} \page

\startbuffer[series]

\startbuffer
\setupfloat
  [bleedfigure]
  [criterium=.5\textwidth,
   leftmargindistance=-1mm,
   rightmargindistance=-1mm,
   default={cutspace,none}]
\stopbuffer

\getbuffer \typebuffer

\startbuffer
\placebleedfigure{}{\blackrule[width=.25cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=.5cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=1cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=2cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=4cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=8cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\startbuffer
\placebleedfigure{}{\blackrule[width=16cm]}
\stopbuffer

\getbuffer \typebuffer \flushsidefloats

\stopbuffer

{\getbuffer[setupa,setupb,setupc,series]} \page
{\getbuffer[setupa,setupb,setupc,series]} \page

\page

\setupbackgrounds [text] [leftedge]    [background=]
\setupbackgrounds [text] [rightedge]   [background=]
\setupbackgrounds [text] [leftmargin]  [background=]
\setupbackgrounds [text] [rightmargin] [background=]

At \CONTEXT\ and Bacho\TEX meetings it is now a tradition that Harald König and I
spend some time on figuring out what happens with border cases and interfences
with user intervention. As it's hard to nail down I decided to add some more
tracing and control. So, the remainder of this chapter is dedicated to Harald.

We will now demonstrate some features in a way that makes it possible to
compare to the simple default case. Options can be passed as keywords:

\starttyping
\placefigure
  [left,...]
  [fig:whatever]
  {caption}
  {content}
\stoptyping

or as settings:

\starttyping
\startplacefigure
  [default={left,...},
   title=caption,
   reference=fig:whatever]

    content

\stopplacefigure
\stoptyping

It is important to realize that all that spacing can interfere with additional
hard coded corrections at the users end. We don't show the effects of \type
{sidespacebefore} and \type {sidespaceafter}, the two general vertical spacing
hooks. These are currently set to {\tttf \rootfloatparameter {sidespacebefore}}
and {\tttf \rootfloatparameter {sidespaceafter}} respectively. The \type
{sidealign} parameter is always winning from a keyword doing the same.

The last few examples demonstrate that you can define an instance. Often that's
the best way to deal with special cases in a consistent way. For instance:

\starttyping
\definefloat
  [LeftTwo]
  [figure]

\setupfloat
  [LeftTwo]
  [default=left,
   sidealign=line]
\stoptyping

First we show some keyword variant, next some parameter driven versions.

\def\SampleKeyword#1%
  {\setbuffer[foo]
     \useMPlibrary[dum]
     \setupbodyfont[dejavu]
     \setuplayout[page]
     \placefigure[left]{}{\externalfigure[dummy]} \samplefile{sapolsky} \samplefile{sapolsky}
     \placefigure[#1]  {}{\externalfigure[dummy]} \samplefile{sapolsky} \samplefile{sapolsky}
   \endbuffer
   \framed
     [background=color,backgroundcolor=white,offset=overlay]
     {\scale
        [width=.45\textwidth]
        {\typesetbuffer[foo]}}}

\def\SampleSettings#1#2#3%
  {\setbuffer[foo]
     \useMPlibrary[dum]
     \setupbodyfont[dejavu]
     \setuplayout[page]
     \definefloat[#1][figure]
     \setupfloat[#1][default=left]
     \definefloat[#2][figure]
     \setupfloat[#2][#3]
     \startplacefloat[#1] \externalfigure[dummy] \stopplacefloat \samplefile{sapolsky} \samplefile{sapolsky}
     \startplacefloat[#2] \externalfigure[dummy] \stopplacefloat \samplefile{sapolsky} \samplefile{sapolsky}
   \endbuffer
   \framed
     [background=color,backgroundcolor=white,offset=overlay]
     {\scale
        [width=.45\textwidth]
        {\typesetbuffer[foo]}}}

\startbuffer[LeftOne]
\definefloat[LeftOne][figure]

\setupfloat
  [LeftOne]
  [default=left]
\stopbuffer

\startbuffer[LeftTwo]
\definefloat[LeftTwo][figure]

\setupfloat
  [LeftTwo]
  [default=left,
   sidealign=line]
\stopbuffer

\startbuffer[LeftThree]
\definefloat[LeftThree][figure]

\setupfloat
  [LeftThree]
  [default={left,2*line}]
\stopbuffer

\startbuffer[LeftFour]
\definefloat[LeftFour][figure]

\setupfloat
  [LeftFour]
  [default={left},
   topoffset=5pt]
\stopbuffer

\startbuffer[LeftFive]
\definefloat[LeftFive][figure]

\setupfloat
  [LeftFive]
  [default={left},
   bottomoffset=5pt,
   topoffset=5pt]
\stopbuffer

\startlinecorrection
\startcombination[2*2]
    {\SampleKeyword{left,high}}     {\type{left,high}}
    {\SampleKeyword{left,low}}      {\type{left,low}}
    {\SampleKeyword{left,high,low}} {\type{left,high,low}}
    {\SampleKeyword{left,fit}}      {\type{left,fit}}
\stopcombination
\stoplinecorrection

\startlinecorrection
\startcombination[2*2]
    {\SampleKeyword{left,halfline}} {\type{left,halfline}}
    {\SampleKeyword{left,height}}   {\type{left,height}}
    {\SampleKeyword{left,depth}}    {\type{left,depth}}
    {\SampleKeyword{left,grid}}     {\type{left,grid}}
\stopcombination
\stoplinecorrection

\startlinecorrection
\startcombination[2*2]
    {\SampleKeyword{left,line}}     {\type{left,line}}
    {\SampleKeyword{left,1*line}}   {\type{left,1*line}}
    {\SampleKeyword{left,2*line}}   {\type{left,2*line}}
    {\SampleKeyword{left,3*line}}   {\type{left,3*line}}
\stopcombination
\stoplinecorrection

\startlinecorrection
\startcombination[2*2]
    {\SampleSettings{LeftOne}{LeftTwo}  {default={left,line}}}
                                        {\typ{default={left,line}}}
    {\SampleSettings{LeftOne}{LeftThree}{default={left,2*line}}}
                                        {\typ{default={left,2*line}}}
    {\SampleSettings{LeftOne}{LeftFour} {default=left,topoffset=5pt}}
                                        {\typ{default=left, topoffset=5pt}}
    {\SampleSettings{LeftOne}{LeftFive} {default=left, topoffset=5pt, bottomoffset=5pt}}
                                        {\typ{default=left, topoffset=5pt, bottomoffset=5pt}}
\stopcombination
\stoplinecorrection

There is some tracing built in but as this mechanism is rather complex it only
gives an idea about what is going on. Here is an example:

\startbuffer[one]
\enabletrackers[floats.anchoring]

\showframe

\setupfloat
  [sidespacebefore=big,
   sidespaceafter=big]

\starttext
    \dorecurse{10}{
        \placefigure[left]{#1.1}{}
        a small sentence \par
        \placefigure[left]{#1.2}{}
        a small sentence \par
        \input klein \par
    }
\stoptext
\stopbuffer

\typebuffer[one]

In \in {figure} [fig:side:one:1] and \in {figure} [fig:side:one:2] you see the
first two pages of the typeset result.

The anchor to the text is showed in orange and an optional shift in red. The content
is in green and a depth compensation in magenta. Dummy lines added for proper
spacing as well as progressing beyond a previous float are in blue.

\startplacefigure[title={Side float tracing example 1, page 1.},reference=fig:side:one:1]
    \scale[width=\textwidth]{\typesetbuffer[one][page=1]}
\stopplacefigure

\startplacefigure[title={Side float tracing example 1, page 2.},reference=fig:side:one:2]
    \scale[width=\textwidth]{\typesetbuffer[one][page=2]}
\stopplacefigure

A second example that uses different settings is shown in \in {figure}
[fig:side:two:1] and \in {figure} [fig:side:two:2].

\startbuffer[two]
\enabletrackers[floats.anchoring]

\setupfloat
  [sidespacebefore=,
   sidespaceafter=big,
   step=small]

\showframe

\starttext
    \dorecurse{10}{
        \placefigure[left]{#1.1}{}
        a small sentence \par
        \placefigure[left]{#1.2}{}
        a small sentence \par
        \input klein \par
    }
\stoptext
\stopbuffer

\typebuffer[two]

\startplacefigure[title={Side float tracing example 2, page 1.},reference=fig:side:two:1]
   \framed
      [background=color,backgroundcolor=white,offset=overlay]
      {\scale[width=\textwidth]{\typesetbuffer[two][page=1]}}
\stopplacefigure

\startplacefigure[title={Side float tracing example 2, page 2.},reference=fig:side:two:2]
   \framed
      [background=color,backgroundcolor=white,offset=overlay]
      {\scale[width=\textwidth]{\typesetbuffer[two][page=2]}}
\stopplacefigure

\startbuffer[three]
\usemodule[simulate]

\setuplayout
  [tight]

\setupbodyfont
  [dejavu]

\enabletrackers
  [floats.anchoring]

\setupfloats
  [sidethreshold=.5\strutdp, % default, use "old" for previous implementation
   step=small]

\definemeasure[MyHeight][3cm]
\definemeasure[MyWidth] [3cm]

% \setupheadertexts
%   [width=\measure{MyWidth}\quad height=\measure{MyHeight}]

\unexpanded\def\FakeWords#1%
  {\simulatewords
     [n=#1,m=#1,min=1,max=5,hyphen=no,color=text,line=yes,random=1234]}

\starttext

\startbuffer
    \FakeWords{100}\par
    \placefigure
        [left] {oeps}
        {\framed[width=\measure{MyWidth},height=\measure{MyHeight}]{}}
    \FakeWords  {2}\par
    \FakeWords  {3}\par
    \FakeWords  {5}\par
    \FakeWords  {4}\par
    \FakeWords{200}\par
    \placefigure
        [left] {oeps}
        {\framed[width=\measure{MyWidth},height=\measure{MyHeight}]{}}
    \FakeWords{200}\par
\stopbuffer

\dostepwiserecurse {\number\dimexpr3cm} {\number\dimexpr4cm} {\number\dimexpr0.25cm} {
    \definemeasure[MyWidth][#1sp]
    \dostepwiserecurse {\number\dimexpr3cm} {\number\dimexpr4cm} {\number\dimexpr0.25cm} {
        \definemeasure[MyHeight][##1sp]
        \start
            \setupwhitespace[none]
            \getbuffer \page
        \stop
        \start
            \setupwhitespace[big]
            \getbuffer \page
        \stop
    }
}
\stoptext
\stopbuffer

Progressing next to a side float and determining how many lines to indent is a
somewhat complex mechamism because many factors play a role and spacing can
interfere badly. The decision about the number of lines to hang is to some extend
controllable but there are cases when you need to steer it (for instance by
scaling an image). In the next overviews we see the result of the following
somewhat complex setup:

\typebuffer[three]

The \type {step} parameter controls how we fill up the space when we need to
progress beyond it for instance because another float shows up or because we
issue a \type {\flushsidefloats}. Its value can be \type {big}, \type {medium} or
\type {small} and defaults to \type {small} which gives of enough precision. The
\type {sidethreshold} parameter controls the number of lines that we hang around
the float. Here we only show the consequence of the the threshold. A larger
threshold result in mode whitespace below the side float. You can zoom in to see
what happens at the bottom of the float (or run the examples yourself).

\def\ShowSample#1%
  {\framed
     [background=color,backgroundcolor=white,offset=overlay]
     {\scale
        [width=\dimexpr(\textwidth-2\emwidth)/3\relax]
        {\typesetbuffer[three][page=#1]}}}

\startplacefigure[title={The working of default step and side threshold (no whitespace.},reference=fig:side:three:1]
    \startcombination[3*3]
        {\ShowSample {1}} {} {\ShowSample {3}} {} {\ShowSample {5}} {}
        {\ShowSample {7}} {} {\ShowSample {9}} {} {\ShowSample {9}} {}
        {\ShowSample{11}} {} {\ShowSample{13}} {} {\ShowSample{15}} {}
    \stopcombination
\stopplacefigure

\startplacefigure[title={The working of default step and side threshold (whitespace).},reference=fig:side:three:2]
    \startcombination[3*3]
        {\ShowSample {2}} {} {\ShowSample {4}} {} {\ShowSample {6}} {}
        {\ShowSample {8}} {} {\ShowSample{10}} {} {\ShowSample{12}} {}
        {\ShowSample{12}} {} {\ShowSample{14}} {} {\ShowSample{15}} {}
    \stopcombination
\stopplacefigure

\stopchapter

\stopcomponent
