% \iffalse %% Style file `umoline'. %% Copyright (C) 1999,2000 Hiroshi Nakashima %% (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} % %\def\next{LaTeX2e} %\ifx\fmtname\next %\def\next{ %\NeedsTeXFormat{LaTeX2e}[1994/12/01] %\ProvidesPackage{umoline}} %\else\def\next[#1]{}\fi %\next %\ProvidesFile{umoline.drv} % \fi % \ProvidesFile{umoline.dtx} [2000/07/11 v1.1 ] % \iffalse %<*driver> \documentclass{ltxdoc} \usepackage{umoline} \DisableCrossrefs \PageIndex \CodelineNumbered \RecordChanges % %\OnlyDescription %\def\ONLYDESCRIPTION{} %<*driver> \advance\textwidth4em \begin{document} \DocInput{umoline.dtx} \end{document} % % \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 % % \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