summaryrefslogtreecommitdiff
path: root/doc/context/sources/general/manuals/details/details-floatingaround.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/context/sources/general/manuals/details/details-floatingaround.tex')
-rw-r--r--doc/context/sources/general/manuals/details/details-floatingaround.tex1485
1 files changed, 1485 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/details/details-floatingaround.tex b/doc/context/sources/general/manuals/details/details-floatingaround.tex
new file mode 100644
index 000000000..91d853098
--- /dev/null
+++ b/doc/context/sources/general/manuals/details/details-floatingaround.tex
@@ -0,0 +1,1485 @@
+% language=uk
+
+\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