2

This is a follow-up question to a previous ConTeXt solution. That solution dealt with wrapped figures in a ConTeXt document generated from Pandoc Markdown.

without short caption

Now, I would like to extend that solution to allow for a short caption below a wrapped figure. Moreover, I would like to have the short caption typeset differently, say small-sized bold sans-serif.

Below is a minimal working example that shows how the layout of the original solution gets messed up when adding the short caption text. What do I need to change to the description definition to allow for short captions under wrapped figures?

\setuptolerance[horizontal, tolerant, stretch]

\setuppapersize [A4][A4]
\setuplayout    [width=middle,  backspace=1.5in, cutspace=1.5in,
                 height=middle, topspace=0.75in, bottomspace=0.75in]

\setuppagenumbering[location={footer,center}]

% Inter-paragraph spacing
\setupwhitespace[medium]

% Break at hyphens
\setbreakpoints[compound]

\setupexternalfigures[location=default]

% Remaining code is for descriptions with a left floating figure
% https://tex.stackexchange.com/a/133372/26348

\startsetups placefigure
  \setupexternalfigure
    [wfactor=fit]
\stopsetups

% Floats do not have "before=" nor a setup key
\appendtoks \setups{placefigure} \to \everyinsidefloat

\definemeasure[pageheight][\dimexpr(\pagegoal-\pagetotal-2\lineheight)]

\define[1]\startdescription{
   \setbox\scratchbox\vbox{\setupexternalfigure[width=4cm]#1}%
   \ifdim\ht\scratchbox>\dimexpr\measure{pageheight}\relax
      \page
   \fi
   \startplacefigure[location={left,high,none}]
     \box\scratchbox
   \stopplacefigure
   }

\define\stopdescription{\endgraf}


\starttext
\input douglas.tex

\startdescription{{\externalfigure[cow]}Short caption}
  \input linden.tex
\stopdescription

\input bryson.tex
\stoptext

with short caption

2 Answers2

4

The standard way to place a caption on a wrapped figure is as follows:

\setupexternalfigures[location={local,global,default}]
\starttext

\startplacefigure
    [
      title={A short caption}, 
      location={left, nonumber},
    ]
    \externalfigure[cow][width=2cm]
\stopplacefigure

\input knuth

\stoptext

which gives:

solution

If you want to use this in an automated way with Pandoc, one option is to redefine the \startdescription macro as follows:

\define[1]\startdescription
  {\dostartdescription#1\dostopdescription}

\def\dostartdescription#1#2\dostopdescription
  {\setbox\scratchbox\vbox{\setupexternalfigure[width=4cm]#1}%
   \ifdim\ht\scratchbox>\dimexpr\measure{pageheight}\relax
      \page
   \fi
   \startplacefigure[location={left,high,nonumber}, style=\ss\bfxx\setupinterlinespace, title={#2}]
     \box\scratchbox
   \stopplacefigure
   }

\define\stopdescription{\endgraf}

which works correctly with the example posted in the question.

However, I am not convinced that this is the right approach to this problem. Personally, I find it easier to preprocess the markdown input. See this blog post for my views.

Aditya
  • 62,301
1

The accepted answer can be still improved upon

The height of the wrapped text is off by one line, or stated differently, the space below the image is too big. This happens independently of whether a caption is present or not. Here is an even more dramatic example made using the same code:

extra linebreak

I think, I also found a reason why, over at ConTeXtGarden:

Images at the beginning of a paragraph

Using \externalfigure[...] at the beginning of a paragraph results in a line break after the image. This is because \externalfigure is a \vbox. > When a \vbox is encountered at (what appears to be) the beginning of a paragraph, vertical mode is maintained. To prevent this, add \dontleavehmode before \externalfigure, like this:

\dontleavehmode
\externalfigure[...] ... first line ...

The problem now is that —despite many desperate attempts— I am not succeeding at integrating this \dontleavehmode in the code of the accepted answer.

Edit: Improved solution with reduced spacing under the caption

The code referred to in Aditya's comment below, correctly reduces the white space under wrapped figure captions. Here is the result for the original example:

improved solution

  • 1
    Add the following code to your preamble. ConTeXt adds structht to the height of the side float while determining the number of lines to hang. This works well under the assumption that the captions are typeset in the same size as the main content. If captions are typeset in a smaller font, then the structht is not needed. – Aditya Nov 14 '13 at 00:37
  • Your code performs wonderfully! With all we have learned here, you should really start to consider wrapping things up and contributing this code to the ConTeXt developers as a new description environment. The only issue which remains is the unfortunate page breaking between section titles and this description environment. I will create a last question out of this and point the other developers in the newsgroup to it. Stay put! – Serge Stroobandt Nov 14 '13 at 10:29