[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Groff] Underlining in groff
From: |
Blake McBride |
Subject: |
Re: [Groff] Underlining in groff |
Date: |
Sat, 1 Aug 2009 23:53:03 -0500 |
Yes, this does work. Thank you very much!!
Blake McBride
On Fri, Jul 31, 2009 at 5:26 AM, Werner LEMBERG <address@hidden> wrote:
>
> > I think this is the solution to go, and I'll implement it if I have
> > time: Use an ms-like underlining macro if either .ce or .rj is
> > active.
>
> Please try the attached version: .ce and .rj should now work as
> expected.
>
>
> Werner
>
> .\" ul.tmac
> .\"
> .\" Copyright (C) 2003, 2004, 2009 Free Software Foundation, Inc.
> .\"
> .\" written by Werner LEMBERG <address@hidden>
> .\"
> .\" ul.tmac is free software; you can redistribute it and/or modify it
> under
> .\" the terms of the GNU General Public License as published by the Free
> .\" Software Foundation; either version 2, or (at your option) any later
> .\" version.
> .\"
> .\" ul.tmac is distributed in the hope that it will be useful, but WITHOUT
> ANY
> .\" WARRANTY; without even the implied warranty of MERCHANTABILITY or
> .\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
> .\" for more details.
> .\"
> .\" You should have received a copy of the GNU General Public License along
> .\" with ul.tmac; see the file COPYING. If not, write to the Free Software
> .\" Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
> .\"
> .\" History:
> .\"
> .\" Version 1.0 2003-Dec-18
> .\" First release.
> .\"
> .\" Version 1.1 2004-Jan-14
> .\" Improve documentation.
> .\"
> .\" Version 1.2 2004-Jun-09
> .\" Add GPL.
> .\"
> .\" Version 1.3 2009-Jul-31
> .\" Make underlining work with .ce and .rj requests.
> .\"
> .\"
> .\" This file defines a macro `.Underline' which underlines its arguments
> .\" continuously. It is completely transparent to justifying, this is,
> .\" the text to be underlined (and the text surrounding it) is typeset
> .\" identical to normal text, without any distortion in filling.
> .\"
> .\" Note that you can use `.Underline' in diversions; it works also across
> .\" page breaks and is robust against vertical position traps.
> .\"
> .\" With the -me package it might happen that you get a warning (and no
> .\" underlining) if the text to be underlined is in the last line of the
> .\" document:
> .\"
> .\" Line -- Unclosed block, footnote, or other diversion (ul-div)
> .\"
> .\" Simply add a final `.br' to your document to get correct behaviour.
> .
> .
> .\" The vertical position and thickness of the underline segments can
> .\" be controlled with the following two strings.
> .
> .ds Underline-thickness (\En[.ps]s / 15u)
> .ds Underline-offset (\En[.ps]s / 5u)
> .
> .
> .if n \{\
> . de Underline
> . cu
> \\$*
> . .
> .
> . nx
> .\}
> .
> .
> .eo
> .
> .
> .de \"
> ..
> .
> .
> .de Underline
> . \" The .ce and .rj requests must be handled specially since neither of
> . \" them sets \n[.k].
> . if \n[.ce] \{\
> . ul-simple \$*
> . return
> . \}
> .
> . if \n[.rj] \{\
> . ul-simple \$*
> . return
> . \}
> .
> . \" If we aren't in our `ul-div' diversion, start it now, reset the
> . \" .Underline and diversion line counters, and set the diversion trap.
> . \" Otherwise just increase the .Underline counter.
> . ie '\n[.z]'ul-div' \
> . nr ul-count +1
> . el \{\
> . di ul-div
> . dt 1u ul-do
> . nr ul-count 0
> . nr ul-line 0
> . \}
> .
> . nr ul-active 1
> .
> . \" Embed code to set various registers before and after the text.
> . \" This code is evaluated when the diversion is reread the first time.
> . \"
> . \" Saving \n[.k] as horizontal positions is sufficient since the
> . \" indentation is set to zero while rereading. On the other hand, we
> . \" need the (normal) indentation and line length values while filling
> . \" the diversion, to get the start and end positions of normal lines in
> . \" case an underline segment is broken across lines.
> \?\
> \R'ul-.i-\n[ul-count] \n[.i]'\
> \R'ul-.l-\n[ul-count] \n[.l]'\
> \R'ul-.ll-\n[ul-count] \n[.ll]'\
> \R'ul-start-pos-\n[ul-count] \En[.k]'\
> \?\
> \$*\
> \?\
> \R'ul-end-pos-\n[ul-count] \En[.k]'\
> \?
> .
> . nr ul-active 0
> ..
> .
> .
> .de ul-simple
> \Z'\
> \D't \*[Underline-thickness]''\c
> \Z'\$*'\
> \v'\*[Underline-offset]'\
> \D'l \w'\$*'u 0'\
> \v'-\*[Underline-offset]'
> ..
> .
> .
> .de ul-do
> . \" Switch to another environment to preserve the partially filled line.
> . ev ul-env
> . evc 0
> .
> . \" Emit vertical space possibly truncated by the diversion trap.
> . if \n[.trunc] \
> . sp \n[.trunc]u
> .
> . \" Save the .Underline and `active' counters as array elements, indexed
> . \" by the diversion line counter.
> . nr ul-count-\n[ul-line] \n[ul-count]
> . nr ul-active-\n[ul-line] \n[ul-active]
> .
> . \" End diversion if there isn't a broken underline segment. Otherwise,
> . \" move trap down to handle next line.
> . ie !\n[ul-active] \{\
> . dt
> . di
> .
> . \" Prepare diversion handling.
> . in 0
> . nf
> .
> . \" Copy the diversion to set the embedded number registers.
> . di ul-div1
> . ul-div
> . di
> . rn ul-div1 ul-div
> .
> . \" Process diversion again. The trick is to insert underline
> . \" segments *before* the corresponding text line is emitted.
> . nr ul-max-line \n[ul-line]
> . nr ul-count 0
> . nr ul-line 0
> .
> . di ul-div1
> . \" Call .ul-do1 manually the first time.
> . ul-do1
> . ul-div
> . di
> .
> . \" Finally emit underlined text.
> . ul-div1
> . \}
> . el \
> . dt (\n[.d]u + 1u) ul-do
> .
> . nr ul-line +1
> .
> . \" Restore previous environment.
> . ev
> ..
> .
> .
> .de ul-do1
> . if (\n[ul-line] <= \n[ul-max-line]) \{\
> . nr ul-last \n[ul-count]
> .
> . \" Get saved counters from the array.
> . nr ul-count \n[ul-count-\n[ul-line]]
> . nr ul-active \n[ul-active-\n[ul-line]]
> .
> . \" Set line thickness.
> \Z'\
> \D't \*[Underline-thickness]''\c
> .
> . \" A typical diversion to be handled looks like this:
> . \"
> . \" xxxx -0--- xxxx -1----- xxxxxxxx -2--
> . \" -2------- xxxxxx xxxxx -3----- xxxxxx
> .
> . while (\n[ul-last] < \n[ul-count]) \{\
> \Z'\
> \h'\n[ul-start-pos-\n[ul-last]]u'\
> \v'\*[Underline-offset]'\
> \D'l (\n[ul-end-pos-\n[ul-last]]u - \n[ul-start-pos-\n[ul-last]]u) 0'\
> \v'-\*[Underline-offset]''\c
> . nr ul-last +1
> . \}
> .
> . ie \n[ul-active] \{\
> . \" An underline segment broken across lines.
> \Z'\
> \h'\n[ul-start-pos-\n[ul-count]]u'\
> \v'\*[Underline-offset]'\
> \D'l (\n[ul-.ll-\n[ul-count]]u - \n[ul-start-pos-\n[ul-count]]u) 0'\
> \v'-\*[Underline-offset]''\c
> .
> . \" Set start position to the indentation value of next line.
> . nr ul-start-pos-\n[ul-count] \n[ul-.i-\n[ul-count]]
> . \" Update length of next line.
> . nr ul-.ll-\n[ul-count] \n[ul-.l-\n[ul-count]]
> . \}
> . el \{\
> . \" The last underline segment in the diversion.
> \Z'\
> \h'\n[ul-start-pos-\n[ul-count]]u'\
> \v'\*[Underline-offset]'\
> \D'l (\n[ul-end-pos-\n[ul-count]]u - \n[ul-start-pos-\n[ul-count]]u) 0'\
> \v'\*[Underline-offset]''\c
> . \}
> . \}
> .
> . \" Move trap down to handle next line or remove trap.
> . ie \n[ul-active] \
> . dt (\n[.d]u + 1u) ul-do1
> . el \
> . dt
> .
> . nr ul-line +1
> ..
> .
> .ec
> .
> .\" EOF
>
>