Home | History | Annotate | Line # | Download | only in tmac
      1 .ig
      2 www.tmac - macro package for adding HTML elements to roff documents.
      3 
      4 File position: <groff_source_top>/tmac/www.tmac
      5 Installed position: groff's main macro directory.
      6 
      7 ------------------------------------------------------------------------
      8     Legalize
      9 ------------------------------------------------------------------------
     10 
     11 This file is part of groff, the GNU roff type-setting system.
     12 
     13 Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
     14 written by Gaius Mulley <gaius (a] glam.ac.uk>, with additions by
     15 Werner Lemberg <wl (a] gnu.org> and Bernd Warken <bwarken (a] mayn.de>.
     16 
     17 groff is free software; you can redistribute it and/or modify it under
     18 the terms of the GNU General Public License as published by the Free
     19 Software Foundation; either version 2, or (at your option) any later
     20 version.
     21 
     22 groff is distributed in the hope that it will be useful, but WITHOUT
     23 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     24 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     25 for more details.
     26 
     27 You should have received a copy of the GNU General Public License
     28 along with groff; see the file COPYING.  If not, write to the Free
     29 Software Foundation, 51 Franklin St - Fifth Floor, Boston, MA
     30 02110-1301, USA.
     31 
     32 
     33 ------------------------------------------------------------------------
     34     Description
     35 ------------------------------------------------------------------------
     36 
     37 A simple set of macros to provide HTML documents with basic
     38 www functionality.  It should work with any macro set.
     39 ..
     40 .
     41 .\" --------------------------------------------------------------------
     42 .\" Setup
     43 .\" --------------------------------------------------------------------
     44 .
     45 .do if d www:lenstr .nx
     46 .
     47 .do mso devtag.tmac
     48 .
     49 .nr _C \n(.C
     50 .cp 0
     51 .
     52 .
     53 .nr www-html 0
     54 .if '\*[.T]'html' .nr www-html 1
     55 .
     56 .\" set up www-image-template
     57 .
     58 .if !d www-image-template \
     59 .  ds www-image-template
     60 .
     61 .if r ps4html \{\
     62 .  \" remove the title command when we are generating images for html
     63 .  \" (stops a title accidentally appearing inside an image)
     64 .  di www-notitle
     65 .  tl ''''
     66 .  di
     67 .  rm tl
     68 .  de tl
     69 .  .
     70 .\}
     71 .
     72 .
     73 .\" --------------------------------------------------------------------
     74 .\" Test for `.substring'; result in register `www.substring_ok'.
     75 .\" The automated break points in .URL addresses are only added if
     76 .\" this register is non-zero.
     77 .\"
     78 .nr www:substring_ok 0
     79 .de www:@test_substring
     80 .  if !d substring \
     81 .    return
     82 .  ds \\$0:s abcdefg\"
     83 .  substring \\$0:s 1 1
     84 .  if !'\\*[\\$0:s]'b' \{\
     85 .    rm \\$0:s
     86 .    return
     87 .  \}
     88 .  ds \\$0:s abcdefg\"
     89 .  substring \\$0:s 0 0
     90 .  if !'\\*[\\$0:s]'a' \{\
     91 .    rm \\$0:s
     92 .    return
     93 .  \}
     94 .  ds \\$0:s abcdefg\"
     95 .  substring \\$0:s 1 -1
     96 .  if !'\\*[\\$0:s]'bcdefg' \{\
     97 .    rm \\$0:s
     98 .    return
     99 .  \}
    100 .  nr www:substring_ok 1
    101 .  rm \\$0:s
    102 ..
    103 .www:@test_substring
    104 .rm www:@test_substring
    105 .
    106 .
    107 .\" --------------------------------------------------------------------
    108 .\" Local Macros
    109 .\" --------------------------------------------------------------------
    110 .
    111 .\" --------------------------------------------------------------------
    112 .\" www:paraspace
    113 .\"
    114 .\" Space before paragraph. Use \n[PD] if it exists.
    115 .\"
    116 .nr www:pd 0.5v
    117 .de www:paraspace
    118 .  ie r PD .sp \\n[PD]u
    119 .  el .sp \\n[www:pd]u
    120 ..
    121 .
    122 .\"
    123 .\" --------------------------------------------------------------------
    124 .\" www:error (<test>...)
    125 .\"
    126 .\" Print error message
    127 .\"
    128 .de www-error
    129 .  tm \\n[.F]:\\n[.c]: macro error: \\$*
    130 ..
    131 .als www:error www-error
    132 .
    133 .\" --------------------------------------------------------------------
    134 .\" www:lenstr (<register_name> <string_name>)
    135 .\"
    136 .\" Store length of string named <string_name> into register named
    137 .\" <register_name>.
    138 .\"
    139 .de www:lenstr
    140 .  if !(\\n[.$] == 2) \{\
    141 .    tm .\\$0 expects 2 arguments.
    142 .    ab
    143 .  \}
    144 .  length \\$0:n x\\*[\\$2]
    145 .  nr \\$1 (\\n[\\$0:n]-1)
    146 .  rr \\$0:n
    147 ..
    148 .\" --------------------------------------------------------------------
    149 .\" www:splitstr (<name>)
    150 .\"
    151 .\" Add a space character between any two adjacent characters in string
    152 .\" <name> and restore result into the string variable <name>; space
    153 .\" characters are first replaced by the word `space'.
    154 .\"
    155 .de www:splitstr
    156 .  if !(\\n[.$] == 1) \
    157 .    www:error .\\$0 expects 1 argument.
    158 .  if '\\*[\\$1]'' \
    159 .    return
    160 .  ds \\$0:r "\\*[\\$1]\""
    161 .  ds \\$0:s\"
    162 .  while 1 \{\
    163 .    ds \\$0:c "\\*[\\$0:r]\""
    164 .    substring \\$0:c 0 0\"
    165 .    ie '\\*[\\$0:c]' ' \
    166 .      as \\$0:s " space\""
    167 .    el \
    168 .      as \\$0:s " \\*[\\$0:c]\""
    169 .    www:lenstr \\$0:n \\$0:r
    170 .    if (\\n[\\$0:n] <= 1) \{\
    171 .      break
    172 .    \}
    173 .    substring \\$0:r 1 -1\"
    174 .  \}
    175 .  if !'\\*[\\$0:s]'' \
    176 .    substring \\$0:s 1 -1 
    177 .  ds \\$1 \\*[\\$0:s]
    178 .  rm \\$0:c
    179 .  rr \\$0:n
    180 .  rm \\$0:r
    181 .  rm \\$0:s
    182 ..
    183 .\" --------------------------------------------------------------------
    184 .\" www:url_breaks (<string_name>)
    185 .\"
    186 .\" Add `\:' (possible break point) within URL strings after `/'.
    187 .\"
    188 .\" Smart about multiple `/', existing `\:', and space characters;
    189 .\" does not set a break point if less than 5 characters would go to
    190 .\" the next line.
    191 .\"
    192 .de www:url_breaks
    193 .  if !(\\n[.$] == 1) \
    194 .    www:error .\\$0 expects 1 argument.
    195 .  if !\n[www:substring_ok] \
    196 .    return
    197 .  ds \\$0:s "\\*[\\$1]\""
    198 .  www:splitstr \\$0:s
    199 .  www:url_breaks_splitted \\$0:s \\*[\\$0:s]
    200 .  ds \\$1 "\\*[\\$0:s]\""
    201 .  rm \\$0:s
    202 ..
    203 .\" --------------------------------------------------------------------
    204 .\" www:url_breaks_splitted (<result> <char> [<char>...])
    205 .\"
    206 .\" Add `\:' within URL strings, but arguments are a splitted string.
    207 .\"
    208 .\" Arguments: >=2: <result> <char> [<char>...]
    209 .\"
    210 .de www:url_breaks_splitted
    211 .  nr \\$0:min 5             \" minimal number of characters for next line
    212 .  if (\\n[.$] < 2) \
    213 .    www:error .\\$0 expects at least 2 arguments.
    214 .  ds \\$0:res \\$1\"
    215 .  shift
    216 .  ds \\$0:s\"
    217 .  nr \\$0:done 0
    218 .  while !\\n[\\$0:done] \{\
    219 .    if (\\n[.$] <= 0) \{\
    220 .      nr \\$0:done 1
    221 .      break
    222 .    \}
    223 .    if '\\$1'space' \{\
    224 .      as \\$0:s " \""
    225 .      shift
    226 .      continue
    227 .    \}
    228 .    if (\\n[.$] < \\n[\\$0:min]) \{\
    229 .      as \\$0:s "\\$1\""
    230 .      shift
    231 .      continue
    232 .    \}
    233 .    if !'\\$1'/' \{\
    234 .      as \\$0:s "\\$1\""
    235 .      shift
    236 .      continue
    237 .    \}
    238 .    \" we are at a `/' character
    239 .    while '\\$1'/' \{\
    240 .      as \\$0:s /\"
    241 .      if (\\n[.$] == 0) \{\
    242 .        nr \\$0:done 1
    243 .        break
    244 .      \}
    245 .      shift
    246 .    \}
    247 .    if \\n[\\$0:done] \
    248 .      break
    249 .    if (\\n[.$] < \\n[\\$0:min]) \
    250 .      continue
    251 .    if '\\$1'\:' \
    252 .      shift
    253 .    as \\$0:s \:\"
    254 .  \}
    255 .  ds \\*[\\$0:res] \\*[\\$0:s]\"
    256 .  rm \\$0:res
    257 .  rm \\$0:s
    258 ..
    259 .\" --------------------------------------------------------------------
    260 .\" User Interface
    261 .\" --------------------------------------------------------------------
    262 .
    263 .\" --------------------------------------------------------------------
    264 .\" HTML
    265 .\"
    266 .\" the main auxiliary macro for the HTML interface
    267 .\"
    268 .de HTML
    269 .  if \\n[www-html] \{\
    270 .    \" was implemented via .nop \&\X^html:\\$*^ but
    271 .    \" is now implemented using HTML-NS to utilize code factoring.
    272 .    \"
    273 .    \" the `\&' makes the vertical mode leave, so to say
    274 .    \"
    275 .    nop \&\c
    276 .    HTML-NS \\$*
    277 .    nop \&
    278 .  \}
    279 ..
    280 .\"
    281 .\" an auxiliary macro for HTML (without following space)
    282 .\"
    283 .de HTML-NS
    284 .  nop \X^html:\\$*^\c
    285 ..
    286 .\"
    287 .\" emit a HTML tag after shutting down a (possibly open) paragraph
    288 .\"
    289 .de HTML</p>
    290 .  if \\n[www-html] \{\
    291 .    \" the `\&' makes the vertical mode leave, so to say
    292 .    nop \&\X^html</p>:\\$*^
    293 .  \}
    294 ..
    295 .\" --------------------------------------------------------------------
    296 .\" HX n
    297 .\"
    298 .\"   Automatic heading level cut off.
    299 .\"
    300 .\"   N is the depth limit of automatically linked headings.  So a depth
    301 .\"   of 2 would cause grohtml to generate a list of links for `.NH 1'
    302 .\"   and `.NH 2' but not for `.NH 3'.
    303 .\"
    304 .de HX
    305 .  if \\n[www-html] \
    306 .    nop \X^index:\\$*^
    307 ..
    308 .\" --------------------------------------------------------------------
    309 .\" BCL foreground background active not-visited visited
    310 .\"
    311 .de BCL
    312 .  HTML <body text=\\$1 bgcolor=\\$2 link=\\$3 alink=\\$4 vlink=\\$5>
    313 ..
    314 .\" --------------------------------------------------------------------
    315 .\" BGIMG imagefile
    316 .\"
    317 .de BGIMG
    318 .  HTML <body background=\\$1>
    319 ..
    320 .\" --------------------------------------------------------------------
    321 .\" URL url [description] [after]
    322 .\"     if description is absent then the url becomes the anchor text
    323 .\"
    324 .de URL
    325 .  ie !'\\$1'' \{\
    326 .    ds \\$0:adr \\$1\"
    327 .    www:url_breaks \\$0:adr
    328 .  \}
    329 .  ie \\n[www-html] \{\
    330 .    ie '\\$3'' \
    331 .      ds \\$0:after \&
    332 .    el \
    333 .      ds \\$0:after \&\\$3
    334 .    ie '\\$2'' \
    335 .       HTML-NS <a href="\\$1">\\$1</a>
    336 .    el \
    337 .       HTML-NS <a href="\\$1">\\$2</a>
    338 .    nop \\*[\\$0:after]
    339 .    rm \\$0:after
    340 .  \}
    341 .  el \{\
    342 .    if !r ps4html .ad l
    343 .    ie '\\$2'' \{\
    344 .      ie '\\$1'' \{\
    345 .        ie !'\\$3'' \
    346 .          nop \\$3
    347 .      \}
    348 .      el \{\
    349 .        ie \\n[.color] \
    350 .          nop \%\[la]\m[blue]\f[C]\\*[\\$0:adr]\f[]\m[]\[ra]\\$3
    351 .        el \
    352 .          nop \%\[la]\f[CB]\\*[\\$0:adr]\f[]\[ra]\\$3
    353 .      \}
    354 .    \}
    355 .    el \{\
    356 .      ie '\\$1'' \{\
    357 .        ie \\n[.color] \
    358 .          nop \m[blue]\\$2\m[]\\$3
    359 .        el \
    360 .          nop \f[B]\\$2\f[]\\$3
    361 .      \}
    362 .      el \{\
    363 .        ie \\n[.color] \
    364 .          nop \m[blue]\\$2\m[] \%\[la]\f[C]\\*[\\$0:adr]\f[]\[ra]\\$3
    365 .        el \
    366 .          nop \f[B]\\$2\f[] \%\[la]\f[C]\\*[\\$0:adr]\f[]\[ra]\\$3
    367 .      \}
    368 .    \}
    369 .    if !r ps4html .ad
    370 .  \}
    371 .  rm \\$0:adr
    372 ..
    373 .\" --------------------------------------------------------------------
    374 .\" FTP url description [after]
    375 .\"
    376 .\"   Same as URL.
    377 .\"
    378 .als FTP URL
    379 .\" --------------------------------------------------------------------
    380 .\" MTO address description [after]
    381 .\"
    382 .\"   ADDRESS is the email address (without the `mailto:' prefix).
    383 .\"
    384 .\"   DESCRIPTION is the optional name.  If an empty argument is given,
    385 .\"   ADDRESS is used instead.
    386 .\"
    387 .\"   AFTER is optional stuff printed immediately after ADDRESS
    388 .\"   (resp. DESCRIPTION).
    389 .\"
    390 .\"     Example:
    391 .\"
    392 .\"       Foobar has been written by
    393 .\"       .MTO fred (a] foo.bar "Fredrick Bloggs" .
    394 .\"
    395 .de MTO
    396 .  ie \\n[www-html] \{\
    397 .    ie '\\$2'' \
    398 .      URL mailto:\\$1 \\$1 "\\$3"
    399 .    el \
    400 .      URL mailto:\\$1 "\\$2" "\\$3"
    401 .  \}
    402 .  el \{\
    403 .    ie '\\$2'' \{\
    404 .      ie '\\$1'' \{\
    405 .        ie !'\\$3'' \
    406 .          nop \\$3
    407 .      \}
    408 .      el \{\
    409 .        ie \\n[.color] \
    410 .          nop \%\m[blue]\f[C]\\$1\f[]\m[]\\$3
    411 .        el \
    412 .          nop \%\f[CB]\\$1\f[]\\$3
    413 .      \}
    414 .    \}
    415 .    el \{\
    416 .      ie '\\$1'' \{\
    417 .        ie \\n[.color] \
    418 .          nop \m[blue]\\$2\m[]\\$3
    419 .        el \
    420 .          nop \f[B]\\$2\f[]\\$3
    421 .      \}
    422 .      el \{\
    423 .        ie \\n[.color] \
    424 .          nop \m[blue]\\$2\m[] \%\[la]\f[C]\\$1\f[]\[ra]\\$3
    425 .        el
    426 .          nop \f[B]\\$2\f[] \%\[la]\f[C]\\$1\f[]\[ra]\\$3
    427 .      \}
    428 .    \}
    429 .  \}
    430 ..
    431 .\" --------------------------------------------------------------------
    432 .\" TAG name
    433 .\"
    434 .\"   Generate an html name NAME.
    435 .\"
    436 .de TAG
    437 .  HTML <a name="\\$1"></a>
    438 ..
    439 .\" --------------------------------------------------------------------
    440 .\" IMG [-R|-L|-C] filename [width] [height]
    441 .\"
    442 .\"   Include an image of any type (will only work for -Thtml).
    443 .\"
    444 .\"   Alignment is centered by default (-C).
    445 .\"   Default value for WIDTH is 1i.
    446 .\"   If HEIGHT is not given, WIDTH is used as the height.
    447 .\"
    448 .de IMG
    449 .  ie \\n[www-html] \{\
    450 .    ie '\\$2'-R' \
    451 .      DEVTAG ".right-image"
    452 .    el \{\
    453 .      ie '\\$2'-L' \
    454 .        DEVTAG ".left-image"
    455 .      el \
    456 .        DEVTAG ".centered-image"
    457 .    \}
    458 .    nr www-width 100
    459 .    if !'\\$3'' \
    460 .      nr www-width \\$3
    461 .    nr www-height \\n[www-width]
    462 .    if !'\\$4'' \
    463 .      nr www-height \\$4
    464 .    HTML <img src="\\$1" alt="Image \\$1" \
    465            width=\\n[www-width] height=\\n[www-height]>
    466 .  \}
    467 .  el \
    468 .    nop \[la]\f[C]\\$1\f[]\[ra]
    469 ..
    470 .\" --------------------------------------------------------------------
    471 .\" PIMG  [-R|-L|-C] filename [width] [height]
    472 .\"
    473 .\"   Include a png image.  It will work for -Tps and -Thtml.
    474 .\"   The default value for WIDTH and HEIGHT is zero; the default
    475 .\"   alignment is centering (-C).
    476 .\"
    477 .\" Note: This macro can only be used with the `-U' option of groff,
    478 .\"       activating unsafe mode, if not used with -Thtml; the PNG image
    479 .\"       is then converted to the EPS format using netpbm utilities.
    480 .\"
    481 .de PIMG
    482 .  ie \\n[www-html] \{\
    483 .    ie '\\$1'-R' \
    484 .      DEVTAG ".right-image"
    485 .    el \{\
    486 .      ie '\\$1'-L' \
    487 .        DEVTAG ".left-image"
    488 .      el \
    489 .        DEVTAG ".centered-image"
    490 .    \}
    491 .    nr www-width 0
    492 .    nr www-height 0
    493 .    if !'\\$3'' \
    494 .      nr www-width (\\$3 * 100 / 240)
    495 .    if !'\\$4'' \
    496 .      nr www-height (\\$4 * 100 / 240)
    497 .    ie (\\n[www-width] == 0) \{\
    498 .      ie (\\n[www-height] == 0) \
    499 .        HTML <img src="\\$2" alt="Image \\$2">
    500 .      el \
    501 .        HTML <img src="\\$1" alt="Image \\$2" height=\\n[www-height]>
    502 .    \}
    503 .    el \{\
    504 .      ie (\\n[www-height] == 0) \
    505 .        HTML <img src="\\$2" alt="Image \\$2" width=\\n[www-width]>
    506 .      el \
    507 .        HTML <img src="\\$2" alt="Image \\$2" width=\\n[www-width] \
    508                height=\\n[www-height]>
    509 .    \}
    510 .  \}
    511 .  el \{\
    512 .    if !r ps4html \{\
    513 .      www-make-unique-name
    514 .      sy pngtopnm \\$2 | pnmcrop -white | @PNMTOPS_NOSETPAGE@ -noturn > \\*[www-unique-name].eps
    515 .      ie '\\$1'-C' \
    516 .        PSPIC \\*[www-unique-name].eps \\$3 \\$4
    517 .      el \
    518 .        PSPIC \\$1 \\*[www-unique-name].eps \\$3 \\$4
    519 .    \}
    520 .  \}
    521 ..
    522 .
    523 .\" --------------------------------------------------------------------
    524 .\" auxiliary definitions for MPIMG
    525 .\"
    526 .nr www-left-ll-trap 0
    527 .nr www-left-po-trap 0
    528 .nr www-right-ll-trap 0
    529 .
    530 .de www-finish-left-po
    531 .  po -(\\n[www-left-indent]u + \\n[www-image-gap]u)
    532 .  wh \\n[www-left-po-trap]u
    533 .  nr www-left-indent 0
    534 ..
    535 .
    536 .\" called when the -R picture is finished
    537 .de www-finish-right-ll
    538 .  ll +(\\n[www-right-indent]u + \\n[www-image-gap]u)
    539 .  \" now see whether we need to inline www-finish-left-ll
    540 .  if (\\n[www-left-ll-trap]u > 0) \
    541 .    if ((\\n[www-right-ll-trap]u + 1v) >= \\n[www-left-ll-trap]u) \{\
    542 .      mk www-left-po-trap
    543 .      nr www-left-po-trap +1v
    544 .      wh \\n[www-left-po-trap]u www-finish-left-po
    545 .      ll +\\n[www-left-indent]u
    546 .      wh \\n[www-left-ll-trap]u
    547 .      nr www-left-ll-trap 0
    548 .    \}
    549 .  \" and see whether we need to inline www-finish-left-po
    550 .  if (\\n[www-left-po-trap]u > 0) \
    551 .    if ((\\n[www-right-ll-trap]u + 1v) >= \\n[www-left-po-trap]u) \{\
    552 .      po -\\n[www-left-indent]u
    553 .      wh \\n[www-left-po-trap]u
    554 .      nr www-left-indent 0
    555 .    \}
    556 .  wh \\n[www-right-ll-trap]u
    557 .  nr www-right-ll-trap 0
    558 ..
    559 .
    560 .de www-finish-left-ll
    561 .  if (\\n[www-right-ll-trap] > 0) \
    562 .    if ((\\n[www-left-ll-trap] + 1v) >= \\n[www-right-ll-trap]) \{\
    563 .      ll +\\n[www-right-indent]u
    564 .      nr www-right-ll-trap 0
    565 .    \}
    566 .  mk www-left-po-trap
    567 .  nr www-left-po-trap +1v
    568 .  wh \\n[www-left-po-trap]u www-finish-left-po
    569 .  ll +(\\n[www-left-indent]u + \\n[www-image-gap]u)
    570 .  wh \\n[www-left-ll-trap]u
    571 .  nr www-left-ll-trap 0
    572 ..
    573 .
    574 .\" www-handle-percent arg N1 N2 S1
    575 .\"                    arg - input string (number or number%)
    576 .\"                    output parameters:
    577 .\"                    N1 - name of number register 1=absolute 0=percentage
    578 .\"                    N2 - number register name for absolute value
    579 .\"                    S1 - string register name for percentage value
    580 .
    581 .de www-handle-percent 
    582 .  ds www-percent \\$1\"
    583 .  substring www-percent -1 -1
    584 .
    585 .  ie '\\*[www-percent]'%' \{\
    586 .    ds www-abs \\$1\"
    587 .    substring www-abs 0 -2
    588 .    nr \\$2 0
    589 .    nr \\$3 \\*[www-abs]
    590 .    ds \\$4 \\$1\"
    591 .  \}
    592 .  el \{\
    593 .    nr \\$2 1
    594 .    nr \\$3 \\$1
    595 .    ds \\$4 none\"
    596 .  \}
    597 ..
    598 .
    599 .\" --------------------------------------------------------------------
    600 .\" MPIMG [-R|-L] [-G gap] filename [width [height]]
    601 .\"
    602 .\"   Include a png image and wrap text around it.  It will work for
    603 .\"   -Tps and -Thtml.  The default value for WIDTH is 1i; default value
    604 .\"   for HEIGHT is WIDTH; the default alignment is left (-L).
    605 .\"   -G is used to insert a gap between the text and the image.
    606 .\"   The height and width can also be given as a percentage.
    607 .\"   The PostScript device converts the percentage width into an
    608 .\"   absolute value by using \\n[.l], and the height by using \\n[.p].
    609 .\"   
    610 .\"
    611 .\" Note: This macro can only be used with the `-U' option of groff,
    612 .\"       activating unsafe mode, if not used with -Thtml; the PNG image
    613 .\"       is then converted to the EPS format using netpbm utilities.
    614 .\"
    615 .
    616 .nr www-htmlimage-gap 0
    617 .
    618 .de MPIMG
    619 .  nr www-image-just 1
    620 .  nr www-image-gap 0
    621 .  while (\\n[.$] > 0) \{\
    622 .    if '-L'\\$1' \{\
    623 .      nr www-image-just 1
    624 .      shift
    625 .      continue
    626 .    \}
    627 .    if '-R'\\$1' \{\
    628 .      nr www-image-just 0
    629 .      shift
    630 .      continue
    631 .    \}
    632 .    if '-G'\\$1' \{\
    633 .      nr www-image-gap \\$2
    634 .      nr www-htmlimage-gap (\\$2 * 100 / 240)
    635 .      shift 2
    636 .      continue
    637 .    \}
    638 .    break
    639 .  \}
    640 .
    641 .  nr www-width 1i
    642 .  nr www-height 1i
    643 .  ds www-size-specs "width=\\n[www-width] height=\\n[www-height]\"
    644 .  ie !'\\$2'' \{\
    645 .    nr www-is-absolute 0
    646 .    nr www-absolute 0
    647 .    ds www-percentage none\"
    648 .    www-handle-percent \\$2 www-is-absolute www-absolute www-percentage
    649 .    ie !\\n[www-is-absolute] \{\
    650 .      \" percentage of linelength requested
    651 .      nr www-width (\\n[www-absolute] * \\n[.l] / 100)
    652 .      if \\n[www-html] \
    653 .        nr www-width (\\n[www-width] * 100 / 240)
    654 .      ds www-size-specs "width=\\*[www-percentage]\"
    655 .    \}
    656 .    el \{\
    657 .      nr www-width \\n[www-absolute]
    658 .      if \\n[www-html] \
    659 .        nr www-width (\\n[www-width] * 100 / 240)
    660 .      ds www-size-specs "width=\\n[www-width]\"
    661 .    \}
    662 .
    663 .    nr www-height \\n[www-width]
    664 .    ie !'\\$3'' \{\
    665 .      nr www-is-absolute 0
    666 .      nr www-absolute 0
    667 .      ds www-percentage none\"
    668 .      www-handle-percent \\$3 www-is-absolute www-absolute www-percentage
    669 .      ie !\\n[www-is-absolute] \{\
    670 .        \" percentage of pagelength requested
    671 .        nr www-height (\\n[www-absolute] * \\n[.p] / 100)
    672 .        if \\n[www-html] \
    673 .           nr www-height (\\n[www-height] * 100 / 240)
    674 .        ds www-size-specs "\\*[www-size-specs] height=\\*[www-percentage]\"
    675 .      \}
    676 .      el \{\
    677 .        nr www-height \\n[www-absolute]
    678 .        if \\n[www-html] \
    679 .           nr www-height (\\n[www-height] * 100 / 240)
    680 .        ds www-size-specs "\\*[www-size-specs] height=\\*[www-height]\"
    681 .      \}
    682 .    \}
    683 .  \}
    684 .  el \{\
    685 .    \" height not specified; use width value
    686 .    ie !\\n[www-is-absolute] \{\
    687 .       \" percentage value
    688 .       ds www-size-specs "\\*[www-size-specs] height=\\*[www-percentage]\"
    689 .       nr www-height \\n[www-width]
    690 .    \}
    691 .    el \{\
    692 .       ds www-size-specs "\\*[www-size-specs] height=\\*[www-width]\"
    693 .       nr www-height \\n[www-width]
    694 .    \}
    695 .  \}
    696 .
    697 .  ie \\n[www-html] \{\
    698 .    ie !\\n[www-image-just] \
    699 .      HTML <img src="\\$1" alt="Image \\$1" hspace=\\n[www-htmlimage-gap] \
    700              align=right \\*[www-size-specs]>
    701 .    el \
    702 .      HTML <img src="\\$1" alt="Image \\$1" hspace=\\n[www-htmlimage-gap] \
    703              align=left \\*[www-size-specs]>
    704 .  \}
    705 .  el \{\
    706 .    tm www-width is \\n[www-width]
    707 .    tm www-height is \\n[www-height]
    708 .    if !r ps4html \{\
    709 .      www-make-unique-name
    710 .      sy pngtopnm \\$1 | pnmcrop -white | @PNMTOPS_NOSETPAGE@ -noturn > \\*[www-unique-name].eps
    711 .      ie !\\n[www-image-just] \{\
    712 .        \" we must now disable a possible left image trap
    713 .        sp -1
    714 .        if (\\n[www-left-ll-trap] > 0) \
    715 .          wh \\n[www-left-ll-trap]u
    716 .        if (\\n[www-left-po-trap] > 0) \
    717 .          wh \\n[www-left-po-trap]u
    718 .        PSPIC -R \\*[www-unique-name].eps \\n[www-width]u \\n[www-height]u
    719 .        sp -\\n[ps-desht]u
    720 .        nr www-right-indent \\n[ps-deswid]u
    721 .        \" we want to have some space between text and image,
    722 .        \" so the line length must be shorter
    723 .        ll -(\\n[www-right-indent]u + \\n[www-image-gap]u)
    724 .        mk www-right-ll-trap
    725 .        nr www-right-ll-trap +(\\n[ps-desht]u - 1v)
    726 .        wh \\n[www-right-ll-trap]u www-finish-right-ll
    727 .        \" now restore possible left trap
    728 .        if (\\n[www-left-ll-trap] > 0) \
    729 .          wh \\n[www-left-ll-trap]u www-finish-left-ll
    730 .        if (\\n[www-left-po-trap] > 0) \
    731 .          wh \\n[www-left-po-trap]u
    732 .      \}
    733 .      el \{\
    734 .        \" we must now disable a possible right image trap
    735 .        if (\\n[www-right-ll-trap] > 0) \
    736 .          wh \\n[www-right-ll-trap]u
    737 .        PSPIC -L \\*[www-unique-name].eps \\n[www-width]u \\n[www-height]u
    738 .        sp -\\n[ps-desht]u
    739 .        nr www-left-indent \\n[ps-deswid]u
    740 .        \" increase offset by gap
    741 .        po +(\\n[www-left-indent]u + \\n[www-image-gap]u)
    742 .        \" decrease line length by gap
    743 .        ll -(\\n[www-left-indent]u + \\n[www-image-gap]u)
    744 .        mk www-left-ll-trap
    745 .        nr www-left-ll-trap +(\\n[ps-desht]u - 1v)
    746 .        wh \\n[www-left-ll-trap]u www-finish-left-ll
    747 .        \" now restore possible right trap
    748 .        if (\\n[www-right-ll-trap] > 0) \
    749 .          wh \\n[www-right-ll-trap]u www-finish-right-ll
    750 .      \}
    751 .    \}
    752 .  \}
    753 ..
    754 .\" --------------------------------------------------------------------
    755 .\" HnS n
    756 .\"
    757 .\"   Begin heading.  Heading level is N.
    758 .\"
    759 .\" HnE
    760 .\"
    761 .\"   End heading.
    762 .\"
    763 .\" If your heading contains URL, FTP, MTO macros you might wish to
    764 .\" disable automatic links to headings.  This can be done via `-P-l'
    765 .\" from the command line or by using a cakk to `.HX 0'.
    766 .\"
    767 .nr www-heading-no -1
    768 .
    769 .de HnS
    770 .  ie '\\$1'' \
    771 .    nr www-heading-no 1
    772 .  el \
    773 .    nr www-heading-no \\$1
    774 .  DEVTAG-NH \\n[www-heading-no]
    775 ..
    776 .
    777 .de HnE
    778 .  if (\\n[www-heading-no] == -1) \
    779 .    www-error "HnE found without a corresponding HnS"
    780 .  DEVTAG-EO-H
    781 ..
    782 .\" --------------------------------------------------------------------
    783 .\" LK
    784 .\"
    785 .\"   Emit the automatically collected links derived from
    786 .\"   section/numbered headings at this position.
    787 .\"
    788 .de LK
    789 .  DEVTAG ".links"
    790 ..
    791 .\" --------------------------------------------------------------------
    792 .\" HR
    793 .\"
    794 .\"   Produce a horizontal line.
    795 .\"
    796 .de HR
    797 .  HTML</p> "<hr>"
    798 ..
    799 .\" --------------------------------------------------------------------
    800 .\" NHR
    801 .\"
    802 .\"  Suppresses the generation of the top and bottom rules which grohtml
    803 .\"  emits by default.
    804 .\"
    805 .de NHR
    806 .  DEVTAG ".no-auto-rule"
    807 ..
    808 .\"
    809 .\" www-end-nowhere - end of input trap called to finish diversion.
    810 .\"
    811 .de www-end-nowhere
    812 .  if !\\n[www-html] \
    813 .    di
    814 .  DEVTAG-EO-TL
    815 ..
    816 .\" --------------------------------------------------------------------
    817 .\" HTL
    818 .\"
    819 .\"   Generate an HTML title only.  This differs from the -ms .TL macro
    820 .\"   which generates both an HTML title and an H1 heading.
    821 .\"
    822 .\"   This is useful when an author wishes to use a HTML title as search
    823 .\"   engine fodder but a graphic title in the document.
    824 .\"
    825 .\"   The macro terminates when a space or break is seen (.sp, .br).
    826 .\"
    827 .de HTL
    828 .  DEVTAG ".html-tl"
    829 .  if !\\n[www-html] \
    830 .    di www-nowhere
    831 .  it 2 www-end-nowhere
    832 ..
    833 .
    834 .\" --------------------------------------------------------------------
    835 .\" auxiliary definitions for lists
    836 .\"
    837 .ds www-ul-level1 \[bu]\ \ \"
    838 .ds www-ul-level2 \[sq]\ \ \"
    839 .ds www-ul-level3 \[ci]\ \ \"
    840 .nr www-ul-level 0
    841 .
    842 .ds www-ol-level1 decimal\"
    843 .ds www-ol-level2 lower-alpha\"
    844 .ds www-ol-level3 lower-roman\"
    845 .ds www-ol-tmp 00\ \ \"
    846 .nr www-ol-ctr1 0 1
    847 .nr www-ol-ctr2 0 1
    848 .nr www-ol-ctr3 0 1
    849 .af www-ol-ctr2 a
    850 .af www-ol-ctr3 i
    851 .nr www-ol-level 0
    852 .
    853 .nr www-dl-level 0
    854 .nr www-dl-shift 5n
    855 .
    856 .\"
    857 .\" allow nested lists
    858 .\"
    859 .nr www-depth 0
    860 .nr www-li-indent \n[.i]
    861 .ds www-level0 nop\"
    862 .ds www-level1
    863 .ds www-level2
    864 .ds www-level3
    865 .ds www-level4
    866 .ds www-level5
    867 .ds www-level6
    868 .ds www-level7
    869 .ds www-level8
    870 .ds www-level9
    871 .
    872 .\" which macro to use for LI
    873 .de www-push-li
    874 .  nr www-depth +1
    875 .  ds www-level\\n[www-depth] \\$1\"
    876 .  als LI \\$1
    877 ..
    878 .
    879 .de www-pop-li
    880 .  nr www-depth -1
    881 .  als LI \\*[www-level\\n[www-depth]]
    882 ..
    883 .
    884 .\"
    885 .\" Auxiliary macro for ULS.
    886 .\"
    887 .de www-push-ul-level
    888 .  nr www-ul-level +1
    889 .  if (\\n[www-ul-level] > 3) \
    890 .    www-error "ULS: too many levels of indentation (\\n[www-ul-level])"
    891 ..
    892 .\"
    893 .\" Auxiliary macro for ULE.
    894 .\"
    895 .de www-pop-ul-level
    896 .  if !\\n[www-ul-level] \
    897 .    www-error "ULE: trying to terminate a list which does not exist"
    898 .  nr www-ul-level -1
    899 ..
    900 .
    901 .\"
    902 .\" Auxiliary macro for OLS.
    903 .\"
    904 .de www-push-ol-level
    905 .  nr www-ol-level +1
    906 .  if (\\n[www-ol-level] > 3) \
    907 .    www-error "OLS: too many levels of indentation (\\n[www-ol-level])"
    908 ..
    909 .\"
    910 .\" Auxiliary macro for OLE.
    911 .\"
    912 .de www-pop-ol-level
    913 .  if !\\n[www-ol-level] \
    914 .    www-error "OLE: trying to terminate a list which does not exist"
    915 .  nr www-ol-level -1
    916 ..
    917 .
    918 .\" --------------------------------------------------------------------
    919 .\" ULS
    920 .\"
    921 .\"   Start an unordered list.
    922 .\"
    923 .de ULS
    924 .  www-push-li www-li-ul
    925 .  www-push-ul-level
    926 .  ie \\n[www-html] \
    927 .    HTML</p> "<ul>"
    928 .  el \{\
    929 .    nr www-li-indent +\w'\\*[www-ul-level\\n[www-ul-level]]'u
    930 .  \}
    931 ..
    932 .\" --------------------------------------------------------------------
    933 .\" ULE
    934 .\"
    935 .\"   End an unordered list.
    936 .\"
    937 .de ULE
    938 .  ie \\n[www-html] \
    939 .    HTML "</ul>"
    940 .  el \{\
    941 .    nr www-li-indent -\w'\\*[www-ul-level\\n[www-ul-level]]'u
    942 .    in \\n[www-li-indent]u
    943 .  \}
    944 .  www-pop-ul-level
    945 .  www-pop-li
    946 ..
    947 .\" --------------------------------------------------------------------
    948 .\" OLS
    949 .\"
    950 .\"   Start an ordered list.
    951 .\"
    952 .de OLS
    953 .  www-push-li www-li-ol
    954 .  www-push-ol-level
    955 .  ie \\n[www-html] \
    956 .    HTML</p> "<ol style='list-style-type: \\*[www-ol-level\\n[www-ol-level]]'>"
    957 .  el \
    958 .    nr www-li-indent +\w'\\*[www-ol-tmp]'u
    959 ..
    960 .\" --------------------------------------------------------------------
    961 .\" OLE
    962 .\"
    963 .\"   End an ordered list.
    964 .\"
    965 .de OLE
    966 .  ie \\n[www-html] \
    967 .    HTML "</ol>"
    968 .  el \{\
    969 .    nr www-li-indent -\w'\\*[www-ol-tmp]'u
    970 .    in \\n[www-li-indent]u
    971 .    nr www-ol-ctr\\n[www-ol-level] 0 1
    972 .  \}
    973 .  www-pop-ol-level
    974 .  www-pop-li
    975 ..
    976 .\" --------------------------------------------------------------------
    977 .\"
    978 .\" DLS
    979 .\"   Start a definition list.
    980 .\"
    981 .de DLS
    982 .  www-push-li www-li-dl
    983 .  nr www-dl-level +1
    984 .  ie \\n[www-html] \
    985 .    HTML</p> "<dl>"
    986 .  el \{\
    987 .    nr www-li-indent +\\n[www-dl-shift]u
    988 .    in \\n[www-li-indent]u
    989 .  \}
    990 ..
    991 .\" --------------------------------------------------------------------
    992 .\"
    993 .\" DLE
    994 .\"   End a definition list.
    995 .\"
    996 .de DLE
    997 .  ie \\n[www-html] \
    998 .    HTML "</dl>"
    999 .  el \{\
   1000 .    nr www-li-indent -\\n[www-dl-shift]u
   1001 .    in \\n[www-li-indent]u
   1002 .  \}
   1003 .  nr www-dl-level -1
   1004 .  www-pop-li
   1005 ..
   1006 .\" --------------------------------------------------------------------
   1007 .\" LI
   1008 .\"
   1009 .\"   Insert a list item.
   1010 .\"
   1011 .\" ********
   1012 .\" www-li-ul - bulleted list item
   1013 .\"
   1014 .de www-li-ul
   1015 .  ie \\n[www-html] \
   1016 .    HTML-NS "<li>"
   1017 .  el \{\
   1018 .    www:paraspace
   1019 .    in \\n[www-li-indent]u
   1020 .    ti -\w'\\*[www-ul-level\\n[www-ul-level]]'u
   1021 .    nop \\*[www-ul-level\\n[www-ul-level]]\c
   1022 .  \}
   1023 ..
   1024 .\" ********
   1025 .\" www-li-ol - numbered list item
   1026 .\"
   1027 .de www-li-ol
   1028 .  ie \\n[www-html] \
   1029 .    HTML-NS "<li>"
   1030 .  el \{\
   1031 .    www:paraspace
   1032 .    in \\n[www-li-indent]u
   1033 .    ti -\w'\\n[www-ol-ctr\\n[www-ol-level]]\ \ 'u
   1034 .    nop \\n+[www-ol-ctr\\n[www-ol-level]]\ \ \c
   1035 .  \}
   1036 ..
   1037 .\" ********
   1038 .\" www-li-dl - definition list item
   1039 .\"
   1040 .de www-li-dl
   1041 .  ie \\n[www-html] \{\
   1042 .    HTML "<dt>\\$1</dt>"
   1043 .    HTML-NS "<dd>"
   1044 .  \}
   1045 .  el \{\
   1046 .    www:paraspace
   1047 .    in \\n[www-li-indent]u
   1048 .    ti -\\n[www-dl-shift]u
   1049 .    nop \&\\$1
   1050 .    br
   1051 .  \}
   1052 ..
   1053 .\" --------------------------------------------------------------------
   1054 .\" DC l text [color]
   1055 .\"
   1056 .\"   L is the letter to be dropped and enlarged.
   1057 .\"
   1058 .\"   TEXT is the following text whose height the first letter should not
   1059 .\"   exceed.
   1060 .\"
   1061 .\"   COLOR is the optional color of the dropped letter (default black).
   1062 .\"
   1063 .de DC
   1064 .  ds www-dropcolor black
   1065 .  if !'\\$3'' \
   1066 .    ds www-dropcolor \\$3
   1067 .  ie '\*(.T'html' \{\
   1068 .    www-make-unique-name
   1069 .    nr www-drop-width (100u * \\n[.v]u * 3u / \\n[.l]u)
   1070 .    MPIMG -L \\*[www-unique-name].png "\\n[www-drop-width]%"
   1071 .  \}
   1072 .  el \{\
   1073 .    ie r ps4html \{\
   1074 .      www-make-unique-name
   1075 .      \" To avoid interferences with another DC macro call which is located
   1076 .      \" very near to the current one, we draw the glyph on a separate page.
   1077 .      \" Otherwise it could theoretically happen that the dropped capital
   1078 .      \" glyphs overlap.
   1079 .      bp
   1080 .      ev www-DC
   1081 .      vs 320p
   1082 .      nop \O[5i\\*[www-unique-name].png]\O[1]
   1083 .      nop \m[\\*[www-dropcolor]]\s[160]\O[3]\\$1\O[4]
   1084 .      nop \O[2]\O[0]
   1085 .      br
   1086 .      ev
   1087 .      bp
   1088 .    \}
   1089 .    el \{\
   1090 .      ie n \
   1091 .        nop \\$1\c
   1092 .      el \{\
   1093 .        nr dummy \w'\\$1'u
   1094 .        nr dcht ((\\n[.v] + \\n[rst]) * \\n[.ps] / \\n[rst])
   1095 .        char \[dcap] \m[\\*[www-dropcolor]]\s'\\n[dcht]u'\\$1
   1096 .        nop \v'\\n[.v]u'\\[dcap]\v'-\\n[.v]u'\c
   1097 '        ti \w'\\[dcap]'u
   1098 .      \}
   1099 .    \}
   1100 .  \}
   1101 .  nop \\$2
   1102 ..
   1103 .\" --------------------------------------------------------------------
   1104 .\" Setup around HTML-IMAGE and friends
   1105 .\"
   1106 .\" now set up TS, TE, EQ, EN default macros
   1107 .\"
   1108 .do if !d TS .do ds TS HTML-IMAGE
   1109 .do if !d TE .do ds TE HTML-IMAGE-END
   1110 .do if !d EQ .do ds EQ HTML-IMAGE
   1111 .do if !d EN .do ds EN HTML-IMAGE-END
   1112 .\"
   1113 .\" supplementary macros used by other macro sets
   1114 .\"
   1115 .\" here are some tags specially for -Tps or -Thtml when invoked by
   1116 .\" pre-html to generate png images from postscript.
   1117 .
   1118 .\" --------------------------------------------------------------------
   1119 .\" HTML-DO-IMAGE - tells troff to issue an image marker which can be
   1120 .\"                 read back by pre-html
   1121 .\"
   1122 .de HTML-DO-IMAGE
   1123 .  if r ps4html \
   1124 .    nop \O[5\\$2\\$1.png]\O[1]\O[3]
   1125 .  if \\n[www-html] \
   1126 .    nop \O[5\\$2\\$1.png]\O[0]\O[3]
   1127 ..
   1128 .\" --------------------------------------------------------------------
   1129 .\" HTML-IMAGE-END - terminates an image for html
   1130 .\"
   1131 .de HTML-IMAGE-END
   1132 .  if r ps4html \
   1133 .    nop \O[4]\O[2]\O[0]
   1134 .  if \\n[www-html] \
   1135 .    nop \O[4]\O[2]\O[1]
   1136 ..
   1137 .
   1138 .nr www-png-no 0
   1139 .
   1140 .\" --------------------------------------------------------------------
   1141 .\" www-make-unique-name - generates another unique name in string
   1142 .\"                        `www-unique-name'
   1143 .\"
   1144 .de www-make-unique-name
   1145 .  nr www-png-no +1
   1146 .  ds www-unique-name \\*[www-image-template]\\n[www-png-no]
   1147 ..
   1148 .\" --------------------------------------------------------------------
   1149 .\" HTML-IMAGE and friends tell grohtml that this region of text needs
   1150 .\"            to be rendered as an image.
   1151 .\"
   1152 .de HTML-IMAGE
   1153 .  \" generates a centered image
   1154 .  www-make-unique-name
   1155 .  HTML-DO-IMAGE \\*[www-unique-name] c
   1156 ..
   1157 .
   1158 .de HTML-IMAGE-RIGHT
   1159 .  www-make-unique-name
   1160 .  HTML-DO-IMAGE \\*[www-unique-name] r
   1161 ..
   1162 .
   1163 .de HTML-IMAGE-LEFT
   1164 .  www-make-unique-name
   1165 .  HTML-DO-IMAGE \\*[www-unique-name] l
   1166 ..
   1167 .
   1168 .de HTML-IMAGE-INLINE
   1169 .  www-make-unique-name
   1170 .  HTML-DO-IMAGE \\*[www-unique-name] i
   1171 ..
   1172 .
   1173 .\" --------------------------------------------------------------------
   1174 .\" JOBNAME
   1175 .\"
   1176 .\"   Generate multiple output files containing the html.
   1177 .\"   A file is split whenever a .SH or .NH 1 is encountered.
   1178 .\"   The argument to JOBNAME is the file stem for future output files.
   1179 .\"
   1180 .de JOBNAME
   1181 .  DEVTAG .job-name \\$1
   1182 ..
   1183 .\" --------------------------------------------------------------------
   1184 .\" HEAD
   1185 .\"
   1186 .\"   Adds information to the <head> </head> section of the html
   1187 .\"   document
   1188 .\" --------------------------------------------------------------------
   1189 .de HEAD
   1190 .  DEVTAG .head "\\$*"
   1191 ..
   1192 .\" --------------------------------------------------------------------
   1193 .\" Final Setup
   1194 .\" --------------------------------------------------------------------
   1195 .
   1196 .if \n[www-html] \{\
   1197 .   nh
   1198 .   nr HY 0
   1199 .\}
   1200 .
   1201 .\"
   1202 .\" start of some code
   1203 .\"
   1204 .
   1205 .de CDS
   1206 .ft C
   1207 .nf
   1208 ..
   1209 .\"
   1210 .\" end of some code
   1211 .\"
   1212 .
   1213 .de CDE
   1214 .fi
   1215 .ft P
   1216 ..
   1217 .
   1218 .if r ps4html .nop \O[0]
   1219 .cp \n(_C
   1220 .
   1221 .\" now set
   1222 .
   1223 .\" --------------------------------------------------------------------
   1224 .\" Emacs settings
   1225 .\" --------------------------------------------------------------------
   1226 .
   1227 .\" Local Variables:
   1228 .\" mode: nroff
   1229 .\" End:
   1230 .\" EOF
   1231