[texhax] sidecap + wrap
Tim Holy
holy at wustl.edu
Tue Oct 28 10:52:00 CET 2008
Hi,
Well, I think I mostly have this figured out on my own. However, my solution
required that I write my own caption-generating macro, which looks like this:
\newcommand{\captiontext}[1]{\refstepcounter{figure}
{\captionfont {\captionlabelfont \figurename~\thefigure: }#1}
}
This works for figures, but is there a way to make a generic macro that works
for figures, tables, and any other floats? I've spent quite some time looking
through caption.sty for inspiration, but so far I can't get this to work
properly.
Best,
--Tim
On Thursday 16 October 2008, Tim Holy wrote:
> 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
> _______________________________________________
> TeX FAQ: http://www.tex.ac.uk/faq
> Mailing list archives: http://tug.org/pipermail/texhax/
> More links: http://tug.org/begin.html
>
> Automated subscription management:
http://tug.org/mailman/listinfo/texhax
> Human mailing list managers: postmaster at tug.org
More information about the texhax
mailing list