\NeedsTeXFormat{LaTeX2e}[1994/12/01] \ProvidesPackage{nicefilelist}[2012/05/20 v0.4 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} %% See its documentation for details. %% %% 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:failure} %% |\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 *} %% %% === Safe Tests === %% \label{sec:safe} %% For fairly safe tests, we brief{}ly use an exotic version of `Q' %% (similarly to \ctanpkgref{ifmptarg}): \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'". %% %% === Package Option `[r]' === %% \label{sec:opt} %% v0.4 offers package option `[r]' that allows strings with `r' %% 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}% }% } \ProcessOptions %% %% === Redefining \cs{listfiles} === %% Similarly to original \LaTeX, |\listfiles| carries almost everything %% that is needed for the file list only: \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 \typeout{% %% 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|\] results in %% `{}' where is the one-step expansion of %% : \def\NFL@make@macro@arg##1##2{\expandafter##1\expandafter{##2}}% %% |\NFL@space@split{}{}{}| %% passes prefix and suffix as arguments to %% if a space token is within , otherwise %% gets the original as single %% argument. The latter is useful here where %% 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 , and `' is chosen correctly. {##6{##4}}{##5{##1}{##2}}}% %% |\NFL@ifx@kbl{}{}{}{}| %% 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{}| before `\NFL@maybe@three': \def\NFL@date@or@rest##1{% \NFL@if@date{##1}{##1}{\NFL@no@date@version##1}}% %% |\NFL@if@date{}{}{}| ... \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 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{}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| 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|: \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 : \def\NFL@false##1\@nil{\@secondoftwo}% %% |\NFL@true| skips further candidates and dummies and chooses : \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{}{}| looks whether %% is a date. If it is, it is written to screen, and then we look %% if contains a version id. Otherwise ```_'" %% 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{}|: \def\NFL@version@or@rest##1{% \NFL@if@version{##1}% {\NFL@place@version{##1}}% {\NFLnoversion@\NFLspaceIII##1}}% %% |\NFL@if@version{}{}{}|: \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{}{}{}| 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{}| adds filler to version id: \def\NFL@place@version##1{\MFleftinfield{##1}{f-version}}% %% |\NFL@maybe@version@rest{}{}|: \def\NFL@maybe@version@rest##1##2{% \NFL@if@version{##1}% {\NFL@place@version{##1}\NFLspaceIII##2}% {\NFLnoversion@\NFLspaceIII##1 ##2}}% } %% === 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]