mirror of
https://https.git.savannah.gnu.org/git/groff.git
synced 2026-01-26 15:39:07 +00:00
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:
parent
244e55f660
commit
fedbf6ff9d
@ -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.
|
||||
|
||||
@ -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
287
contrib/sboxes/msboxes.ms
Normal 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
39
contrib/sboxes/sboxes.am
Normal 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
116
contrib/sboxes/sboxes.tmac
Normal 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:
|
||||
@ -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"
|
||||
.\" ====================================================================
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user