# [NTG-context] Rule under length of last line

Hans Hagen pragma at wxs.nl
Mon Jul 31 20:56:24 CEST 2006

Duncan Hothersall wrote:
> I've had a last-minute impossible request for a typesetting style, and
> having already told the person it can't be done in the time available,
> wondered whether it can actually be done at all.
>
depends on the amount of time, and it the case of customers what they
are willing to pay -)

many things can be done, esp because designers are not that accustomed
to thinking on programmable designs
> The request is for a subsection heading to have a continuous horizontal
> rule under both its number and title, at a distance of about 6pt from
> the baseline (i.e. not underlining), extending just the length of the
> heading. I can do that by setting both number and title in a TABLE,
> setting the offsets and specifying the bottom frame to be on - no problem.
>
> However, the tricky part is that where a longer title runs beyond one
> line, the line should only appear under the last line, and only to the
> length of the last line of text.
>
> In other words, for viewers with fixed width fonts:
>
> 1.1.1 Short title
> -----------------
>
> 1.1.2 Longer title which wraps onto a
>       second line like this
> ---------------------------
>
> We generate the ConTeXt code from XML, so ideally a solution wouldn't
> require the last line to be set separately, but would just work whether
> the heading was single or multiple line. What I'm really looking for is
> a subsection setup that will automatically do this whatever length of title.
>
> I have to say I think it's quite ugly, but can anyone give me a pointer
>
you don't wanna know hwo much time i've spent in programming ugly stuff -)
> as to how it could be done? Is there a box left at the end of a par
> which shows the width of the last line?
>
> As I say, I've already said no, so this is just out of interest, no
> urgency.
>
anyhow, it's doable; the first solution took me 30 minutes, the second one 15 minutes

\def\FirstSolution#1#2%
{\vbox\bgroup
\setbox0\hbox{#1}
\hsize.4\textwidth
\beginshapebox#2\endshapebox
\gdef\SetLastLineWidth{\xdef\LastLineWidth{\the\wd\scratchbox}}%
\reshapebox
{\setbox\scratchbox\hbox{\unhbox\shapebox}%
\SetLastLineWidth
\globallet\SetLastLineWidth\relax
\box\scratchbox}%
\scratchdimen\dimexpr\wd0+.25em+\LastLineWidth\relax
% \setbox2\ruledvbox   {\innerflushshapebox}
% why is correction needed
\setbox2\vbox        {\vskip-\lineskip\innerflushshapebox}
\setbox0\vbox to \ht2{\box0}
\hbox{\box0\hskip.25em\box2}
\offinterlineskip
\vskip.25ex
\blackrule[width=\scratchdimen,height=2pt]
\egroup}

\doglobal\newcounter\NextLinePos

\def\SecondSolution#1#2%
{\vbox\bgroup
\hsize.4\textwidth
\doglobal\increment\NextLinePos
\setbox\scratchbox\hbox{#1}
\hbox{\vtop{\copy\scratchbox}\hskip.25em\vtop{#2}}%
\offinterlineskip
\scratchdimen\dimexpr\wd\scratchbox+.25em+
\MPx{e:npl:\NextLinePos}-\MPx{b:npl:\NextLinePos}\relax
\vskip.25ex
\blackrule[width=\scratchdimen,height=2pt]
\egroup}

\def\DoSecondSolution#1%
{\bpos{npl:\NextLinePos}#1\epos{npl:\NextLinePos}}

% \showstruts

\starttext

\section{is this nice or not}

\section{is this nice or not nice, that's the question}

\section{is this nice or not}

\section{is this nice or not nice, that's the question}

\stoptext

Now it's your turn to wikify this ...

Hans

-----------------------------------------------------------------
Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com
| www.pragma-pod.nl
-----------------------------------------------------------------