% language=us % todo: \setlayeranchored[text-1]{HELLO WORLD} \environment details-environment \startcomponent details-finetuningfloats \startchapter[title={Finetuning graphics}] In this chapter we will discuss a few more tricks to control float placement. This control is needed if you want to typeset documents in a semi desk top publishing way. When you combine technical graphics, you may wish to align the content optically. This can be done with the \type {offset} command. We will demonstrate this with a couple of \METAPOST\ graphics: \startbuffer \startreusableMPgraphic{alpha} fill fullsquare xyscaled( 2cm, 2cm) withcolor \MPcolor{red} ; fill unitsquare xyscaled(+.5cm,+.5cm) withcolor \MPcolor{gray} ; \stopreusableMPgraphic \startreusableMPgraphic{beta} fill fullsquare xyscaled( 2cm, 2cm) withcolor \MPcolor{red} ; fill unitsquare xyscaled(+.5cm,-.5cm) withcolor \MPcolor{gray} ; \stopreusableMPgraphic \startreusableMPgraphic{gamma} fill fullsquare xyscaled( 2cm, 2cm) withcolor \MPcolor{red} ; fill unitsquare xyscaled(-.5cm,-.5cm) withcolor \MPcolor{gray} ; \stopreusableMPgraphic \startuseMPgraphic{delta} fill fullsquare xyscaled( 2cm, 2cm) withcolor \MPcolor{red} ; fill unitsquare xyscaled(-.5cm,+.5cm) withcolor \MPcolor{gray} ; \stopuseMPgraphic \stopbuffer \typebuffer \getbuffer \startbuffer \startcombination[2*2] {\reuseMPgraphic{alpha}} {alpha} {\reuseMPgraphic {beta}} {beta} {\reuseMPgraphic{gamma}} {gamma} {\reuseMPgraphic{delta}} {delta} \stopcombination \stopbuffer \typebuffer In \in {figure} [fig:offset-1] we place these graphics in a \type {2*2} grid. As you can see, the centers don't align well. \placefigure[here][fig:offset-1]{}{\getbuffer} In \in {figure} [fig:offset-2] the centers of the graphic align well. This is accomplished by adding some space around the graphics. \startbuffer \startcombination[2*2] {\ruledhbox{\offset[rightoffset=1cm] {\reuseMPgraphic{alpha}}}} {alpha} {\ruledhbox{\offset[bottomoffset=.5cm]{\reuseMPgraphic {beta}}}} {beta} {\ruledhbox{\offset[bottomoffset=.5cm]{\reuseMPgraphic{gamma}}}} {gamma} {\ruledhbox{\offset[leftoffset=1cm] {\reuseMPgraphic{delta}}}} {delta} \stopcombination \stopbuffer \placefigure[here][fig:offset-2]{}{\getbuffer} \starttyping \startcombination[2*2] {\offset[rightoffset=1cm] {\reuseMPgraphic{alpha}}} {alpha} {\offset[bottomoffset=.5cm]{\reuseMPgraphic {beta}}} {beta} {\offset[bottomoffset=.5cm]{\reuseMPgraphic{gamma}}} {gamma} {\offset[leftoffset=1cm] {\reuseMPgraphic{delta}}} {delta} \stopcombination \stoptyping If we align the centers vertically, as demonstrated in \in {figure} [fig:offset-2] we can stick to a few bottom offsets. \starttyping \startcombination[4*1] {\reuseMPgraphic{alpha}} {alpha} {\offset[bottomoffset=.5cm]{\reuseMPgraphic {beta}}} {beta} {\offset[bottomoffset=.5cm]{\reuseMPgraphic{gamma}}} {gamma} {\reuseMPgraphic{delta}} {delta} \stopcombination \stoptyping \startbuffer \startcombination[4*1] {\ruledhbox {\reuseMPgraphic{alpha}}} {alpha} {\ruledhbox{\offset[bottomoffset=.5cm]{\reuseMPgraphic {beta}}}} {beta} {\ruledhbox{\offset[bottomoffset=.5cm]{\reuseMPgraphic{gamma}}}} {gamma} {\ruledhbox {\reuseMPgraphic{delta}}} {delta} \stopcombination \stopbuffer \placefigure[here][fig:offset-3]{}{\getbuffer} These examples demonstrate that the dimensions change with the offset. You can retain the dimensions but still align them by using the \type {x} and \type {y} parameter. This kind of manipulations will often result in a ugly spacing because the placement macros handle on the original dimensions. \in {Figure} [fig:offset-4] demonstrates this. \starttyping \startcombination[4*1] {\reuseMPgraphic{alpha}} {alpha} {\offset[y=-.5cm]{\reuseMPgraphic {beta}}} {beta} {\offset[y=-.5cm]{\reuseMPgraphic{gamma}}} {gamma} {\reuseMPgraphic{delta}} {delta} \stopcombination \stoptyping \startbuffer \startcombination[4*1] {\ruledhbox {\reuseMPgraphic{alpha}}} {alpha} {\ruledhbox{\offset[y=-.5cm]{\reuseMPgraphic {beta}}}} {beta} {\ruledhbox{\offset[y=-.5cm]{\reuseMPgraphic{gamma}}}} {gamma} {\ruledhbox {\reuseMPgraphic{delta}}} {delta} \stopcombination \stopbuffer \placefigure[here][fig:offset-4]{}{\getbuffer} In the previous chapter we demonstrated how a side float can be moved up or down by providing a placement directive or by preceding the placement with \type {\movesidefloat}. Such a move can be used to align a graphic with particular line of text. This command can also be used for alignment purposes similar to the \type {\offset} command. We will demonstrate this with the following graphics. \startbuffer \startreusableMPgraphic{gnu} fill fullsquare xyscaled( 4cm, 1cm) withcolor \MPcolor{red} ; fill unitsquare xyscaled(-1cm,.5cm) shifted (0,-.25cm) withcolor \MPcolor{gray} ; \stopreusableMPgraphic \startreusableMPgraphic{gnat} fill fullsquare xyscaled( 4cm, 1cm) withcolor \MPcolor{red} ; fill unitsquare xyscaled(+1cm,.5cm) shifted (0,-.25cm) withcolor \MPcolor{gray} ; \stopreusableMPgraphic \stopbuffer \typebuffer \getbuffer In the next two examples we shift the \type {gnu} and \type {gnat} graphics horizontally in order to get them aligned. The move does not change the dimensions of the float, but they do influence the paragraph shape. \startbuffer[a] \movesidefloat [x=.5cm] \placefigure [left,none] {} {\reuseMPgraphic{gnu}} \stopbuffer \startbuffer[b] \movesidefloat [x=-.5cm] \placefigure [left,none] {} {\reuseMPgraphic{gnat}} \stopbuffer \typebuffer[a,b] \getbuffer[a] \fakewords{50}{100} \getbuffer[b] \fakewords{50}{100} \blank It is possible to shift vertically by setting \type {y}, but this is often a bad idea and definitely may spoil alignment of graphics to the grid. If you have to revert to this trick, you are probably working in document screw||up mode. This is why in grid mode, we automatically round to an equal number of lines. If you know what text you're dealing with and also can be sure about the height of a graphic, you can trick \CONTEXT\ to ignore the dimensions of a graphic. Here we use the graphic: \startbuffer \startreusableMPgraphic{gnome} fill fullsquare xyscaled(2cm, 1cm) withcolor \MPcolor{red} ; fill fullsquare xyscaled(1cm,.5cm) withcolor \MPcolor{gray} ; \stopreusableMPgraphic \stopbuffer \typebuffer \getbuffer \startbuffer \placefigure[leftmargin,none,reset]{}{\reuseMPgraphic{gnome}} \stopbuffer \typebuffer \getbuffer The graphic is moved into the margin (\type {leftmargin}), has no caption (\type {none}), and all kind of tricky housekeeping is reset (\type {reset}). \startbuffer \placefigure[left,none,high,low]{}{\reuseMPgraphic{gnome}} \stopbuffer \getbuffer Now the next graphic is not influenced by the previous one, so we can place them close to each other. Use these tricks with care, especially if your document source is reused and the typeset products are not carefully checked. \typebuffer When \CONTEXT\ tries to determine if a float fits, it makes a couple of assumptions, for instance that the available room equals the text height minus the height of the text so far. You can slightly influence the way these values are interpreted by setting the calculation method. You can set the methods as follows: \starttyping \setupfloats[textmethod=0,sidemethod=1] \stoptyping Method~0 just looks at the raw dimensions, while method~1 lessens the maximum text height by one percent, thereby playing safe. Method~2 takes a window of 1~point. This may lead to better decisions since we may run into rounding errors of several scaled points (which is small but troublesome). Method~2 is well suited when typesetting on a grid, because there everything has to fit in a rounded number of lines, which leaves no room for rounding errors. \starttabulate[||c|c|] \NC \bf grid mode \NC \bf yes \NC \bf no \NC \NR \NC \type{sidemethod} \NC \type{2} \NC \type{1} \NC \NR \NC \type{textmethod} \NC \type{2} \NC \type{0} \NC \NR \stoptabulate \startusableMPgraphic{demo-1}{color} path p ; p := fullsquare xyscaled (3cm,2LineHeight) ; fill p withcolor \MPvar{color} ; \stopusableMPgraphic \startusableMPgraphic{demo-2}{color,morecolor} path p ; p := fullsquare xyscaled (6cm,4LineHeight) ; path q ; q := fullsquare xyscaled (3cm,2LineHeight) ; fill p withcolor \MPvar{color} ; setbounds currentpicture to q ; fill q withcolor \MPcolor{morecolor} ; \stopusableMPgraphic As you may know by now, we can use the directives \type {high}, \type {low}, \type {height}, \type {depth} and \type {line} to influence the spacing around a side float. A real tight spacing can be achieved with \type {fit}. \starttyping \placefigure[left,fit,none]{}{some graphic} \stoptyping \placefigure[left,fit,none]{}{\useMPgraphic{demo-1}{color=red}} This kind of placements only make sense in special situations, because normally you don't want the graphic to touch the text. If you think that this is all a user may want, you're wrong. It is not imaginary that graphics have small pieces sticking out and|/|or lots of white space as part of their design. In that case, the bounding box can be set to a smaller size. \placefigure [left,fit,none] {} {\setlayer [graphics] {\useMPgraphic{demo-2}{color=red,morecolor=tgreen}}} Now, when handling a side float, \CONTEXT\ first places the float, and then starts with typesetting the paragraph, cleverly avoiding the graphic. However, when the graphic is virtually larger than its known size, it may cover part of the preceding paragraph. How come that the graphic starting this paragraph does not do that? It is because we explicitly moved it to the background. This involves some preparation. At the document level, we define a layer called \type {graphic}. \starttyping \definelayer[graphics][position=yes] \stoptyping The position directive tells \CONTEXT\ that it should honour the position of the graphic. Next we must make sure that this layer is placed. \starttyping \setupbackgounds[page][background=graphics] \stoptyping Now we're ready to move graphics to this layer: \starttyping \placefigure [left,fit,none] {}{\setlayer[graphics]{graphic}} \stoptyping It's now a small step to more advanced movements. Say that you want to move the graphic a little bit to the left. In that case you can tell the layer placement to do so. \starttyping \placefigure [left,fit,none]{}{\setlayer[graphics][hoffset=-12pt]{graphic}} \stoptyping From this you can deduce that there is also a movement in the vertical direction using \type {voffset}. In addition you can anchor the graphic using the \type {location} parameter and provide offsets. \placefigure [left,fit,none] {} {\setlayer [graphics][hoffset=-12pt] {\useMPgraphic{demo-2}{color=red,morecolor=tgreen}}} As soon as you run into situations where float placement is to be consistently enforced, you will feel the need for dedicate placement macros. For example: \startbuffer \definefloat [somefloat] [figure] \setupfloat [somefloat] [sidespaceafter=, sidespacebefore=, default={left,none}] \stopbuffer \typebuffer \getbuffer Instead of resetting the side spacing, we could have default to \type {high,low}, but this way we can overload the default placement and still get zero spacing. Throughout this manual we discuss features related to overlays and layers. These permit you to move content around in ways that either or not depend on the text flow. We have now come to another trick based on these mechanisms: bleeding. When printing a document, you need to take into account that when graphics go beyond the page boundary, you need to compensate for inaccuracies in cutting the pages. Such graphics are called bleeding graphics and the amount of bleed is often a few millimeters. The best way to handle such graphics is to use the correct dimensions and play with the edge widths and distances in combination with backspace and cut space. In a properly set up layout and by using a well designed set of predefined graphic placements, you can handle this quite well. A bleeding figure can be defined as follows: \startbuffer \definefloat [edgefigure] [figure] \setupfloat [edgefigure] [default={inner,height,high,low,none}, maxwidth=4cm] \defineexternalfigure [edgefigure] [width=\dimexpr\backspace+4cm-1mm\relax, lines=4] \stopbuffer \typebuffer \getbuffer The default placement is pre|-|configured to have no additional vertical space and align on the height of a line (this is default behaviour so the \type {height} key is redundant here. The 1mm in the previous definition simulates what happens when a page is cut off slightly wrong: we get an annoying gap. \startbuffer[a] \placeedgefigure {} {\externalfigure[hacker][edgefigure]} \stopbuffer \typebuffer[a] \getbuffer[a] \fakewords{50}{100} One of the nice things about \TEX\ is that you can fine tune dimensions pretty well. So, instead of the previous placement, which turns out rather ugly, we can come up with a better one: \startbuffer \setupfloat [edgefigure] [default={inner,height,high,low,none}, maxwidth=4cm, margin=\strutdepth] \defineexternalfigure [edgefigure] [width=\dimexpr\backspace+4cm+2mm\relax, height=\dimexpr3\lineheight+\strutheight\relax] \stopbuffer \typebuffer \getbuffer This time we take no risk and add 2mm to the dimensions so that we can be sure that the edge of the graphic falls outside the page boundary. \getbuffer[a] \fakewords{50}{100} The \CONTEXT\ resourse library modules provide means to report back the dimensions of graphics used in a document, so that you can develop (tune) them with the proper dimensions. In practice a slightly wider than normal graphic (scaling it horizontally a few millimeters more) does not harm the visual appearance that much, so adapting a graphic to this kind of bleeding is not really needed. In addition to this (rather natural) way of adding bleed to a graphic, you can apply the \type {\bleed} macro. In the previously discussed method the figure placement mechanisms work with the real dimensions. The \type {bleed} macro is using scaling in a different way: from the perspective of \CONTEXT\ the graphic remains its original dimensions and the figure placement mechanisms will act accordingly. We will give a couple of examples of using this macro. Permitted bleeding locations are \type {l}, \type {r}, \type {t}, \type {b}, \type {lr}, \type {bl}, \type {br}, \type {tl} and \type {tr}. \startbuffer \placesomefloat [left,none,fit] {} {\setupbleeding[offset=5mm]% \bleed[width=5cm,height=1cm,location=l] {\externalfigure[mill][bleed]}} \stopbuffer \typebuffer \getbuffer \fakewords{50}{100} \startbuffer \placesomefloat [left,none,fit] {} {\setupbleeding[offset=2mm]% \bleed[width=5cm,height=1cm,location=l] {\externalfigure[mill][bleed]}} \stopbuffer \typebuffer \getbuffer \fakewords{50}{100} The amount of bleeding depends on the postprocessing. In the previous paragraph we used a bleed offset of 5mm, and here we used 2mm. Because the graphic is scaled in order to match the bleed, it will be slightly distorted. With small values this will go unnoticed. You can set the offset with: \starttyping \setupbleeding[offset=5mm] \stoptyping Bleeding itself is accomplished by the \type {\bleed} macro as in: \starttyping \bleed [width=5cm,height=1cm,location=l] {\externalfigure[mill][width=\bleedwidth,height=\bleedheight]} \stoptyping It is kind of awkward to pass those two dimensions so here is a shorter way of doing the same: \starttyping \bleed [width=5cm,height=1cm,location=l] {\externalfigure[mill][bleed]} \stoptyping In fact, this uses the following definition: \starttyping \defineexternalfigure[bleed][width=\bleedwidth,height=\bleedheight] \stoptyping You can influence the scaling of a graphic by setting the \type {stretch} parameters. The location parameter determines the direction of the stretch: \type {l}~(left), \type {r}~(right), \type {t}~(top), \type {b}~(bottom) or a combination of these. We will now combine the previous example code with this knowledge. \startbuffer \placefigure [left] {} {\bleed [stretch=no,voffset=0pt,hoffset=1cm] {\externalfigure[detcow][bleed]}} \stopbuffer \typebuffer \getbuffer \fakewords {100} {150} \startbuffer \placefigure [left] {} {\bleed [width=5cm,height=3cm,location=l] {\externalfigure[detcow][bleed]}} \stopbuffer \typebuffer \getbuffer \fakewords {100} {150} \startbuffer \placefigure [right] {} {\bleed [width=5cm,height=3cm,location=r] {\externalfigure[detcow][bleed]}} \stopbuffer \typebuffer \getbuffer \fakewords {100} {150} You can combine this feature with layers. We will now show a few applications which may look like magic at first glance, but will become natural to your repertoire once you have played with them. The next example moves the graphic to a layer associated with the (current) page. \startbuffer \placefigure [right,none] {} {\setlayer [graphics] {\bleed [width=5cm,height=3cm,location=rb] {\externalfigure[detcow][bleed]}}} \stopbuffer \typebuffer \getbuffer \fakewords {100} {150} You can also predefine locations where graphics (or other content) needs to be anchored. A direct call to anchor looks as follows: \starttyping \placefigure [left,none] {} {\anchor [text-1] [location=lt,hoffset=max,voffset=max] [width=3cm,height=3cm,frame=on]% {\externalfigure[detcow][width=5cm,frame=on]}} \stoptyping This will anchor a graphic in one of the text layers, but at the cost of specifying this in the document source. One way around this is to predefine anchors. \startbuffer \defineanchor[rightbottom][text-1][location=lt,hoffset=max,voffset=max] \defineanchor[righttop] [text-1][location=lb,hoffset=max] \defineanchor[leftbottom] [text-1][location=rt,voffset=max] \defineanchor[lefttop] [text-1][location=rb] \stopbuffer \startbuffer \defineanchor[rightbottom][text-1][preset=rightbottom] \defineanchor[righttop] [text-1][preset=righttop] \defineanchor[leftbottom] [text-1][preset=leftbottom] \defineanchor[lefttop] [text-1][preset=lefttop] \stopbuffer \typebuffer \getbuffer We will apply this to a predefined float type. \startbuffer \definefloat[myfigure][figure] \setupfloat[myfigure][sidespaceafter=,sidespacebefore=] \stopbuffer \typebuffer \getbuffer Our previous example can now be reduced to: \startbuffer \placemyfigure [left,none] {} {\anchor[rightbottom] {\externalfigure[detcow][width=5cm,frame=on]}} \stopbuffer \typebuffer \getbuffer \fakewords {100} {150} You can still specify dimensions and anchors can be combined with bleeding. Of course this kind of mixed usage means that you need to have some feeling for what these mechanisms do. \startbuffer \placemyfigure [left,none] {} {\anchor [rightbottom] [width=5cm,height=3cm,frame=on] {\bleed [width=5cm,height=3cm,location=l] {\externalfigure[detcow][bleed]}}} \stopbuffer \typebuffer \getbuffer \fakewords {100} {150} \startbuffer \placemyfigure [right,none] {} {\anchor [rightbottom] [width=5cm,height=3cm,frame=on] {\bleed [width=5cm,height=3cm,location=r] {\externalfigure[detcow][bleed]}}} \stopbuffer \typebuffer \getbuffer \fakewords {100} {150} \startbuffer \placemyfigure [left,none] {} {\anchor [lefttop] [width=3cm,height=3cm,frame=on] {\externalfigure[detcow][width=5cm,frame=on]}} \stopbuffer \typebuffer \getbuffer \fakewords {100} {150} \startbuffer \placemyfigure [left,none] {} {\anchor [lefttop] [width=3cm,height=3cm,frame=on] [offset=.5cm] {\externalfigure[detcow][width=5cm,frame=on]}} \stopbuffer \typebuffer \getbuffer \fakewords {100} {150} \blank {\em Todo: parameter specifications of all those macros.} \stopchapter \stopcomponent