aboutsummaryrefslogtreecommitdiffhomepage
path: root/present.tmac
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2016-11-22 22:47:35 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2016-11-22 22:47:35 +0100
commit631b966e503b4101783c2807909c172139d1d3db (patch)
tree599ae93bddd8036b90cd4edd1a7387a78f2bf27f /present.tmac
downloadgpresent-fork-631b966e503b4101783c2807909c172139d1d3db.tar.gz
initial import of all the files from gpresent-2.3.tar.gz
Diffstat (limited to 'present.tmac')
-rw-r--r--present.tmac615
1 files changed, 615 insertions, 0 deletions
diff --git a/present.tmac b/present.tmac
new file mode 100644
index 0000000..798c050
--- /dev/null
+++ b/present.tmac
@@ -0,0 +1,615 @@
+.\" Groff Presentation Macros
+.\" date: October 5, 2002
+.\" version: 2.0
+.\" author: Bob Diertens, <bobd@science.uva.nl>
+.ig
+ Copyright (C) 2001, 2002 Bob Diertens
+
+ This macro package 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 of the License, or
+ (at your option) any later version.
+
+ This macro package 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 macro package; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+..
+.\"*** Initialisation
+.\" depending on tmac.gm
+.if !r .mgm \{\
+' tm ERROR: no mm macros loaded
+. ab "aborted"
+.\}
+.nr .mpresent 1
+.\" Defaults
+.VM 0 0
+.nr Hu 1
+.\"nr Ds 0
+.S +8
+.\"*** Page
+.\"width: 10i height: 7.5i page-offset: 0.75i
+.\"extra margin: 0.75i
+.\"PGFORM 8.5i 7.50i 1.5i 1
+.\" we compensate for the extra footer-line with 0.24i.
+.PGFORM 8.5i 7.74i 1.5i 1
+.\"usage: MARGIN left [right]
+.de MARGIN
+.po \\$1+0.75i
+.nr @po \\n[.o]
+.ie \\n[.$]>1 \{\
+. ll 10i-\\$2-\\$1
+.\}
+.el \{\
+. ll (10i-(\\$1*2u))
+.\}
+.nr @ll \\n[.l]
+.lt \\n[@ll]u
+..
+.\" *** Colors
+.ds gp-col@default "black
+.ds gp-col@prev "black
+.ds gp-col@cur "black
+.\" set the current color in the environments used by MM
+.am misc@ev-keep
+.mk gp-markvertical
+\\m[\\*[gp-col@cur]]
+.sp |\\n[gp-markvertical]u
+..
+.\"usage: DEFAULTCOLOR color
+.de DEFAULTCOLOR
+.ds gp-col@default \\$1
+.ds gp-col@prev \\$1
+.ds gp-col@cur \\$1
+\\m[\\$1]
+..
+.\"usage: INITCOLOR color
+.\"for setting the color at the start (.COLOR color does not work)
+.de INITCOLOR
+.ds gp-col@prev \\$1
+.ds gp-col@cur \\$1
+\\m[\\$1]
+..
+.\"usage: COLOR color arg1 [arg2]
+.de COLOR
+.ds gp-color \\$1
+.shift
+.ie \\n[.$] \{\
+\\m[\\*[gp-color]]\
+\\&\\$1\
+\\m[\\*[gp-col@cur]]\c
+. ie \\n[.$]=2 \{\
+\\&\\$2
+. \}
+. el \\&
+.\}
+.el \{\
+. if '\\*[gp-color]'P' .ds gp-color \\*[gp-col@prev]
+. ds gp-col@prev \\*[gp-col@cur]
+. ds gp-col@cur \\*[gp-color]
+\\m[\\*[gp-color]]\c
+.\}
+..
+.\"usage: DEFCOLOR name red green blue
+.de DEFCOLOR
+.ds gp-col!\\$1 "\\$2 \\$3 \\$4
+.defcolor \\$1 rgb \\$2 \\$3 \\$4
+.ds col\\$1 "\\m[\\$1]
+..
+.ds colP "\\m[]
+.DEFCOLOR red 1.0 0.0 0.0
+.DEFCOLOR green 0.0 1.0 0.0
+.DEFCOLOR blue 0.0 0.0 1.0
+.DEFCOLOR red9 0.9 0.0 0.0
+.DEFCOLOR green9 0.0 0.9 0.0
+.DEFCOLOR blue9 0.0 0.0 0.9
+.DEFCOLOR red8 0.8 0.0 0.0
+.DEFCOLOR green8 0.0 0.8 0.0
+.DEFCOLOR blue8 0.0 0.0 0.8
+.DEFCOLOR red7 0.7 0.0 0.0
+.DEFCOLOR green7 0.0 0.7 0.0
+.DEFCOLOR blue7 0.0 0.0 0.7
+.DEFCOLOR red6 0.6 0.0 0.0
+.DEFCOLOR green6 0.0 0.6 0.0
+.DEFCOLOR blue6 0.0 0.0 0.6
+.DEFCOLOR red5 0.5 0.0 0.0
+.DEFCOLOR green5 0.0 0.5 0.0
+.DEFCOLOR blue5 0.0 0.0 0.5
+.DEFCOLOR red4 0.4 0.0 0.0
+.DEFCOLOR green4 0.0 0.4 0.0
+.DEFCOLOR blue4 0.0 0.0 0.4
+.DEFCOLOR red3 0.3 0.0 0.0
+.DEFCOLOR green3 0.0 0.3 0.0
+.DEFCOLOR blue3 0.0 0.0 0.3
+.DEFCOLOR red2 0.2 0.0 0.0
+.DEFCOLOR green2 0.0 0.2 0.0
+.DEFCOLOR blue2 0.0 0.0 0.2
+.DEFCOLOR red1 0.1 0.0 0.0
+.DEFCOLOR green1 0.0 0.1 0.0
+.DEFCOLOR blue1 0.0 0.0 0.1
+.DEFCOLOR yellow 1.0 1.0 0.0
+.DEFCOLOR magenta 1.0 0.0 1.0
+.DEFCOLOR cyan 0.0 1.0 1.0
+.DEFCOLOR yellow9 0.9 0.9 0.0
+.DEFCOLOR magenta9 0.9 0.0 0.9
+.DEFCOLOR cyan9 0.0 0.9 0.9
+.DEFCOLOR yellow8 0.8 0.8 0.0
+.DEFCOLOR magenta8 0.8 0.0 0.8
+.DEFCOLOR cyan8 0.0 0.8 0.8
+.DEFCOLOR yellow7 0.7 0.7 0.0
+.DEFCOLOR magenta7 0.7 0.0 0.7
+.DEFCOLOR cyan7 0.0 0.7 0.7
+.DEFCOLOR yellow6 0.6 0.6 0.0
+.DEFCOLOR magenta6 0.6 0.0 0.6
+.DEFCOLOR cyan6 0.0 0.6 0.6
+.DEFCOLOR yellow5 0.5 0.5 0.0
+.DEFCOLOR magenta5 0.5 0.0 0.5
+.DEFCOLOR cyan5 0.0 0.5 0.5
+.DEFCOLOR yellow4 0.4 0.4 0.0
+.DEFCOLOR magenta4 0.4 0.0 0.4
+.DEFCOLOR cyan4 0.0 0.4 0.4
+.DEFCOLOR yellow3 0.3 0.3 0.0
+.DEFCOLOR magenta3 0.3 0.0 0.3
+.DEFCOLOR cyan3 0.0 0.3 0.3
+.DEFCOLOR yellow2 0.2 0.2 0.0
+.DEFCOLOR magenta2 0.2 0.0 0.2
+.DEFCOLOR cyan2 0.0 0.2 0.2
+.DEFCOLOR yellow1 0.1 0.1 0.0
+.DEFCOLOR magenta1 0.1 0.0 0.1
+.DEFCOLOR cyan1 0.0 0.1 0.1
+.DEFCOLOR black 0.0 0.0 0.0
+.DEFCOLOR gray1 0.1 0.1 0.1
+.DEFCOLOR gray2 0.2 0.2 0.2
+.DEFCOLOR gray3 0.3 0.3 0.3
+.DEFCOLOR gray4 0.4 0.4 0.4
+.DEFCOLOR gray5 0.5 0.5 0.5
+.DEFCOLOR gray6 0.6 0.6 0.6
+.DEFCOLOR gray7 0.7 0.7 0.7
+.DEFCOLOR gray8 0.8 0.8 0.8
+.DEFCOLOR gray9 0.9 0.9 0.9
+.DEFCOLOR white 1.0 1.0 1.0
+.\"*** Backgrounds
+.nr gp-bg*x1 54
+.nr gp-bg*y1 12
+.nr gp-bg*x2 774
+.\"nr gp-bg*x2 828
+.nr gp-bg*y2 552
+.\"nr gp-bg*y2 560
+.de FillSolid
+ps: def
+/FillSolid {
+ /y2 exch def
+ /x2 exch def
+ /y1 exch def
+ /x1 exch def
+ gsave
+ x1 y1 moveto
+ x2 y1 lineto
+ x2 y2 lineto
+ x1 y2 lineto
+ closepath
+ setrgbcolor
+ fill
+ grestore
+} bind def
+..
+.de FillGradX
+ps: def
+/FillGradX {
+ /y2 exch def
+ /x2 exch def
+ /y1 exch def
+ /x1 exch def
+ /blue2 exch def
+ /green2 exch def
+ /red2 exch def
+ /blue1 exch def
+ /green1 exch def
+ /red1 exch def
+ /step 2 def
+ /nrsteps x2 x1 sub step div def
+ /incrred red2 red1 sub nrsteps div def
+ /incrgreen green2 green1 sub nrsteps div def
+ /incrblue blue2 blue1 sub nrsteps div def
+ gsave
+ x1 step x2 {
+ /x exch def
+ x y1 moveto
+ x y2 lineto
+ x step sub y2 lineto
+ x step sub y1 lineto
+ closepath
+ red1 green1 blue1 setrgbcolor fill
+ /red1 red1 incrred add def
+ /green1 green1 incrgreen add def
+ /blue1 blue1 incrblue add def
+ } for
+ grestore
+} bind def
+..
+.de FillGradY
+ps: def
+/FillGradY {
+ /y2 exch def
+ /x2 exch def
+ /y1 exch def
+ /x1 exch def
+ /blue2 exch def
+ /green2 exch def
+ /red2 exch def
+ /blue1 exch def
+ /green1 exch def
+ /red1 exch def
+ /step 2 def
+ /nrsteps y2 y1 sub step div def
+ /incrred red2 red1 sub nrsteps div def
+ /incrgreen green2 green1 sub nrsteps div def
+ /incrblue blue2 blue1 sub nrsteps div def
+ gsave
+ y1 step y2 {
+ /y exch def
+ x1 y moveto
+ x2 y lineto
+ x2 y step sub lineto
+ x1 y step sub lineto
+ closepath
+ red1 green1 blue1 setrgbcolor fill
+ /red1 red1 incrred add def
+ /green1 green1 incrgreen add def
+ /blue1 blue1 incrblue add def
+ } for
+ grestore
+} bind def
+..
+.de FillGradAngle
+ps: def
+/setupgradfill { % sr sg sb er eg eb steps angle
+ rotate
+ /numsteps exch def
+ % String to hold synthetic data
+ /gradstr numsteps 3 mul string def
+ 3 index sub numsteps div /ib exch def
+ 3 index sub numsteps div /ig exch def
+ 3 index sub numsteps div /ir exch def
+ /sb exch def
+ /sg exch def
+ /sr exch def
+
+ %(SR SG SB: ) print sr == sb == sg ==
+ %(IR IG IB: ) print ir == ib == ig ==
+
+ % Create a synthetic data string
+ 0 1 numsteps 1 sub { % loop
+ 3 mul % index
+ gradstr 1 index sr 255 mul round cvi put
+ gradstr 1 index 1 add sg 255 mul round cvi put
+ gradstr 1 index 2 add sb 255 mul round cvi put
+ pop
+ /sr sr ir add def
+ /sg sg ig add def
+ /sb sb ib add def
+ } for
+} bind def
+
+/convbboxtoxywh { % llx lly urx ury
+ 2 index sub exch 3 index sub exch
+} bind def
+
+/gradmatrix matrix def
+
+/gradfill {
+% startred startgreen startblue endred endgreen endblue steps angle
+ save /mysave exch def
+ setupgradfill
+ pathbbox clip convbboxtoxywh % x y w h
+ 0 0 3 -1 roll 6 -2 roll % w 0 0 h x y
+ gradmatrix astore concat
+ numsteps 1 8 [numsteps 0 0 1 0 0]
+ {
+ gradstr
+ }
+ false 3 colorimage
+ mysave restore
+} bind def
+
+% Fill the whole page
+/FillGradAngle {
+ /y2 exch def
+ /x2 exch def
+ /y1 exch def
+ /x1 exch def
+ gsave
+ x1 y1 moveto
+ x1 y2 lineto
+ x2 y2 lineto
+ x2 y1 lineto
+ closepath
+ gradfill
+ grestore
+} bind def
+..
+.nr gp-bg*set 0
+.nr gp-bg*defSolid 0
+.nr gp-bg*defGradX 0
+.nr gp-bg*defGradXS 0
+.nr gp-bg*defGradY 0
+.nr gp-bg*defGradAngle 0
+.\"usage: BACKGROUND method args
+.de BACKGROUND
+.ie '\\$1'None' .nr gp-bg*set 0
+.el \{\
+. ds gp-bg*method \\$1
+. nr gp-bg*set 1
+. ie '\\$1'Solid' .ds gp-bg*args "\\*[gp-col!\\$2]
+. el \{\
+. shift
+. ds gp-bg*args "\\*[gp-col!\\$1] \\*[gp-col!\\$2]
+. shift
+. shift
+. as gp-bg*args " \\$*
+. \}
+. as gp-bg*args " \\n[gp-bg*x1] \\n[gp-bg*y1] \\n[gp-bg*x2] \\n[gp-bg*y2]
+.\}
+..
+.de gp-fill*define
+.if !\\n[gp-bg*def\\$1] \{\
+\Y[Fill\\$1]
+. nr gp-bg*def\\$1 1
+.\}
+..
+.de gp-fill*background
+.if \\n[gp-bg*set] \{\
+. gp-fill*define \\*[gp-bg*method]
+\\X'ps: exec \\*[gp-bg*args] Fill\\*[gp-bg*method]'
+.\}
+..
+.\"usage: FILL x1 y1 x2 y2 method args
+.de FILL
+.nr gp-fill*x1 (\\$1)/1p+\\n[gp-bg*x1]
+.nr gp-fill*y1 (\\$2)/1p+\\n[gp-bg*y1]
+.nr gp-fill*x2 (\\$3)/1p+\\n[gp-bg*x1]
+.nr gp-fill*y2 (\\$4)/1p+\\n[gp-bg*y1]
+.shift 4
+.ds gp-fill*method \\$1
+.ie '\\$1'Solid' .ds gp-fill*args "\\*[gp-col!\\$2]
+.el \{\
+. shift
+. ds gp-fill*args "\\*[gp-col!\\$1] \\*[gp-col!\\$2]
+. shift 2
+. as gp-fill*args " \\$*
+.\}
+.as gp-fill*args " \\n[gp-fill*x1] \\n[gp-fill*y1] \\n[gp-fill*x2] \\n[gp-fill*y2]
+.gp-fill*define \\*[gp-fill*method]
+\X'ps: exec \\*[gp-fill*args] Fill\\*[gp-fill*method]'\c
+..
+.\" *** Header
+.de TP
+.ev gp-top
+.ll \\n[@ll]u
+.lt \\n[@ll]u
+.gp-fill*background
+.COLOR \\*[gp-col@default]
+.ie d HEADER .HEADER
+.el .sp 0.1i
+.COLOR P
+\X'ps: exec %%%%ENDTOP'
+.sp -0.10i
+.ev
+..
+.\" *** Footer
+.de EOP
+.ev gp-bop
+.ll \\n[@ll]u
+.lt \\n[@ll]u
+\X'ps: exec %%%%BEGINBOT'\c
+.COLOR \\*[gp-col@default]
+.sp |\\n[footer*start]u
+.if d FOOTER .FOOTER
+.COLOR P
+.br
+.ev
+..
+.\" *** Presentation Macros
+.\" minimum for footer-size is 2
+.\"usage: FOOTERSIZE n
+.de FOOTERSIZE
+.nr pg*footer-size (v;\\$1)
+.nr footer*start \\n[.p]-(\\n[pg*footer-size]-1v)
+.pg@move-trap
+..
+.FOOTERSIZE 3
+.\"usage: PAUSE
+.de PAUSE
+\X'ps: exec %%%%PAUSE'\c
+..
+.\"usage: BLOCKS [once] [x [y [length]]
+.de BLOCKS
+.nr gp-block*once 0
+.if '\\$1'once' \{\
+. nr gp-block*once 1
+. shift
+.\}
+.\"\X'ps:exec %%%%PAUSE'\c
+.if \\n[gp-block*once] \X'ps:exec %%%%BEGINONCE'\c
+.nr gp-block*po \\n[@po]u
+.nr gp-block*ll \\n[@ll]u
+.mk gp-BLOCKS
+.if \\n[.$]>=2 .sp |(v;\\$2)
+.if \\n[.$]>=1 \{\
+. po +\\$1
+. ie \\n[.$]=3 .ll \\$3
+. el .ll (n;\\n[@ll]u-\\$1)
+.\}
+..
+.de BLOCKE
+.br
+.po \\n[gp-block*po]u
+.ll \\n[gp-block*ll]u
+.sp |\\n[gp-BLOCKS]u
+.if \\n[gp-block*once] \X'ps:exec %%%%ENDONCE'\c
+.\"\X'ps:exec %%%%PAUSE'\c
+..
+.ds gp-title*color blue4
+.ds gp-subtitle*color blue4
+.ds gp-title
+.ds gp-subtitle
+.ds gp-title*format C
+.nr gp-title*defindent 0.5i
+.nr gp-title*indent \n[gp-title*defindent]
+.ds gp-subtitle*format I
+.nr gp-subtitle*defindent 0.5i
+.nr gp-subtitle*indent \n[gp-subtitle*defindent]
+.\"usage: TITLECOLOR color
+.de TITLECOLOR
+.ds gp-title*color \\$1
+..
+.\"usage: TITLEFORMAT C | L | R | I x
+.de TITLEFORMAT
+.ds gp-title*format \\$1
+.if '\\$1'I' \{\
+. ie \\n[.$]>=2 .nr gp-title*indent \\$2
+. el .nr gp-title*indent \\n[gp-title*defindent]
+.\}
+..
+.\"usage: TITLE title
+.de TITLE
+.SP 0.25i
+.S +8
+.if '\\*[gp-title*format]'C' 'ce 99
+.if '\\*[gp-title*format]'L' 'in 0
+.if '\\*[gp-title*format]'R' 'rj 99
+.if '\\*[gp-title*format]'I' 'in \\n[gp-title*indent]u
+.COLOR \\*[gp-title*color] "\\$*"
+.if '\\*[gp-title*format]'C' 'ce 0
+.if '\\*[gp-title*format]'L' 'in
+.if '\\*[gp-title*format]'R' 'rj 0
+.if '\\*[gp-title*format]'I' 'in
+.S -8
+.SP 0.3i
+.ds gp-title "\\$1
+.ds gp-subtitle
+.ADDCONTENT "\\$*"
+..
+.\"usage: SUBTITLECOLOR color
+.de SUBTITLECOLOR
+.ds gp-subtitle*color \\$1
+..
+.\"usage: SUBTITLEFORMAT C | L | R | I x
+.de SUBTITLEFORMAT
+.ds gp-subtitle*format \\$1
+.if '\\$1'I' \{\
+. ie \\n[.$]>=2 .nr gp-subtitle*indent \\$2
+. el .nr gp-subtitle*indent \\n[gp-subtitle*defindent]
+.\}
+..
+.\"usage: SUBTITLE title
+.de SUBTITLE
+.SP 0.2i
+.S +4
+.if '\\*[gp-subtitle*format]'C' 'ce 99
+.if '\\*[gp-subtitle*format]'L' 'in 0
+.if '\\*[gp-subtitle*format]'R' 'rj 99
+.if '\\*[gp-subtitle*format]'I' 'in \\n[gp-subtitle*indent]u
+.COLOR \\*[gp-subtitle*color] "\\$*
+.if '\\*[gp-subtitle*format]'C' 'ce 0
+.if '\\*[gp-subtitle*format]'L' 'in
+.if '\\*[gp-subtitle*format]'R' 'rj 0
+.if '\\*[gp-subtitle*format]'I' 'in
+.S -4
+.SP 0.20i
+.ds gp-subtitle "\\$1
+..
+.\"*** Contents
+.\"usage: ADDCONTENT text
+.de ADDCONTENT
+.am gp-toc*list
+.gp-content*set "\\$1" \\n[%]
+\\..
+..
+.de gp-content*set
+.na
+.fi
+.nr gp-collength (\\n[@ll]u*7u)/15u
+.ll \\n[gp-collength]u-\w'\\$2'u-2m
+.ne 2v
+.nr gp-set*oldnl \\n[nl]
+\\$1\h'1m'
+.ll \\n[gp-collength]u
+.sp -1
+.nr gp-sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w'\\$2')-1m
+\h'|\\n[.n]u'\l'\\n[gp-sep]u.'\h'1m'\\$2\c
+.nr gp-set*x \\n[.o]-2p
+.nr gp-set*w \\n[.l]+4p
+.nr gp-set*h (\\n[nl]-\\n[gp-set*oldnl])+\\n[.v]
+.nr gp-set*y \\n[nl]-(\\n[nl]-\\n[gp-set*oldnl])+(\\n[.v]/4)
+\X'ps: exec %%%%LINK \\n[gp-set*x] \\n[gp-set*y] \\n[gp-set*w] \\n[gp-set*h] \\$2'
+.ll \\n[@ll]u
+..
+.de END
+.if \\n[pg*cols-per-page]>1 .1C 1
+.rm HEADER
+.SK
+.MARGIN 0.75i 0.75i
+.rm FOOTER
+.S -8
+\X'ps: exec %%%%CONTENTS'\c
+\X'ps: def %%%%HASCONTENTS'\c
+.ce
+\\*[Licon]
+.br
+.SP 3
+.2C
+.COLOR \\*[gp-link*color]
+.if d gp-toc*list .gp-toc*list
+.COLOR P
+..
+.\" *** Links
+.ds gp-link*color blue7
+.\" usage: LINK name string
+.de LINK
+.gp-link@set
+.nr gp-link*x1 \\n[.k]
+.nr gp-link*y1 \\n[nl]+(\\n[.v]/4)
+.COLOR \\*[gp-link*color] "\\$2"
+.nr gp-link*x2 \\n[.k]-2p
+.nr gp-link*y2 \\n[nl]+(\\n[.v]/4)
+.ie \\n[gp-link*y1]=\\n[gp-link*y2] \{\
+. nr gp-link*x1 -2p
+. nr gp-link*w \\n[gp-link*x2]-\\n[gp-link*x1]
+. nr gp-link*x1 +\\n[.o]
+\X'ps: exec %%%%LINK \\n[gp-link*x1] \\n[gp-link*y1] \\n[gp-link*w] \\n[.v] \\$1'\c
+.\}
+.el \{\
+. nr gp-link*x1 +2p
+. nr gp-link*w \\n[.l]-\\n[gp-link*x1]+2p
+. nr gp-link*x1 +\\n[.o]
+\X'ps: exec %%%%LINK \\n[gp-link*x1] \\n[gp-link*y1] \\n[gp-link*w] \\n[.v] \\$1'\c
+. nr gp-link*w \\n[gp-link*x2]+2p
+. nr gp-link*x1 \\n[.o]-2p
+\X'ps: exec %%%%LINK \\n[gp-link*x1] \\n[gp-link*y2] \\n[gp-link*w] \\n[.v] \\$1'\c
+.\}
+..
+.\" usage: DESTINATION name
+.de DESTINATION
+\X'ps: exec %%%%DEST \\$1 \\n[%]'\c
+..
+.nr gp-link*changed 0
+.\" usage: LINKCOLOR color [border-width [border-color]]
+.de LINKCOLOR
+.ds gp-link*color \\$1
+.if \\n[.$]>1 \{\
+. ds gp-link*opt "\\$2
+. if \\n[.$]>2 .as gp-link*opt " \\*[gp-col!\\$3]
+. nr gp-link*changed 1
+.\}
+..
+.de gp-link@set
+.if \\n[gp-link*changed] \{\
+\X'ps: exec %%%%LINKOPTIONS \\*[gp-link*opt]'\c
+. nr gp-link*changed 0
+.\}
+..