diff options
Diffstat (limited to 'usergrps/uktug/baskervi/6_1/bv61rus.tex')
-rw-r--r-- | usergrps/uktug/baskervi/6_1/bv61rus.tex | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/usergrps/uktug/baskervi/6_1/bv61rus.tex b/usergrps/uktug/baskervi/6_1/bv61rus.tex new file mode 100644 index 0000000000..4bd937d25f --- /dev/null +++ b/usergrps/uktug/baskervi/6_1/bv61rus.tex @@ -0,0 +1,217 @@ + +\title{Russian Paragraph Shapes} +\author{Based on \texttt{comp.text.tex} article of Peter Schmitt\\ + with extra commentary by David Carlisle.} + +\begin{Article} + +\section{The problem} + +\catcode`\<=12 +\let\Par\par +\parfillskip0pt +\parindent1cm +\def\russianpar{\ifhmode \unskip + \hskip-2\parindent minus-2\parindent \hskip\hsize minus\hsize + \hbox{\hskip\parindent}\hskip0pt + \hbox{\strut}\hskip-\parindent\hskip\hsize plus\parindent + \vadjust{\nobreak\vskip-\baselineskip}\Par + \fi} +\let\par\russianpar + +Recently on the \texttt{comp.text.tex} newsgroup The following +question was asked (as an aside in a thread that was originally about +``My Life with \TeX''. + + +\begin{itshape} +\textbf{Related problem:} the last line of a paragraph must be \textbf{either} +longer than \verb|\parindent| and shorter than +$(\verb|\hsize|-\verb|\parindent|)$, \textbf{or} +it must reach the right margin (exactly \verb|\hsize| long). + +How can I implement this with the existing continuous +\verb|\parfillskip| glue? This is my publisher's demand, based on +traditional Russian typography rules. +\end{itshape} + + +In fact it is clear that this requirement cannot be satisfied +by any setting of the pargraph parameters alone, however the question +produced two deceptively simple solutions from two `regulars' on that +newsgroup, Peter Schmitt and Donald Arseneau. In a couple of followup +articles these methods were refined. This article is based +on Peter's summary as posted to the newsgroup and typeset with the +requested paragraph style. + +The ideas here may be +of use to anyone wishing to implement non-standard paragraph shapes, +not just the particular requirements of this question. + +\section{The first solution} + +You can do this by ending each paragraph by \mbox{glue $+$ hbox $+$ glue} + where the (empty) hbox spans \verb|\parindent|, + \mbox{glue $+$ hbox} together range from + \verb|\parindent| to \verb|\hsize|~$-$~\verb|\parindent|, + and \hbox{hbox $+$ glue} range from +\verb|\hsize|~$-$~\verb|\parindent| + to \verb|\hsize|, + such that a break may occur either before \mbox{glue $+$ hbox} + (such that glue disappears) or just after hbox. +In both cases the paragraph will end in an empty line. +Therefore you have to back up one line. + +\begin{verbatim} +\parfillskip0pt + +\def\russianpar{% + \hskip2\parindent plus\hsize + \hskip-2\parindent + \hbox{\hskip\parindent}% + \hskip0pt + \hbox{}% + \hskip-\parindent + \hskip\hsize plus\parindent + \vadjust{\vskip-\baselineskip}% + \endgraf} +\end{verbatim} + +\section{The second solution} +Donald Arseneau's solution is similar, but rather than always forcing +a blank row at the end of the paragraph, a rule of a special (small) +depth is inserted together with glue items. If the line breaks leaving +this rule on its own on the last line, then this can be detected by +inspecting \verb|\prevdepth|, and a suitable negative skip can be +added to compensate for the `blank' line. + +\begin{verbatim} +\def\par{% + \ifhmode + \unskip + \strut + \hskip-\parindent + \vadjust{}% + \nobreak + \hskip2\parindent + \vrule depth 54321sp + height \ht \strutbox width 0sp + \endgraf + \ifdim\prevdepth=54321sp + \nobreak + \vskip-2\baselineskip + \hbox{\strut}% + \fi + \fi} + +\parfillskip=\hsize minus\hsize +\advance\parfillskip + -2\parindent minus-2\parindent + +\end{verbatim} + +\section{Comments} + +Donald Arseneau commented on one problem with the first solution: +Unfortunately, \verb|plus \hsize| does not set a firm limit on the stretch +the same way that \verb|minus\hsize| sets a limit on the shrink. Inserting +the settings \verb|\tolerance=100| \verb|\pretolerance=100| may fix +this, but I doubt that such low tolerances would be practical when +building a paragraph under such ``Russian'' constraints to the line +breaking. + +To which the reply was: +One might, however, wish to take advantage of this effect +by setting a higher (than \verb|\parindent|) limit for the last line +where the length is chosen such that a tolerable line would +still meet the \verb|\parindent| requirement. +On average, this should prefer longer last lines and this is +is certainly aesthetically better. + +Some more remarks: +calculating the \verb|\parskip| has the advantage (over setting +\verb|\parskip| to a calculated value) that one may change +\verb|\hsize| and \verb|\parindent| without needing to adapt other values. +If one does not mind this, using fixed values (calculated once) +is certainly more efficient. +In this case one should also think of using prepared boxes +(\verb|\setbox| and \verb|\copybox|) instead of producing these boxes +each time when a paragraph is set. + +The trick of passing information via the depth of a special strut is +well known, but relies on the fact that no other macro package is +using the same value. Donald Knuth remarks in the \TeX{}Book\ ``\emph{A +distance of~$1000\,$sp is invisible to the naked eye, so a variety of +messages can be passed in this way.}'' +However if there is a chance that several +macro packages really are using this trick, it would be wise to define +an allocation mechanism (cf.\ \verb|\newcount|) that allocates a +unique `special depth' each time it is called. Similar comments could +apply to allocating penalty values over 10000 which are also often +used to flag special actions to be taken. + +As all these methods require a redefinition of \verb|\par| (which is +inserted by \TeX\ automatically for each blank line in the input file) +they may need some further work to work in conjunction with other +macros that redefine \verb|\par|, probably the most common such case +are the \LaTeX\ list environments. + +\section{Final versions} +After considering the points raised in the discussion Peter Schmitt +posted the following two variants, which take more care over inserting +the glue, and an original use of \verb|\discretionary|. This article +is set with \verb|\par| defined by the first of these methods, and with +paragraph indent of 1\,cm. + +\noindent1) +\begin{verbatim} +\parfillskip0pt + +\def\russianpar{% + \ifhmode + \unskip + \hskip-2\parindent minus-2\parindent + \hskip\hsize minus\hsize + \hbox{\hskip\parindent}% + \hskip0pt + \hbox{\strut}% + \hskip-\parindent + \hskip\hsize plus\parindent + \vadjust{\nobreak\vskip-\baselineskip}% + \endgraf + \fi} + +\end{verbatim} + +\noindent2) +\begin{verbatim} +\parfillskip0pt + +\def\Russianpar{% + \ifhmode + \unskip + \strut\vadjust{}% + \nobreak + \discretionary + {}% + {\hbox{\hskip2\parindent + \vrule depth 123sp + width 0sp + height \ht \strutbox}} + {\hbox{\hskip\parindent}}% + \hskip-2\parindent minus2\parindent + \hskip\hsize minus\hsize + \kern0pt + \endgraf + \ifdim\prevdepth=123sp + \nobreak + \vskip-2\baselineskip + \hbox{\strut}% + \fi + \fi} + +\end{verbatim} + +\mbox{} + +\end{Article} |