\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 by 'hardwrap''s %% \[|\setmaxprintline{}|\] \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|\] 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}}% } %% === Shorthand for 'myfilist' === %% \[|\MaxBaseEmptyList{}[]|\] %% (v0.5) or %% \[|\MaxBaseEmptyList*[]|\] %% (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