Add new background boxes to gropdf.

* src/devices/gropdf/gropdf.pl: New \X'pdf background' command.
* tmac/pdf.tmac: Covenience command .pdfbackground added.
* contrib/sboxes/: Files which demonstrate use of background
boxes using -ms macros.
This commit is contained in:
Deri James 2021-10-10 14:39:24 +01:00
parent 244e55f660
commit fedbf6ff9d
8 changed files with 652 additions and 1 deletions

View File

@ -1,3 +1,12 @@
2021-10-10 Deri James <deri@chuzzlewit.myzen.co.uk>
Add new background boxes to gropdf.
* src/devices/gropdf/gropdf.pl: New \X'pdf background' command.
* tmac/pdf.tmac: Covenience command .pdfbackground added.
* contrib/sboxes/: Files which demonstrate use of background
boxes using -ms macros.
2021-10-09 G. Branden Robinson <g.branden.robinson@gmail.com>
[tests]: Fix portability problems in 2 tests.

View File

@ -654,6 +654,7 @@ include $(top_srcdir)/contrib/mom/mom.am
include $(top_srcdir)/contrib/pdfmark/pdfmark.am
include $(top_srcdir)/contrib/pic2graph/pic2graph.am
include $(top_srcdir)/contrib/rfc1345/rfc1345.am
include $(top_srcdir)/contrib/sboxes/sboxes.am
include $(top_srcdir)/doc/doc.am
include $(top_srcdir)/font/devX100/devX100.am
include $(top_srcdir)/font/devX100-12/devX100-12.am

287
contrib/sboxes/msboxes.ms Normal file
View File

@ -0,0 +1,287 @@
.nr LL 17c
.nr LT \n[LL]
.nr PO 2c
.nr PS 11
.nr VS 13
.nr PI 3.5n
.nr HM 2c
.nr FM 2c
.nr QI 7n
.\" .nr PD 7p
.ll 17c
.po 2c
.\" .RP no
.ND March 2021
.EH '%''March 2021'
.EF ''''
.OH 'Using PDF boxes with the \f[I]ms\f[] macros''%'
.OF ''''
.TL
Using PDF boxes with the \f[I]ms\f[] macros
.AU
Deri James
.AI
deri@chuzzlewit.myzen.co.uk
.\" .AB no
.ds FAM H
.LP
A recent extension to the Groff PDF driver allows coloured rectangles to be
created beneath any output created by groff. The extension is a new "\eX'pdf:'"
command (with a convenience command
.B pdfbackground
with the same parameters):-
.QS
.BoxStart SHADED cornsilk OUTLINED brown INDENT 2n WEIGHT 1p
\M[floralwhite]\c
.pdfbackground pagefill
\M[]\c
.B
\eX'pdf: background
.BI
cmd left top right bottom weight'
.br
.B .pdfbackground
.BI
cmd left top right bottom weight'
.LP
Where:-
.IP cmd 7n
Can be any of "page|fill|box" in combination. So "pagefill" would draw a
rectangle which covers whole current page size (in which case the rest of the
parameters can be omitted because the box dimensions are taken from the
current media size). "boxfill", on the other hand, requires the given
dimensions to place the box. Including "fill" in the command will make the
rectangle filled with the current background colour "\eM[colour]" and including
"box" will give the rectangle a border in the current stroke colour
"\em[colour]".
.sp \n[PD]u
The "cmd" may also be "off", on its own, which will terminate drawing the
current box. If you have specified a page colour
with
.B ".pdfbackground pagefill
it is always the first box in the stack, and if
you specify it again it will replace the first entry. Be aware that the
pagefill box renders the page opaque so tools which "watermark" pdf pages are
unlikely to be successful. To return the background to transparent do a
.B ".pdfbackground off
with no other boxes open
.sp \n[PD]u
Finally the command may be "footnote" followed by a new value for "bottom"
which will be used for all current boxes, just for the current page. This is
to allow room for footnotes which grow during the page.\m[red]\**\m[]
.FS
If the value is negative it is used as an offset from the bottom of the page.
.FE
.LP
.IP left
.IP top
.IP right
.IP bottom 7n
Are the coordinates of the box. The "top" and "bottom" coordinates are
the minimum and maximum for the box, since the actual start of the
box is the vertical position of groff when you issue the command and the bottom of
the box is the point where you turn the box "off". The top and bottom
coordinates are only used if the box drawing extends onto the next page, so,
ordinarily they would be set to the header and footer margins.
.IP weight 7n
If "box" is included in the command then this parameter provides the line width
for the box border.
.BoxStop
.QE
More convenience can be gained by including -msboxes on the groff command line
which includes the macros "BoxStart" and "BoxStop".
.QS
.BoxStart SHADED cornsilk OUTLINED brown INDENT 2n WEIGHT 1p
.BoxStart SHADED cornsilk3 INDENT 2p
.B .BoxStart
.R SHADED
.I colour
.R OUTLINED
.I colour
.R INDENT
.I size
.R WEIGHT
.I size
.BoxStop
.LP
Where SHADED gives the fill colour and OUTLINED the border colour. Omit either
to get a borderless filled box, or just a border with no fill. WEIGHT is used
if the box is OUTLINED.
.LP
INDENT is a value which leaves a gap between the border and the contents inside
the box.
.BoxStop
.QE
Boxes can stacked, so you can start a box within another box, usually the
later boxes would be smaller than the containing box, but this is not
enforced. If using the BoxStart macro the left position is the current indent
minus the INDENT in the command, and the right position is the left position
(calculated above) plus the current line length and twice the indent.
The macro definition of .BoxStart above has been given a box without borders
and a 2p indent.
.QS
.BoxStart SHADED cornsilk OUTLINED brown INDENT 2n WEIGHT 1p
.BoxStart SHADED cornsilk3 INDENT 2p
.B .BoxStop
.BoxStop
.LP
There are no parameters, it closes the last box at the current vertical
position, after adding the Indent spacing.
.BoxStop
.QE
This macro package has one further feature, it attempts to hook into the ms
package to receive notifications when footnotes are growing, so that it can
close boxes before the footnotes are printed. If there are footnotes on a page
it will close current boxes 2p above the footnote separator, this probably
will not match the indent amount requested.
.LP
The above was produced by the following code.
.ds FAM C
.nr PS 9
.nr VS 10
.nf
.LP
.BoxStart SHADED white OUTLINED brown INDENT 2n WEIGHT 1p
.nf
\&.nr LL 17c
\&.nr LT \en[LL]
\&.nr PO 2c
\&.nr PS 11
\&.nr VS 13
\&.nr PI 3.5n
\&.nr HM 2c
\&.nr FM 2c
\&.nr QI 7n
\&.\" .nr PD 7p
\&.ll 17c
\&.po 2c
\&.\" .RP no
\&.ND March 2021
\&.EH '%''March 2021'
\&.EF ''''
\&.OH 'Using PDF boxes with the \ef[I]ms\ef[] macros''%'
\&.OF ''''
\&.TL
Using PDF boxes with the \ef[I]ms\ef[] macros
\&.AU
Deri James
\&.AI
deri@chuzzlewit.myzen.co.uk
\&.\" .AB no
\&.ds FAM H
\&.LP
A recent extension to the Groff PDF driver allows coloured rectangles to be
created beneath any output created by groff. The extension is a new "\eX'pdf:'"
command (with a convenience command
\&.B pdfbackground
with the same parameters):-
\&.QS
\&.BoxStart SHADED cornsilk OUTLINED brown INDENT 2n WEIGHT 1p
\eM[floralwhite]\ec
\&.pdfbackground pagefill
\eM[]\ec
\&.B
\eX'pdf: background
\&.BI
cmd left top right bottom weight'
\&.br
\&.B .pdfbackground
\&.BI
cmd left top right bottom weight'
\&.LP
Where:-
\&.IP cmd 7n
Can be any of "page|fill|box" in combination. So "pagefill" would draw a
rectangle which covers whole current page size (in which case the rest of the
parameters can be omitted because the box dimensions are taken from the
current media size). "boxfill", on the other hand, requires the given
dimensions to place the box. Including "fill" in the command will make the
rectangle filled with the current background colour "\eM[colour]" and including
"box" will give the rectangle a border in the current stroke colour
"\em[colour]".
\&.sp \n[PD]u
The "cmd" may also be "off", on its own, which will terminate drawing the
current box. If you have specified a page colour
with
\&.B ".pdfbackground pagefill
it is always the first box in the stack, and if
you specify it again it will replace the first entry. Be aware that the
pagefill box renders the page opaque so tools which "watermark" pdf pages are
unlikely to be successful. To return the background to transparent do a
\&.B ".pdfbackground off
with no other boxes open
\&.sp \n[PD]u
Finally the command may be "footnote" followed by a new value for "bottom"
which will be used for all current boxes, just for the current page. This is
to allow room for footnotes which grow during the page.\m[red]\e**\**\m[]
.FS
This is just a long footnote. Its purpose is only to check that the bottom of
the box on this page has been adjusted because of the size of the footnote.
.FE
\&.FS
If the value is negative it is used as an offset from the bottom of the page.
\&.FE
\&.LP
\&.IP left
\&.IP top
\&.IP right
\&.IP bottom 7n
Are the coordinates of the box. The "top" and "bottom" coordinates are
the minimum and maximum for the box, since the actual start of the
box is the vertical position of groff when you issue the command and the bottom of
the box is the point where you turn the box "off". The top and bottom
coordinates are only used if the box drawing extends onto the next page, so,
ordinarily they would be set to the header and footer margins.
\&.IP weight 7n
If "box" is included in the command then this parameter provides the line width
for the box border.
\&.BoxStop
\&.QE
More convenience can be gained by including -msboxes on the groff command line
which includes the macros "BoxStart" and "BoxStop".
\&.QS
\&.BoxStart SHADED cornsilk OUTLINED brown INDENT 2n WEIGHT 1p
\&.BoxStart SHADED cornsilk3 INDENT 2p
\&.B .BoxStart
\&.R SHADED
\&.I colour
\&.R OUTLINED
\&.I colour
\&.R INDENT
\&.I size
\&.R WEIGHT
\&.I size
\&.BoxStop
\&.LP
Where SHADED gives the fill colour and OUTLINED the border colour. Omit either
to get a borderless filled box, or just a border with no fill. WEIGHT is used
if the box is OUTLINED.
\&.LP
INDENT is a value which leaves a gap between the border and the contents inside
the box.
\&.BoxStop
\&.QE
Boxes can stacked, so you can start a box within another box, usually the
later boxes would be smaller than the containing box, but this is not
enforced. If using the BoxStart macro the left position is the current indent
minus the INDENT in the command, and the right position is the left position
(calculated above) plus the current line length and twice the indent.
The macro definition of .BoxStart above has been given a box without borders
and a 2p indent.
\&.QS
\&.BoxStart SHADED cornsilk OUTLINED brown INDENT 2n WEIGHT 1p
\&.BoxStart SHADED cornsilk3 INDENT 2p
\&.B .BoxStop
\&.BoxStop
\&.LP
There are no parameters, it closes the last box at the current vertical
position, after adding the Indent spacing.
\&.BoxStop
\&.QE
This macro package has one further feature, it attempts to hook into the ms
package to receive notifications when footnotes are growing, so that it can
close boxes before the footnotes are printed. If there are footnotes on a page
it will close current boxes 2p above the footnote separator, this probably
will not match the indent amount requested.
\&.LP
.BoxStop

39
contrib/sboxes/sboxes.am Normal file
View File

@ -0,0 +1,39 @@
sboxes_srcdir = $(top_srcdir)/contrib/sboxes
SBOXES_FLAGS = -M$(sboxes_srcdir) -ms -msboxes -Tpdf
# Files installed in $(tmacdir).
SBOXES_NORMAL_FILES = contrib/sboxes/sboxes.tmac
sboxestmacdir = $(tmacdir)
dist_sboxestmac_DATA = $(SBOXES_NORMAL_FILES)
# Files installed in $(examplesdir)/sboxes. SBOXES_EXAMPLEFILES are located
# in the source tree, while SBOXESPROCESSEDEXAMPLEFILES are generated in
# the build tree.
SBOXES_EXAMPLEFILES= contrib/sboxes/msboxes.ms
if BUILD_EXAMPLES
sboxesexampledir = $(exampledir)/sboxes
dist_sboxesexample_DATA = $(SBOXES_EXAMPLEFILES)
SBOXES_PROCESSEDEXAMPLEFILES = contrib/sboxes/msboxes.pdf
sboxesprocessedexampledir = $(exampledir)/sboxes
nodist_sboxesprocessedexample_DATA = $(SBOXES_PROCESSEDEXAMPLEFILES)
else
EXTRA_DIST += $(SBOXES_EXAMPLEFILES)
endif
$(SBOXES_PROCESSEDEXAMPLEFILES): $(SBOXES_NORMAL_FILES) \
groff troff gropdf font/devpdf/build_font_files
contrib/sboxes/msboxes.pdf:
mkdir -p $(top_builddir)/contrib/sboxes/
$(top_builddir)/test-groff $(SBOXES_FLAGS) $(sboxes_srcdir)/msboxes.ms > $@
uninstall_groffdirs: uninstall_sboxes
uninstall_sboxes:
if test -d $(DESTDIR)$(exampledir)/sboxes; then \
rmdir $(DESTDIR)$(exampledir)/sboxes; \
fi
# Local Variables:
# fill-column: 72
# mode: makefile-automake
# End:
# vim: set autoindent filetype=automake textwidth=72:

116
contrib/sboxes/sboxes.tmac Normal file
View File

@ -0,0 +1,116 @@
.ig
sboxes.tmac
Copyright (C) 1989-2021 Free Software Foundation, Inc.
Written by Deri James (deri@chuzzlewit.myzen.co.uk)
This file is part of groff.
groff 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 3 of the License, or
(at your option) any later version.
groff 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 this program. If not, see <http://www.gnu.org/licenses/>.
..
.if !\n(.g \
. ab groff ms macros require groff extensions; aborting
.
.if \n(.C \
. ab groff ms macros do not work in compatibility mode; aborting
.
.\" See if already loaded.
.if r GSBOX .nx
.nr GSBOX 1
.nr bx@stack 0
.
.de pdfbackground
.device pdf: background \\$*
..
.\" Link into ms macros to trap footnote growth
.am fn@print-sep
.nr bx@pb \\n[nl]u-2p
.nop \!x X pdf: background footnote \\n[bx@pb]z
.rr bx@pb
..
.\" Has PD been actioned?
.am par*start
.nr bx@PD \\n[PD]
..
.
.de BoxStart
. fl
. nr bx@stack \\n[bx@stack]+1u
. nr bx@shad 0
. nr bx@outl 0
. nr bx@ind 1P
. ds bx@wt 0
. ds bx@type "\"
. while \\n[.$] \{\
. ie 'SHADED'\\$1' \{\
. nop \\M[\\$2]\c
. nr bx@shad 1
. as bx@type "fill\"
. shift 2
. \}
. el \{\
. ie 'OUTLINED'\\$1' \{\
. nop \\m[\\$2]\c
. nr bx@outl 1
. as bx@type "box\"
. shift 2
. \}
. el \{\
. ie 'WEIGHT'\\$1' \{\
. ds bx@wt \\$2
. shift 2
. \}
. el \{\
. ie 'INDENT'\\$1' \{\
. nr bx@ind \\$2
. shift 2
. \}
. el \{\
. tm Unknown Token \\$1
. shift
. \}
. \}
. \}
. \}
. \}
.
. if '\\*[bx@type]'' .ds bx@type "fill"
. nr bx@l \\n[\\n[.ev]:li]s+\\n[.o]s-\\n[bx@ind]u
. nr bx@r \\n[bx@l]u+\\n[.l]-\\n[\\n[.ev]:li]+(\\n[bx@ind]u*2u)
. nr bx@gap \\n[.v]-\\n[.ps]+\\*[bx@wt]
. nr bx@bot \\n[.p]u-\\n[FM]u+\\n[bx@ind]u+\\n[.ps]u
. nr bx@top \\n[HM]-\\n[bx@ind]u+\\n[bx@gap]u
. ne \\n[bx@ind]u+2v+\\*[bx@wt]
. sp -(2v-(\\n[bx@PD]u*2u))u
. pdfbackground \\*[bx@type] \\n[bx@l]z \\n[bx@top]z \\n[bx@r]z \\n[bx@bot]z \\*[bx@wt] \\n[nl]z
. sp (\\n[bx@ind]u-1v)u
. if (\\n[bx@shad]=1) .nop \\M[]\c
. if (\\n[bx@outl]=1) .nop \\m[]\c
. ds bx@ind\\n[bx@stack] \\n[bx@ind]
. rr bx@shad bx@outl bx@ind bx@bot bx@top bx@l bx@r
. rm wt type
. sp -(\\n[bx@gap]u)
. nr bx@PD 0
..
.de BoxStop
. sp \\*[bx@ind\\n[bx@stack]]u-\\n[.psr]u
. pdfbackground off
. nr bx@stack \\n[bx@stack]-1u
..
.\" Local Variables:
.\" mode: nroff
.\" fill-column: 72
.\" End:
.\" vim: set filetype=groff textwidth=72:

View File

@ -1144,6 +1144,56 @@ previous value, also any trailing missing parameters are ignored.
not all PDF Readers support any or all these transitions.
.LP
.
.
.TP
.BI "\eX'pdf: background " "cmd left top right bottom weight" \[aq]
Where:-
.RS
.TP
.I cmd
Can be any of "page|fill|box" in combination. So "pagefill" would draw a
rectangle which covers whole current page size (in which case the rest of the
parameters can be omitted because the box dimensions are taken from the
current media size). "boxfill", on the other hand, requires the given
dimensions to place the box. Including "fill" in the command will make the
rectangle filled with the current background colour "\eM[colour]" and including
"box" will give the rectangle a border in the current stroke colour
"\em[colour]".
.sp .5v
The "cmd" may also be "off", on its own, which will terminate drawing the
current box.
.sp .5v
Finally the command may be "footnote" followed by a new value for "bottom"
which will be used for all current boxes, just for the current page. This is
to allow room for footnotes which grow during the page.\m[red]\**\m[]
.LP
.TP
.I left
.TQ
.I top
.TQ
.I right
.TQ
.I bottom
Are the coordinates of the box. The "top" and "bottom" coordinates are
the minimum and maximum for the box, since the actual start of the
box is the vertical position of groff when you issue the command and the bottom of
the box is the point where you turn the box "off". The top and bottom
coordinates are only used if the box drawing extends onto the next page, so,
ordinarily they would be set to the header and footer margins.
.TP
.I weight
If "box" is included in the command then this parameter provides the line width
for the box border.
.RE
The convenience macro for this escape is
.BR .pdfbackground .
.LP
There is also a macro file which can be included if you are using the ms macro
package which can be incorporated by placing -msboxes on the
.B groff
command line.
.
.\" ====================================================================
.SS "Importing graphics"
.\" ====================================================================

View File

@ -121,6 +121,7 @@ my $wt=-1;
my $thislev=1;
my $mark=undef;
my $suspendmark=undef;
my $boxmax=0;
@ -137,6 +138,8 @@ my $transition={PAGE => {Type => '/Trans', S => '', D => 1, Dm => '/H', M => '/I
BLOCK => {Type => '/Trans', S => '', D => 1, Dm => '/H', M => '/I', Di => 0, SS => 1.0, B => 0}};
my $firstpause=0;
my $present=0;
my @bgstack; # Stack of background boxes
my $bgbox=''; # Draw commands for boxes on this page
$noslide=1 if exists($ENV{GROPDF_NOSLIDE}) and $ENV{GROPDF_NOSLIDE};
@ -364,6 +367,32 @@ if ($cpageno > 0)
@{$cpage->{Annots}}=@PageAnnots;
}
if ($#bgstack > -1 or $bgbox)
{
my $box="q 1 0 0 1 0 0 cm ";
foreach my $bg (@bgstack)
{
# 0=$bgtype # 1=stroke 2=fill. 4=page
# 1=$strkcol
# 2=$fillcol
# 3=(Left,Top,Right,bottom,LineWeight)
# 4=Start ypos
# 5=Endypos
# 6=Line Weight
my $pg=$bg->[3] || \@mediabox;
$bg->[5]=$pg->[3]; # box is continueing to next page
$box.=DrawBox($bg);
$bg->[4]=$pg->[1]; # will continue from page top
}
$stream=$box.$bgbox."Q\n".$stream;
$bgbox='';
}
$boxmax=0;
PutObj($cpageno);
OutStream($cpageno+1);
}
@ -1228,6 +1257,74 @@ sub do_x
$present=1;
}
elsif (lc($xprm[1]) eq 'background')
{
splice(@xprm,0,2);
my $type=shift(@xprm);
# print STDERR "ypos=$ypos\n";
if (lc($type) eq 'off')
{
my $sptr=$#bgstack;
if ($sptr > -1)
{
if ($sptr == 0 and $bgstack[0]->[0] & 4)
{
pop(@bgstack);
}
else
{
$bgstack[$sptr]->[5]=GraphY($ypos);
$bgbox=DrawBox(pop(@bgstack)).$bgbox;
}
}
}
elsif (lc($type) eq 'footnote')
{
my $t=GetPoints($xprm[0]);
$boxmax=($t<0)?abs($t):GraphY($t);
}
else
{
my $bgtype=0;
foreach (@xprm)
{
$_=GetPoints($_);
}
$bgtype|=2 if $type=~m/box/i;
$bgtype|=1 if $type=~m/fill/i;
$bgtype|=4 if $type=~m/page/i;
$bgtype=5 if $bgtype==4;
my $bgwt=$xprm[4];
$bgwt=$xprm[0] if !defined($bgwt) and $#xprm == 0;
my (@bg)=(@xprm);
my $bg=\@bg;
if (!defined($bg[3]) or $bgtype & 4)
{
$bg=undef;
}
else
{
FixRect($bg);
}
if ($bgtype)
{
if ($bgtype & 4)
{
shift(@bgstack) if $#bgstack >= 0 and $bgstack[0]->[0] & 4;
unshift(@bgstack,[$bgtype,$strkcol,$fillcol,$bg,GraphY($ypos),GraphY($bg[3]||0),$bgwt || 0.4]);
}
else
{
push(@bgstack,[$bgtype,$strkcol,$fillcol,$bg,GraphY($ypos),GraphY($bg[3]||0),$bgwt || 0.4]);
}
}
}
}
}
elsif (lc(substr($xprm[0],0,9)) eq 'papersize')
{
@ -1593,7 +1690,7 @@ sub LoadPDF
foreach my $o (@{$pdf})
{
if (exists($o->{STREAMPOS}))
{
{
my $l;
$l=$o->{OBJ}->{Length} if exists($o->{OBJ}->{Length});
@ -2541,6 +2638,32 @@ sub NewPage
@{$cpage->{Annots}}=@PageAnnots;
}
if ($#bgstack > -1 or $bgbox)
{
my $box="q 1 0 0 1 0 0 cm ";
foreach my $bg (@bgstack)
{
# 0=$bgtype # 1=stroke 2=fill. 4=page
# 1=$strkcol
# 2=$fillcol
# 3=(Left,Top,Right,bottom,LineWeight)
# 4=Start ypos
# 5=Endypos
# 6=Line Weight
my $pg=$bg->[3] || \@defaultmb;
$bg->[5]=$pg->[3]; # box is continueing to next page
$box.=DrawBox($bg);
$bg->[4]=$pg->[1]; # will continue from page top
}
$stream=$box.$bgbox."Q\n".$stream;
$bgbox='';
$boxmax=0;
}
PutObj($cpageno);
OutStream($cpageno+1);
}
@ -2570,6 +2693,23 @@ sub NewPage
# @mediabox=@defaultmb;
}
sub DrawBox
{
my $bg=shift;
my $res='';
my $pg=$bg->[3] || \@mediabox;
$bg->[4]=$pg->[1], $bg->[5]=$pg->[3] if $bg->[0] & 4;
my $bot=$bg->[5];
$bot=$boxmax if $boxmax > $bot;
my $wid=$pg->[2]-$pg->[0];
my $dep=$bot-$bg->[4];
$res="$bg->[1] $bg->[2] $bg->[6] w\n";
$res.="$pg->[0] $bg->[4] $wid $dep re f " if $bg->[0] & 1;
$res.="$pg->[0] $bg->[4] $wid $dep re s " if $bg->[0] & 2;
return("$res\n");
}
sub MakeXO
{
$stream.="%mode=$mode\n";

View File

@ -805,6 +805,15 @@ am solely responsible for any bugs I may have introduced into this file.
.de pdftransition
.nop \!x X pdf: transition \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
..
.de pdfbackground
.\" $1=Page|Fill|Box|off
.\" $2=left
.\" $3=top
.\" $4=right
.\" $5=bottom
.\" $6=line weight (if box)
.device pdf: background \\$*
..
.
.\" Local Variables:
.\" mode: nroff