tags:

views:

55

answers:

1

I'm typesetting a book with LaTeX. The text design includes pull quotes, which are supposed to look something like this:

Chicken chicken chicken chicken  -------------
chicken chicken chicken chicken     CHICKEN
chicken chicken chicken chicken     CHICKEN
chicken chicken chicken chicken  -------------
chicken chicken chicken chicken chicken chicken

So, wrapfig.sty seems like it has the basic mechanism I need, and I just need to define an environment that does the horizontal rules, centering, and larger type. The problem is that wrapfigure doesn't seem to want to be nested in an environment definition. If I have this in my text body it works

\begin{wrapfigure}{o}{2in}
\large chicken chicken
\end{wrapfigure}

but if I do this in the prologue

\newenvironment{pullquote}
  {\begin{wrapfigure}{o}{2in}\large}
  {\end{wrapfigure}}

and then I have

\begin{pullquote}
chicken chicken
\end{pullquote}

I get this error message:

Package wrapfig Warning: Collision between wrapping environments ...

the pull quote is typeset several paragraphs below where I want it (at the approximate location of the next pull quote, it looks like, or else at the end of the document) and the body text doesn't get wrapped around the pull quote. What gives? How do I make this work?

+1  A: 

I don't have full understanding of it, but I suspect it's because wrapfigure is itself a wrapper around figure float environment.

I think I found a solution/workaround here: http://texblog.net/latex-archive/plaintex/expandafter/

I think this code gets what you want:

\documentclass{article}
\usepackage{wrapfig}
\raggedright
\expandafter\def\expandafter\wrapfigure\expandafter{\wrapfigure{o}{2in}\large\raggedright}

\begin{document}

chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken
\begin{wrapfigure}
CHICKEN CHICKEN
CHICKEN CHICKEN
\end{wrapfigure}
chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken

\end{document}

The code as used above redefines 'wrapfigure' to have different use, which may not be what you want. You can create new commands for the begin{env} and end{env} which leave 'wrapfigure' itself unaltered, like this:

\documentclass{article}
\usepackage{wrapfig}
\raggedright

\newcommand{\myfigstart}{\begin{wrapfigure}{o}{2in}\large\raggedright}
\newcommand{\myfigend}{\end{wrapfigure}}

\begin{document}

chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken
\myfigstart
CHICKEN CHICKEN CHICKEN CHICKEN
\myfigend
chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken

\end{document}
Herbert Sitz
So what you're saying is, it's the extra goo added by `\newenvironment` (which *is*, ultimately, just defining two new commands) that breaks things? How bizarre. But I can live with the pair-of- `\newcommand` s approach; thanks.
Zack
I did a little experimenting. It turns out to be the extra goo added by `\begin` and `\end` that breaks wrapfigure! You can define a custom wrapfigure environment with `\newenvironment{myfig}` as long as you *use* that environment with the internal commands `\myfig` and `\endmyfig` instead of `\begin{myfig}` and `\end{myfig}`. Still bizarre and (I would argue) a bug in wrapfig.
Zack