<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%% ragged.sty by Laurent Siebenmann, March 1996 --
  %% beta version of Mar 30, 1996.
  %% Aim: Maintain hyphenation and raggedness control
  %% while providing the following for all formats.
  %% --- to make a paragraph ragged on left and justified   
  %% on right, use the syntax
  %% \raggedL &lt;paragraph&gt; 
  %% --- to make a paragraph ragged on both left and right  
  %% (and symmetric), use the syntax
  %% \raggedC &lt;paragraph&gt;  
  %% \raggedR is essentially equivalent \raggedright of Plain
  %% or to \RaggedRight of raggedri.sty of G. Schr"oder.
  %% All three \raggedX should give the same linebreaks; they 
  %% just provide different horizontal positioning of the lines.
  %% Documentation of options etc. follows \endinput.
  %% Run this file alone to see a demo.
 
 \ifx\undefined\raggedL\else\expandafter\endinput\fi
 
 \chardef\raggedcatAT=\catcode`\@ \catcode`\@=11
 
 %%temporarily suppress Plain's logging of allocations
 \let\R@Gtemp\wlog 
 \def\wlog#1{\relax} 
 
 \newbox\R@Gvbox
 \newbox\R@Ghbox
 \newbox\R@Ghbox@
 
 \newcount\R@Glinect
 
 \newskip\R@Gfillskip
 
 \newdimen\R@Gauxdim
 \newdimen\R@Gindentdim
 \newdimen\R@Ghsize
 \newdimen\raggedStretch
 
 \raggedStretch=10\p@ %% default
 
 \newtoks\raggedEnv
 \newtoks\raggedEnvOnce
 
 \let\wlog\R@Gtemp 
 
 \R@Gfillskip=\z@ plus 1fil
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%% Core macros

 \def\R@Gprep{\ifhmode
  \errmessage{ Do not use 
     \noexpand\raggedX commands in horizontal mode}%
  \expandafter\par\fi}
 
 \def\R@Gcore{%
  \setbox\R@Gvbox=\vbox\bgroup 
   \hsize=\maxdimen \leftskip=\z@
   \hskip\z@skip}
 
 \def\CalcR@GIndent@{%
  %% first set \R@Gindentdim to excess of \R@Ghsize over remainder
  \R@Gindentdim=\hsize
  \advance\R@Gindentdim by -\rightskip
  \advance\R@Gindentdim by -\wd\R@Ghbox@
  %% second convert to hang as l,c,r demand
  \fixR@Ghang@ %% \R@Gindentdim=.5\R@Gindentdim for \raggedC
  }%

 \def\endR@Gcore{\endgraf
  \global\R@Glinect=\prevgraf
  \global\setbox\R@Ghbox=\lastbox
  \egroup %
  \ifcase\R@Glinect\relax %% 0
  \or \endR@Gcore@ %% 1
  \else \errmessage{\noexpand\raggedX is failing. 
    Read about \string\RaggedX}\endR@Gcore@ %% &gt;1
  \fi}
 
 \def\endR@Gcore@{%
  \setbox\R@Gvbox=\vbox{%
    \unhcopy\R@Ghbox\unpenalty\unskip\unskip
    \endgraf\global\R@Glinect=\prevgraf %\showthe\prevgraf
    \global\setbox\R@Ghbox@=\lastbox}%
  \setbox\R@Ghbox@=\hbox{%
    \unhbox\R@Ghbox@\unpenalty\unskip\unskip}%
  \CalcR@GIndent@ %% 
  \ifdim\R@Gindentdim&gt;\z@
    \hangindent=\R@Gindentdim %\showthe\R@Gindentdim
  \else
    \hangindent=\z@ 
    %% Rmk: neg hangindents are from right margin
  \fi
  \advance\R@Glinect by -1\relax
  \hangafter\R@Glinect
  \unhbox\R@Ghbox
  \endgraf}

 \def\endR@@G{\endR@Gcore\let\par\R@Goldpar\endgroup}

 \def\raggedFrac#1{\def\R@GFrac{#1 }}

 \raggedFrac{1} %% default

 \def\R@GEnv@{%
  %\parskip=4pt plus 1pt 
  %\baselineskip=12pt
  %\parfillskip=0pt plus 1fil
  %\emergencystretch=20pt
  \finalhyphendemerits=20000 % 5000 is Plain default
  \parindent=\z@ %% 0
  \pretolerance=\@M %% 10000
  %% end of options easily changeable 
  %% via \raggedEnv{...} and \raggedEnvOnce{...}
  \let\R@Goldpar\par 
  \let\par\endR@@G
  \R@Gauxdim=\hsize 
  \advance\R@Gauxdim by -\leftskip
  \advance\R@Gauxdim by -\rightskip
  \R@Ghsize=\R@GFrac\R@Gauxdim
  \advance\R@Gauxdim by -\R@Ghsize
  \R@GRedefs
  \the\raggedEnv
  \the\raggedEnvOnce\global\raggedEnvOnce{}%
  }%

 \def\R@GRedefs{\let\break\R@Gbreak
  \let\vadjust\R@Gvadjust@
  \everydisplay{\R@Geverydisplaymole@}}

  \def\R@Gnono{ is forbidden with \string\raggedX}
  \def\R@Gbreak{\errmessage{\noexpand\break\R@Gnono}\penalty-\@M}%
  \def\R@Gvadjust@#1{{\tt (USE OF vadjust)}%
        \errmessage{\noexpand\vadjust\R@Gnono.\space See output}}%
  \def\R@Geverydisplaymole@#1$${$${\tt (DISPLAY)}%
        \errmessage{Display math\R@Gnono. See output}}%

  \def\raggedHrule{\unskip\penalty0
        \vrule height0.3\p@ depth-0\p@ width \R@Ghsize \penalty0}%

 %%% \R@GEnv@@ corrects \R@Ghsize if user has modified it 
  %% through \leftskip, \rightskip via \raggedEnv{...}
  %% then does other last minute tasks tasks
 \def\R@GEnv@@{%
   \R@Ghsize=\hsize
   \advance\R@Ghsize by -\leftskip
   \advance\R@Ghsize by -\rightskip
   \parfillskip=\R@Gfillskip
   }

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%% User macros

 %%% \raggedC 
 \def\raggedC{\R@Gprep\begingroup
  \leftskip=1\leftskip \rightskip=1\rightskip 
  \R@GEnv@
  \advance\leftskip by .5\R@Gauxdim plus .5\raggedStretch
  \advance\rightskip by .5\R@Gauxdim plus .5\raggedStretch
  \def\fixR@Ghang@{\R@Gindentdim=.5\R@Gindentdim}%
  \R@GEnv@@ 
  \R@Gcore}

 %%% \RaggedC 
 \def\RaggedC{\R@Gprep\begingroup\let\R@Gcore\relax
  \let\R@GRedefs\relax\raggedC
  \parfillskip=\z@ 
  \def\par{\let\par\R@Goldpar\par\endgroup\endgroup}%
  }

 % %%% \raggedR@ is strict analog of \raggedR@, \raggedC@
 %  %% present for testing only
 % \def\raggedR@{\R@Gprep\begingroup
 %  \R@GEnv@ %% not needed
 %  \advance\rightskip by \R@Gauxdim plus \raggedStretch 
 %  \def\fixR@Ghang@{\R@Gindentdim=0\p@}%
 %  \R@GEnv@@ 
 %  \R@Gcore
 %  }

 %%% \raggedR is more robust then \raggedL, \raggedC as it
  %% it allows $$...$$ and \vadjust, \break etc. in paragraph.
 \def\raggedR{\R@Gprep\begingroup
  \let\R@GRedefs\relax
  \R@GEnv@ %% initial part
  \advance\rightskip by \R@Gauxdim plus \raggedStretch 
  \R@GEnv@@ 
  \def\par{\let\par\R@Goldpar\par\endgroup}%
  }

 %%% \RaggedR 
 \def\RaggedR{\R@Gprep\raggedR
   \parfillskip=\z@\relax}

 \def\raggedL{\R@Gprep\begingroup
  \R@GEnv@
  \advance\leftskip by \R@Gauxdim plus \raggedStretch 
  \def\fixR@Ghang@{}%
  \R@GEnv@@ 
  \R@Gcore}

 %%% \RaggedL 
 \def\RaggedL{\R@Gprep\begingroup\let\R@Gcore\relax
  \let\R@GRedefs\relax\raggedL
  \parfillskip=\z@ 
  \def\par{\let\par\R@Goldpar\par\endgroup\endgroup}%
  }

 \def\gobble#1{}

 \catcode`\@=\raggedcatAT 

 %%%% END INPUT IF THIS IS NOT A DEMO RUN !
 \edef\temp{\csname\jobname\endcsname}%
 \edef\Temp{\csname ragged.sty\endcsname}%
 \ifx\temp\Temp\else
   \expandafter\endinput 
 \fi

 %%%% END OF MACROS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%% BEGINNING OF DEMONSTRATION
  %%% TESTS FOR \raggedX

 \ifx\documentstyle\undefined
   \let\documentstyle\gobble \let\begin\gobble
 \fi
 \documentstyle{article} 
 \begin{document}

 \hsize=400pt

 \raggedStretch=1000pt
 \RaggedC
      THESE ARE TESTS FOR ragged.sty\break
     EXPORT THE TESTS BEFORE PLAYING WITH THEM
 \bigskip

  \widowpenalty=10000
  \leftskip=0\hsize %plus 10pt
  \rightskip=0\hsize %plus 10pt
  \raggedStretch=10pt %% 10pt dafault
  \raggedFrac{.5}
  \raggedEnv{\parskip=4pt plus 3pt
    \emergencystretch=20pt
    %\pretolerance=100
    }
  \parskip=0pt plus 2pt
  \parindent=0pt

\def\TESTTEXT{It is the union of passionate interest in detailed
facts with equal devotion to abstract generalization which forms
the novelty in  \hbox{our present society}. }

 \TESTTEXT

 %\raggedEnvOnce{\raggedStretch=0pt}
 \raggedL\raggedHrule
 % $$dfd$$ %\vadjust{\hrule}% \break
 \TESTTEXT

 \raggedL
 {\sl A.N. Whitehead}

 \raggedC\raggedHrule\TESTTEXT

 %\raggedEnvOnce{\parskip=0pt}
 \raggedC{\sl A.N. Whitehead}


 \raggedR\raggedHrule\TESTTEXT

 \raggedR
{\sl A.N. Whitehead}

 %\end
 %{document}

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %%%  TESTS FOR \RaggedX
 
  \raggedStretch=1000pt %% default 10pt %% play with this
  \raggedEnv{%
    %\linepenalty=0 %% default 50 %% play with this
    \parskip=4pt plus 3pt
    %\pretolerance=0 %% default 100
    %\hyphenpenalty=0 %% default 50
    }

 \bigskip \hrule \bigskip

 \TESTTEXT

  \RaggedL\raggedHrule\TESTTEXT

 \raggedL
{\sl A.N. Whitehead}

 
 \RaggedC\raggedHrule\TESTTEXT

 %\raggedEnvOnce{\parskip=0pt}
 \raggedC{\sl A.N. Whitehead}


 \RaggedR\raggedHrule\TESTTEXT

 \raggedR
{\sl A.N. Whitehead}

\end
{document}

 %%%% END OF TESTS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


         *****    USER DOCUMENTATION FOR ragged.sty     *****



 *** TYPICAL EXAMPLE

  \input ragged.sty 

  \raggedFrac{.4}
  \raggedEnv{\parskip=4pt plus 3pt}
  \raggedL\raggedHrule 
I was not a Child~Prodigy, because a Child~Prodigy is
a child who knows as much when it is a child as it 
does when it~grows~up.
               
\raggedL
{--- Will Rogers}

The above will produce a quotation that is aligned to the right margin,
ragged on the left and having about .4 the width of a normal line. 

     Just compose this file itself to see to see a more extensive
example instantly composed.



 *** INTENDED USES

(i) For "ragged-left-and-flush-right" formatting of short prose
quotations tradionally placed  at the end  of book chapters.   

(ii) For captions on figures in an artistic page layout.  

(iii) For notes in a left hand margin ragged on the left and aligned
on the right.

 (iv) For "raggedleft" composition of left-hand pages of of narrow
brochures --- matching "raggedright" composition of right hand pages.

     Admittedly, hand specification of linebreaks is often the best
option, and that is how Don Knuth proceeds for use (i) in most of his
books. But in case reformatting for different page sizes or screen sizes
is anticipated, Knuth's alternative should be avoided like the plague;
this should apply to all documents distributed in ".tex" typescript
format.  The last 3 applications seem to demand good control on
raggedness and hyphenation.



 *** NOVELTY 

     It is too early to assert with confidence that ragged.sty offers
genuinely new capabilities in all formats.

     Hopefully \raggedL and \raggedC offer something new even for LaTeX
users. The standard "center" and "flushright" environments of LaTeX do
*roughly* the same thing by a different method.  But the macros
\raggedL and \raggedC seem a necessery innovation in case one wants
control on raggedness and/or hyphenation.

     Outside LaTeX, even the  offer even the more limited LaTeX features
are little known; thus, particularly sturdy macros \RaggedC and  \RaggedL
are also offered by ragged.sty to provide just the  LaTeX features in
other formats --- which means all features except raggedness control and
hyphenation.



 *** USER CONTROL SEQUENCE SUMMARY

The \raggedX trio:
\raggedL &lt;paragraph&gt; %% sets paragraph ragged on left justified on right
\raggedC &lt;paragraph&gt; %% sets paragraph ragged on both left and right
\raggedR &lt;paragraph&gt; %% sets paragraph ragged on right justified on left
See also the companion trio \RaggedX below.

With the default configuration, each of these leaves an arbitrarily
short last line while maintaining some tension on earlier lines
(\raggedStretch=10pt, total raggedness stretch).

Only the following paragraph is affected by each.

 --- \raggedHrule provides a horizontal line of the ragged text width
if put *immediately after* \raggedX.  

 --- \raggedFrac{&lt;decimal fraction&gt;} sets the length of the lines of
the ragged-set paragraphs as a fraction of current line length. 
The  current line length is 

        (\hsize  diminished by  \leftskip  and  \rightskip)

 --- \raggedEnv{...} is to be placed before \raggedX; it allows the user
to redefine parameters for the  line breaking environment of \raggedX. 
Inspect the definition  of the internal macro \R@GEnv@ for hints on
which parameters to change.  Never change the code in ragged.sty;
your modifications belong in \raggedEnv{...} within  your typescripts.

     \raggedEnv{...} and \raggedFrac{...} need not be repeated before
each use of \raggedX. If you want once-only temporary ragged
environment change, you can use grouping or \raggedEnvOnce{...}

     \raggedFrac, \hsize, \leftskip, \rightskip should not appear in the
argument of \raggedEnv; this is roughly because they relate to external
parameters.

     By default, paragraph indentation of the ragged paragraph is
zero.   Hyphenation is by default switched off.  However
\raggedEnv{\parindent=20pt \pretolerance=100}  would change this back
to Plain defaults. 

     You may want to adjust the new dimension \raggedStretch, which is
10pt by default.  Incidentally, if the total stretch in lines falls
below about 20pt, you may have to add, say \emergencystretch=20pt
inside \raggedEnv{...}.

     In tuning stretch and hyphenation, consider also the following:
\fontdimen3\font=&lt;dimension&gt;, \spaceskip=&lt;skip&gt; and \xspaceskip=&lt;skip&gt;.
Cf. Plain's \raggedright.

     A companion trio \RaggedL, \RaggedC, \RaggedR  are simpler,
robuster, and faster macros that perform two services already available
in LaTeX:

 (i) If used with default parameters, they force the last paragraph line
to have roughly the same length as all others.  Results are good if
there are many lines.

 (ii) If used with parameter value \raggedStretch=1000pt, they behave
like the competing LaTeX environments with default parameters: lines are
relaxed and filled in natural order.


 *** INSTALLATION

     For any format,  \input ragged.sty  will install the package.

     For LaTeX (version 2e), place \usepackage{ragged} in the article header
between \documentclass{...} and \begin{document}.



 *** OCCASIONAL PROBLEMS AND THEIR REMEDIES

     \raggedL and \raggedC (not \raggedR and \RaggedX) are only
moderately robust: they work correctly only when the paragraph contents
will form a single line if composed on an "infinitely" long line.
Therefore, they misbehave if they contain *for example* displayed math
or \break or material inserted by \vadjust; and  also if the paragraph
exceeds about a page of typing; error warnings are given.

     The most annoying failing is the unavailability of \break; it can
be replaced  by \hbox{...} and the tie ~ ; indeed without introducing the
inflexibility which \break does.

     Fortunately such limitations do not much interfere with the use
intended. (Indeed the unavailability of \break is a blessing in
disguise.)

    If difficulty is nevertheless encountered, use the *fast* and
*robust* \RaggedL and \RaggedC where necessary (search out "\Ragged"
instructions and tests!).  

    On a given paragraph, all 3 \raggedX should always produce the
*same* linebreaks; any exception is a bug.  Similarly for all three
\RaggedX.

    Please report undocumented bugs to lcs@topo.math.u-psud.fr.



 *** A TRIVIAL SOLUTION WHEN RAGGEDNESS IS NULL

     Donald Arseneau pointed out (Info-TeX, Sat Mar  9, 1996) that if
left and right margins are justified (i.e. \raggedStretch is zero)  then
the last line of paragraphs can be center or right aligned by a simple
"trick" setting as follows:

 *** Center Alignment

   \leftskip=1\leftskip plus 1fil  %% use \setlength in LaTeX
   \rightskip=-\leftskip
   \parfillskip=0pt plus 2fil

 *** Right Alignment

   \leftskip=1\leftskip plus 1fil  %% use \setlength in LaTeX
   \rightskip=-\leftskip
   \parfillskip=0pt plus 1fil

Donald considers this *well known*; he learned of it first from
Barbara Beeton.

    This device will also work in ragged environments IF AND WHEN
*extended* TeX allows skips to have *both* finite and infinite stretch
-- analogous to ordinals of the form integer + \omega.  This is not
yet planned.

    As always in TeX, there may yet be another "deus ex machina"!  Time
will tell.



 *** WHY USE ragged.sty WITH LATEX?

     LaTeX (in all versions) has the environments "flushleft", "center",
and "flushright" that perform very nearly the services of \RaggedL,
\RaggedC, and \RaggedR.  LaTeX also has macros \raggedright and
\raggedleft  roughly equivalent to "flushleft" and "flushright" minus
the grouping that goes along with an environment. 

     These LaTeX environments/macros perform reliably, and like \RaggedX
do *not* suffer the fragility mentioned above for \raggedX. 

      All these LaTeX features are programmed by a mare parameter setting
(cf. programmer documentation below): they simply use the infinite value
1fil  for the stretch component of \leftskip and/or \rightskip, and this
permits quite excessive raggedness -- as testing shows.  If one just
makes this stretch finite and modest, then the last line becomes
excessively stretched and/or all lines tend to become equal. This matter
seems to have been first recorded and remedied by Jan van der Steen and
Martin Schr\"oder who wrote raggedri.sty (1993) (see  CTAN) producing a
macro \RaggedRight more or less  equivalent to Plain's \raggedright --
but no \RaggedCenter nor \RaggedLeft.

     Consequently LaTeX users have reason to use my macros \raggedL and
\raggedC  when controlled raggedness is wanted.  In addition, I suspect
the ragged.sty syntax will prove helpful in adjusting up width's and
margins.

     Since the competing LaTeX environments are deeply imbricated in
the complicated "list" environment apparatus, I have not attempted to
tinker directly with the LaTeX code to make the new ragged.sty features
a well integrated patch for LaTeX; that is a job for those working on
LaTeX3. 



 *** HISTORY

     These macros were initially programmed to respond to a request of 
Laszlo Battha &lt;battha@apollo.ggki.hu&gt;, Mon Mar 4, 1996 on the Info-TeX
list.

     Laurent Siebenmann
             Math'ematique, Bat. 425,
             Univ de Paris-Sud,
             91405-Orsay,
             France







 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


     *****   PROGRAMMER DOCUMENTATION FOR ragged.sty   *****

     In essence, \RaggedX is a mere parameter setting; indeed, it sets
the stretch components of \leftskip and \rightskip to total
\raggedStretch.  What is a miracle preordained by Knuth is that as
soon as \raggedStretch is huge (say 1000pt), while \linepenalty
remains substantial (say 50) all lines but the last are as full as
they can be without puting interword spaces under tension. 
Hyphenation occurs only to prevent line length overrun.  LaTeX
operates similarly but using infinite stretch.

     In contrast, \raggedL and \raggedC are hopefully original; they
are more devious than outright difficult; what will be more
difficult is to make them work in absolutely all circumstances where
Plain's \raggedright works. They already give perfect typography 
or else complain.

     Permit me to set the scene with an overstatement. Analogs of all
three \raggedX exist in every competent wordprocessor since 1984 --
beginning with MacWrite. However, in TeX (1982) there was an
unfortunate oversight; there should be not just one \parfillskip but
two: \leftparfillskip and \rightparfillskip=\parfillskip.  These
should be "skip"s (elastic spaces) inserted at the left and right of
the last line of each paragraph.  If these become available (say in
an e-TeX or Omega), one will be able to  program  \raggedL and
\raggedC by merely setting these parameters along with \leftskip,
\rightskip and a few others.

     This makes it clear that the moderately complicated programming
I have used is just a "workaround".  Fortunately it is neither slow
nor bulky.

     Here is the logic of the present programming of \raggedL; it
will be followed by some promising alternatives.



 *** CURRENT METHOD (A)

 --- Sweep the paragraph text into \vbox of huge \hsize so that the
paragraph text fits on one line.  The use of a \vbox instead of an
\hbox; here is the one recent "breakthrough" involved; it surfaced as a
result of investigations of Barbara Beeton, Michael Downes and Don
Knuth -- in this order! -- see TUGboat 11 (Nov 1991), pages 605--612.

 --- Extract the line as an \hbox and \unhbox it into a \vbox with
the "raggedleft" environment as desired, except for \parfillskip=0pt
plus 1fil where we would really want \leftparfillskip=0pt plus 1fil
and  \rightparfillskip=0pt. Here we learn the number of lines in the
paragraph by use of \lastgraph. 

 --- We find out the length of the the last line by using \lastbox to
pick off the last \hbox in the above \vbox, and then \unhbox'ing it
into another \hbox stripping off a penalty10000, \rightskip and
\parfillskip (going right to left).

 --- From this, we can calculate the indentation by which to push the
last box right to make it flush with the right margin.

     But we do *not* do that since it entails unpleasant technical
complications related to vertical placement.  Instead we more
simply:

 --- unhbox onto the current page (essentially) the first \hbox
encountered above, using the last mentioned environment modified only by
a  \hangindent  equal to the measured indent, which is scheduled by 
\hangafter to intervene on the last line of the paragraph.

    In a real sense the current page receives the final paragraph
just like a normal paragraph.  Therefore (hopefully!) no vertical
mode complications will occur.  

    Far *more* complex tricks of this sort, *the last one excepted*, are
exploited in Donald Arseneau's shapepar.sty on CTAN.  Fortunately,
ragged.sty and  shapepar.sty  do not compete on the performance
front.



 *** ALTERNATIVE METHOD (B)

     This is the method I first attempted in a preliminary "hack" posted
on Info-teX Sat Mar 9, 1996.  The raggedleft paragraph can contain
\vadjust and \break since the "one-long-line" requirement of (A) 
disappears.  

 --- first compose the paragraph \vbox with the ultimately desired
\hsize, \leftskip, \rightskip, but use \parfillskip=0pt plus 1fil. 

 --- obtain the relaxed length of the last paragraph line much as 
as above, using \lastbox etc. The last line is thus "deleted".

 --- reconstruct the last line as an \hbox to assure the correct
horizontal location.

 --- restore the last line into the \vbox.  This requires careful
vertical placement, possibly involving \lastskip, \lastdepth,
\lastpenalty,

 --- \unvbox the corrected \vbox onto the current page.  
This again requires careful vertical placement, eg. as regards 
space both above and below, penalties etc.

     The last step requires that one be able to perfectly emulate, by
hand as it were, important parts of TeX's paragraph builder.  It is by
far a more delicate task than the first method.  Donald Arseneau called
it "painful" (Info-TeX, Sat Mar  9, 1996).  

     Indentations above *displayed equations* have not been discussed
(but they are in alternative C below); that would redouble complexity.



 *** ALTERNATIVE METHOD (C)

     This last alternative is my proposed improvement of the first
method by use of an auxiliary file for storing widths between TeX
jobs and by possible use of two passes on each paragraph.  

     This method seems to fully eliminate the failings of \raggedX,
ie. refusal of: displays, \break, \vadjust. Very desirable for a
narrow brochure with left-hand pages composed "raggedleft".   But I
have done only fragmentary prototyping.

     Two passes on a paragraph are executed (when that is necessary)
by taking up the whole paragraph in a macro argument, storing it
temporarily in unexpanded token list form, and then rereading it so
that category assignments are those for normal progressive input. 
This will be done by fast internal primitives in all versions of
e-TeX. But in Knuth's TeX it requires writing the unexpanded token
list out to a file, with help of the the \meaning primitive and
then rereading.
     
     An auxiliary file with indentation widths may indicate that a
preliminary pass is unnecessary; thus, on the average, composition
should be very fast.  

 --- during a possible preliminary composition of a paragraph one
keeps \parfillskip equal 0pt plus 1fil, and merely records, in the
order of occurrence:

 (a) the widths of remainders on the last line before each display,
using \predisplaysize and a temporary addition to the token list
\everydisplay.

 (b) the width of the remainder on the paragraph's last line. This
is gotten using \lastbox much as in methods (A) or (B).

Note that \lastbox operates in internal vertical mode, and not in
vertical mode. Hence all preliminary composition is to be done in a
\vbox. This \vbox is discarded once the necessary indentation
information has been extracted --- just as in method (A) but
contrary to method (B).

 --- during final raggedleft composition of a paragraph, the width
information is applied with help from \lastgraf, \hangindent,
\hangafter much as in method (A).

In this final raggedleft composition of a paragraph, the width
information used may be either from the current job or from a
previous job. But it is always obtained from some preliminary
composition.

     In the case of a paragraph that is composed by \raggedL in a 
single pass, it would be highly desirable to have a check that the
composed paragraph is OK;  it would for example probably *not* be OK
if changes had intervened there since last composition.  The
unavailability of \lastbox in ordinary  vertical mode seems to make
a *sure* check difficult.  Perhaps one must be content  with checks
that are less than sure --- such as variation of the number  of
typescript lines occupied by the paragraph as found via
\inputlineno. The user could also signal changes using a syntax like
\raggedL[changed 1647]. Also,  \raggedTwoPass in the header could
force slow but sure two-pass treatment.


     Incidentally, a simple way to make a brochure with left pages
raggedleft and right pages raggedright and *without* altering the
output routine is to compose the brochure twice,  once raggedleft
and once raggedright; then one can mix the two at the .dvi (or
postscript) level.

     It is clear that, for such brochures, vertical spacing in and
among paragraphs should be perfectly normal, and identical for
raggedleft and raggedright composition.  Method (C)  seems to
promise this without pain.



     I recommend (C) as next method to program. But I could
be wrong.

     Laurent Siebenmann
             Math'ematique, Bat. 425,
             Univ de Paris-Sud,
             91405-Orsay,
             France

             30 March 1996


</pre></body></html>