\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{nicefilelist}[2012/12/12 v0.7a
                               more file list alignment (UL)]
%% Copyright (C) 2012 Uwe Lueck,
%% http://www.contact-ednotes.sty.de.vu
%% -- author-maintained in the sense of LPPL below --
%%
%% This file can be redistributed and/or modified under
%% the terms of the LaTeX Project Public License; either
%% version 1.3c of the License, or any later version.
%% The latest version of this license is in
%%     http://www.latex-project.org/lppl.txt
%% We did our best to help you, but there is NO WARRANTY.
%%
%% Please report bugs, problems, and suggestions via
%%
%%   http://www.contact-ednotes.sty.de.vu
%%
%% === Alignment Settings        ===
%% \label{sec:templates}
%% We use the \ctanpkgref{monofill} package for alignment of plain text:
\RequirePackage{monofill}[2012/10/29]
%% See its documentation for details.
%% %% <- added 2012/10/29 ->
%% The `[wrap]' option provided by 'nicefilelist' v0.7 requires 
%% 'monofill' v0.2 as of 2012-10-29.
%%
%% We support three alignment ``fields" according to the terminology of \pkg{monofill}. 
%% Their ids are |f-base| for base filenames, |f-ext| for filename extensions, 
%% % |f-date| for the revision date, 
%% and |f-version| for the revision version id of a file %%% , 
%% % the latter two 
%% as read from `\ProvidesFile', `\ProvidesPackage', 
%% or `\ProvidesClass' command in the file.
%% Initial settings for them are following.
%% For modifying them, load 'nicefilelist.sty', 
%% then type your own settings, then issue `\listfiles'
%% or load 'myfilist.sty'.
\MFfieldtemplate{f-base}{nicefilelist}
\MFfieldtemplate{f-ext}{tex}
\MFfieldtemplate{f-version}{v0.11a}
%% We are not supporting version numbers greater than 9 at present---sorry! (TODO)
%% 
%% |\NFLspaceI|, |\NFLspaceII|, and |\NFLspaceIII| 
%% determine the space between the four 
%% columns for names, dates, versions, and ``captions":
\newcommand*{\NFLspaceI}  { \space}
\newcommand*{\NFLspaceII} { \space}
\newcommand*{\NFLspaceIII}{ }
%% 
%% === Failure Displays          ===
%% \label{sec:fail}                 %% was failure 2012/10/29
%% |\NFLnodate| is displayed in place of a file date if it seems 
%% not to be given (configurable):
\newcommand*{\NFLnodate}{ -- \space-- --}
%% |\NFLnoversion| likewise---however, for alignment, 
%% each wanted space must be specified as `\space'
%% (not just a code blank space). 
%% It may need adjustment (by `\renewcommand') when
%% `\MFfieldtemplate{f-version}' is modified:
\newcommand*{\NFLnoversion}{\space--}
%% |\NFLnotfound| is for files with wrong or no 
%% \cs{Provides.\empty..} command:
\newcommand*{\NFLnotfound}{ * NOT FOUND *}
%% 
%% === Package Options           ===
%% \label{sec:opt}
%% v0.4 offers package option |[r]| that allows strings with `r' %% |...| 2012/10/30
%% in place of `v', for ``release." `\NFL@v@digit''s definition
%% therefore depends ... we use |\@listfiles| for a ``message" 
%% there. For the original restricted functionality, it expands 
%% to |\NFL@false|. 
\def\@listfiles{\noexpand\NFL@false}
%% Package option `[r]' carries out another test instead.
%% See the accompanying file `SrcFILEs.txt' to see the effect. 
%% TODO: update example!?
\DeclareOption{r}{%
  \def\@listfiles{%
    {\noexpand\NFL@ifx@kbl##1r%
        {\noexpand\NFL@digits##2\noexpand\@nnil}%
        \noexpand\NFL@false}%
  }%
}
%% v0.7 offers package option |[wrap]| for automatical wrapping within %% |...| 2012/10/30
%% the "captions" column, based on Will Robertson's and Kevin Godby's 
%% \ctanpkgref{hardwrap} package. The difference between this option 
%% and the functionality without is controlled by the macro 
%% `\NFL@filerow'. 
%% %% 2012/10/30:
%% \emph{Without} it expands to `\typeout'
\newcommand*{\NFL@filerow}{\typeout}
%% ---`\let' does'nt work with 'myfilist''s redefinition of 
%% `\typeout'.
%% \emph{With} `[wrap]', `\NFL@filerow' applies 'hardwrap''s 
%% `\HardWrap':
\DeclareOption{wrap}{%
  \renewcommand*{\NFL@filerow}[1]{%
    \HardWrap\typeout\hw@maxprintline\relax{^^J%
      \MFrightinfield\space{f-base} %
      \MFleftinfield \space{f-ext}%
      \NFLspaceI\@spaces\space\@spaces\space \NFLspaceII
      \MFrightinfield\space{f-version}\NFLspaceIII}{%
      #1}}%
%% Alignment of filenames with 'hardwrap' seems to need
  \renewcommand*{\MFfillelement}{\MFotherspace}
%% from \ctanpkgref{monofill} v0.2.             %% was `monospace' 2012/12/12
}
%% The display width is controlled by 'hardwrap''s counter 
%% `\hw@maxprintline'. Unless 'hardwrap' finds something special, 
%% its content is 79, corresponding to a display width of 
%% 80 characters (I believe---counting the leftmost character 
%%  as \qtd{0}, as editors like to do). You can choose a different 
%% content value <max-char-col> by 'hardwrap''s
%% \[|\setmaxprintline{<max-char-col>}|\]
\ProcessOptions
%% The next `\ifx' is to check whether `[wrap]' has been demanded 
%% and 'hardwrap' is needed:
\ifx\NFL@filerow\typeout \else
  \RequirePackage{hardwrap}
\fi
%% 
%% === Safe Tests                === %% below options 2012/10/29
%% \label{sec:safe}
%% For fairly safe tests, we brief{}ly use an exotic version of `Q'
%% (similarly to \ctanpkgref{ifmptarg} and \ctanpkgref{url}):
\catcode`\Q=7 \let\NFL@criterion=Q \catcode`\Q=11
%% %% 2012/03/27:
%% It appears to me that expandable tests like the ones employed here 
%% never are perfectly safe; you only can say that it is safe with a 
%% source meeting certain conditions. \ctanpkgref{fifinddo} originally 
%% was made for ``plain text," to be read from files without assigning 
%% \TeX's special category codes. \emph{Here} we assume that the source 
%% (text in \cs{Provides.\empty..} arguments) will never contain such a 
%% ``funny `Q'".
%%
%% === Redefining \cs{listfiles} ===
%% Similarly to original \LaTeX, |\listfiles| carries almost everything 
%% that is needed for the file list only. 2012-10-29: little point 
%% in this, perhaps, in that the package should be loaded when 
%% running `\listfiles' is intended---TODO. Or maybe it is loaded 
%% \emph{just in case?}
\renewcommand*{\listfiles}{%
  \let\listfiles\relax
%% ---this clears memory. Now \LaTeX\ doesn't collect file names for 
%% &\listfiles when &\@listfiles is undefined, therefore 
%   \let\@listfiles\relax
%% % although we don't use it.
%% % (TODO use it in place of some `\NFL@'...?)
%% ... postponed for v0.4 ...
%% \vskip\smallskipamount\noindent
%% |\@dofilelist| is executed by the standard \LaTeX\ `\enddocument'
%% macro or by `\ListInfos' from the \ctanpkgref{myfilist} package.
  \def\@dofilelist{%
%% ``Title:"
     \typeout{^^J           %% trick 2012/03/29 vv
              \MFrightinfield{*File Lis}{f-base}t*}%
     \@for\@currname:=\@filelist\do{%
%% This starts the loop through the list of files
       \filename@parse\@currname
       \edef\filename@ext{%
          \ifx\filename@ext\relax tex\else\filename@ext\fi}%
%% Like \LaTeX's &\reserved@b:
       \expandafter\let\expandafter\@tempb
            \csname ver@\filename@base.\filename@ext\endcsname
%% According to `source2e.pdf', &\filename@area may be a directory. 
%% Trying support of this is seems to be a new feature with v0.2---not 
%% tested, TODO!
       \edef\@tempa{\filename@area\filename@base}%
%% Actually I would like to be able to do even the filename parsing 
%% expandably---for all systems, `texsys.cfg'!?? TODO
       \NFL@filerow{%
%% Now all parsing and checking must be expandable.
         \NFL@make@macro@arg\MFrightinfield\@tempa      {f-base}.%
         \NFL@make@macro@arg\MFleftinfield \filename@ext{f-ext}%
         \NFLspaceI
         \NFL@ifx@kbl\@tempb\relax\NFLnotfound{%
           \NFL@make@macro@arg\NFL@space@split\@tempb
                                              \NFL@maybe@three
                                              \NFL@date@or@rest
         }%
       }%
     }%
%% The line of stars:
     \typeout{                        %% trick vvv 2012/03/29
              \MFrightinfield{********}{f-base}***^^J}%
%% TODO or more stars as with 'longnamefilelist'?
  }%
%% This finishes the definition of `\@dofilelist'. 
%% % The definitions of macros called from `\@dofilelist' are following.
%% \[|\NFL@make@macro@arg<cmd-1><cmd-2>|\] results in 
%% `<cmd-1>{<t-list>}' where <t-list> is the one-step expansion of 
%% <cmd-2>:
  \def\NFL@make@macro@arg##1##2{\expandafter##1\expandafter{##2}}%
%% |\NFL@space@split{<token-list>}{<spaced>}{<unspaced>}|
%% passes prefix and suffix as arguments to <spaced> 
%% if a space token is within <token-list>, otherwise 
%% <unspaced> gets the original <token-list> as single 
%% argument. The latter is useful here where <token-list> 
%% becomes visible only by an &\expandafter.
%% The following construction is discussed more generally 
%% in the \ctanpkgref{bitelist} package.
  \def\NFL@space@split##1{%
    \NFL@return@space@split##1\@nil: \NFL@criterion\@nil\@nil@{##1}}%
%% `\NFL@return@spaces@split' essentially has \emph{three} parameters 
%% delimited by ` ', `\@nil', and `\@nil' again.
  \def\NFL@return@space@split##1 ##2\@nil##3\@nil@##4##5##6{%
    \NFL@ifx@kbl\NFL@criterion{##2}%
%% If #2 is empty, `\NFL@ifx@kbl' (as of v0.3) compares 
%% `\NFL@criterion' (criterion indicating ``unspaced") with 
%% `\expandafter'. This only happens when the space is the last thing 
%% in <token-list>, and `<spaced>' is chosen correctly.
    {##6{##4}}{##5{##1}{##2}}}%
%% |\NFL@ifx@kbl{<token>}{<maybe-token>}{<ifx>}{<unlessx>}| 
%% as of v0.3  should save some tokens, in some longer run, 
%% especially if we want to add nestings---cf. \file{source2e.pdf}
%% for ``Kabelschacht."
  \def\NFL@ifx@kbl##1##2{%
    \ifx##1##2\expandafter  \@firstoftwo
      \else   \expandafter \@secondoftwo \fi}%
%% Dealing with |\NFL@date@or@rest{<token-list>}| before `\NFL@maybe@three':
  \def\NFL@date@or@rest##1{%
    \NFL@if@date{##1}{##1}{\NFL@no@date@version##1}}%
%% |\NFL@if@date{<token-list>}{<yes>}{<no>}| ...
  \def\NFL@if@date##1{\NFL@slashes##1\NFL@xi xyzxyzxyzx\@nil}% 
%% |\NFL@slashes| checks that there are slashes at the expected places:
  \def\NFL@slashes##1##2##3##4##5##6##7##8{%
    \NFL@ifx@kbl##5/%
      {\NFL@ifx@kbl##8/\NFL@ten@only\NFL@false}%
      \NFL@false
%% This especially happens when <token-list> is empty.
%% Digit candidates back:
    {##1##2##3##4##6##7}}%
%% If the word is a date, we now have taken 6 of the 8 digits. 
%% \[|\NFL@ten@only{<digits>}<digit><digit>Q|\]
%% takes the two remaining and then a thing that should be `Q' 
%% in the funny sense of Sec.~\ref{sec:safe}.
  \def\NFL@ten@only##1##2##3##4{%
    \NFL@ifx@kbl\NFL@xi##4\NFL@digits\NFL@false
%% Finally checking digits:
    ##1##2##3\@nnil}%
%% |\NFL@digits<token>| is a loop through single tokens:
  \def\NFL@digits##1{% 
    \NFL@ifx@kbl##1\@nnil\NFL@true{%
      \NFL@if@digit@code##1<0\NFL@false{%
        \NFL@if@digit@code##1>9\NFL@false\NFL@digits
      }%
    }%
  }%
%% |\NFL@if@digit@code<char-1><relation><char-2><fits><bad>|:
  \def\NFL@if@digit@code##1##2##3{%
    \ifnum`##1##2`##3 \expandafter  \@firstoftwo
      \else           \expandafter \@secondoftwo \fi}%
%% |\NFL@false| skips further candidates and dummies and chooses <no>:
  \def\NFL@false##1\@nil{\@secondoftwo}%
%% |\NFL@true| skips further candidates and dummies and chooses <yes>:
  \def\NFL@true##1\@nil{\@firstoftwo}%
%% We don't support version without date, therefore run 
%% |\NFL@no@date@version| as soon as we find that the file info 
%% does not start with a date:
  \def\NFL@no@date@version{%
    \NFLnodate\NFLspaceII\NFLnoversion@\NFLspaceIII}%
%% |\NFLnoversion@| adds filler to &\NFLnoversion:
  \def\NFLnoversion@{%
    \NFL@make@macro@arg\NFL@place@version\NFLnoversion}%
%% |\NFL@maybe@three{<word-1>}{<rest>}| looks whether <word-1> 
%% is a date. If it is, it is written to screen, and then we look
%% if <rest> contains a version id. Otherwise ```<word-1>_<rest>'"
%% is considered a ``caption" only.
  \def\NFL@maybe@three##1##2{%
    \NFL@if@date{##1}%
                {##1\NFLspaceII 
                 \NFL@space@split{##2}%
                                 \NFL@maybe@version@rest
                                 \NFL@version@or@rest}%
                {\NFL@no@date@version##1 ##2}}%
%% |\NFL@version@or@rest{<token-list>}|:
  \def\NFL@version@or@rest##1{%
    \NFL@if@version{##1}%
                   {\NFL@place@version{##1}}%
                   {\NFLnoversion@\NFLspaceIII##1}}%
%% |\NFL@if@version{<token-list>}{<yes>}{<no>}|:
  \def\NFL@if@version##1{\NFL@v@digit##1xy\@nil}%
%% TODO: At applications you see how some tokens could be saved.
%% On the other hand, the macros are more transparent in the 
%% present way.
%% \vskip\smallskipamount\noindent
%% |\NFL@v@digit{<t1>}{<t2>}{<rest>}| checks whether the first thing
%% is a `v' and the second a digit---unless package option `[r]' 
%% was chosen. v0.4 uses `\edef' for choosing:
  \edef\NFL@v@digit##1##2##3\@nil{%
    \noexpand\NFL@ifx@kbl##1v%
        {\noexpand\NFL@digits##2\noexpand\@nnil}%
%% |\@listfiles| will either expand to the original `\NFL@false'
%% or to a test on `r':
        \@listfiles
    \noexpand\@nil}%
  \let\@listfiles\relax
%% |\NFL@place@version{<token-list>}| adds filler to version id:
  \def\NFL@place@version##1{\MFleftinfield{##1}{f-version}}%
%% |\NFL@maybe@version@rest{<list-1>}{<list-2>}|:
  \def\NFL@maybe@version@rest##1##2{%
    \NFL@if@version{##1}%
                   {\NFL@place@version{##1}\NFLspaceIII##2}%
                   {\NFLnoversion@\NFLspaceIII##1 ##2}}%
}
%% === Shorthand for 'myfilist'  ===
%% \[|\MaxBaseEmptyList{<longest-name>}[<read-again-files>]|\]
%% (v0.5) or 
%% \[|\MaxBaseEmptyList*[<read-again-files>]|\]
%% (v0.6) as described in Section~\ref{sec:short}: 
\newcommand*{\MaxBaseEmptyList}{%
    \@ifstar{\maxBaseEmptyList{abcdabcd}}\maxBaseEmptyList}
\newcommand*{\maxBaseEmptyList}[1]{%
    \MFfieldtemplate{f-base}{#1}%
    \RequirePackage{myfilist}\EmptyFileList}
%% So |\maxBaseEmptyList| is like former `\MaxBaseEmptyList'
%% without expecting a star---available to users.
%%
%% === Leaving the Package File  ===
\endinput
%%
%% === VERSION HISTORY ===

v0.1   2012/03/20   started 
       2012/03/22   almost ready
       2012/03/23   debugging; \NFLspaceI etc.; 
                    documentation completed 

v0.2   2012/03/24   file info processed by \typeout - start
       2012/03/25   trying, debugging
       2012/03/26   continued; \NFL@place@version, \NFLnoversion@; 
                    works, reordered; another fix about Q -> \@empty
       2012/03/27   undone the latter, explained; improved remarks on
                    \@listfiles
       2012/03/29   alignment of title/stars with base<11

v0.30  2012/05/18f. \NFL@ifx@kbl in \NFL@return@space@split
       2012/05/20   all \ifx reimplemented, old code kept
       STORED INTERNALLY
v0.31  2012/05/20   removing old code - STORED INTERNALLY
v0.32  2012/05/20   removing \NFL@xpxpxp; replacing \NFL@after@false
                    by \NFL@ifnum@kbl, keeping old code
       STORED INTERNALLY
v0.33  2012/05/20   removing old code; added 3 %s
       STORED INTERNALLY
v0.4   2012/05/20   option [r]
v0.5   2012/09/30   \MaxBaseEmptyList
v0.6   2012/10/03   \MaxBaseEmptyLists first arg. only optional
       2012/10/11   ... bad with 2nd opt. arg., *
v0.7   2012/10/13   "updating" date in \Provides...!
       2012/10/28   \HardWrap first try 
       2012/10/29   \HardWrap newline material -> [wrap]
                    sec:test below sec:opt, mentioning `url'
       2012/10/30   correcting \NFL@filerow without wrapping, 
                    doc.: |...| in sec:opt
v0.7a  2012/12/12   doc. monospace -> monofill
