\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{monofill}[2012/10/29 v0.2 monospace 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
%%
%% == User Commands      ==
%% \label{sec:user}
%% %% \[...\] rather than \\[...] 2012/10/29:
%% \[|\MFfieldtemplate[<fill-element>]{<field>}{<template>}|\]
%% determines the width of fields with id <field> to be the same 
%% as of <template>:
\newcommand*{\MFfieldtemplate}[3][\MFfillelement]{%
%% % `\space' is the default <fill-element>, stored as first argument
%% % of `\MF@make@bg'. 
%% `\@bg' delimits the ``background" or 
%% ``filler list". The field id is stored at the end ahead.
    \MF@make@bg#1#3\MF@store@field@bg\@bg{#2}}
%% `\MF@make@bg' is defined in Sec.~\ref{sec:field}.
%% \medbreak\noindent                               %% \medbreak 2012/03/29
%% %% <- TODO as in morgan.sty "vert. cmd. box"
%% \[|\MFfillelement|\]                             %% \[...\] 2012/10/29
%% is the default for <fill-element>, 
%% defined to be (like) `\space' here:
\newcommand*{\MFfillelement}{}  \let\MFfillelement\space
%% <fill-element> \emph{must} be a \emph{``single item"}
%% (that \TeX\ converts into a single token, due to our 
%%  comparison mechanism), so for using somewhat more complex <complex> than `\space',
%% \[|\renewcommand*{\MFfillelement}{<complex>}|\]  %% |...| 2012/10/29
%% must be used instead of the optional argument.---It was very hard 
%% for me with \emph{typesetting}, what finally worked were
%% |\MFspace| and
%% |\MFenspace| as alternative optional arguments. 
%% It is fine for half-quad spaces such as characters with `\tt' 
%% figures with more Computer Modern fonts:
\newcommand*{\MFspace}{\mbox{ }}
% \newcommand*{\MFenspace}{\leavevmode\enspace}
\newcommand*{\MFenspace}{\mbox{\enspace}}
%% For using the \ctanpkgref{nicefilelist} and \ctanpkgref{hardwrap} 
%% packges together, I needed the following |\MFotherspace| as 
%% `\MFfillelement'---expanding to a character token that is a 
%% blank space according to its character code, but belongs to the 
%% ``other" category:
\newcommand*{\MFotherspace}{} {\@makeother\ \gdef\MFotherspace{ }}
%% More generally, I guess that this is the perfect ``filling
%% element" in text to be wrapped by 'hardwrap'.
%% \medbreak\noindent                               %% \medbreak 2012/10/29
%% \[|\MFleftinfield{<text>}{<field>}|\] 
%% returns <text>, 
%% followed by <fill-elements> to get as many elements 
%% (characters) as the <template> associated with <field>:
\newcommand*{\MFleftinfield}{\MF@check@field l}
%% % \smallskip\noindent
%% \[|\MFrightinfield{<text>}{<field>}|\] %% \[...\] 2012/10/29
%% returns the <fill-elements> before giving <text>:
\newcommand*{\MFrightinfield}{\MF@check@field r}
%% `\MF@check@field' is defined in Sec.~\ref{sec:text}.
%%
%% \pagebreak                               %% 2012/10/29
%% == Internal Commands  ==
%% === Tools             ===
%% We test arguments <arg> on emptiness by 
%% |\MF@if@empty{<arg>}{<yes>}{<no>}|:
\newcommand*{\MF@if@empty}[1]{%
    \ifx\MF@store@field@bg#1\MF@store@field@bg
        \expandafter\@firstoftwo
    \else
        \expandafter\@secondoftwo
    \fi}
%% |\MF@field| stores the name space for filling jobs:
\newcommand*{\MF@field}{MF@field:}
%%
%% === Field Declaration ===
%% \label{sec:field}
%% |\MF@make@bg| essentially builds a list of as many filler elements 
%% as the template has characters, using a loop macro `\MF@make@bg'. 
%% The current list of filler elements is delimited by `\@bg'.
\def\MF@make@bg#1#2#3\MF@store@field@bg{%
    \MF@if@empty{#3}%
%% First case: `#2' is the last template element. 
%% We run `\MF@store@field@bg' with an additional filler 
%% element:\footnote{Another run of `&\MF@make@bg fails' ...}
                {\MF@store@field@bg#1}%
%% Second case: the filler list gets an additional element, 
%% and the loop repeats:
                {\MF@make@bg#1#3\MF@store@field@bg#1}%
}
%% |\MF@store@field@bg<background>\@bg{<field>}|
%% essentially stores the filler list (``<background>"), 
%% or more precisely ...
\def\MF@store@field@bg#1\@bg#2{%
%% Here is the \strong{only assignment} when the macros run: %% \strong 2012/03/29
%% a command \[`\MF@field:<field>{<text>}'\] 
%% is defined.\footnote{This is the common, confusing way 
%%                      to describe such situations. 
%%                      Actually, the definition assigns a 
%%                      macro meaning to a ``named token" 
%%                      whose name is ```MF@field:<field>'". 
%%                      \emph{Typing} `&\MF@field:<field>' won't work.}
    \@namedef{\MF@field#2}##1{%
        \MF@reduce@bg##1\rest@t#1\rest@f{##1}{#2}}}
%%
%% === Checking Field   ===
%% \label{sec:text}
%% |\MF@check@field{<align>}{<text>}{<field>}|
%% runs |\MF@field:<field>{<text>}| from above, 
%% provided the latter has been defined (by `\MFfieldtemplate').
%% The <align> command is appended.
\newcommand*{\MF@check@field}[3]{%
    \@ifundefined{\MF@field#3}%
%                  {\PackageError{field "#3" not defined}%
%                                {use \string\MFfieldtemplate}}%
%% With v0.1, I thought about errors and warnings properly only 
%% more below ...
                 {\MF@field@undeclared{#2}{#3}}%
                 {\csname\MF@field#3\endcsname{#2}#1}}
%% |\MF@field@undeclared{<text>}{<field>}| just outputs <text>. 
\newcommand*{\MF@field@undeclared}[2]{#1}
%% A proper message is problematic in \strong{pure expansion}
%% as on screen or in \file{.log} files. 
%% Package option |fake-undefined| (Sec.~\ref{sec:opt}) 
%% offers another ``cheap" solution.
%% (TODO)
%% 
%% === Trying Alignment ===
%% |\MF@reduce@bg<r-text>\rest@t<r-fill>\rest@f{<text>}{<field>}<align>| 
%% \\[\smallskipamount]
%% is invoked by that `\MF@field:<field>' that 
%% `\MF@store@field@bg' defines as above.
%% It takes away one element both from the (remaining) <text> 
%% (delimited by `\rest@t') and the filler list (delimited by `\rest@f'). 
%% The full <text> has been stored ahead.
\def\MF@reduce@bg#1#2\rest@t#3#4\rest@f{%
    \MF@if@empty{#2}%
        {\MF@if@empty{#4}%
%% When we have removed the last elements of both lists at the same time, 
%% we just return <text>:
                     \@firstofthree
%% When we have removed the last element of <text>, and there still is
%% a filler element, we perform the alignment:
                     {\MF@fine@align{#4}}}%
        {\MF@if@empty{#4}%
%% When we have removed the last filler element, and a <text> element 
%% is still present, we return <text>, maybe together with a warning:
                     \MF@bad@align
%% When neither #1 nor #3 have been the last elements in their lists, 
%% we run `\MF@reduce@bg' on the remaining lists:
                     {\MF@reduce@bg#2\rest@t#4\rest@f}}}
%% |\@firstofthree{<use>}{<skip>}{<skip>}| may be known or not ...
\long\def\@firstofthree#1#2#3{#1}
%% |\MF@fine@align{<filler>}{<text>}{<field>}<align>| ...
\newcommand*{\MF@fine@align}[4]{\if r#4#1#2\else#2#1\fi}
%% |\MF@bad@align{<text>}{<field>}{<align>}|\\[\smallskipamount]
%% % gobbles <align>,
%% % throws a message about <text> and <field>, and outputs <text>.
%% % If this happens at \strong{pure expansion} such as writing 
%% % to \emph{screen} or a \emph{plain text file}, something really 
%% % awful may happen ... (we may adjust `\MF@bad@align' better 
%% % for this case, another time ... TODO)
%% at present is similar to `\@firstofthree'. 
%% In a future package version, we may add some warning or so 
%% for cases where it is useful---while it is not useful to write 
%% \emph{code} for warnings to screen and \file{.log} 
%% (the originally intended use of the package).
%% We offer a ``cheap" possibility of throwing some error by 
%% package option |fake-undefined|---see Sec.~\ref{sec:opt}
\newcommand*{\MF@bad@align}[3]{#1}
%% Actually, in v0.1 |\MF@check@field| appends the <field> 
%% argument hoping it could be used in a warning.
%% 
%% == Package Option     ==
%% \label{sec:opt}
%% With applications like `\listfiles', it may be useful to get an 
%% ``undefined" error where the name of the undefined command 
%% is a kind of ``secret message" ...
\DeclareOption{fake-undefined}{%
%% #1 is <text> and will be output, #2 is <field>, cf.~above.
    \def\MF@field@undeclared#1#2{#1\monofillFieldUndeclared}
    \def\MF@bad@align#1#2#3{#1\monofillFieldTooSmall}}
\ProcessOptions
%% == \cs{endinput} and Version HISTORY == 
\endinput
%%
%% VERSION HISTORY

v0.1   2012/03/18   started
       2012/03/19   completed 
v0.1a  2012/03/29   doc.: \medbreak (fix); \strong
v0.2   2012/10/29   \MFotherspace; doc. slightly reformatted
