There are really too many conflicting use cases around balancing and multi-columns :-( and too little support from TeX doesn't help either.
Analysing this request, it is clear that the expectation is that all three columns will look identical. Unfortunately that is not the use case that multicol*
implements (and if it is the case that there has been a buggy version 1.8f that actually did this isn't really going to change this).
The use case that multicol*
implements is the following:
- each column is fill until we reach the bottom of the page
- then we start a new columns
- the final column is filled with white space at the bottom, so that this "incomplete" column is not spread out.
This is modeled after the way \twocolumn
works or how LaTeX finishes a document (or handles a \newpage
). So what you get is

which is "correct" as essentially a \vfill
is added at the bottom. Now given the fact that the column already contains a \vfill
we get equal strength and thus the word Answer ands up in the middle.
Now one can argue about whether or not this should be a \vfill
or only a \vfil
(and perhaps the latter is more appropriate as that is also what LaTeX uses) but fact is that multicol
was using that double strength \vfill
since multicol*
got introduced.
So let's change that for the moment by replacing an internal definition like this:
\renewcommand\vfillmaxdepth{\vskip 0pt plus 1fil minus \maxdepth}
(that has normally "fill" inside). So what does this gives us?

Hmmmm, so not quite right either. Do you see why?
well, the problem is that the 3 columns are not identical. The last column is ending an enumerate
environment and that adds extra vertical space, that we can nicely see above. The reason that there isn't a similar white space is at the top of the first column is that multicol
suppresses such white space at the beginning as that is a usual use case (again you see that there are judgement calls and one oculd have a case where you don't want to have this supressed).
So how to we get rid of this extra space at the end?
Not easy as it turns out. Of course you can figure out what the parameter is that is used here and set it to zero, but a) that parameter is shared among all the "display environments" in LaTeX and b) it is not enough.
So lets try
\vskip-\lastskip % not really LaTeX but there you are
just after \end{enumerate}
.
Gets us nearly there, but still not correct as we get

I overlayed a few xxxx
es so that it is easier to se what's going on. So why is the text in the last column still higher then in the others? The reason is that there isn't any space at the bottom in the first two columns but there is some in the last. We canceled it out with the above command but it is still a space only first a positive one and then a negative one.
But the issue is that any such space means that the depth of the last column is essentially ignored, so in the first two columns the bottom is at the baseline of the word "Answer" and the \underline
is actually below the bottom of the column (we have a depth) whereas in the last column the bottom is where the printed material ends, ie we have no depth and all of the material is within the column.
So what one really needs after the \end{enumerate}
is something like
\vskip-\lastskip % drop the extra space from enumerate
\vskip-\prevdepth % back up by the depth of the last lin
only then you get

Now this isn't quite the way it should be and if you replace multicol*
with multicol
then you will notice that that the above is needed then (as no \vfill
is added at the end of the last column) but that it doesn't work either and you end up with

(again with xxxx overlayed) so the last column is off by this \prevdepth
amount.
Now, that I guess is a bug (in version 1.8i) and I fear I need to have a very deep look at this ... and I have many more before ... \prevdepth
handling is a nightmare as it seems.
Update
I updated multicol
to support this use case directly as I think this can be done without harming other scenarios. Basic approach is
- at
\end{multicols*}
firstly back up by \lastskip
(if there is space, from say an environment ending, we don't really need that)
- then back up by
\prevdepth
(so that we are at the baseline of the last box if there was one)
- then insert a
\vfil
(one l) so that by default the column is set ragged.
Now if there if a \fill
inside the column it will align nicely at the bottom (unless there was more than one vertical space because we only removed the last).
If the user really wants a specific space at the end \vspace*
will do that for him.
The full approach is a little bit more complicated, which is why this needs a little more testing, but if all works out well it will show up in v1.8j.