summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/monofill/monofill.sty
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/monofill/monofill.sty
Initial commit
Diffstat (limited to 'macros/latex/contrib/monofill/monofill.sty')
-rw-r--r--macros/latex/contrib/monofill/monofill.sty201
1 files changed, 201 insertions, 0 deletions
diff --git a/macros/latex/contrib/monofill/monofill.sty b/macros/latex/contrib/monofill/monofill.sty
new file mode 100644
index 0000000000..486bc97739
--- /dev/null
+++ b/macros/latex/contrib/monofill/monofill.sty
@@ -0,0 +1,201 @@
+\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