% language=us

\environment details-environment

\startcomponent details-captiontrickery

\startchapter[title={Caption handling}]

\start

It's hard to predict what kind of caption placements users want. The amount of
variation if large and thereby any system of specifying them will look complex.
So, examples are the best way to show them.

\startbuffer
\setupcaption
  [figure]
  [location=bottom]
\placefigure
  [left]
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\fakewords{60}{80} \par
\stopbuffer

\typebuffer \getbuffer

\startbuffer
% \setupfloats[grid=yes]
% \setupfloats[grid=tolerant]
\setupcaption
  [figure]
  [location=top]
\placefigure
  [left]
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\fakewords{60}{80} \par
\stopbuffer

\typebuffer \getbuffer

In this document we typeset on a grid. For more complex cases and when a document
is processed without any user intervention, this is often a bad idea because the
snapper can decide to make sure that there is enough space above and below an
element. You can however influence the snapper explicitly:

\startbuffer
\setupcaption
  [figure]
  [location=top]
\placefigure
  [left,line]
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\fakewords{60}{80} \par
\stopbuffer

\typebuffer \getbuffer

Normally a side float plus caption has a normalized (strut) depth while also
top skip gets applied. When one of the grid related options \type {height}, \type
{line}, \type {depth}, \type {grid} or \type {halfline} is given the top skip
correction is removed. The \type {grid} option removes the depth too. The \type
{grid} option removes the depth while the \type {height} and \type {depth}
options adds an extra amount of strut depth. The \type {depth} option also adds a
line and \type {halfline} removes a line but adds strut height. Indeed this sounds
complicated so best play with it a bit.

Keep in mind that the snapper plays safe and therefore tends to add more space when
needed. You can set a grid parameter that controls it:

\starttyping
\setupfloats[grid=tolerant]
\stoptyping

Currently this only applies to side floats but in the future we might support it
for regular floats too.

\startbuffer
\setupcaption
  [figure]
  [width=4cm,align=flushright,location={left,high}]
\placefigure
  [left]
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\fakewords{60}{80} \par
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupcaption
  [figure]
  [width=4cm,align=flushright,location={high,lefthanging}]
\placefigure
  [left]
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\fakewords{60}{80} \par
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupcaption
  [figure]
  [width=4cm,align=flushleft,location={high,righthanging}]
\placefigure
  [right]
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\fakewords{60}{80} \par
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupcaption
  [figure]
  [width=4cm,align=flushleft,location={high,rightmargin}]
\placefigure
  [right]
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\fakewords{60}{80} \par
\stopbuffer

\typebuffer \getbuffer

The location of a caption is determined by the keywords \type {top}, \type
{bottom} and for the side captions \type {high}, \type {middle}, \type {low},
either or not in combination with \type {left}, \type {right}, \type
{leftmargin}, \type {rightmargin}, {lefthanging} or \type {righthanging}.

The next series of examples shows the regular (non||side) floats.

\startbuffer
\setupcaption
  [figure]
  [location={high,left}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupcaption
  [figure]
  [width=4cm,align=flushright,location={high,left}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupcaption
  [figure]
  [width=4cm,align=flushright,location={middle,left}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupcaption
  [figure]
  [width=4cm,align=flushright,location={low,left}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\startbuffer
\setupfloat
  [figure]
  [location=right]
\setupcaption
  [figure]
  [width=4cm,align=flushright,location=high]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupfloat
  [figure]
  [location=right]
\setupcaption
  [figure]
  [width=4cm,align=flushright,location={high,left}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}

\setupfloat
  [figure]
  [location=left]
\setupcaption
  [figure]
  [width=4cm,align=flushleft, location={high,left}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupfloat
  [figure]
  [location=middle]
\setupcaption
  [figure]
  [width=4cm,align=flushright, location={high,lefthanging}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupfloat
  [figure]
  [location=middle]
\setupcaption
  [figure]
  [width=4cm,align=flushleft,  location={high,righthanging}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupfloat
  [figure]
  [location=right]
\setupcaption
  [figure]
  [width=4cm,align=flushleft, location={high,rightmargin}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupfloat
  [figure]
  [location=left]
\setupcaption
  [figure]
  [width=4cm,align=flushright,location={high,leftmargin}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupfloat
  [figure]
  [location=middle]
\setupcaption
  [figure]
  [width=4cm,align=flushright,location={high,outermargin}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

\startbuffer
\setupfloat
  [figure]
  [location=middle]
\setupcaption
  [figure]
  [width=4cm,align=flushleft, location={high,innermargin}]
\placefigure
  {}{\externalfigure[dummy][lines=2,width=4cm]}
\stopbuffer

\typebuffer \getbuffer

The \type {innermargin} and \type {outermargin} are special cases. They adapt to
the kind of page.

\page \stop

\stopchapter

\stopcomponent
