%%
%% This is file `vwcol.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% vwcol.dtx  (with options: `package')
%% ___________________________________________________________
%% 
%% Copyright (C) 2008, 2015  Will Robertson
%%                          <will.robertson@latex-project.org>
%% 
%% Distributable under the LaTeX Project Public License,
%% version 1.3c or higher (your choice). The latest version of
%% this license is at: http://www.latex-project.org/lppl.txt
%% 
%% This work is "maintained" (as per LPPL maintenance status)
%% by Will Robertson.
%% 
%% This work consists of the file  vwcol.dtx
%%           and the derived files vwcol.sty,
%%                                 vwcol.ins, and
%%                                 vwcol.pdf.
%% ___________________________________________________________
\ProvidesPackage{vwcol}
  [2015/02/10 v0.2 Variable-width multicolumn text]
\RequirePackage{calc}
\RequirePackage{color}
\RequirePackage{environ}[2008/06/18]
\RequirePackage{keyval}
\RequirePackage{ragged2e}
\newlength\vwcol@sep
\newlength\vwcol@rule
\newlength\vwcol@totalwidth
\newlength\vwcol@averagewidth
\newlength\vwcol@parindent
\newcount\vwcol@last
\newcount\vwcol@Ncols
\newcount\vwcol@Nlines
\newcount\vwcol@maxrecursion
\newbox\vwcol@box
\newbox\vwcol@plainbox
\newbox\vwcol@outputbox
\newif\if@vwcol@boxready
\newif\if@vwcol@prerule
\newif\if@vwcol@postrule
\newif\if@vwcol@presep
\newif\if@vwcol@postsep
\newcommand\vwcol@PackageError[2]{%
  \PackageError{vwcol}{^^J\space\space#1}{#2}}
\newcommand\vwcol@PackageWarning[1]{%
  \PackageWarning{vwcol}{%
    ^^J\space\space#1^^JThis warning occurred}}
\newcommand\vwcol@PackageInfo[1]{%
  \PackageWarning{vwcol}{%
    ^^J\space\space#1^^JThis warning occurred}}
\DeclareOption{quiet}{%
  \renewcommand\vwcol@PackageError[2]{%
    \vwcol@PackageWarning{#1.}}%
  \let\vwcol@PackageInfo\@gobble}
\ProcessOptions
\def\vwcol@test@length#1#2{%
  \afterassignment\vwcol@test@@
  \@tempdima=#1#2\@nil}
\def\vwcol@test@@#1\@nil{%
  \ifx\@nil#1\@nil
    \@tempswatrue
  \else
    \@tempswafalse
  \fi}
\def\vwcolsetup{\setkeys{vwcol}}
\define@key{vwcol}{widths}{\def\vwcol@widths{#1}}
\define@key{vwcol}{maxrecursion}{\vwcol@maxrecursion=#1}
\vwcolsetup{maxrecursion=5}
\define@key{vwcol}{rule}{%
  \def\@tempa{#1}%
  \def\@tempb{none}%
  \ifx\@tempa\@tempb
    \vwcol@rule=0pt
  \else
    \vwcol@test@length{#1}{\linewidth}%
    \vwcol@rule=\@tempdima
  \fi}
\vwcolsetup{rule=0.4pt}
\define@key{vwcol}{lines}{%
  \def\@tempa{#1}%
  \def\@tempb{auto}%
  \ifx\@tempa\@tempb
    \vwcol@Nlines=0
  \else
    \vwcol@Nlines=#1
  \fi}
\vwcolsetup{lines=auto}
\define@key{vwcol}{sep}{%
  \def\@tempa{#1}%
  \def\@tempb{fill}%
  \ifx\@tempa\@tempb
    \vwcol@sep=1sp
  \else
    \vwcol@test@length{#1}{\linewidth}%
    \vwcol@sep=\@tempdima
  \fi}
\vwcolsetup{sep=0.05}
\define@key{vwcol}{presep}[true]{%
  \def\@tempa{#1}%
  \def\@tempb{true}%
  \ifx\@tempa\@tempb
    \@vwcol@preseptrue
  \else
    \def\@tempb{false}%
    \ifx\@tempa\@tempb
      \@vwcol@presepfalse
    \else
      \vwcol@PackageWarning{%
        '#1' not a valid option for option 'presep';
        'true' or 'false' only.}%
    \fi
  \fi}
\vwcolsetup{presep=false}

\define@key{vwcol}{postsep}[true]{%
  \def\@tempa{#1}%
  \def\@tempb{true}%
  \ifx\@tempa\@tempb
    \@vwcol@postseptrue
  \else
    \def\@tempb{false}%
    \ifx\@tempa\@tempb
      \@vwcol@postsepfalse
    \else
      \vwcol@PackageWarning{%
        '#1' not a valid option for option 'postsep';
        'true' or 'false' only.}%
    \fi
  \fi}
\vwcolsetup{postsep=false}
\define@key{vwcol}{sidesep}[true]{%
  \def\@tempa{#1}%
  \def\@tempb{true}%
  \ifx\@tempa\@tempb
    \@vwcol@preseptrue
    \@vwcol@postseptrue
  \else
    \def\@tempb{false}%
    \ifx\@tempa\@tempb
      \@vwcol@presepfalse
      \@vwcol@postsepfalse
    \else
      \vwcol@PackageWarning{%
        '#1' not a valid option for option 'sidesep';
        'true' or 'false' only.}%
    \fi
  \fi}
\define@key{vwcol}{prerule}[true]{%
  \def\@tempa{#1}%
  \def\@tempb{true}%
  \ifx\@tempa\@tempb
    \@vwcol@preseptrue
    \@vwcol@preruletrue
  \else
    \def\@tempb{false}%
    \ifx\@tempa\@tempb
      \@vwcol@prerulefalse
    \else
      \vwcol@PackageWarning{%
        '#1' not a valid option for option 'prerule';
        'true' or 'false' only.}%
    \fi
  \fi}
\vwcolsetup{prerule=false}
\define@key{vwcol}{postrule}[true]{%
  \def\@tempa{#1}%
  \def\@tempb{true}%
  \ifx\@tempa\@tempb
    \@vwcol@postseptrue
    \@vwcol@postruletrue
  \else
    \def\@tempb{false}%
    \ifx\@tempa\@tempb
      \@vwcol@postrulefalse
    \else
      \vwcol@PackageWarning{%
        '#1' not a valid option for option 'postrule';
        'true' or 'false' only.}%
    \fi
  \fi}
\vwcolsetup{postrule=false}
\define@key{vwcol}{siderule}[true]{%
  \def\@tempa{#1}%
  \def\@tempb{true}%
  \ifx\@tempa\@tempb
    \@vwcol@preseptrue
    \@vwcol@postseptrue
    \@vwcol@preruletrue
    \@vwcol@postruletrue
  \else
    \def\@tempb{false}%
    \ifx\@tempa\@tempb
      \@vwcol@prerulefalse
      \@vwcol@postrulefalse
    \else
      \vwcol@PackageWarning{%
        '#1' not a valid option for option 'siderule';
        'true' or 'false' only.}%
    \fi
  \fi}
\define@key{vwcol}{justify}{%
  \def\@tempa{#1}%
  \def\@tempb{ragged}%
  \ifx\@tempa\@tempb
    \let\vwcol@justify\RaggedRight
  \else
    \def\@tempb{flush}%
    \ifx\@tempa\@tempb
      \let\vwcol@justify\justifying
    \else
      \def\@tempb{raggedleft}%
      \ifx\@tempa\@tempb
        \let\vwcol@justify\RaggedLeft
      \else
        \def\@tempb{center}%
        \ifx\@tempa\@tempb
          \let\vwcol@justify\Centering
        \else
          \vwcol@PackageWarning{%
            '#1' not a valid option for option 'justify';
            one of 'flush'/'ragged'/'raggedleft'/'center' only.}%
        \fi
      \fi
    \fi
  \fi}
\vwcolsetup{justify=ragged}
\define@key{vwcol}{indent}{\setlength\vwcol@parindent{#1}}
\vwcolsetup{indent=1.5em}
\define@key{vwcol}{rulecolor}{\def\vwcol@rulecol{#1}}
\vwcolsetup{rulecolor=black}
\NewEnviron{vwcol}[1][]{%
  \par\noindent
  \@vwcol@boxreadyfalse
  \vwcolsetup{#1}%
  \splittopskip=\ht\strutbox
  \expandafter\vwcol@process@widths\expandafter{\vwcol@widths}%
  \vwcol@para@setup
  \ifdim\vwcol@sep=1sp
    \vwcol@totalwidth=\linewidth
  \else
    \vwcol@totalwidth=\numexpr
      \vwcol@totalwidth+(\vwcol@Ncols-1)*\vwcol@sep
      \relax sp
    \if@vwcol@presep
      \advance\vwcol@totalwidth\dimexpr(\vwcol@sep-\vwcol@rule)/2\relax
    \fi
    \if@vwcol@postsep
      \advance\vwcol@totalwidth\dimexpr(\vwcol@sep-\vwcol@rule)/2\relax
    \fi
    \if@vwcol@prerule \advance\vwcol@totalwidth \vwcol@rule\fi
    \if@vwcol@postrule\advance\vwcol@totalwidth \vwcol@rule\fi
  \fi
  \ifdim\vwcol@totalwidth > \linewidth
    \vwcol@PackageWarning{%
      Total width of columns plus their separations
      is greater than the linewidth^^J\space\space
      (by \the\vwcol@totalwidth\space - \the\linewidth\space =
       \the\dimexpr \vwcol@totalwidth-\linewidth\relax)}%
  \fi
  \ifnum\vwcol@Nlines=0%
    \@tempcnta=\hbadness
    \hbadness=\maxdimen
    \setbox\vwcol@plainbox\hbox{%
      \parbox{\vwcol@averagewidth}{\vwcol@justify\BODY}}%
    \hbadness=\@tempcnta
    \vwcol@Nlines=\numexpr
        (\ht\vwcol@plainbox+\dp\vwcol@plainbox)/
        (\baselineskip*\vwcol@Ncols)
      \relax
    \@tempcnta=1%
    \loop\unless\if@vwcol@boxready
      \savebox\vwcol@outputbox{%
        \hbox to \vwcol@totalwidth{\vwcol@{\BODY}}}%
      \unless\if@vwcol@boxready
        \advance\@tempcnta 1%
        \advance\vwcol@Nlines 1%
        \ifnum\@tempcnta>\vwcol@maxrecursion
          \@vwcol@boxreadytrue
          \vwcol@PackageError{%
            The estimated number of lines is greater than
            \the\vwcol@maxrecursion\space lines too small,%
              ^^J\space\space
            so I gave up (last tried maximum value of
            [lines=\the\vwcol@Nlines])%
          }{%
            Text will be truncated in the multicolumns;
            please select the%
            ^^J\space\space
            number of lines explicitly or increase
            [maxrecursion=\the\vwcol@maxrecursion].%
          }%
        \fi
      \fi
    \repeat
    \usebox\vwcol@outputbox
  \else
    \hbox to \vwcol@totalwidth{\vwcol@{\BODY}}%
    \unless\if@vwcol@boxready
      \vwcol@PackageError{%
        Not enough lines to fit the entire text;
        some text has been truncated.^^J\space\space
        Increase [lines=\the\vwcol@Nlines] to fit more%
      }{%
        Or remove [lines=\the\vwcol@Nlines] altogether
        to have 'vwcol' estimate the value.}%
    \fi
  \fi\par}
\def\vwcol@para@setup{%
    \vwcol@justify
    \@tempswafalse
    \ifx\vwcol@justify\RaggedRight
      \@tempswatrue
    \else\ifx\vwcol@justify\justifying
        \@tempswatrue
    \fi\fi
    \if@tempswa
      \parindent=\vwcol@parindent
    \else
      \vwcol@PackageInfo{%
        'indent' ignored for [justify=raggedleft]
        or [justify=center]}
    \fi
    \parskip=0pt}
\def\vwcol@process@widths#1{%
  \@for\@ii:=#1\do{\advance\vwcol@Ncols 1}%
  \ifdim\vwcol@sep=1sp
    \@tempdimb=\numexpr
      \linewidth-(\vwcol@Ncols-1)*\vwcol@rule
      \relax sp
  \else
    \ifdim\vwcol@rule > \vwcol@sep
      \vwcol@sep=\vwcol@rule
      \vwcol@PackageWarning{%
        'sep' must be greater than or equal to 'rule'}%
    \fi
    \@tempdimb=\numexpr
      \linewidth-(\vwcol@Ncols-1)*\vwcol@sep
      \relax sp
    \if@vwcol@presep
      \advance\@tempdimb\dimexpr(-\vwcol@sep+\vwcol@rule)/2\relax
    \fi
    \if@vwcol@postsep
      \advance\@tempdimb\dimexpr(-\vwcol@sep+\vwcol@rule)/2\relax
    \fi
  \fi
  \if@vwcol@prerule\advance\@tempdimb-\vwcol@rule\fi
  \if@vwcol@postrule\advance\@tempdimb-\vwcol@rule\fi
  \@for\@ii:=#1\do{%
    \vwcol@test@length\@ii\@tempdimb
    \advance\vwcol@totalwidth\@tempdima
    \expandafter\expandafter\expandafter\def
    \expandafter\expandafter\expandafter\vwcol@setup@parlines
    \expandafter\expandafter\expandafter{%
                \expandafter\vwcol@setup@parlines
                \expandafter\vwcol@addlines
                \expandafter{\the\@tempdima}}}%
  \vwcol@averagewidth=\dimexpr \vwcol@totalwidth/\vwcol@Ncols \relax}
\def\vwcol@setup@parlines{\let\vwcol@parlines\@empty}
\def\vwcol@addlines#1{%
  \@tempcnta=0
  \loop\ifnum\@tempcnta<\vwcol@Nlines
    \advance\@tempcntb 1
    \ifnum\@tempcntb>\vwcol@last
      \xdef\vwcol@parlines{\vwcol@parlines 0cm #1 }%
    \fi
    \advance\@tempcnta 1
  \repeat}
\newcommand\vwcol@[1]{%
  \setbox\vwcol@box\vbox{%
    \def\par{\endgraf\advance\vwcol@last\the\prevgraf}%
    \everypar{%
      \@tempcntb=0
      \vwcol@setup@parlines
      \parshape=\numexpr \vwcol@Nlines*\vwcol@Ncols-\vwcol@last \relax
      \vwcol@parlines}%
    \noindent\strut#1}%
  \if@vwcol@presep
    \if@vwcol@prerule
      \begingroup
        \color{\vwcol@rulecol}
        \vrule width \vwcol@rule
      \endgroup
    \fi
    \hskip\dimexpr (\vwcol@sep-\vwcol@rule)/2 \relax
  \fi
  \@tempcnta=0
  \loop\ifnum\@tempcnta < \vwcol@Ncols
    \advance\@tempcnta 1
    \unless\ifnum\@tempcnta=1
      \ifdim\vwcol@sep=1sp
        \hfill
        \begingroup
          \color{\vwcol@rulecol}
          \vrule width \vwcol@rule
        \endgroup
        \hfill
      \else
        \@tempdima=\dimexpr (\vwcol@sep-\vwcol@rule)/2 \relax
        \hskip\@tempdima
        \begingroup
          \color{\vwcol@rulecol}
          \vrule width \vwcol@rule
        \endgroup
        \hskip\@tempdima
      \fi
    \fi
    \vsplit\vwcol@box to \numexpr
      (\vwcol@Nlines-1)*\baselineskip+\ht\strutbox \relax sp
  \repeat
  \if@vwcol@postsep
    \hskip\dimexpr (\vwcol@sep-\vwcol@rule)/2 \relax
    \if@vwcol@postrule
      \begingroup
        \color{\vwcol@rulecol}
        \vrule width \vwcol@rule
      \endgroup
    \fi
  \fi
  \ifvoid\vwcol@box
    \global\@vwcol@boxreadytrue
  \fi}
%% 
%%
%% End of file `vwcol.sty'.
