[texhax] sidecap + wrap

Tim Holy holy at wustl.edu
Fri Oct 17 00:35:45 CEST 2008


Hello,

I've been a LaTeX user for some time, but have never delved into hacking it 
before, and I'm quite a novice; please pardon my ignorance.

I'm writing a grant application with very limited space. To help save space, I 
want the figure captions to be as space efficient as possible. Since my 
captions tend to be long (they explain a lot of details about the figures), 
what I want is something like "sidecap", but that when the caption reaches 
the bottom of the figure, it then fills the entire available width. 
Schematically, if "F" indicates region occupied by figure, and "C" indicates 
region occupied by caption, then standard figures are like this:

        FFFFF
        FFFFF
        FFFFF
CCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCC

(this email may be best viewed with a fixed-width font!) and sidecap gives you 
figures like this:

      CCCCCCCCCCCCCCC
      CCCCCCCCCCCCCCC
      CCCCCCCCCCCCCCC
FFFFF CCCCCCCCCCCCCCC
FFFFF CCCCCCCCCCCCCCC
FFFFF CCCCCCCCCCCCC

(notice the blank space above the figure, because the caption is bigger than 
the figure) and what I want is this:

FFFFF CCCCCCCCCCCCCCC
FFFFF CCCCCCCCCCCCCCC
FFFFF CCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCC

It turns out that this effect isn't too hard to achieve, but the way I've done 
it requires a lot of manual tweaking; I can't help but think that there must 
be a better way.

Here's the really awful manual method:

\documentclass{article}
\usepackage{graphicx}

\newcount\thisfigindentedlines
\newlength{\thisfigurewidth}
\newlength{\thiscaptionindent}
\newlength{\thisremaininglength}
\newlength{\captionsep}
\setlength{\captionsep}{0.15in}
\newlength{\extravspace}
\setlength{\extravspace}{-0.25in}

\newcommand{\setcaptionlengths}{
\setlength{\thiscaptionindent}{\thisfigurewidth}
\addtolength{\thiscaptionindent}{\captionsep}
\setlength{\thisremaininglength}{\columnwidth}
\addtolength{\thisremaininglength}{-\thiscaptionindent}
}

\begin{document}

This is a test document to see if I can develop a version of side-captioning 
that wraps any extra text around the bottom of a figure.

\def\thisfigureheight{1.25in}
\setlength{\thisfigurewidth}{3.5in}
\setcaptionlengths
\begin{figure}
\includegraphics[height=\thisfigureheight]{gull}\quad
\includegraphics[height=\thisfigureheight]{tiger}
\vspace{-\thisfigureheight}
\vspace{\extravspace}
\caption{
\parshape=10 \thiscaptionindent \thisremaininglength \thiscaptionindent 
\thisremaininglength \thiscaptionindent \thisremaininglength 
\thiscaptionindent \thisremaininglength \thiscaptionindent 
\thisremaininglength \thiscaptionindent \thisremaininglength 
\thiscaptionindent \thisremaininglength \thiscaptionindent 
\thisremaininglength \thiscaptionindent \thisremaininglength 0pt \columnwidth
({\bf A}) A gull. This is a bird. It's a sea bird. You know, one that flies 
out over the ocean. I don't know much about gulls, so I don't know what more 
to say about them. {\bf B} A tiger. They're big. I hear they're friendly, at 
least when they don't intend to eat you. Certainly, they're really strong. 
They like water.
}
\end{figure}

\end{document}



Note the many ways that this solution could be improved:
1. I use the \parshape command with an explicit number of indented lines; but 
this seems silly, because I already have a variable that contains the height 
of the figure. It seems that I should be able to calculate the number of 
lines (from \thisfigureheight and \baselineskip) and then put this in a loop. 
But I'm not having any luck with a construct like this:

\def\parshapecmd{}
\loop\ifnum\thisfigindentedlines>1
  \advance\thisfigindentedlines by -1
  \def\parshapecmd{\parshapecmd \thiscaptionindent \thisremaininglength}
\repeat
\def\parshapecmd{\parshapecmd 0pt \columnwidth}

I just don't know enough TeX to know what's wrong with it.

2. At the end of the \includegraphics commands, it seems that there should be 
some way of knowing "where you are" (i.e., where the "cursor" is) so that you 
know both the height and width of the inserted graphics. That way, the user 
doesn't have to explicitly specify widths and heights.

I'm envisioning that this should be as easy as:

\def\thisfigureheight{1.25in} % needed only because there are 2 images
\begin{figure}
\includegraphics[height=\thisfigureheight]{gull}\quad
\includegraphics[height=\thisfigureheight]{tiger}
\sidecapwrap{
({\bf A}) A gull....
}
\end{figure}

Can anyone offer advice?

Thanks,
--Tim


More information about the texhax mailing list