As mentioned in comments you are printing a document formatted for US letter paper on an A4 page. If you use
\documentclass[11pt,a4paper]{article}
Then it all fits on one page.
Let me show you how to implement this for twocolumn
layouts rather than via the multicol
package. This will fix some of your coding issues.
\documentclass[twocolumn]{article}
\usepackage{wrapfig}
\usepackage{lipsum}
\makeatletter
\newenvironment{pquote}[1][\relax]{%
\ifx#1\relax\def\@mypl{\if@firstcolumn l\else r\fi}%
\else\def\@mypl{#1}\fi%
\wrapfigure[3]{\@mypl}[0.2\columnwidth]{0.4\columnwidth}%
\large\bfseries}{\par\endwrapfigure}
\makeatother
\begin{document}
\lipsum[1]
\begin{pquote}
Lorem ipsum!
\end{pquote}
\lipsum[2-4]
\begin{pquote}
Dolor sit amet!
\end{pquote}
\lipsum[5-8]
\begin{pquote}[r]
Mauris ut est.
\end{pquote}
\lipsum[9]
\end{document}
Your general method of setting pquote
to a variation of wrapfigure
using \begin{wrapfigure}
unfortunately doesn't work, as you will see by making a simple test document with fixed positioning. This has something to do with the way the arguments are processed. Instead use \wrapfigure
with the appropriate arguments, and balacnce it with \endwrapfigure
. Furthermore, the positioning argument needs to expand directly to one of the allowed strings so this should be done via an intermeadiate macro.
Now with twocolumn
we have the test \if@firstcolumn
which can be used to determine the positioning. Unfortunately it is not 100% foolproof, so my definition above provides an optional argument allowing you to force the positioning.
In multicols
things are rather more complicated, and I see no easily accessible variable to do this. Essentially multicol
typesets the material in to one long box and then splits off the correct amount from the top for each column. There are some internal variables keeping count of the column number, but they are not easily accessible. Furthermore multicol
does some balancing of columns, trying split the given typeset material in to a number of boxes of equal height, if the typesetting is to change in the process, then this is more complicated. One symptom of this is that \marginpar
s are not allowed in the multicols
, see the package documentation, whereas in twocolumn
margin pars work (fairly) nicely switiching sides as required.
ADDITION in response to comment:
If you want to use multicols
and are prepared to specify placement then the coding is simpler, but still requires avoiding \begin{wrapfigure}
:
\documentclass{article}
\usepackage{multicol,ragged2e}
\usepackage{wrapfig}
\usepackage{lipsum}
\makeatletter
\newenvironment{pquote}[2]{%
\wrapfigure[#1]{#2}[0.2\columnwidth]{0.4\columnwidth}%
\large\bfseries\Centering}{\par\endwrapfigure}
\makeatother
\begin{document}
\begin{multicols}{2}
\lipsum[1]
\begin{pquote}{4}{l}
Lorem ipsum!
\end{pquote}
\lipsum[2-4]
\begin{pquote}{6}{r}
Dolor sit amet!
\end{pquote}
\lipsum[5-8]
\begin{pquote}{5}{r}
Mauris ut est.
\end{pquote}
\lipsum[9]
\end{multicols}
\end{document}
Best Answer
\vfill\null
after the last line to break.\columnbreak
after\vfill\null
.