2

Background

While implementing Frank Mittelbach's answer, the pdflatex command returned the following warning:

LaTeX Warning: You have requested, on input line 13, version
               `2011/12/20' of package multicol,
               but only version
               `2011/06/27 v1.7a multicolumn formatting (FMi)'
               is available.

Accompanied shortly thereafter by the following error:

Underfull \hbox (badness 10000) in paragraph at lines 199--199
\OT1/cmr/m/n/10 dic-tum gravida mau-

Code

The code is straightforward:

\documentclass{article}
\usepackage{lipsum}
\usepackage{mccolaction}

\newif\ifinlast
\def\columnbreakunlesslast{%
    \docolaction{\typeout{in first column}\inlastfalse}%
                           {\typeout{in middle column}\inlastfalse}%
                           {\typeout{in last  column}\inlasttrue}%
    \unless \ifinlast \columnbreak \fi
 }

\begin{document}

\begin{multicols*}{3}
\section{First}
\lipsum[1-2]

\columnbreakunlesslast

\section{Second}
\lipsum[4-5]
\end{multicols*}

\end{document}

Problem

I tried the following commands:

tlmgr update --self
tlmgr update --list
tlmgr update --all

Each returned with "no updates available".

Question

How do I upgrade the multicols package using TeX Live 2013 on Linux?

closed as off-topic by Werner, Xavier, barbara beeton, Marco Daniel, T. Verron Jul 6 '13 at 16:39

  • This question does not fall within the scope of TeX, LaTeX or related typesetting systems as defined in the help center.
If this question can be reworded to fit the rules in the help center, please edit the question.

  • 1
    The newest version of multicol at CTAN and so in TeX Live is 2011/06/27. Maybe Frank has a newer version on his machine ;-) – Marco Daniel Jul 5 '13 at 22:35
  • 1
  • 4
    The problem seems to have been resolved by a new CTAN upload. As such, it may be of limited use to future visitors who have an updated distribution. – Werner Jul 6 '13 at 15:05
  • 1
    I think that Frank's answer for updating the distribution manually might be useful for anyone who receives a similar LaTeX warning. – Dave Jarvis Jul 6 '13 at 19:23
  • @Werner given that the core LaTeX is only updated ver seldom that is only partially true. – Frank Mittelbach Jul 6 '13 at 20:10
7

Sorry, didn't realize that the SVN version never made it to CTAN. So the correct code for mccolaction.sty that should work for both versions of multicol looks like this:

%
%    \begin{macrocode}
\ProvidesPackage{mccolaction}
          [2013/07/07 v0.9c  column actions for multicolumn formatting (FMi)]
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage{etoolbox}
\RequirePackage{multicol}[2011/06/27]
%    \end{macrocode}
%
%   Determining the current column in multicols is difficult because
%   (in contrast to the twocolumn mode of standard LaTeX) the
%   multicols columns are determined very late in the game and due to
%   the balancing routine it is not known where a piece of text is
%   going to end up at the time the text is typeset. Only afterwards,
%   when everything has be typeset into a single long galley, that
%   galley is split into individual columns (at the very end in a
%   possibly huge set of trials to balance the column material.
%
%   Therefore the approach taken here is to write out a single line
%   into the .aux file whenever a column is finally typeset:
%\begin{verbatim}
% \mc@col@status{<number>}
%\end{verbatim}
%   The number in the argument denotes the different kind of column: 1
%   for left column 2 for any middle column and 3 for the final column.
%
%   We only set this up for the LR typesetting case here, something
%   similar could be done for the RL version:
%    \begin{macrocode}
%
% there has been a code change after 2011/06 that never made it to CTAN
% but only into the SVN repository
% so we need to provide two different versions:
\@ifpackagelater{multicol}{2011/06/28}
{%
\patchcmd{\LR@column@boxes}{\box\count@}%
         {\protected@write\@auxout{}{\string\mc@col@status
              {\ifmc@firstcol 1\else 2\fi}}%
          \mc@firstcolfalse
          \box\count@}%
         {\typeout{juhu!}}{\typeout{oje!}}%
\patchcmd{\LR@column@boxes}{\box\mult@rightbox}%
         {\protected@write\@auxout{}{\string\mc@col@status{3}}%
          \box\mult@rightbox}%
         {\typeout{juhu!}}{\typeout{oje!}}%
}
{%
\patchcmd{\page@sofar}{\box\count@}%
         {\protected@write\@auxout{}{\string\mc@col@status
              {\ifmc@firstcol 1\else 2\fi}}%
          \mc@firstcolfalse
          \box\count@}%
         {\typeout{juhu!}}{\typeout{oje!}}%
\patchcmd{\page@sofar}{\box\mult@rightbox}%
         {\protected@write\@auxout{}{\string\mc@col@status{3}}%
          \box\mult@rightbox}%
         {\typeout{juhu!}}{\typeout{oje!}}%
}
\newif\ifmc@firstcol
\mc@firstcoltrue
%    \end{macrocode}
%
%   Need to reinitiate \verb=\mc@align@columns= as this was let to
%   the old definition of \verb=\LR@column@boxes=.
%
%    \begin{macrocode}
\LRmulticolcolumns

%   Whenever we want to do something that depends on the current
%   column we execute \verb=\docolaction=. This command takes one
%   optional and three mandatory arguments. The mandatory ones denote
%   what to do if this is a ``left'', ``middle'', or ``right'' column
%   and the optional one is simply there to say what to do if we don't
%   know (default is to use the ``left'' column action in that case).
%
%   We use one counter \verb=\mc@col@check@num= to generate us unique
%   label names. Each time we execute \verb=\docolaction= we increment
%   this counter to get a new name.
%    \begin{macrocode}
\newcount\mc@col@check@num
%    \end{macrocode}

%   The generated ``labels'' are named
%   \verb=\mc@col-\the\mc@col@check@num= and they hold as values the
%   numbers 1, 2, or 3 denoting the current column type.

%    \begin{macrocode}
\newcommand\docolaction[4][1]{%
 \global\advance\mc@col@check@num\@ne
 \edef\mc@col@type{\expandafter\ifx
               \csname mc@col-\the\mc@col@check@num\endcsname\relax
                  0\else
                  \csname mc@col-\the\mc@col@check@num\endcsname
               \fi}%
%    \end{macrocode}
%    We prefix with 0 so that an unknown label (that returns
%   \verb=\relax=) will result in case 0
%    \begin{macrocode}
 \ifcase \mc@col@type\relax
%    \end{macrocode}
%    If column is unknown we use the default action or the action
%   denoted by the optional argument (so that arg can take the value
%   1, 2, 3)
%    \begin{macrocode}
     \ifcase #1\or #2\or#3\or#4\fi   % 0 not known use first col as default
  \or
%    \end{macrocode}
%    Otherwise we know (or think we know) that this is a first, middle,
%   or last column:
%    \begin{macrocode}
     #2%  % 1 First col
  \or
     #3%  % 2 any middle col
  \or
     #4%  % 3 last col
  \else
    \ERROR
  \fi
%    \end{macrocode}
%    But how does the column number get associated with our label? We
%   do do this by writing another line into the aux file at this point:
%    \begin{macrocode}
  \edef\next{\write\@auxout
     {\string\mc@set@col@status{mc@col-\the\mc@col@check@num}%
                               {\mc@col@type}}}%
  \next
}
%    \end{macrocode}
%
%   Because of extra data writing to the aux file the aux file will
%   now contain something like the following after the document is
%   processed the first time:
%\begin{verbatim}
%\relax
%\mc@col@status{1}
%\mc@set@col@status{lcol-1}{0}
%\mc@col@status{2}
%\mc@set@col@status{lcol-2}{0}
%\mc@col@status{3}
%\mc@set@col@status{lcol-3}{0}
%\mc@col@status{1}
%\mc@col@status{2}
%\mc@col@status{3}
%\mc@set@col@status{lcol-4}{0}
%\end{verbatim}
%   The \verb=\mc@col@status= line denotes the column type and has been
%   writting out just before corresponding the column box was placed
%   onto the page.
%   The\verb=\mc@set@col@status= lines have been written out as part
%   of shipping the column boxes out, e.g.,
%   \verb=\mc@set@col@status{lcol-1}{0}= was therefore somewhere within
%   the first column as it appears between \verb=\mc@col@status{1}=
%   and  \verb=\mc@col@status{2}=
%   The second argument in that line is the value used in the previous
%   run (or zero if there was no previous run. We can use this to
%   determine if a rerun is necessary.
%
%   Thus with this knowledge we can set things up to get the labels
%   working.
%
%   When the aux file is read in \verb=\mc@col@status= is used to set
%   \verb=\mc@curr@col@status=:
%
%    \begin{macrocode}
\def\mc@col@status#1{\gdef\mc@curr@col@status{#1}}
%    \end{macrocode}

%   And when \verb=\mc@set@col@status= is executed we can simply set
%   up the label by associating it with the \verb=\mc@curr@col@status=
%   and ignore the second argument:
%    \begin{macrocode}
\def\mc@set@col@status#1#2{%
   \global\expandafter\let\csname #1\endcsname\mc@curr@col@status}
%    \end{macrocode}
%
%   The above definition is being used when the \texttt{.aux} file is
%   read in at the beginning. At the end we need a different
%   definition to test if another typesetting run is needed. There we
%   compare the value used in the current run (stored in the second
%   argument) with the value used on the next run. If those two values
%   differ we set \verb=@tempswa= to false which will trigger the
%   ``Label(s) may have changed'' warning.
%    \begin{macrocode}
\AtEndDocument{\def\mc@set@col@status#1#2{%
     \ifnum #2=\mc@curr@col@status\else
       \@tempswatrue
     \fi}%
}
%    \end{macrocode}

Due to the check the code above with work with both the version on CTAN dated 2011/06/27 and the one in the SVN.

To answer you question on updating your distribution: it is unfortunately a little manual: pick up the multicol.dtx and tools.ins from the SVN at http://latex-project.org/svnroot/latex2e-public/required/tools .

Place them into an empty directory and run latex tools.ins. Ignore the errors about missing files (or alternatively pick up all files in that directory from SVN). That should then generate the multicol.sty file for you that you can place into your local texmf tree or replace the copy in your main tree or for testing simply use it in the same directory as your .tex file.

Not the answer you're looking for? Browse other questions tagged or ask your own question.