diff options
Diffstat (limited to 'tmac/pspic.tmac')
-rw-r--r-- | tmac/pspic.tmac | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/tmac/pspic.tmac b/tmac/pspic.tmac new file mode 100644 index 0000000..98f9ba4 --- /dev/null +++ b/tmac/pspic.tmac @@ -0,0 +1,178 @@ +.\" Define the PSPIC macro. +.\" +.\" When used with output devices other than ps, dvi, html, or xhtml, +.\" draw a box where the picture would go. +.\" +.\" Usage: +.\" +.\" .PSPIC [-L|-R|-C|-I <indentation>] <file> [<width> [<height>]] +. +.do if d PSPIC .nx +. +.do nr *groff_pspic_tmac_C \n[.cp] +.cp 0 +. +.\" This is called if the `psbb` request returned a bounding box of all +.\" zeroes. It already issues a diagnostic; one can append `ab` to this +.\" macro if that should be a fatal error, or redefine it for some other +.\" purpose. +.de pspic*error-hook +.. +. +.de PSPIC +. nr ps-offset-mode 0 +. \" left-aligned? +. ie '\\$1'-L' \{\ +. nr ps-offset-mode 1 +. shift +. HTML-DO-IMAGE \\$1 l +. \} +. el \{\ +. \" right-aligned? +. ie '\\$1'-R' \{\ +. nr ps-offset-mode 2 +. shift +. HTML-DO-IMAGE \\$1 r +. \} +. el \{\ +. \" indented? +. ie '\\$1'-I' \{\ +. nr ps-offset-mode 3 +. nr ps-offset (m;\\$2) +. shift 2 +. HTML-DO-IMAGE \\$1 i +. \} +. el \{\ +. \" centered is the default +. if '\\$1'-C' \ +. shift +. HTML-DO-IMAGE \\$1 c +. \} +. \} +. \} +. +. br +. +. \" get bounding box +. psbb \\$1 +. ie (\\n[llx] : \\n[lly] : \\n[urx] : \\n[ury]) \{\ +. nr ps-wid (\\n[urx] - \\n[llx]) +. nr ps-ht (\\n[ury] - \\n[lly]) +. if (\\n[ps-wid] < 0) \ +. nr ps-wid (-\\n[ps-wid]) +. if (\\n[ps-ht] < 0) \ +. nr ps-ht (-\\n[ps-ht]) +. +. \" if we have a <width> parameter, use it as the final +. \" image width; otherwise we use the image's natural width +. \" or the current line length, whatever is smaller +. ie (\\n[.$] >= 2) \ +. nr ps-deswid (i;\\$2) +. el \ +. nr ps-deswid ((\\n[.l] - \\n[.i]) <? \\n[ps-wid]p) +. +. \" compute the final image height (with proper rounding), +. \" based on the image's aspect +. nr ps-desht (\\n[ps-deswid] * 1000 + (\\n[ps-wid] / 2) \ + / \\n[ps-wid] * \\n[ps-ht] \ + + 500 / 1000) +. +. \" if we have a <height> parameter, use it as the final +. \" image height in case it is smaller than the height +. \" value we have just computed +. if ((\\n[.$] >= 3) & (\\n[ps-desht] > (i;0\\$3))) \{\ +. nr ps-desht (i;\\$3) +. \" recompute the final image width since we always +. \" keep the correct image aspect +. nr ps-deswid (\\n[ps-desht] * 1000 + (\\n[ps-ht] / 2) \ + / \\n[ps-ht] * \\n[ps-wid] \ + + 500 / 1000) +. \} +. +. \" reserve vertical space for image +. ne (\\n[ps-desht]u + 1v) +. +. \" compute image offset w.r.t. the current left margin +. if (\\n[ps-offset-mode] == 0) \ +. nr ps-offset (\\n[.l] - \\n[.i] - \\n[ps-deswid] / 2) +. if (\\n[ps-offset-mode] == 1) \ +. nr ps-offset 0 +. if (\\n[ps-offset-mode] == 2) \ +. nr ps-offset (\\n[.l] - \\n[.i] - \\n[ps-deswid]) +. +. ie '\*[.T]'dvi' \{\ +. \" prepare values for \special{psfile=...} as needed by dvips +. ie (\\n[ps-wid]p == \\n[ps-deswid]) \{\ +. ds ps-scale \" empty +. ds ps-hoffset hoffset=-\\n[llx] +. ds ps-voffset voffset=-\\n[lly] +. \} +. el \{\ +. nr ps-scale (\\n[ps-deswid] * 100 / \\n[ps-wid]p) +. nr ps-hoffset (-\\n[llx] * \\n[ps-scale] / 100) +. nr ps-voffset (-\\n[lly] * \\n[ps-scale] / 100) +. ds ps-scale hscale=\\n[ps-scale] vscale=\\n[ps-scale] +. ds ps-hoffset hoffset=\\n[ps-hoffset] +. ds ps-voffset voffset=\\n[ps-voffset] +. \} +. +\h'\\n[ps-offset]u'\ +\v'\\n[ps-desht]u'\ +\X'psfile=\\$1 \\*[ps-hoffset] \\*[ps-voffset] \\*[ps-scale]' +. \} +. el \{\ +. ie '\*[.T]'ps' \{\ +. \" prepare values for grops; the 'ps-invis' and 'ps-endinvis' +. \" escapes are for groff's -X switch to provide a PS preview +. \" with xditview: it uses -Tps for formatting but xditview +. \" can't handle EPS files, thus alternative code is enclosed +. \" between those two escapes +. ds ps-invis \X'ps: invis' +. ds ps-endinvis \X'ps: endinvis' +. ds ps-import \X'ps: import \E$1 \En[llx] \En[lly] \En[urx] \En[ury] \ + \En[ps-deswid] \E*[ps-desht]' +. \} +. el \{\ +. ds ps-invis +. ds ps-endinvis +. ds ps-import +. \} +. +. ie (\\n[.$] >= 3) \ +. ds ps-desht \\n[ps-desht] +. el \ +. ds ps-desht \" empty +. +\h'\\n[ps-offset]u'\ +\\*[ps-invis]\ +\# horizontally, the rectangle is slightly smaller than the image +\# to compensate the line thickness (especially needed for TTY devices) +\Z'\D'p 0 \\n[ps-desht]u \ + (\\n[ps-deswid]u - \\n[.H]u) 0 \ + 0 -\\n[ps-desht]u''\ +\# for convenience we also display the image file name (centered +\# vertically); +\Z'\v'((\\n[ps-desht]u / 2u) \ + + (\w'\\$1'u * 0) \ + + ((\\n[rst]u + \\n[rsb]u) / 2u))'\h'1m'\\$1'\ +\\*[ps-endinvis]\ +\v'\\n[ps-desht]u'\ +\\*[ps-import] +. \} +. +. br +. sp \\n[ps-desht]u +. \} +. el \ +. pspic*error-hook \\$@ +. HTML-IMAGE-END +.. +. +.cp \n[*groff_pspic_tmac_C] +.do rr *groff_pspic_tmac_C +. +.\" Local Variables: +.\" mode: nroff +.\" fill-column: 72 +.\" End: +.\" vim: set expandtab filetype=groff tabstop=2 textwidth=72: |