summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/umoline
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/umoline
Initial commit
Diffstat (limited to 'macros/latex/contrib/umoline')
-rw-r--r--macros/latex/contrib/umoline/README28
-rw-r--r--macros/latex/contrib/umoline/umoline.dtx1278
-rw-r--r--macros/latex/contrib/umoline/umoline.ins6
-rw-r--r--macros/latex/contrib/umoline/umoline.pdfbin0 -> 220458 bytes
4 files changed, 1312 insertions, 0 deletions
diff --git a/macros/latex/contrib/umoline/README b/macros/latex/contrib/umoline/README
new file mode 100644
index 0000000000..3e5eb71b9a
--- /dev/null
+++ b/macros/latex/contrib/umoline/README
@@ -0,0 +1,28 @@
+umoline (v1.1): The Package for Under/Mid/Overline for Long Texts.
+
+[How to "make"]
+
+ % tex umoline.ins # you'll have umoline.sty and umoline-man.tex
+
+# to have user's manual
+ % latex umoline-man
+ % makeindex -s gind.ist -o umoline-man.ind umoline-man.idx
+ % latex umoline-man
+
+# to have implementation document
+ % latex umoline.dtx
+ % makeindex -s gind.ist -o umoline.ind umoline.idx
+ % makeindex -s gglo.ist -o umoline.gls umoline.glo
+ % latex umoline.dtx
+
+[Features]
+
++ \Underline{<text>} draw an underline for text allowing line breaks in
+ the <text> of "ordinary" character strings or general LaTeX staffs
+ surrounded by `{' and `}'.
+
++ \Midline{<text>} and \Overline{<text>} are also available.
+
+Enjoy!
+
+Hiroshi Nakashima <nakasima@tutics.tut.ac.jp>
diff --git a/macros/latex/contrib/umoline/umoline.dtx b/macros/latex/contrib/umoline/umoline.dtx
new file mode 100644
index 0000000000..9efadccf4c
--- /dev/null
+++ b/macros/latex/contrib/umoline/umoline.dtx
@@ -0,0 +1,1278 @@
+% \iffalse
+%% Style file `umoline'.
+%% Copyright (C) 1999,2000 Hiroshi Nakashima <nakasima@tutics.tut.ac.jp>
+%% (Toyohashi Univ. of Tech.)
+%%
+%% This program can be redistributed and/or modified under the terms
+%% of the LaTeX Project Public License distributed from CTAN
+%% archives in directory macros/latex/base/lppl.txt; either
+%% version 1 of the License, or any later version.
+%%
+% \fi
+%
+% \CheckSum{485}
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%%
+% \iffalse
+%%
+%<*dtx>
+\ProvidesFile{umoline.dtx}
+%</dtx>
+%<package>\def\next{LaTeX2e}
+%<package>\ifx\fmtname\next
+%<package>\def\next{
+%<package>\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+%<package>\ProvidesPackage{umoline}}
+%<package>\else\def\next[#1]{}\fi
+%<package>\next
+%<driver>\ProvidesFile{umoline.drv}
+% \fi
+% \ProvidesFile{umoline.dtx}
+[2000/07/11 v1.1 ]
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{umoline}
+\DisableCrossrefs
+\PageIndex
+\CodelineNumbered
+\RecordChanges
+%</driver>
+%<driver>\OnlyDescription
+%<driver>\def\ONLYDESCRIPTION{}
+%<*driver>
+\advance\textwidth4em
+\begin{document}
+\DocInput{umoline.dtx}
+\end{document}
+%</driver>
+% \fi
+% \changes{v1.0}{1999/04/14}
+% {The style is born from jumoline.}
+%
+% \errorcontextlines10000
+% \def\|{\verb|}
+% \DeleteShortVerb\|
+% \GetFileInfo{umoline.dtx}
+% \setcounter{IndexColumns}{2}
+%
+% \def\bottomfraction{.9}
+% \def\cs#1{\hbox{\tt\char\escapechar#1}}
+% \def\Item{\vskip-\itemsep\vskip-\parsep\vskip0pt\item}
+%
+% \makeatletter
+% \def\eqnarray{\stepcounter{equation}\let\@currentlabel=\theequation
+% \global\@eqnswtrue
+% \global\@eqcnt\z@\tabskip\@centering\let\\=\@eqncr
+% $$\halign to \displaywidth\bgroup\hskip\@centering
+% $\displaystyle\tabskip\z@{##}$\@eqnsel&\global\@eqcnt\@ne
+% \hfil$\;{##}\;$\hfil
+% &\global\@eqcnt\tw@ $\displaystyle\tabskip\z@{##}$\hfil
+% \tabskip\@centering&\llap{##}\tabskip\z@\cr}
+%
+% \def\Meta#1{\penalty\@highpenalty
+% \hbox{{\tt\char`\{}{\it\meta{#1}}{\tt\char`\}}}}
+% \def\opt#1{{\tt[}{\it\meta{#1}}{\tt]}}
+% \def\optn#1{{\tt[#1]}}
+% \def\arg#1{{\tt\char`\{#1\char`\}}}
+%
+% \let\latex@addmarginpar\@addmarginpar
+% \let\latex@latex@warning@no@line\@latex@warning@no@line
+% \def\@addmarginpar{\let\@latex@warning@no@line\@gobble
+% \latex@addmarginpar
+% \let\@latex@warning@no@line\latex@latex@warning@no@line}
+% \let\@font@warning\@gobble
+%
+% \long\def\m@cro@#1#2{\endgroup \topsep\MacroTopsep \trivlist
+% \edef\saved@macroname{\string#2}
+% \def\makelabel##1{\llap{##1\hskip\@totalleftmargin}}
+% \if@inlabel
+% \let\@tempa\@empty \count@\macro@cnt
+% \loop \ifnum\count@>\z@
+% \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
+% \edef\makelabel##1{\llap{\vtop to\baselineskip
+% {\@tempa\hbox{##1}\vss}
+% \hskip\@totalleftmargin}}
+% \advance \macro@cnt \@ne
+% \else \macro@cnt\@ne \fi
+% \edef\@tempa{\noexpand\item[
+% #1
+% \noexpand\PrintMacroName
+% \else
+% \noexpand\PrintEnvName
+% \fi
+% {\string#2}]}
+% \@tempa
+% \global\advance\c@CodelineNo\@ne
+% #1
+% \SpecialMainIndex{#2}\nobreak
+% \DoNotIndex{#2}
+% \else
+% \SpecialMainEnvIndex{#2}\nobreak
+% \fi
+% \global\advance\c@CodelineNo\m@ne
+% \ignorespaces}
+%
+% \def\DescribeOpt{\leavevmode\@bsphack\begingroup\MakePrivateLetters
+% \Describe@Opt}
+% \def\Describe@Opt#1{\endgroup \Describe@pt{#1}}
+% \def\Describe@pt#1#2{
+% \marginpar{\raggedleft\PrintDescribeMacro{#1}}
+% \SpecialOptUsageIndex{#1}{#2}}
+% \def\SpecialOptUsageIndex#1#2{
+% \index{#1\actualchar{\protect\ttfamily#1} (#2)\encapchar usage}
+% \index{#2s:\levelchar{\protect\ttfamily#1}\encapchar usage}
+% \@esphack\ignorespaces}
+% \def\SpecialOptMainIndex#1#2{
+% \index{#1\actualchar{\protect\ttfamily#1} (#2)\encapchar main}
+% \index{#2s:\levelchar{\protect\ttfamily#1}\encapchar main}
+% \@esphack\ignorespaces}
+% \def\SpecialOptIndex#1#2{
+% \index{#1\actualchar{\protect\ttfamily#1} (#2)}
+% \index{#2s:\levelchar{\protect\ttfamily#1}}
+% \@esphack\ignorespaces}
+% \def\SpecialOptIndexS#1#2{
+% \index{#1\actualchar{\protect\ttfamily#1} (#2)}
+% \index{#2es:\levelchar{\protect\ttfamily#1}}
+% \@esphack\ignorespaces}
+%
+% \def\SpecialMainIndex#1{\@bsphack
+% \RemoveAtFromCS{#1}
+% \protected@edef\@tempa{\noexpand\special@index{\RAFCtempa
+% \actualchar \string\verb
+% \quotechar*\verbatimchar\string#1\verbatimchar
+% \encapchar main}}\@tempa
+% \@esphack}
+% \def\SpecialIndex#1{\@bsphack
+% \RemoveAtFromCS{#1}
+% \protected@edef\@tempa{\noexpand\special@index{\RAFCtempa
+% \actualchar \string\verb
+% \quotechar*\verbatimchar\string#1\verbatimchar}}\@tempa
+% \@esphack}
+%
+% \let\RAFCempty\@empty
+% \let\RAFCgobble\@gobble
+% \makeatother
+% \def\RemoveAtFromCS#1{\edef\RAFCtempa{\expandafter\RAFCgobble\string#1}
+% \edef\RAFCtempa{\expandafter\string\csname\RAFCtempa\endcsname}
+% \expandafter\iRemoveAtFromCS\RAFCtempa@\NIL}
+% \def\iRemoveAtFromCS#1#2@#3\NIL{\def\RAFCtempb{#3}
+% \ifx\RAFCtempb\RAFCempty \def\RAFCtempa{#2}\let\next\relax
+% \else \def\RAFCtempa{#2@}\def\next{\iiRemoveAtFromCS#3\NIL}
+% \def\RAFCtempb{#2}
+% \ifx\RAFCtempb\RAFCempty
+% \else\ifx\RAFCtempb\CommonCSPrefix
+% \else\ifx\RAFCtempb\CommonIfPrefix
+% \else \def\RAFCtempa{}\def\next{\xRemoveAtFromCS#2@#3\NIL}\fi\fi\fi\fi
+% \next}
+% \def\iiRemoveAtFromCS#1{\ifx#1@\edef\RAFCtempa{\RAFCtempa@}
+% \let\next\iiRemoveAtFromCS
+% \else \def\next{\xRemoveAtFromCS#1}\fi
+% \next}
+% \def\xRemoveAtFromCS#1@\NIL{\edef\RAFCtempa{#1\RAFCtempa}}
+% \makeatletter
+%
+% \begingroup
+% \gdef\@sverbcat{\catcode`\@\active\catcode`\#\active}
+% \catcode`\@\active \gdef@{\char`\@\penalty\exhyphenpenalty}
+% \catcode`\#\active \gdef#{\penalty\exhyphenpenalty}
+% \endgroup
+% \let\latex@sverb\@sverb
+% \def\@sverb{\@sverbcat\latex@sverb}
+%
+% \def\theglossary{\onecolumn \glossary@prologue
+% \GlossaryParms \let\item\@idxitem \ignorespaces}
+% \def\endtheglossary{\relax}
+%
+%
+%
+% \def\bracepair{`{\tt\char`\{\char`\}'}}
+%
+% \ifx\ONLYDESCRIPTION\undefined\else
+% \let\SpecialUsageIndex\SpecialMainIndex
+% \let\SpecialOptUsageIndex\SpecialOptMainIndex
+% \fi
+%
+%
+%
+% \edef\CommonCSPrefix{\expandafter\RAFCgobble\string\UMO}
+% \edef\CommonIfPrefix{\expandafter\RAFCgobble\string\ifUMO}
+%
+% \title{\textsf{umoline}\\
+% The Package for Under/Mid/Overline for Long Texts\thanks{
+% This file has version number \fileversion, last revised \filedate.}}
+% \author{Hiroshi Nakashima\\(Toyohashi Univ. of Tech.)}
+% \date{\filedate}
+% \maketitle
+%
+% \begin{abstract}
+% This file provides macros to draw \|\Underline|, \|\Midline| and
+% \|\Overline| with a long text allowing line breaking in the text.
+% \end{abstract}
+%
+% \tableofcontents
+% \newpage
+%
+%
+% \section{Introduction}
+% \label{sec:intro}
+%
+% Users of \TeX{} and \LaTeX{} often complain that a text with \|\underline|
+% and \|\overline| cannot have line-break points in it. This makes it hard
+% to draw lines under a sentence in order to, for example, show that the
+% sentence is modified by a revision.
+%
+% Although it is almost impossible to find the perfect solution for the
+% problem, we could have a acceptable approximation by introducing certain
+% reasonable restrictions. For example, macros provided by \textsf{umoline}
+% only accept {\em ordinary} texts as their objective texts to draw
+% underline, etc. In fact, many \TeX{}ackers have written macros having this
+% restriction, including author's \textsf{julem}\footnote{
+%
+% This style was named by someone who distributed author's macro set posted
+% to a news group, and thus the author himself does not know the reason why
+% it is called so.}
+%
+% which copes with texts in both Japanese and English (and other European
+% languages). The style, however, has a few drawbacks including that it
+% consumes a huge amount of computational time and dvi-file space.
+%
+% The style \textsf{umoline} is designed to solve the problem minimizing
+% the time/space consumption to some acceptable level although still they are
+% not very small. Note that \textsf{umoline} is only for English (and
+% possibly some other European language) and another style \textsf{jumoline}
+% by the author is available for Japanese users.
+%
+%
+% \section{Usage}
+% \label{sec:usage}
+%
+% \subsection{Basic Usage}
+% \label{sec:usage-basic}
+%
+% The package is usable to both \LaTeXe{} and \LaTeX-2.09 users with their
+% standard package loading declaration. If you use \LaTeXe, simply do the
+% following.
+% \begin{quote}
+% \|\usepackage{umoline}|\SpecialIndex{\usepackage}
+% \end{quote}
+% If you still love \LaTeX-2.09, the following is what you have to do.
+% \begin{quote}
+% \|\documentstyle[..,umoline,...]|\Meta{style}\SpecialIndex{\documentstyle}
+% \end{quote}
+%
+% You have the following three basic commands to draw underlines and
+% relatives.
+%
+% \begin{itemize}
+% \item \|\Underline|\Meta{text}
+% \DescribeMacro{\Underline}\par
+% Draw lines under the \meta{text}. \Underline{For example, this sentence
+% is generated by
+% {\tt\string\Underline\char`\{}\UMOspace{0pt}[0]{\tt For Example, }{\ldots}
+% {\tt\char`\}}.}
+%
+% \item \|\Midline|\Meta{text}
+% \DescribeMacro{\Midline}\par
+% Draw lines as if hyphens are overlaid on the \meta{text}. \Midline{For
+% example, this sentence is generated by
+% {\tt\string\Midline\char`\{}\UMOspace{0pt}[0]{\tt For Example, }{\ldots}
+% {\tt\char`\}}.}
+%
+% \item \|\Overline|\Meta{text}
+% \DescribeMacro{\Overline}\par
+% Draw lines over the \meta{text}. \Overline{For example, this sentence is
+% generated by
+% {\tt\string\Overline\char`\{}\UMOspace{0pt}[0]{\tt For Example, }{\ldots}
+% {\tt\char`\}}.}
+% \end{itemize}
+%
+% For each command shown above, its argument \meta{text} is the sequence of
+% one of the following elements.
+%
+% \begin{itemize}
+% \item
+% Ordinary characters excluding those for command invocation and math
+% staffs. For example;
+%
+% \begin{quote}
+%\begin{verbatim}
+%\Underline{Since this sentence does not have macro invocation nor math
+%staffs, you may path it directly to the commands.}
+%\end{verbatim}
+% \end{quote}
+%
+% will produce the following result.
+%
+% \begin{quote}
+% \Underline{Since this sentence does not have macro invocation nor math
+% staffs, you may path it directly to the commands.}
+% \end{quote}
+%
+% \item
+% Character string surrounded by `\|{|' and `\|}|'. Any string that can be
+% passed to \LaTeX's \|\mbox| is also able to be passed to \|\Underline| and
+% its relatives. Since the string is processed as if it is packed into
+% \|\mbox|, line break will never occur in the string. For example;
+%
+% \begin{quote}
+%\begin{verbatim}
+%\Underline{The {\textbf{boldface}} part and the math part {$y=x^2$} are
+%surrounded by brace pairs because they have special characters.}
+%\end{verbatim}
+% \end{quote}
+%
+% will produce the following result.
+% \begin{quote}
+% \Underline{The {\textbf{boldface}} part and the math part {$y=x^2$} are
+% surrounded by brace pairs because they have special characters.}
+% \end{quote}
+%
+% \item
+% Commands \|\UMOspace|, \|\UMOnewline| and \|\\| for spacing and line
+% breaking. The usage of them will be shown later.
+% \end{itemize}
+%
+%
+%
+% \subsection{Control Lines}
+% \label{sec:usage-line}
+%
+% The default distance of the lines drawn by \|\Underline| and its relatives
+% from baselines are defined as follows, where $b$ is the value of
+% \|\baselineskip| and $a$ is the height of `-'\footnote{
+%
+% The height of `-' is not the distance between a baseline and the visible
+% short line of the image of `-'. Rather, its invisible part is
+% approximately twice as tall as the distance.}.
+%
+% Note that positive value
+% means the lines are drawn above baselines, while below baselines if
+% negative.
+% \SpecialIndex{\baselineskip}
+% \SpecialIndex{\strutbox}
+%
+% \begin{eqnarray*}
+% \|\Underline|&:& -0.3b\ \hbox{(depth of \|\strutbox|)}\\
+% \|\Midline|&:& +0.5a\\
+% \|\Overline|&:& +0.7b\ \hbox{(height of \|\strutbox|)}
+% \end{eqnarray*}
+%
+% If you wish to draw lines at the position other than the defaults, you may
+% set the following {\em length commands} (or {\em dimen register} in TeX's
+% jargon) to some appropriate positive values representing the distance from
+% baselines using \|\setlength|.
+%
+% \begin{itemize}
+% \item
+% \makebox[12em]{\cs{UnderlineDepth} \dotfill}
+% The depth of \|\Underline|
+% \DescribeMacro{\UnderlineDepth}
+%
+% \item
+% \makebox[12em]{\cs{MidlineHeight} \dotfill}
+% The height of \|\Midline|
+% \DescribeMacro{\MidlineHeight}
+%
+% \item
+% \makebox[12em]{\cs{OverlineHeight} \dotfill}
+% The height of \|\Overline|
+% \DescribeMacro{\OverlineHeight}
+% \end{itemize}
+%
+% Setting these commands to any negative values makes corresponding lines
+% drawn at the defaults.
+%
+% \leavevmode\DescribeMacro{\MidlineChar}
+% Another position control for \|\Midline| is to change the {\em reference}
+% character by \|\Midline|\allowbreak\|Char|\Meta{$c$}. That is,
+% \|\Midline| will be
+% drawn $0.5a$ above baselines where $a$ is the height of $c$.
+%
+% \leavevmode\DescribeMacro{\UMOline}
+% Yet another position control can be done by a generalized line drawing
+% command;
+%
+% \begin{quote}
+% \|\UMOline|\Meta{height}\Meta{text}
+% \end{quote}
+%
+% This command draw lines \meta{height} above (or below if negative)
+% baselines for the \meta{text}.
+%
+% \leavevmode\DescribeMacro{\UMOlineThickness}
+% The thickness of lines is the value set to the length-command
+% \|\UMOlineThickness|, whose default value is 0.4\,pt.
+%
+%
+%
+% \subsection{Explicit Spacing and Line Breaking}
+% \label{sec:usage-space}
+%
+% If the argument \meta{text} has a command invocation, it should be
+% surrounded by `\|{|' and `\|}|' and its result will be packed in a
+% \|\mbox|. Therefore a space inserted by \|{\hspace|\Meta{len}\|}| will
+% not disappear when a line is broken just before the space. Commands for
+% line breaking, such as \|\(no)linebreak|, \|\newline| and \|\\| will not
+% have any effect in \|\mbox| (or cause error).
+% \SpecialIndex{\hspace}
+% \SpecialIndex{\linebreak}
+% \SpecialIndex{\nolinebreak}
+% \SpecialIndex{\newline}
+% \SpecialIndex{\\}
+%
+% To solve these problems, the following commands for spacing and line
+% breaking are available.
+%
+% \begin{itemize}
+% \item
+% \|\UMOspace|\Meta{len}\opt{num}
+% \DescribeMacro{\UMOspace}\par
+% A space of \meta{len} wide is inserted and will disappear if a line is
+% broken just before the space. The optional argument \meta{num} discourage
+% or encourage the line break at the space. If \meta{num} is non-negative,
+% it discourages line breaking in the same way as the argument of
+% \|\nolinebreak|. If negative, it encourages breaking and its absolute
+% value corresponds to the argument of \|\linebreak|.
+%
+% Note that if \opt{num} follows `\|*|', \meta{num} is interpreted as the
+% value to pass \TeX's \|\penalty|.
+% \SpecialIndex{\penalty}
+%
+% \item
+% \|\UMOspace*|\Meta{len}
+% \DescribeMacro{\UMOspace*}\par
+% A space of \meta{len} wide is inserted and will not disappear even if a
+% line is broken at the space.
+%
+% \item
+% \|\UMOnewline|, \|\\|
+% \DescribeMacro{\UMOnewline}
+% \DescribeMacro{\\}\par
+% Terminate a line simply leaving space.
+%
+% \item
+% \|\UMOnewline*|, \|\\*|
+% \DescribeMacro{\UMOnewline*}
+% \DescribeMacro{\\*}\par
+% Terminate a line leaving underlined (or mid/overlined) space.
+% \end{itemize}
+%
+%
+%
+% \subsection{Remarks}
+% \label{sec:usage-note}
+%
+% \begin{enumerate}
+% \item
+% No hyphenation will be performed in \meta{text}.
+%
+% \item
+% As other \LaTeX's commands, \|\verb| in \meta{text} may cause an error even
+% if it surrounded by `\|{|' and `\|}|'.
+%
+% \item
+% Also as other \LaTeX's commands, paragraph separator cannot be included in
+% \meta{text} or you will have an error message.
+%
+% \item
+% Processing time for underlined (or mid/overlined) text is approximately 10
+% times as long as that for ordinary text. The size of dvi file also
+% enlarged by factor three or so.
+% \end{enumerate}
+%
+%
+%
+% \IndexPrologue{\newpage\section*{Index}
+% Underlined number refers to the page where the specification of
+% corresponding entry is described.}
+% \StopEventually{\PrintIndex}
+%
+%
+%
+% \newpage
+% \section{Implementation}
+% \label{sec:imp}
+%
+% \subsection{Problems and Solution}
+% \label{sec:imp-solution}
+%
+% The fundamental difficulty to draw underlines and its relatives is removed
+% by restricting as \meta{text} may have {\em ordinary} characters and other
+% staffs surrounded by \bracepair{} (called {\em blocked text}), because we
+% can pick each element in \meta{text} and draw a line for the element.
+% Thus remaining problems is {\em glues} that may be stretched or shrunk
+% when a paragraph is build.
+%
+% This problem has the following two subproblems.
+%
+% \begin{enumerate}
+% \item
+% How can we obtain the natural width, stretch and shrink of a glue
+% automatically inserted by \TeX's spacing mechanism?
+%
+% \item
+% How can we draw the line having the same natural width, stretch and shrink
+% as the glue?
+% \end{enumerate}
+%
+% The second problem is relatively easy because we have \|\leaders| whose
+% specification is as follows.
+% \SpecialIndex{\leaders}
+%
+% \begin{quote}
+% \|\leaders\hrule height|\meta{$h$}\|depth|\meta{$d$}\|\hskip|\meta{$s$}
+% \end{quote}
+%
+% The important (and not well-known) feature of \|\leaders| is that $h$ and
+% $d$ are not necessary to be non-negative, but $h$ simply specifies the
+% distance between the upper edge of the line and the baseline, while $d$ is
+% that for the lower edge\footnote{
+%
+% The lack of the knowledge of this fact caused one major drawback of
+% \textsf{julem} in which a line for a space is terribly inefficiently drawn
+% by \cs{leaders} with \cs{hbox} containing a very short line segment.}.
+%
+% Note that positive (negative) value of $h$ ($d$) means the edge is above
+% the baseline, and negative (positive) means below it. Thus for an
+% underline whose upper edge is $u$ below the baseline and thickness is $w$,
+% we can simply do the following to have a space-like object that will be
+% stretched or shrunk and will be potentially discarded on line breaking in
+% the exactly same way as the space produced by \|\hskip|\meta{$s$}.
+%
+% \begin{quote}
+% \|\leaders\hrule height|\meta{$-u$}\|depth|\meta{$u{+}w$}\|\hskip|\meta{$s$}
+% \end{quote}
+%
+% Mid-lines and overlines are also drawn in similar ways.
+%
+% As for the first problem, we can calculate the natural width, stretch and
+% shrink by simulating \TeX's spacing machanism. For each space in
+% \meta{text} (but not in blocked text), let $f$ be the \|\spacefactor|
+% defined by the word (or other object) preceeding the space, $d_i$ be the
+% \|\fontdimen|\meta{$i$} of the selected font, $s$ and $x$ be \|\spaceskip|
+% and \|\xspaceskip|, $n(g)$, $p(g)$ and $m(g)$ be the natural width and
+% stetch/shrink factor of the glue $g$. The glue $\sigma$ inserted for
+% the space is calculated as shown in Table~\ref{tab:space}.
+% \SpecialIndex{\spacefactor}\SpecialIndex{\spaceskip}
+% \SpecialIndex{\xspaceskip}
+%
+% \begin{table}[b]
+% \caption{Glue for Interword Space}
+% \label{tab:space}
+% $$\arraycolsep0pt
+% \begin{array}{r@{\;\land\;}l@{\quad}c@{\quad}c@{\quad}c}
+% \multicolumn2c{\hbox{condition}}&n(\sigma)&p(\sigma)&m(\sigma)\\\hline
+% f<2000&n(s)=0& d_2& d_3\cdot(f/1000)& d_4\cdot(1000/f)\\
+% f<2000&n(s)\neq0& n(s)& p(s)\cdot(f/1000)& m(s)\cdot(1000/f)\\
+% f\geq2000&n(x)=0& d_2+d_7&d_3\cdot(f/1000)& d_4\cdot(1000/f)\\
+% f\geq2000&n(x)\neq0& n(x)& p(x)& m(x)
+% \end{array}
+% $$
+% \end{table}
+%
+%
+%
+% \subsection{Tricks for Compatibility}
+% \label{sec:imp-compat}
+%
+% At the very beginning of \textsf{umoline.sty}, we checks whether it is
+% loaded by \LaTeXe{} or \LaTeX-2.09, and then declares \|\NeedsTeXFormat|
+% and \|\ProvidesPackage| if \LaTeXe{}. This part is embedded at the
+% beginning of \textsf{umoline.dtx} in a tricky manner to let
+% \textsf{docstrip} produce the following code.
+% \SpecialIndex{\NeedsTeXFormat}
+% \SpecialIndex{\ProvidesPackage}
+%
+%\begin{quote}
+%\begin{verbatim}
+%\def\next{LaTeX2e}
+%\ifx\fmtname\next
+%\def\next{
+%\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+%\ProvidesPackage{umoline}}
+%\else\def\next[#1]{}\fi
+%\next
+%[2000/07/11 v1.1 ]
+%\end{verbatim}
+%\end{quote}
+%
+% \begin{macro}{\PackageError}
+% We have to define \|\PackageError|, which is only \LaTeX2e-specific
+% macro in \textsf{umoline}, using \|\@latexerr| if the macro has not yet
+% defined (i.e. \LaTeX-2.09).
+% \SpecialIndex{\@latexerr}
+% \end{macro}
+%
+% \iffalse
+%<*package>
+% \fi
+% \begin{macrocode}
+
+\ifx\PackageError\undefined
+\def\PackageError#1#2#3{\@latexerr{#1:#2}{#3^^J\@ehc}}
+\fi
+
+%%^L
+
+% \end{macrocode}
+%
+%
+%
+% \subsection{Register Declaration}
+% \label{sec:imp-decl}
+%
+% In \textsf{umoline}, we use the following registers and relatives.
+%
+% \begin{itemize}
+% \item
+% \begin{macro}{\UnderlineDepth}
+% \|\UnderlineDepth| (dimen)\\
+% The distance from baseline to the upper edge of an underline. It is
+% initialized to a negative value (\|-\maxdimen|) to refer the default
+% value, the depth of \|\strutbox|.
+% \end{macro}
+%
+% \item
+% \begin{macro}{\MidlineHeight}
+% \|\MidlineHeight| (dimen)\\
+% The distance from baseline to the lower edge of a mid-line. It is
+% initialized to a negative value (\|-\maxdimen|) to refer the default
+% value, the half height of \|\UMO@midlinechar| (see
+% \S\ref{sec:imp-uifinit}).
+% \end{macro}
+%
+% \item
+% \begin{macro}{\OverlineHeight}
+% \|\OverlineHeight| (dimen)\\
+% The distance from baseline to the lower edge of a overline. It is
+% initialized to a negative value (\|-\maxdimen|) to refer the default
+% value, the height of \|\strutbox|.
+% \end{macro}
+%
+% \item
+% \begin{macro}{\UMOlineThickness}
+% \|\UMOlineThickness| (dimen)\\
+% The thickness of underlines and its relatives, and is initialized to the
+% default 0.4\,pt.
+% \end{macro}
+%
+% \item
+% \begin{macro}{\UMO@height}
+% \|\UMO@height| (dimen)\\
+% The distance from baseline to the upper edge of lines, which is refered in
+% line drawing procedure.
+% \end{macro}
+%
+% \item
+% \begin{macro}{\UMO@depth}
+% \|\UMO@depth| (dimen)\\
+% The distance from baseline to the lower edge of lines, which is refered in
+% line drawing procedure.
+% \end{macro}
+%
+% \item
+% \begin{macro}{\UMO@spacefactor}
+% \|\UMO@spacefactor| (count)\\
+% The value of \|\spacefactor| at the time a word or blocked text is produced.
+% \SpecialIndex{\spacefactor}
+% \end{macro}
+%
+% \item
+% \begin{macro}{\ifUMO@nospace}
+% \|\ifUMO@nospace| (if)\\
+% True if the word or blocked text currently processed is the first member of
+% \meta{text} or is
+% preceded by a blocked text (or its sequence) following a space. For such
+% an element, we don't insert interword space before it.
+% \end{macro}
+% \end{itemize}
+%
+% \begin{macrocode}
+%% Register Declaration
+
+\newdimen\UnderlineDepth \UnderlineDepth-\maxdimen
+\newdimen\MidlineHeight \MidlineHeight-\maxdimen
+\newdimen\OverlineHeight \OverlineHeight-\maxdimen
+\newdimen\UMOlineThickness \UMOlineThickness.4pt
+
+\newdimen\UMO@height \newdimen\UMO@depth
+
+\newcount\UMO@spacefactor
+
+\newif\ifUMO@nospace
+
+%%^L
+
+% \end{macrocode}
+%
+% We also use the following registers defined by \LaTeX.
+%
+% \begin{itemize}\item[]
+% \|\@tempboxa|\quad\|\@tempdima|\quad\|\@tempdimb|\quad
+% \|\@tempskipa|\quad\|\@tempcnta|\\\|\if@tempswa|
+% \SpecialIndex{\@tempboxa}
+% \SpecialIndex{\@tempdima}
+% \SpecialIndex{\@tempdimb}
+% \SpecialIndex{\@tempskipa}
+% \SpecialIndex{\@tempcnta}
+% \SpecialIndex{\if@tempswa}
+% \end{itemize}
+%
+%
+%
+%
+% \subsection{User Interface and Initialization}
+% \label{sec:imp-uifinit}
+%
+% \begin{macro}{\MidlineChar}
+% \begin{macro}{\UMO@midlinechar}
+% The macro \|\MidlineChar|\Meta{$c$} defines \meta{$c$} as the body of
+% \|\UMO@midlinechar| that is refered by \|\Midline| to calculate its
+% default height. The default of \meta{$c$}, `-', is also defined by
+% \|\MidlineChar|.
+% \end{macro}\end{macro}
+%
+% \begin{macrocode}
+%% User Interface and Initialization
+
+\def\MidlineChar{\def\UMO@midlinechar}
+\MidlineChar{-}
+
+% \end{macrocode}
+%
+% \begin{macro}{\Underline}
+% \begin{macro}{\Midline}
+% \begin{macro}{\Overline}
+% \begin{macro}{\UMOline}
+% The user interface macros, \|\Underline|\Meta{text},
+% \|\Midline|\Meta{text}, \|\Overline|\Meta{text},
+% \|\UMOline|\Meta{height}\Meta{text}, call the following common macro to
+% draw lines at the position specific to them.
+%
+% \begin{quote}
+% \|\UMO@line|\Meta{reg-or-def}\Meta{reg-height}\Meta{def-height}\Meta{text}
+% \end{quote}
+%
+% The distance $\delta$ between baseline and the baseline-side edge of the
+% line is defined by the following equation.
+%
+% \begin{equation}
+% \delta=\cases{\meta{reg-height}&if $\meta{reg-or-def}\geq 0$\cr
+% \meta{def-height}&if $\meta{reg-or-def}< 0$}
+% \label{eq:delta}
+% \end{equation}
+%
+% Therefore, the following argument passing properly controls the drawing
+% position described in \S\ref{sec:usage-line}, where $c$ is the body of
+% \|\UMO@midlinechar|.
+%
+% \begin{center}\begin{tabular}{l|lll}
+% &\meta{reg-or-def}&\meta{reg-height}&\meta{def-height}\\\hline
+% \|\Underline|&\|\UnderlineDepth|&\|-\UnderlineDepth|&\|\dp\strutbox|\\
+% \|\Midline|&\|\MidlineHeight|&\|\MidlineHeight|&{\it height-of\/}(c)/2\\
+% \|\Overline|&\|\OverlineHeight|&\|\OverlineHeight|&\|\ht\strutbox|\\
+% \|\UMOline|&\|-\maxdimen|&---&\meta{height}\\
+% \end{tabular}\end{center}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macrocode}
+\def\Underline{\UMO@line\UnderlineDepth{-\UnderlineDepth}{-\dp\strutbox}}
+\def\Midline{\setbox\@tempboxa\hbox{\UMO@midlinechar}%
+ \UMO@line\MidlineHeight\MidlineHeight{.5\ht\@tempboxa}}
+\def\Overline{\UMO@line\OverlineHeight\OverlineHeight{\ht\strutbox}}
+\def\UMOline{\UMO@line{-\maxdimen}\z@}
+
+% \end{macrocode}
+%
+% \begin{macro}{\UMO@line}
+% \begin{macro}{\\}
+% Since the behavior of the control character \|\\| in \meta{text} has to be
+% different from that of its original version, \|\UMO@line| firstly opens a
+% group to \|\let| the \|\\| be our own newline command \|\UMOnewline|.
+%
+% Next, we calculate $\delta$ of the equation (\ref{eq:delta}). Since
+% $\delta$ is the distance from baseline to the baseline-side edge of the
+% drawn line, we then calculate \|\UMO@height| ($h$) and \|\UMO@depth|
+% ($d$) using the following equations, where $w$ is the value of
+% \|\UMOlineThickness|.
+%
+% \begin{eqnarray}
+% h&=&\cases{\delta+w&if $\delta\geq0$\cr
+% \delta&if $\delta<0$}\\[.3ex]
+% e&=&\cases{-\delta&if $\delta\geq0$\cr
+% -\delta+w&if $\delta<0$}
+% \end{eqnarray}
+%
+% Then \|\ifUMO@nospace| is set to true for the first element of \meta{text},
+% \TeX's mode is turned to horizontal by \|\leavevmode| if necessary, and
+% \|\UMO@spacefactor| is set to the current value of \|\spacefactor| to cope
+% with the case that \meta{text} has a leading space.
+%
+% After those initializations, \|\UMO@wordloop| (see \S\ref{sec:imp-word})
+% is invoked to process each space-separated word element in \meta{text}.
+% The argument passed to \|\UMO@wordloop| has the form of;
+%
+% \begin{quote}
+% $w_1$\verb*| |$w_2$\verb*| |\ldots\verb*| |$w_n$\verb*| \@nil |
+% \end{quote}
+%
+% where $w_i$ is a word element. The last element \|\@nil| and the space
+% following it is added to \meta{text} by a trick expanding
+% \|\noexpand\@nil\space| using \|\edef| and expanding the result once more
+% by \|\expandafter|.
+%
+% After \|\UMO@worldloop| completes its procedure for \meta{text},
+% \|\UMO@line| close the group and invokes \|\UMO@aftergroup| to make
+% \|\spacefactor| have an appropriate value when the space following
+% \meta{text} processed by \TeX.
+% \end{macro}\end{macro}
+% \begin{macrocode}
+\def\UMO@line#1#2#3#4{\begingroup \let\\\UMOnewline
+ \ifdim#1<\z@ \UMO@height#3\relax
+ \else \UMO@height#2\relax \fi
+ \UMO@depth-\UMO@height
+ \ifdim\UMO@height<\z@ \advance\UMO@depth\UMOlineThickness
+ \else \advance\UMO@height\UMOlineThickness \fi
+ \UMO@nospacetrue
+ \ifvmode\leavevmode\fi \UMO@spacefactor\spacefactor
+ \def\@tempa{#4 }\edef\@tempb{\noexpand\@nil\space}%
+ \expandafter\expandafter\expandafter\UMO@wordloop
+ \expandafter\@tempa\@tempb
+ \endgroup \UMO@aftergroup}
+
+%%^L
+
+% \end{macrocode}
+%
+%
+%
+% \subsection{Processing Word Elements}
+% \label{sec:imp-word}
+%
+% Since we have \|\UMOspace| and \|\UMOnewline| (and \|\\| as its alias) as
+% {\em top-level} elements of \meta{text}, we have to scan each character in
+% \meta{text} to find them after picking space-separated word elements.
+%
+% \begin{macro}{\UMO@wordloop}
+% The macro \|\UMO@wordloop| checks if the first character of given word
+% element is `\|{|' by \|\UMO@ifbgroup|. If so, it invokes
+% \|\UMO@wordblock| to process the blocked text following the character,
+% while \|\UMO@iwordloop| is invoked to process characters in the word
+% element otherwise.
+% \end{macro}
+%
+% \begin{macro}{\UMO@ifbgroup}
+% \begin{macro}{\UMO@ifnc}
+% \SpecialIndex{\if@nextchar}
+% The macro \|\UMO@ifbgroup|\meta{then}\meta{else} is similar to \LaTeX's
+% \|\if@nextchar\bgroup|\meta{then}\allowbreak\meta{else}, but not
+% equivalent because it does not skip spaces preceding `\|{|'. This
+% feature is introduced to cope with a \meta{text} having leading spaces as
+% the following.
+%
+% \begin{quote}
+% \verb*|\Underline{ |\Meta{blocked-text}\ldots\|}|
+% \end{quote}
+%
+% Removing the space skip feature makes the implementation of
+% \|\UMO@ifbgroup| simpler because it just uses \|\futurelet| to get the
+% following character.
+% \end{macro}\end{macro}
+%
+% \begin{macrocode}
+%% Processing Word Elements
+
+\def\UMO@wordloop{\UMO@ifbgroup\UMO@wordblock\UMO@iwordloop}
+\def\UMO@ifbgroup#1#2{\let\@tempa#1\let\@tempb#2\futurelet\@tempc\UMO@ifnc}
+\def\UMO@ifnc{\ifx\@tempc\bgroup \let\next\@tempa \else\let\next\@tempb \fi
+ \next}
+% \end{macrocode}
+%
+% \begin{macro}{\UMO@wordblock}
+% \begin{macro}{\UMO@theword}
+% The macro \|\UMO@wordblock|\Meta{blocked-text} at first produces an
+% underline (or others) for the space followed by \Meta{blocked-text}, if
+% exists, by \|\UMO@spaceskip| (see \S\ref{sec:imp-wordspace}). Next, it
+% invokes \|\UMO@putword| (see \S\ref{sec:imp-drawline}) that produces
+% underlined (or other type) word contained in the macro \|\UMO@theword|
+% that is defined as \meta{blocked-text}. Finally, it repeats the procedure
+% for word elements invoking \|\UMO@wordloop| turning \|\ifUMO@nospace| to
+% true to indicate that the element directly following \Meta{blocked-text}
+% does not follows a space.
+%
+% If \Meta{blocked-text} is followed by a space, it is detected by
+% \|\UMO@iwordloop| to produce underlined (or other type) space before next
+% word element is processed as shown later, and the \|\spacefactor| is set
+% to the value determined by the last character (or a few trailing
+% characters) of \meta{blocked-text}. Thus, it is not correct to say
+% \meta{blocked-text} is packed into \|\mbox| and put because the
+% \|\spacefacor| for \|\mbox| is always 1000. However, this feature will
+% make the spacing of \meta{text} natural when it has blocked word.
+% \end{macro}\end{macro}
+%
+% \begin{macrocode}
+\def\UMO@wordblock#1{\UMO@spaceskip
+ \def\UMO@theword{#1}\UMO@putword \UMO@nospacetrue
+ \UMO@wordloop}
+% \end{macrocode}
+%
+% \begin{macro}{\UMO@iwordloop}
+% \begin{macro}{\UMO@theword}
+% The macro \|\UMO@iwordloop|\meta{word}\verb*| | invokes \|\UMO@end| (see
+% \S\ref{sec:imp-end}) for finalization if \meta{word} is \|\@nil|. If the
+% \meta{word} is empty mainly because the preceding word element is a
+% blocked text that \|\UMO@wordblock| has processed and removed,
+% \|\ifUMO@nospace| is turned to false in order to insert a interword space
+% preceding the next word element.
+%
+% Otherwise, \|\UMO@iwordloop| produces an
+% underline (or others) for the space followed by \meta{word}, if
+% exists, by \|\UMO@spaceskip| (see \S\ref{sec:imp-wordspace}). Then it
+% invokes \|\UMO@charloop|\meta{word}\allowbreak\hbox{\|\@nil|} to process
+% the character string of \meta{word} after initializing \|\UMO@theword|
+% empty. Finally, \|\UMO@wordloop| is recursively invoked after turning
+% \|\ifUMO@nospace| to false to indicate the \meta{word} is followed by a
+% space.
+% \end{macro}\end{macro}
+%
+% \begin{macrocode}
+\def\UMO@iwordloop#1 {\def\@tempa{#1}\ifx\@tempa\@nnil \let\next\UMO@end
+ \else\ifx\@tempa\empty \else
+ \UMO@spaceskip
+ \def\UMO@theword{}\UMO@charloop#1\@nil\fi
+ \UMO@nospacefalse \let\next\UMO@wordloop \fi
+ \next}
+
+% \end{macrocode}
+%
+% \begin{macro}{\UMO@charloop}
+% The macro \|\UMO@charloop| checks if the given character
+% is `\|{|' by \|\UMO@ifbgroup| (see above), because a word element may have
+% a blocked text directly following a character string. If so, it invokes
+% \|\UMO@charblock| to process the blocked text following the character,
+% while \|\UMO@icharloop| is invoked to process the given characters as the
+% member of word element otherwise.
+% \end{macro}
+%
+% \begin{macro}{\UMO@charblock}
+% \begin{macro}{\UMO@theword}
+% The macro \|\UMO@charblock|\Meta{blocked-text} at first produces an
+% underlined (or other type) word that precedes \Meta{blocked-text} by
+% \|\UMO@putword| (see \S\ref{sec:imp-drawline}). Next, it
+% invokes \|\UMO@putword| again but this time for \meta{blocked-text} that
+% is \|\def|ined as the body of \|\UMO@theword|.
+% Finally, it repeats the procedure
+% for the remaining character string by invoking \|\UMO@charloop|.
+% \end{macro}\end{macro}
+%
+% \begin{macrocode}
+\def\UMO@charloop{\UMO@ifbgroup\UMO@charblock\UMO@icharloop}
+\def\UMO@charblock#1{\UMO@putword
+ \def\UMO@theword{#1}\UMO@putword
+ \UMO@charloop}
+% \end{macrocode}
+%
+% \begin{macro}{\UMO@icharloop}
+% \begin{macro}{\UMO@theword}
+% \|\UMO@icharloop|\meta{char} at first checks if the \meta{char} is
+% \|\@nil|, \|\UMOspace| or \|\UMOnewline| (or its alias \|\\|). If the
+% \meta{char} is one of them, the character string preceding the \meta{char}
+% is underlined (or other-lined) by \|\UMO@putword| (see
+% \S\ref{sec:imp-drawline}). Then \|\UMO@icharloop| finishes the procedure
+% for the character string if \meta{char} is \|\@nil|, inserts underlined
+% (or other type) space by \|\UMO@space| (see \S\ref{sec:imp-spnl}) if
+% \|\UMOspace|, or breaks line by \|\UMO@newline| (see \S\ref{sec:imp-spnl})
+% if \|\UMOnewline|.
+%
+% Otherwise, the \meta{char} is appended to the tail of \|\UMO@theword| and
+% \|\UMO@charloop| is recursively invoked for the following characters.
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\UMOspace}
+% \begin{macro}{\UMOnewline}
+% Note that the control sequences \|\UMOspace| and \|\UMOnewline| cannot be
+% processed properly if they occur in a context other than the argument of
+% \|\UMO@icharloop|, for example outside of \|\Underline|. Thus they are
+% defined to complain about their illegal occurrence by \|\PackageError|.
+% \end{macro}\end{macro}
+%
+% \begin{macrocode}
+\def\UMO@icharloop#1{\def\@tempa{#1}%
+ \ifx\@tempa\@nnil \UMO@putword \let\next\relax
+ \else\ifx\UMOspace#1\relax \UMO@putword \let\next\UMO@space
+ \else\ifx\UMOnewline#1\relax \UMO@putword \let\next\UMO@newline
+ \else\edef\UMO@theword{\UMO@theword#1}%
+ \let\next\UMO@charloop \fi\fi\fi \next}
+\def\UMOspace{\PackageError{jumoline}%
+ {\string\UMOspace\space cannot be used here.}%
+ {\string\UMOspace\space can be used only in the argument of
+ \string\Underline\space and its relatives.}}
+\def\UMOnewline{\PackageError{jumoline}%
+ {\string\UMOnewline\space cannot be used here.}%
+ {\string\UMOnewline\space can be used only in the argument of
+ \string\Underline\space and its relatives.}}
+
+%%^L
+
+% \end{macrocode}
+%
+%
+%
+% \subsection{Interword Spacing}
+% \label{sec:imp-wordspace}
+%
+% \begin{macro}{\UMO@spaceskip}
+% The macro \|\UMO@spaceskip| produces an underline (or others) for an
+% interword space if \|\ifUMO@nospace| is false. Since the glue for the
+% space is calculated as shown in Table~\ref{tab:space}, it invokes
+% \|\UMO@skip|\meta{$\sigma$} (see \S\ref{sec:imp-drawline}) after setting
+% \|\@tempskipa| to $\sigma$ calculated referring \|\UMO@spacefactor| that is
+% the value of \|\spacefactor| at the time the word preceding the space is
+% processed.
+% \end{macro}
+%
+% \begin{macro}{\UMO@setspaceskip}
+% A non-trivial part of the calculation of $\sigma$ is to obtain the natural
+% width and stretch/shrink factor of \|\spaceskip| ($s$) individually.
+% Since no convenient primitives to obtain $n(s)$, $p(s)$ and $m(s)$ are
+% available, we have to define a macro \|\UMO@setspaceskip| that processes
+% the character string representation of $s$, \meta{the-s}, which is
+% obtained by \|\the\spaceskip|. This \meta{the-s} is represented in one of
+% the following four forms.
+% $$
+% \def\PLUS{\hbox{\tt\char`\ plus\char`\ }}
+% \def\MINUS{\hbox{\tt\char`\ minus\char`\ }}
+% \def\LAND{{\;\land\;}}
+% \meta{the-s}=\cases{n(s)& if $p(s)=0\LAND m(s)=0$\cr
+% n(s)\PLUS p(s)& if $p(s)\neq0\LAND m(s)=0$\cr
+% n(s)\MINUS m(s)& if $p(s)=0\LAND m(s)\neq0$\cr
+% n(s)\PLUS p(s)\MINUS m(s)&if $p(s)\neq0\LAND m(s)\neq0$}
+% $$
+% Thus \|\UMO@spaceskip| invokes \|\UMO@setspaceskip| by the following
+% tricky sequence;
+%
+% \begin{quote}
+% \|\UMO@setspaceskip|\meta{the-s}\verb*| @ @ @ @ \@nil|
+% \end{quote}
+%
+% in order to pass at least six elements (sixth is a garbage) separated by
+% five spaces. The part from \meta{the-s} to the preceding space of
+% \|\@nil| of the calling sequence shown above is generated by a trick
+% expanding ``\|\the\spaceskip\space @ @ @ @ |'' using \|\edef| and
+% expanding the result once more by \|\expandafter|.
+%
+% On the other hand, the argument syntax of \|\UMO@setspaceskip| is as
+% follows.
+%
+% \begin{itemize}\item[]
+% \|\UMO@setspaceskip|\meta{$n$}\verb*| |\meta{plus-or-minus}\verb*| |
+% \meta{p-or-m}\verb*| |\meta{minus}\verb*| |\meta{$m$}\verb*| |
+% \meta{trailer}\|\@nil|
+% \end{itemize}
+%
+% Thus we will know how \meta{the-s} is represented by checking whether
+% \meta{plus-or-minus} is ``\|plus|'', ``\|minus|'' or ``\|@|'', and whether
+% \meta{minus} is ``\|\minus|'' or ``\|@|'', in order to set \|\@tempskipa|
+% to an appropriate glue.
+% \end{macro}
+%
+% \begin{macro}{\UMO@plus}
+% \begin{macro}{\UMO@minus}
+% \changes{v1.1-1}{2000/07/11}
+% {Fixed the misspell of the macro names for \texttt{plus} and
+% \texttt{minus}.}
+% Note that ``\|plus|'' and ``\|minus|'' shown above have to consist of
+% characters whose \|\catcode| are not 11 but 12. To obtain these unusual
+% character strings easily, we \|\def|ine \|\UMO@plus| and \|\UMO@minus| as
+% these strings beforehand by extracting them from \|\the\@tempskipa| that
+% contains ``\|\1pt plus 2pt minus 3pt|''.
+% \end{macro}\end{macro}
+%
+% \begin{macrocode}
+%% Interword Spacing
+
+\def\UMO@spaceskip{\ifUMO@nospace\else
+ \ifdim\spaceskip=\z@
+ \@tempdima\fontdimen3\font\relax
+ \multiply\@tempdima\UMO@spacefactor \divide\@tempdima\@m
+ \@tempdimb\fontdimen4\font\relax \multiply\@tempdimb\@m
+ \divide\@tempdimb\UMO@spacefactor
+ \@tempskipa\fontdimen2\font plus\@tempdima minus\@tempdimb\relax
+ \else
+ \edef\@tempa{\the\spaceskip\space @ @ @ @ }%
+ \expandafter\UMO@setspaceskip\@tempa\@nil
+ \fi
+ \ifnum\UMO@spacefactor<2000\else
+ \ifdim\xspaceskip=\z@ \advance\@tempskipa\fontdimen7\font
+ \else \@tempskipa\xspaceskip
+ \fi\fi
+ \UMO@skip\@tempskipa \fi}
+\def\UMO@setspaceskip#1 #2 #3 #4 #5 #6\@nil{\@tempdima\z@ \@tempdimb\z@
+ \def\@tempa{#2}\def\@tempb{#3}%
+ \ifx\@tempa\UMO@plus \@tempdima#3\def\@tempa{#4}\def\@tempb{#5}\fi
+ \ifx\@tempa\UMO@minus \@tempdimb\@tempb\relax\fi
+ \multiply\@tempdima\UMO@specefactor \divide\@tempdima\@m
+ \multiply\@tempdimb\@m \divide\UMO@spacefactor
+ \@tempskipa#1 plus\@tempdima minus\@tempdimb\relax}
+\def\@tempa#1 #2 #3 #4 #5\@nil{\def\UMO@plus{#2}\def\UMO@minus{#4}}
+\@tempskipa1pt plus 2pt minus 3pt
+\expandafter\@tempa\the\@tempskipa\@nil
+
+%%^L
+
+% \end{macrocode}
+%
+%
+%
+% \subsection{Drawing Lines}
+% \label{sec:imp-drawline}
+%
+% \begin{macro}{\UMO@putword}
+% \|\UMO@putword| produces a \|\hbox| containing a \meta{word}
+% defined as the body of \|\UMO@theword| and an underline (or others) for
+% the \meta{word}. The width of line is that of the \|\hbox|, and the height
+% and depth is \|\UMO@height| and \|\UMO@depth| respectively. The line is
+% put by \|\rlap| so that it is laid over the \|\hbox|. After the box and
+% line is produced \|\UMO@theword| is reinitialized to empty.
+% \end{macro}
+%
+% \begin{macro}{\UMO@skip}
+% \|\UMO@skip|\Meta{glue} draws an underline (or others) for a
+% stretchable\slash shrinkable space of \meta{glue} by \|\leaders| as shown
+% in \S\ref{sec:imp-solution}.
+% \end{macro}
+%
+% \begin{macrocode}
+%% Draw Under/Mid/Overline
+
+\def\UMO@putword{\setbox\@tempboxa\hbox{\UMO@theword
+ \global\UMO@spacefactor\spacefactor}%
+ \@tempdima\wd\@tempboxa
+ \rlap{\vrule\@height\UMO@height\@depth\UMO@depth\@width\@tempdima}%
+ \box\@tempboxa\def\UMO@theword{}}
+\def\UMO@skip#1{%
+ \leaders\hrule\@height\UMO@height\@depth\UMO@depth\hskip#1\relax}
+
+%%^L
+
+% \end{macrocode}
+%
+%
+%
+% \subsection{Explicit Spacing and Line Breaking}
+% \label{sec:imp-spnl}
+%
+% \begin{macro}{\UMO@space}
+% \begin{macro}{\UMO@sspace}
+% \begin{macro}{\UMO@ispace}
+% \begin{macro}{\UMO@iispace}
+% \begin{macro}{\UMO@penalty}
+% The procedure for the user interface control sequence
+% \|\UMOspace|\Meta{glue}\opt{pen} is performed by \|\UMO@space| to check
+% the existence of `\|*|' directly following \|\UMOspace|, \|\UMO@ispace| to
+% check that of `\|*|' directly preceding \opt{pen}, and \|\UMO@iispace| to
+% check that of \opt{pen} and to invoke \|\UMO@skip| (see
+% \S\ref{sec:imp-drawline}) to draw a line for the space. The penalty is
+% inserted by \|\UMO@penalty| following \LaTeX's convention if \|\@tempswa|
+% is true or \TeX's otherwise.
+%
+% The sequence \|\UMOspace*|\Meta{glue} is processed by \|\UMO@sspace| that
+% inserts \|\vrule| of zero wide and \|\nobreak| as \|\hspace*| does, and
+% then draw a line by \|\UMO@skip| for a space of \meta{glue}.
+%
+% In both cases, \|\UMO@charloop| is invoked after underlined (or other
+% type) space is produced to process characters following \|\UMOspace|.
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macrocode}
+%% Explicit Spacing and Line Breaking
+
+\def\UMO@space{\@ifstar\UMO@sspace\UMO@ispace}
+\def\UMO@sspace#1{\vrule width\z@\nobreak\UMO@skip{#1}\UMO@charloop}
+\def\UMO@ispace#1{\@tempskipa#1\relax
+ \@ifstar{\@tempswafalse\UMO@iispace}{\@tempswatrue\UMO@iispace}}
+\def\UMO@iispace{\@ifnextchar[%]
+ {\UMO@penalty}%
+ {\UMO@skip\@tempskipa \UMO@charloop}}
+\def\UMO@penalty[#1]{\@tempcnta#1\relax
+ \if@tempswa
+ \ifnum\@tempcnta<\z@ \@tempcnta-\@tempcnta \fi
+ \ifcase\@tempcnta \or
+ \@tempcnta\@lowpenalty \or
+ \@tempcnta\@medpenalty \or
+ \@tempcnta\@highpenalty \else
+ \@tempcnta\@M \fi
+ \ifnum#1<\z@ \@tempcnta-\@tempcnta \fi \fi
+ \penalty\@tempcnta \UMO@skip\@tempskipa \UMO@charloop}
+
+% \end{macrocode}
+%
+% \begin{macro}{\UMO@newline}
+% The user interface control sequence \|\UMOnewline|(\|*|) is processed by
+% \|\UMO@newline|. It produces a underlined (or other type) space having
+% \|1fil| stretch factor by \|\UMO@skip| if `\|*|' is supplied, while a
+% space of \|1fil| is simply inserted otherwise. In both cases, \|\break|
+% is inserted after the space to break a line and \|\UMO@charloop| is
+% invoked for the characters following \|\UMOnewline|.
+% \end{macro}
+%
+% \begin{macrocode}
+\def\UMO@newline{\@ifstar{\UMO@skip{0pt plus1fil}\break \UMO@charloop}%
+ {\hfil \break \UMO@charloop}}
+
+%%^L
+
+% \end{macrocode}
+%
+%
+%
+% \subsection{Finalization}
+% \label{sec:imp-end}
+%
+% \begin{macro}{\UMO@end}
+% \begin{macro}{\UMO@aftergroup}
+% When the \meta{text} is completely processed, \|\UMO@end| is invoked from
+% \|\UMO@iwordloop| to set \|\spacefactor| to the value at the last word
+% element is produced. Since this assignment has to be performed outside the
+% group that \|\UMO@line| has opened (see \S\ref{sec:imp-uifinit}), setting
+% \|\spacefactor| to \|\UMO@spacefactor| is \|\xdef|ined as the body of
+% \|\UMO@aftergroup| that is called by \|\UMO@line| after the group is closed.
+% \end{macro}\end{macro}
+%
+% \begin{macrocode}
+%% Finalization
+
+\def\UMO@end{\xdef\UMO@aftergroup{\spacefactor\number\UMO@spacefactor}}
+% \end{macrocode}
+% \iffalse
+%</package>
+% \fi
+%
+%
+%
+% \IndexPrologue{\newpage\section*{Index}
+% Italicized number refers to the page where the specification and usage of
+% corresponding entry is described, while underlined is for the
+% implementation of the entry.\endgraf
+% 
+% To find a control sequence, remove prefixes \cs{@}, \cs{adl@} or
+% \cs{ifadl@} from its name if it has one of them.}
+% \Finale
+% \GlossaryPrologue{\newpage\section*{Revision History}}
+% \PrintChanges
+\endinput
diff --git a/macros/latex/contrib/umoline/umoline.ins b/macros/latex/contrib/umoline/umoline.ins
new file mode 100644
index 0000000000..0e574d6f73
--- /dev/null
+++ b/macros/latex/contrib/umoline/umoline.ins
@@ -0,0 +1,6 @@
+\input docstrip.tex
+\keepsilent
+\askonceonly
+\generate{\file{umoline.sty}{\from{umoline.dtx}{package}}
+ \file{umoline-man.tex}{\from{umoline.dtx}{driver}}}
+\endbatchfile
diff --git a/macros/latex/contrib/umoline/umoline.pdf b/macros/latex/contrib/umoline/umoline.pdf
new file mode 100644
index 0000000000..7491e890a5
--- /dev/null
+++ b/macros/latex/contrib/umoline/umoline.pdf
Binary files differ