diff options
Diffstat (limited to 'doc/context/sources/general/manuals/details/details-floatingaround.tex')
-rw-r--r-- | doc/context/sources/general/manuals/details/details-floatingaround.tex | 1485 |
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 |