.\" om.tmac .ig Mom -- a typesetting/document-processing macro set for groff. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. Written by Peter Schaffter PDF integration contributed by Deri James 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 . Version 2.1-b ------------- Antoine de St-ExupĂ©ry asserted that elegance in engineering is achieved not when there is nothing left to add, but when there is nothing left to take away. By those standards, mom is a Rube Goldberg contraption. She was created over the years while groff, and my understanding of it, changed and evolved. However, I'm a firm believer in "if it ain't broke, don't fix it." Version 2.0 removes some of the redundancies and cruft, but mom still needs some nip and tuck. "" in the description of arguments that can be passed to a macro means that any argument turns the feature off. Thanks to everyone who has contributed suggestions and patches, and to those whose GPL'd work has been plundered. Special thanks to Werner Lemberg (margin notes), Tadziu Hoffman (underlining), Deri James (pdf integration), Robin Haberkorn (tbl integration and float management). .. .\" %beginstrip% \# \# ==================================================================== \# \# Check which version of groff is being run .if (\n[.x]\n[.y] < 118) \ . ab [mom]: You need GNU troff version 1.18 or higher to run this version of mom. \# Check that GNU troff is being run .if !\n[.g]=1 \ . ab [mom]: The mom macros require that you be running GNU troff. .if \n[.C] \ . ab [mom]: The groff mom macros do not work in compatibility mode. \# Add supplementary styles .sty \n[.fp] UL \" Ultra Light .sty \n[.fp] ULI \" Ultra Light Italic .sty \n[.fp] ULCD \" Ultra Light Condensed .sty \n[.fp] ULCDI \" Ultra Light Condensed Italic .sty \n[.fp] ULEX \" Ultra Light Extended .sty \n[.fp] ULEXI \" Ultra Light Extended Italic \# .sty \n[.fp] XL \" Extra Light .sty \n[.fp] XLI \" Extra Light Italic .sty \n[.fp] XLCD \" Extra Light Condensed .sty \n[.fp] XLCDI \" Extra Light Condensed Italic .sty \n[.fp] XLEX \" Extra Light Extended .sty \n[.fp] XLEXI \" Extra Light Extended Italic \# .sty \n[.fp] TH \" Thin .sty \n[.fp] THI \" Thin Italic .sty \n[.fp] THCD \" Thin Condensed .sty \n[.fp] THCDI \" Thin Condensed Italic .sty \n[.fp] THEX \" Thin Extended .sty \n[.fp] THEXI \" Thin Extended Italic \# .sty \n[.fp] L \" Light Roman .sty \n[.fp] LI \" Light Italic .sty \n[.fp] LCD \" Light Condensed .sty \n[.fp] LCDI \" Light Condensed Italic .sty \n[.fp] LEX \" Light Extended .sty \n[.fp] LEXI \" Light Extended Italic \# .sty \n[.fp] BK \" Book Roman .sty \n[.fp] BKI \" Book Italic .sty \n[.fp] BKCD \" Book Condensed .sty \n[.fp] BKCDI \" Book Condensed Italic .sty \n[.fp] BKEX \" Book Extended .sty \n[.fp] BKEXI \" Book Extended Italic \# .sty \n[.fp] CD \" Medium Condensed .sty \n[.fp] CDI \" Medium Condensed Italic .sty \n[.fp] EX \" Medium Extended .sty \n[.fp] EXI \" Medium Extended Italic \# .sty \n[.fp] DB \" DemiBold Roman .sty \n[.fp] DBI \" DemiBold Italic .sty \n[.fp] DBCD \" DemiBold Condensed .sty \n[.fp] DBCDI \" DemiBold Condensed Italic .sty \n[.fp] DBEX \" DemiBold Extended .sty \n[.fp] DBEXI \" DemiBold Extended Italic \# .sty \n[.fp] SB \" SemiBold Roman .sty \n[.fp] SBI \" SemiBold Italic .sty \n[.fp] SBCD \" SemiBold Condensed .sty \n[.fp] SBCDI \" SemiBold Condensed Italic .sty \n[.fp] SBEX \" SemiBold Extended .sty \n[.fp] SBEXI \" SemiBold Extended Italic \# .sty \n[.fp] BCD \" Bold Condensed .sty \n[.fp] BCDI \" Bold Condensed Italic .sty \n[.fp] BEX \" Bold Extended .sty \n[.fp] BEXI \" Bold Extended Italic .sty \n[.fp] BO \" Bold Outline \# .sty \n[.fp] XB \" Extra Bold .sty \n[.fp] XBI \" Extra Bold Italic .sty \n[.fp] XBCD \" Extra Bold Condensed .sty \n[.fp] XBCDI \" Extra Bold Condensed Italic .sty \n[.fp] XBEX \" Extra Bold Extended .sty \n[.fp] XBEXI \" Extra Bold Extended Italic \# .sty \n[.fp] UB \" Ultra Bold .sty \n[.fp] UBI \" Ultra Bold Italic .sty \n[.fp] UBCD \" Ultra Bold Condensed .sty \n[.fp] UBCDI \" Ultra Bold Condensed Italic .sty \n[.fp] UBEX \" Ultra Bold Extended .sty \n[.fp] UBEXI \" Ultra Bold Extended Italic \# .sty \n[.fp] HV \" Heavy .sty \n[.fp] HVI \" Heavy Italic .sty \n[.fp] HVCD \" Heavy Condensed .sty \n[.fp] HVCDI \" Heavy Condensed Italic .sty \n[.fp] HVEX \" Heavy Extended .sty \n[.fp] HVEXI \" Heavy Extended Italic \# .sty \n[.fp] BL \" Black .sty \n[.fp] BLI \" Black Italic .sty \n[.fp] BLCD \" Black Condensed .sty \n[.fp] BLCDI \" Black Condensed Italic .sty \n[.fp] BLEX \" Black Extended .sty \n[.fp] BLEXI \" Black Extended Italic .sty \n[.fp] BLO \" Black Outline \# .sty \n[.fp] XBL \" Extra Black .sty \n[.fp] XBLI \" Extra Black Italic .sty \n[.fp] XBLCD \" Extra Black .sty \n[.fp] XBLCDI \" Extra Black .sty \n[.fp] XBLEX \" Extra Black Italic .sty \n[.fp] XBLEXI \" Extra Black Italic \# .sty \n[.fp] UBL \" Ultra Black .sty \n[.fp] UBLI \" Ultra Black Italic .sty \n[.fp] UBLCD \" Ultra Black Condensed .sty \n[.fp] UBLCDI \" Ultra Black Condensed Italic .sty \n[.fp] UBLEX \" Ultra Black Exteneded .sty \n[.fp] UBLEXI \" Ultra Black Extended Italic \# .sty \n[.fp] SC \" Small Caps Roman .sty \n[.fp] SCI \" Small Caps Italic .sty \n[.fp] SCDB \" Small Caps Demibold .sty \n[.fp] SCDBI \" Small Caps Demibold Italic .sty \n[.fp] SCSB \" Small Caps Semibold .sty \n[.fp] SCSBI \" Small Caps Semibold Italic \# \# Instruct grops to use square linecaps and joins. \# This instruction is also executed in DO_B_MARGIN, NEWPAGE, and HEADER \# .if !n \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap' \# \# The following PostScript, provided by Tadziu Hoffmann, permits \# no-fail underlining \# .de ul*ps ps: def grops begin /decornone { grops begin /X { } def /Y { } def /y2 -1 def end } def /decorline { grops begin u neg /uld exch def u /ulw exch def /X { currentpoint /y0 exch def /x0 exch def } def /Y { currentpoint /y1 exch def /x1 exch def drawline /x2 x1 def /y2 y1 def } def end } def /drawline { gsave ulw setlinewidth 0 setlinecap x1 y1 uld sub moveto y2 y0 eq { x2 y2 } { x0 y0 } ifelse uld sub lineto stroke grestore } def decornone /uld 0 def /ulw 0 def /A { X show Y } def /B { 0 SC 3 -1 roll X widthshow Y } def /C { 0 exch X ashow Y } def /D { 0 exch 0 SC 5 2 roll X awidthshow Y } def /E { 0 rmoveto X show Y } def /F { 0 rmoveto 0 SC 3 -1 roll X widthshow Y } def /G { 0 rmoveto 0 exch X ashow Y } def /H { 0 rmoveto 0 exch 0 SC 5 2 roll X awidthshow Y } def /I { 0 exch rmoveto X show Y } def /J { 0 exch rmoveto 0 SC 3 -1 roll X widthshow Y } def /K { 0 exch rmoveto 0 exch X ashow Y } def /L { 0 exch rmoveto 0 exch 0 SC 5 2 roll X awidthshow Y } def /M { rmoveto X show Y } def /N { rmoveto 0 SC 3 -1 roll X widthshow Y } def /O { rmoveto 0 exch X ashow Y } def /P { rmoveto 0 exch 0 SC 5 2 roll X awidthshow Y } def /Q { moveto X show Y } def /R { moveto 0 SC 3 -1 roll X widthshow Y } def /S { moveto 0 exch X ashow Y } def /T { moveto 0 exch 0 SC 5 2 roll X awidthshow Y } def end .. \# .if !n \Y[ul*ps] .if n .color 0 .nr TOC.RELOCATE 0 \" TOC.RELOCATE is off by default .ds PDFHREF.TEXTCOL.DEFAULT 0.0 0.3 0.9 \# \# ==================================================================== \# \# TYPESETTING MACROS, STRINGS, AND ALIASES \# ======================================== \# \# +++ALIASES+++ \# \# Alias .als as ALIAS, and .aln (number registers) as ALIASN \# .als ALIAS als .als ALIASN aln \# \# ALIASES FOR GROFF REQUESTS \# -------------------------- \# .ALIAS MAC de .ALIAS BR br .ALIAS SPREAD brp .ALIAS ESC_CHAR ec .ALIAS STRING ds .ALIAS INCLUDE so \# \# ALIASES FOR NUMBER REGISTERS \# ---------------------------- \# .ALIASN #PT_SIZE .ps \"fractional point size in units .ALIASN #DIVER_DEPTH dn \"diversion depth .ALIASN #DIVER_WIDTH dl \"diversion width .ALIASN #TRAP_DISTANCE .t \"distance to next trap .ALIASN #LEAD .v \"line space .ALIASN #PAGE_LENGTH .p \"page length .ALIASN #NUM_ARGS .$ \"number of arguments passed to a macro .ALIASN #INDENT .i \"value of current indent \# \# ==================================================================== \# \# MISCELLANEOUS \# ============= .nr #L_MARGIN \n[.o] \" Tabs, etc require #L_MARGIN .cflags 4 /\[en] \" So slash and en-dashes get broken \# \# ==================================================================== \# \# +++PAGE LAYOUT+++ \# \# Macros that control the physical layout of the page: paper size \# and margins. \# \# PAGE WIDTH \# ---------- \# *Argument: \# \# *Function: \# Stores user supplied page width in register #PAGE_WIDTH. \# *Notes: \# #PAGE_WIDTH is used to establish the default LL (and right margin). \# Requires unit of measure. \# .MAC PAGEWIDTH END . br . nr #PAGE_WIDTH \\$1 . if !r#L_MARGIN .L_MARGIN \\n[.o] . if !r#R_MARGIN .R_MARGIN 1i . if '\\*[.T]'pdf' \X'papersize=\\n[#PAGE_WIDTH]z,\\n[#PAGE_LENGTH]z'\c .END \# \# L_MARGIN \# -------- \# *Argument: \# \# *Function: \# Stores user supplied page offset in register #L_MARGIN. \# Sets .po to user supplied offset. \# *Notes: \# Requires unit of measure. \# .MAC L_MARGIN END . br . nr #L_MARGIN (\\$1) . po \\n[#L_MARGIN]u .END \# \# R_MARGIN \# -------- \# *Argument: \# \# *Function: \# Stores user supplied right margin in register #R_MARGIN. \# *Notes: \# This is a pseudo-margin. Right margin is actually a function of \# line length. The macro calculates line length from the page offset \# and the value plugged into #R_MARGIN. \# \# N.B. -- PAGEWIDTH and L_MARGIN have to be defined before R_MARGIN. \# \# Requires unit of measure. \# .MAC R_MARGIN END . br . nr #R_MARGIN (\\$1) . ll \\n[#PAGE_WIDTH]u-\\n[#L_MARGIN]u-\\n[#R_MARGIN]u . ta \\n[.l]u . nr #L_LENGTH \\n[.l] .END \# \# T_MARGIN \# -------- \# *Argument: \# \# *Function: \# Stores the user supplied top margin in register #T_MARGIN. \# Advances user supplied depth from the top of the page. \# *Notes: \# Requires unit of measure. \# .MAC T_MARGIN END . nr #T_MARGIN (\\$1) . nr #TOP 1 . if !\\n[#DOCS] .sp |\\n[#T_MARGIN]u-1v . wh 0i DO_T_MARGIN .END \# \# B_MARGIN \# -------- \# *Argument: \# \# *Function: \# Stores the user supplied bottom margin in register #B_MARGIN. \# *Notes: \# Requires unit of measure. \# .MAC B_MARGIN END . br . nr #B_MARGIN (\\$1) . nr #ORIGINAL_B_MARGIN \\n[#B_MARGIN] . nr #B_MARGIN_SET 1 . wh -\\n[#B_MARGIN]u DO_B_MARGIN .END \# \# PAGE \# ---- \# *Arguments: \# [pagelength [leftmargin [rightmargin [topmargin [bottommargin]]]]] \# *Function: \# Page set-up. Collects arguments and passes them to the appropriate \# macros. \# *Notes: \# All arguments after pagewidth are optional, but must appear \# in the order given above. (User can fill in as much or as \# little as desired.) \# \# All arguments require a unit of measure. \# .MAC PAGE END . br . PAGEWIDTH \\$1 . PAGELENGTH \\$2 . ie '\\$3'' .L_MARGIN \\n[.o] . el .L_MARGIN \\$3 . ie '\\$4'' .R_MARGIN 1i . el .R_MARGIN \\$4 . if !'\\$5'' .T_MARGIN \\$5 . if !'\\$6'' .B_MARGIN \\$6 .END \# \# gropdf: pass pagelength to postprocessor; no need for -P-p \# .MAC PAGELENGTH END . pl \\$* . if '\\*[.T]'pdf' \X'papersize=\\n[#PAGE_WIDTH]z,\\n[#PAGE_LENGTH]z'\c .END \# \# ===================================================================== \# \# +++PAGE CONTROL+++ \# \# Generic macros for breaking pages. \# \# DO_T_MARGIN \# ----------- \# *Argument: \# \# *Function: \# Plants the top margin at the top of each page. \# *Notes: \# The trap is set in .T_MARGIN or .PAGE \# .MAC DO_T_MARGIN END . ev T_MARGIN . nr #TOP 1 . sp |\\n[#T_MARGIN]u-1v . ev . sp -\\n[#T_MARGIN_LEAD_ADJ]u .END \# \# DO_B_MARGIN \# ----------- \# *Argument: \# \# *Function: \# Plants the bottom margin at the bottom of each page. \# *Notes: \# The trap is set in .B_MARGIN or .PAGE. \# .MAC DO_B_MARGIN END . nr #T_MARGIN_LEAD_ADJ \\n[#LEAD]-12000 . ev B_MARGIN . bp . if !n .nop \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap' . ev .END \# \# NEWPAGE \# ------- \# *Argument: \# \# *Function: \# Breaks to a new page. \# *Notes: \# If a B_MARGIN has been set, processes that, otherwise, just \# breaks to a new page. \# .MAC NEWPAGE END . ie \\n[#NO_BREAK] \{\ ' br . rr #NO_BREAK . \} . el .br . nr #NEWPAGE 1 . ie \\n[#B_MARGIN_SET]=1 \{\ . ie !\\n[#DOCS]=1 \{\ . ev NP . bp . if !n .nop \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap' . ev . \} . el \{\ . if \\n[#COLUMNS]=1 .nr #COL_NUM \\n[#NUM_COLS] . ie !\\n[#FN_DEPTH] \{\ . ch FN_OVERFLOW_TRAP . bp . wh -(\\n[#FN_OVERFLOW_TRAP_POS]u) FN_OVERFLOW_TRAP . \} . el .bp . \} . \} . el .DO_B_MARGIN .END \# \# ===================================================================== \# \# +++GENERAL STYLE MACROS+++ \# \# LINE LENGTH \# ----------- \# *Argument: \# \# *Function: \# Stores user supplied line length in register #L_LENGTH. \# Sets .ll to #L_LENGTHu \# *Notes: \# Requires unit of measure. \# .MAC LL END . nr #USER_SET_L_LENGTH 1 . ll \\$1 . nr #L_LENGTH \\n[.l] . ta \\n[.l]u .END \# \# +++FAMILY AND FONT+++ \# \# FALLBACK FONT \# ------------- \# *Argument: \# [ ABORT | WARN ] | ABORT | WARN \# *Function: \# Sets register #ABORT_FT_ERRORS to 1, or defines a fallback font \# called "dummy" at font position 0. \# *Notes: \# Calls to non-existent families cause mom to continue processing \# files using the fallback font until a valid family is entered. \# \# Calls to non-existent fonts generate warnings. If ABORT is passed \# to FALLBACK_FONT, mom stops processing files after the warning. \# Otherwise, she continues to process files using the fallback font \# after the warning is issued. The default fallback font is CR; the \# default for font warnings is to abort. \# .MAC FALLBACK_FONT END . if \\n[#NUM_ARGS]=1 \{\ . if '\\$1'ABORT' .nr #ABORT_FT_ERRORS 1 . if '\\$1'WARN' \ . if r #ABORT_FT_ERRORS .nr #ABORT_FT_ERRORS 0 . if !'\\$1'ABORT' \ . if !'\\$1'WARN' .fp 0 dummy \\$1 . \} . if \\n[#NUM_ARGS]=2 \{\ . fp 0 dummy \\$1 . if '\\$2'ABORT' .nr #ABORT_FT_ERRORS 1 . if '\\$2'WARN' .nr #ABORT_FT_ERRORS 0 . \} .END \# .FALLBACK_FONT CR ABORT \# \# FAMILY \# ------ \# *Argument: \# \# *Function: \# Stores user supplied font family in string $FAMILY. Sets .fam \# to $FAMILY. \# .MAC FAMILY END . ds $FAMILY \\$1 . if \\n[#PRINT_STYLE]=1 \{\ . fam \\*[$TYPEWRITER_FAM] . return . \} . if \\n[#IGNORE] \{\ . fam \\*[$TYPEWRITER_FAM] . return . \} . if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) .ds $SAVED_STYLE \\n[.sty] . ft 0 . fam \\*[$FAMILY] . if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) \{\ . ft \\*[$SAVED_STYLE] . if !F\\n[.fn] .ft 0 . \} . ie \\n[#PRE_COLLATE]=1 . . el \{\ . if \\n[#COLLATE]=1 \ . if !r#START .ds $DOC_FAM \\*[$FAMILY] . \} .END \# \# FONT \# ---- \# *Argument: \# R | I | B | BI | \# *Function: \# Stores user supplied font in $FONT and sets .ft to $FONT. \# .MAC FT END . ds $FONT \\$1 . if \\n[#PRINT_STYLE]=1 \{\ . ie '\\$1'I' \{\ . if \\n[#UNDERLINE_ITALIC]=1 \{\ . UNDERLINE . return . \} . if \\n[#ITALIC_MEANS_ITALIC]=1 \{\ . ds $FONT \\$1 . ft \\*[$FONT] . return . \} . \} . el .UNDERLINE OFF . return . \} . ft 0 . ft \\*[$FONT] . if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) \{\ . if '\\n[.sty]'' \{\ . if !F\\n[.fn] \{\ . if !S\\*[$FONT] \{\ . tm1 "[mom]: Font style "\\*[$FONT]" at line \\n[.c] has not been registered. . ie \\n[#ABORT_FT_ERRORS]=0 \ . tm1 " Continuing to process using fallback font. . el .ab Aborting '\\n[.F]' at \\$0, line \\n[.c]. . \} . if \\n[.f]=0 \{\ . tm1 "[mom]: Either font style "\\*[$FONT]" at line \\n[.c] does not exist in family "\\n[.fam]", . tm1 " or family "\\n[.fam]" has not been installed. . ie \\n[#ABORT_FT_ERRORS]=0 \ . tm1 " Continuing to process using fallback font. . el .ab Aborting '\\n[.F]' at \\$0, line \\n[.c]. . \} . \} . \} . \} .END \# \# POINT SIZE \# ---------- \# *Arguments: \# \# *Function: \# Sets point size to user supplied value in scaled points. \# If #AUTO_LEAD is on, resets lead accordingly. \# *Notes: \# Must NOT use a unit of measure. \# .MAC PT_SIZE END . if \\n[#PRINT_STYLE]=1 .return . if \\n[#IGNORE] .return . ps \\$1 . nr #PT_SIZE_IN_UNITS \\n[.ps] . ie '\\$0'DOC_PT_SIZE' \{\ . if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0 . br . nr #NEW_DOC_PT_SIZE \\n[.ps] . if \\n[#DOC_AUTOLEAD] \{\ . ie !\\n[#DOC_AUTOLEAD_FACTOR] .nr #AUTOLEADING \\n[#DOC_AUTOLEAD] . el .nr #AUTOLEADING \\n[.ps]*\\n[#DOC_AUTOLEAD]/1000-\\n[.ps] . nr #DOC_LEAD \\n[.ps]+\\n[#AUTOLEADING] . nr #RESET_TRAPS 1 . \} . \} . el .if \\n[#AUTO_LEAD] .vs \\n[.ps]u+\\n[#AUTOLEADING]u .END \# \# SIZE (inline) \# ------------- \# *Arguments: \# \# *Function: \# Sets point size to user supplied value in scaled points. \# Intended to be called inline with \*[SIZE ] \# *Notes: \# Can be used with a unit of measure or not. \# .MAC SIZE END \c .ps \\$1 .END \# \# LEADING \# ------- \# *Argument: \# \# *Function: \# Turns off #AUTOLEAD if it's on. \# Sets .vs to user supplied value. \# *Notes: \# Does not require unit of measure. LS automatically turns off AUTOLEAD. \# .MAC LS END . br . nr #OLD_LEAD \\n[.v] . if \\n[#PRINT_STYLE]=1 .return . if \\n[#IGNORE] .return . if \\n[#AUTO_LEAD] \{\ . rr #AUTO_LEAD . rr #AUTOLEAD_VALUE . rr #AUTOLEADING . \} . vs \\$1 . if \\n[.t]<\\n[.v] 'bp . if \\n[#TOP] \{\ . nr #TOP_BASELINE_ADJ \\n[.v]-\\n[#OLD_LEAD] . sp -\\n[#TOP_BASELINE_ADJ]u . rr #TOP . rr #TOP_BASELINE_ADJ . \} .END \# \# AUTOLEAD \# -------- \# *Argument: \# [FACTOR] \# *Function: \# Stores user supplied auto-lead value in register #AUTOLEAD_VALUE. \# Adds #AUT0LEAD_VALUE to #PT_SIZE when invoked to set leading. \# All subsequent PT_SIZE requests reset the leading in the same way until \# AUTOLEAD is turned off. \# *Notes: \# With the optional FACTOR argument, the current point size is \# multiplied by #AUTOLEAD_VALUE/1000 instead of the two being added \# together. \# .MAC AUTOLEAD END . if \\n[#PRINT_STYLE]=1 .return . if \\n[#IGNORE] .return . nr #AUTO_LEAD 1 \" autolead on or off . nr #OLD_LEAD \\n[.v] . nr #AUTOLEAD_VALUE (p;\\$1) \" arg x 1000 . ie '\\$2'FACTOR' \{\ . if !\\n[#DOCS] .nr #DOC_AUTOLEAD_FACTOR \\n[#AUTOLEAD_VALUE] \" save for DOC_PT_SIZE . nr #AUTOLEADING \\n[.ps]*\\n[#AUTOLEAD_VALUE]/1000-\\n[.ps] . \} . el .nr #AUTOLEADING \\n[#AUTOLEAD_VALUE] . vs \\n[.ps]u+\\n[#AUTOLEADING]u . if \\n[#TOP] \{\ . nr #TOP_BASELINE_ADJ \\n[.v]-\\n[#OLD_LEAD] . sp -\\n[#TOP_BASELINE_ADJ]u . rr #TOP . rr #TOP_BASELINE_ADJ . \} .END \# \# STRINGS FOR INLINE CONTROL OF GENERAL TYPE STYLE \# ------------------------------------------------ .ds ROM \Ef[R] .ds IT \Ef[I] .ds BD \Ef[B] .ds BDI \Ef[BI] .ds PREV \Ef[] .ds S \Es \# \# ===================================================================== \# \# +++KERNING+++ \# \# AUTOMATIC PAIRWISE KERNING \# -------------------------- \# *Arguments: \# | \# *Function: \# Turns automatic pairwise kerning on or off. \# .MAC KERN END . ie '\\$1'' \{\ . kern . nr #KERN 1 . \} . el \{\ . kern 0 . nr #KERN 0 . \} .END \# \# INLINE KERNING AND HORIZONTAL MOVEMENT \# -------------------------------------- \# \# Inline kerning provides a simple way to adjust the amount of \# space between any two letters. It's predicated on a unit of \# measure "U", which is 1/36 of the current point size as returned \# by \n[.ps]. E.g., if the current point size is 18, \n[.ps] \# returns 18000u, therefore U=500u. Since U remains proportional \# relative to the current point size, the amount of kerning \# between two letters as expressed in Us remains visually similar \# regardless of changes in point size. \# \# N.B.--the amount of inline kerning supplied by \*[BU] or \# \*[FU] is added to or subtracted from any kerning that already \# takes place between two characters when automatic kerning is \# turned on. \# .nr #KERN_UNIT 36 .ds BU \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*\\$1u)' .ds FU \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*\\$1u)' \# \# Initialize strings for pre-1.1.3c-style BU and FU \# .nr #LOOP 0 1 .while \n+[#LOOP]<37 \{\ . ds BU\n[#LOOP] \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*\n[#LOOP]u)' .\} \# .nr #LOOP 0 1 .while \n+[#LOOP]<37 \{\ . ds FU\n[#LOOP] \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*\n[#LOOP]u)' .\} .rr #LOOP \# \# Horizontal movements \# -------------------- \# BP1...12.75 and FP1...12.75 move backwards or forwards inline by the \# specified number of points. \# .ds BCK \h'-\\$1' .ds FWD \h'\\$1' \# .ds BP.25 \h'-.25' .ds BP.5 \h'-.5' .ds BP.75 \h'-.75' .ds BP1 \h'-1p' .ds BP1.25 \h'-1.25p' .ds BP1.5 \h'-1.5p' .ds BP1.75 \h'-1.75p' .ds BP2 \h'-2p' .ds BP2.25 \h'-2.25p' .ds BP2.5 \h'-2.5p' .ds BP2.75 \h'-2.75p' .ds BP3 \h'-3p' .ds BP3.25 \h'-3.25p' .ds BP3.5 \h'-3.5p' .ds BP3.75 \h'-3.75p' .ds BP4 \h'-4p' .ds BP4.25 \h'-4.25p' .ds BP4.5 \h'-4.5p' .ds BP4.75 \h'-4.75p' .ds BP5 \h'-5p' .ds BP5.25 \h'-5.25p' .ds BP5.5 \h'-5.5p' .ds BP5.75 \h'-5.75p' .ds BP6 \h'-6p' .ds BP6.25 \h'-6.25p' .ds BP6.5 \h'-6.5p' .ds BP6.75 \h'-6.75p' .ds BP7 \h'-7p' .ds BP7.25 \h'-7.25p' .ds BP7.5 \h'-7.5p' .ds BP7.75 \h'-7.75p' .ds BP8 \h'-8p' .ds BP8.25 \h'-8.25p' .ds BP8.5 \h'-8.5p' .ds BP8.75 \h'-8.75p' .ds BP9 \h'-9p' .ds BP9.25 \h'-9.25p' .ds BP9.5 \h'-9.5p' .ds BP9.75 \h'-9.75p' .ds BP10 \h'-10p' .ds BP10.25 \h'-10.25p' .ds BP10.5 \h'-10.5p' .ds BP10.75 \h'-10.75p' .ds BP11 \h'-11p' .ds BP11.25 \h'-11.25p' .ds BP11.5 \h'-11.5p' .ds BP11.75 \h'-11.75p' .ds BP12 \h'-12p' .ds BP12.25 \h'-12.25p' .ds BP12.5 \h'-12.5p' .ds BP12.75 \h'-12.75p' \# .ds FP.25 \h'.25' .ds FP.5 \h'.5' .ds FP.75 \h'.75' .ds FP1 \h'1p' .ds FP1.25 \h'1.25p' .ds FP1.5 \h'1.5p' .ds FP1.75 \h'1.75p' .ds FP2 \h'2p' .ds FP2.25 \h'2.25p' .ds FP2.5 \h'2.5p' .ds FP2.75 \h'2.75p' .ds FP3 \h'3p' .ds FP3.25 \h'3.25p' .ds FP3.5 \h'3.5p' .ds FP3.75 \h'3.75p' .ds FP4 \h'4p' .ds FP4.25 \h'4.25p' .ds FP4.5 \h'4.5p' .ds FP4.75 \h'4.75p' .ds FP5 \h'5p' .ds FP5.25 \h'5.25p' .ds FP5.5 \h'5.5p' .ds FP5.75 \h'5.75p' .ds FP6 \h'6p' .ds FP6.25 \h'6.25p' .ds FP6.5 \h'6.5p' .ds FP6.75 \h'6.75p' .ds FP7 \h'7p' .ds FP7.25 \h'7.25p' .ds FP7.5 \h'7.5p' .ds FP7.75 \h'7.75p' .ds FP8 \h'8p' .ds FP8.25 \h'8.25p' .ds FP8.5 \h'8.5p' .ds FP8.75 \h'8.75p' .ds FP9 \h'9p' .ds FP9.25 \h'9.25p' .ds FP9.5 \h'9.5p' .ds FP9.75 \h'9.75p' .ds FP10 \h'10p' .ds FP10.25 \h'10.25p' .ds FP10.5 \h'10.5p' .ds FP10.75 \h'10.75p' .ds FP11 \h'11p' .ds FP11.25 \h'11.25p' .ds FP11.5 \h'11.5p' .ds FP11.75 \h'11.75p' .ds FP12 \h'12p' .ds FP12.25 \h'12.25p' .ds FP12.5 \h'12.5p' .ds FP12.75 \h'12.75p' \# \# WHOLE LINE (TRACK) KERNING \# -------------------------- \# *Argument: \# \# *Function: \# Invokes .tkf (track kerning) for the current font with \# 1 as both the upper and lower point size limits, so that \# the value entered by the user applies regardless of point \# size. RW ("Reduce Whitespace") reduces the amount of space \# between all characters by an equal amount. EW ("Extra \# Whitespace") increases the amount of space. \# *Notes: \# Decimal values are acceptable. \# \# A value of 1 will produce an unacceptably tight or loose line \# at most text point sizes; therefore, effective use of RW and \# EW is in the fractional range below 1. \# \# \n[.f] holds the current font number, which is acceptable to .tkf. \# \# RW and EW must be reset to 0 to cancel their effect on subsequent \# output lines. \# .MAC RW END . if \\n[#BR_AT_LINE_KERN] \{\ . ie \\n[#JUSTIFY]=1 .brp . el .br . \} . rr #EW . rm $EW . nr #RW 1 . ds $RW \\$1 . tkf \\n[.f] 1 -\\$1 1 -\\$1 .END \# .MAC EW END . if \\n[#BR_AT_LINE_KERN] \{\ . ie \\n[#JUSTIFY]=1 .brp . el .br . \} . rr #RW . rm $RW . nr #EW 1 . ds $EW \\$1 . tkf \\n[.f] 1 \\$1 1 \\$1 .END \# \# BREAK AT LINE KERN \# ------------------ \# *Arguments: \# toggle \# *Function: \# Enables/disables .br's before .RW and .EW \# *Notes: \# Mostly, users will want .br's before any kind of line kerning, but \# there may be cases where they don't. BR_BEFORE_LINE_KERN is off by \# default and must be invoked explicitly. \# .MAC BR_AT_LINE_KERN END . ie '\\$1'' .nr #BR_AT_LINE_KERN 1 . el .rr #BR_AT_LINE_KERN .END \# \# ===================================================================== \# \# +++HYPHENATION+++ \# \# AUTO HYPHENATION \# ---------------- \# *Arguments: \# | | DEFAULT \# or \# LINES | MARGIN | SPACE \# *Function: \# Turns auto hyphenation on or off, resets the hyphenation style \# to default, or permits the setting of various hyphenation \# parameters. \# *Notes: \# HY, by itself, defaults to .hy 14, i.e. no hyphens after the \# first two or before the last two characters of a word, and no \# hyphenation of the last line prior to a trap (e.g., at the \# bottom of a page). \# \# HY DEFAULT resets the hyphenation style to .hy 14 (see \# above) if that behaviour is desired after changes have been \# made to LINES, MARGIN, or SPACE. \# \# HY LINES sets the number of allowable consecutive hyphenated lines. \# \# HY MARGIN sets the amount of space (ipPcm) allowed at the end \# of a line in QUAD mode before hyphenation is tripped (e.g. if there's \# only 6 points left, groff won't try to hyphenate the next word). \# \# HY SPACE sets the amount of extra interword space (ipPcm) that can \# be added in JUSTIFY mode to prevent a line from being hyphenated. \# .MAC HY END . ie '\\$1'' \{\ . hy 14 . nr #HYPHENATE 1 . \} . el \{\ . if !'\\$1'LINES' \{\ . nh . nr #HYPHENATE 0 . \} . if !'\\$1'MARGIN' \{\ . nh . nr #HYPHENATE 0 . \} . if !'\\$1'SPACE' \{\ . nh . nr #HYPHENATE 0 . \} . if !'\\$1'DEFAULT' \{\ . nh . nr #HYPHENATE 0 . \} . if '\\$1'LINES' .hlm \\$2 . if '\\$1'MARGIN' .hym \\$2 . if '\\$1'SPACE' .hys \\$2 . if '\\$1'DEFAULT' \{\ . hlm -1 . hym 0 . hys 0 . \} . \} .END \# \# HYPHENATION PARAMETERS \# ---------------------- \# *Arguments: \# <# of lines> | | \# *Function: \# Allows user to specify .HY LINES, MARGIN, and SPACE with a single command. \# .MAC HY_SET END . nr #HY_SET 1 . hlm \\$1 . hym \\$2 . hys \\$3 .END \# \# ===================================================================== \# \# +++VERTICAL SPACING+++ \# \# ADVANCE LEAD \# ------------ \# *Argument: \# \# *Function: \# Creates or modifies register #ALD. Adds user supplied lead \# below current baseline. \# *Notes: \# Requires a unit of measure. \# .MAC ALD END . br . if \\n[nl]=0 .nr #TOP 1 . if '\\$0'ALD' \{\ . nr #ALD (\\$1) . sp \\n[#ALD]u . \} . if '\\$0'ADD_SPACE' \{\ . vpt 0 . nr #ALD (\\$1) . rs . nop \& . sp |\\n[#T_MARGIN]u-1v+\\n[#ALD]u . rr @TOP . nr #SPACE_ADDED 1 . vpt . \} . if '\\$0'SPACE' .sp \\$1 . if '\\$0'SP' .sp \\$1 .END \# \# REVERSE LEAD \# ------------ \# *Argument: \# \# *Function: \# Creates or modifies register #RLD. Reverses user supplied \# lead above current baseline. \# *Notes: \# Requires a unit of measure. \# .MAC RLD END . br . nr #RLD (\\$1) . sp -\\n[#RLD]u .END \# \# ALD/RLD STRINGS \# --------------- \# The strings \*[ALD.25]...\*[ALD12.75] and their corresponding \# \*[RLD] forms have been left in for backward compatibility with \# documents created using mom-1.1.3c or earlier. The preferred methods \# of advancing and reversing on the page inline are \*[UP ] \# and \*[DOWN ]. \# .ds DOWN \v'\\$1' .ds UP \v'-\\$1' \# .ds ALD.25 \v'.25p' .ds ALD.5 \v'.5p' .ds ALD.75 \v'.75p' .ds ALD1 \v'1p' .ds ALD1.25 \v'1.25p' .ds ALD1.5 \v'1.5p' .ds ALD1.75 \v'1.75p' .ds ALD2 \v'2p' .ds ALD2.25 \v'2.25p' .ds ALD2.5 \v'2.5p' .ds ALD2.75 \v'2.75p' .ds ALD3 \v'3p' .ds ALD3.25 \v'3.25p' .ds ALD3.5 \v'3.5p' .ds ALD3.75 \v'3.75p' .ds ALD4 \v'4p' .ds ALD4.25 \v'4.25p' .ds ALD4.5 \v'4.5p' .ds ALD4.75 \v'4.75p' .ds ALD5 \v'5p' .ds ALD5.25 \v'5.25p' .ds ALD5.5 \v'5.5p' .ds ALD5.75 \v'5.75p' .ds ALD6 \v'6p' .ds ALD6.25 \v'6.25p' .ds ALD6.5 \v'6.5p' .ds ALD6.75 \v'6.75p' .ds ALD7 \v'7p' .ds ALD7.25 \v'7.25p' .ds ALD7.5 \v'7.5p' .ds ALD7.75 \v'7.75p' .ds ALD8 \v'8p' .ds ALD8.25 \v'8.25p' .ds ALD8.5 \v'8.5p' .ds ALD8.75 \v'8.75p' .ds ALD9 \v'9p' .ds ALD9.25 \v'9.25p' .ds ALD9.5 \v'9.5p' .ds ALD9.75 \v'9.75p' .ds ALD10 \v'10p' .ds ALD10.25 \v'10.25p' .ds ALD10.5 \v'10.5p' .ds ALD10.75 \v'10.75p' .ds ALD11 \v'11p' .ds ALD11.25 \v'11.25p' .ds ALD11.5 \v'11.5p' .ds ALD11.75 \v'11.75p' .ds ALD12 \v'12p' .ds ALD12.25 \v'12.5p' .ds ALD12.5 \v'12.5p' .ds ALD12.75 \v'12.75p' \# .ds RLD.25 \v'-.25p' .ds RLD.5 \v'-.5p' .ds RLD.75 \v'-.75p' .ds RLD1 \v'-1p' .ds RLD1.25 \v'-1.25p' .ds RLD1.5 \v'-1.5p' .ds RLD1.75 \v'-1.75p' .ds RLD2 \v'-2p' .ds RLD2.25 \v'-2.25p' .ds RLD2.5 \v'-2.5p' .ds RLD2.75 \v'-2.75p' .ds RLD3 \v'-3p' .ds RLD3.25 \v'-3.25p' .ds RLD3.5 \v'-3.5p' .ds RLD3.75 \v'-3.75p' .ds RLD4 \v'-4p' .ds RLD4.25 \v'-4.25p' .ds RLD4.5 \v'-4.5p' .ds RLD4.75 \v'-4.75p' .ds RLD5 \v'-5p' .ds RLD5.25 \v'-5.25p' .ds RLD5.5 \v'-5.5p' .ds RLD5.75 \v'-5.75p' .ds RLD6 \v'-6p' .ds RLD6.25 \v'-6.25p' .ds RLD6.5 \v'-6.5p' .ds RLD6.75 \v'-6.75p' .ds RLD7 \v'-7p' .ds RLD7.25 \v'-7.25p' .ds RLD7.5 \v'-7.5p' .ds RLD7.75 \v'-7.75p' .ds RLD8 \v'-8p' .ds RLD8.25 \v'-8.25p' .ds RLD8.5 \v'-8.5p' .ds RLD8.75 \v'-8.75p' .ds RLD9 \v'-9p' .ds RLD9.25 \v'-9.25p' .ds RLD9.5 \v'-9.5p' .ds RLD9.75 \v'-9.75p' .ds RLD10 \v'-10p' .ds RLD10.25 \v'-10.25p' .ds RLD10.5 \v'-10.5p' .ds RLD10.75 \v'-10.75p' .ds RLD11 \v'-11p' .ds RLD11.25 \v'-11.25p' .ds RLD11.5 \v'-11.5p' .ds RLD11.75 \v'-11.75p' .ds RLD12 \v'-12p' .ds RLD12.25 \v'-12.5p' .ds RLD12.5 \v'-12.5p' .ds RLD12.75 \v'-12.75p' \# \# ===================================================================== \# \# +++REFINEMENTS+++ \# \# AUTOMATIC LIGATURES \# ------------------- \# *Arguments: \# | \# *Function: \# Turns automatic ligature generation on or off. \# *Notes: \# Ligatures may be supplied manually with \[fi], \[fl], etc. \# .MAC LIGATURES END . ie '\\$1'' \{\ . lg . nr #LIGATURES 1 . \} . el \{\ . lg 0 . nr #LIGATURES 0 . \} .END \# \# SMARTQUOTES \# ----------- \# *Arguments: \# [ ,, ] | [ << ] | [ >> ] | \# or \# [ DA | DE | EN | ES | FR | IT | NL | NO | PT | SV ] | \# *Function: \# Turns smartquotes on (optionally with a quoting style from the \# argument list, or off). \# If no quoting style is given, then EN (English) is used by default. \# If no quoting style is given and smart quotes have been turned off \# previously, the old quoting style will be restored. \# *Notes: \# The " character is read outside the macro when mom is \# processed. The strings for open/close ($QUOTE) are then \# defined in the macro. \# .char " \\*[$QUOTE\\n[#OPEN_CLOSE]]\R'#OPEN_CLOSE (1-\\n[#OPEN_CLOSE])' .nr #SQ_ON 0 \# .MAC SMARTQUOTES END .\" First " will be translated to $QUOTE0 . nr #OPEN_CLOSE 0 . if '\\$1'' \{\ . if !'\\*[$RESTORE_SQ]'' \{\ . SMARTQUOTES \\*[$RESTORE_SQ] . return . \} .\" Default smart quotes (English) . ds $QUOTE0 \[lq] . ds $QUOTE1 \[rq] . ds $RESTORE_SQ EN . nr #SQ_ON 1 . return . \} . if '\\$1',,' \{\ . ds $QUOTE0 \[Bq] . ds $QUOTE1 \[lq] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'<<' \{\ . ds $QUOTE0 \[Fo] . ds $QUOTE1 \[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'>>' \{\ . ds $QUOTE0 \[Fc] . ds $QUOTE1 \[Fo] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'DA' \{\ . ds $QUOTE0 \[Fc] . ds $QUOTE1 \[Fo] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'DE' \{\ . ds $QUOTE0 \[Bq] . ds $QUOTE1 \[lq] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'EN' \{\ . ds $QUOTE0 \[lq] . ds $QUOTE1 \[rq] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'ES' \{\ . ds $QUOTE0 \[lq] . ds $QUOTE1 \[rq] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'FR' \{\ . ds $QUOTE0 \[Fo]\| . ds $QUOTE1 \|\[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'IT' \{\ . ds $QUOTE0 \[Fo]\| . ds $QUOTE1 \|\[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'NL' \{\ . ds $QUOTE0 \[rq] . ds $QUOTE1 \[rq] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'NO' \{\ . ds $QUOTE0 \[Fo] . ds $QUOTE1 \[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'PT' \{\ . ds $QUOTE0 \[Fo] . ds $QUOTE1 \[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'SV' \{\ . ds $QUOTE0 \[Fc] . ds $QUOTE1 \[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} .\" None of the above -> turn smartquotes off . ds $QUOTE0 \[dq] . ds $QUOTE1 \[dq] . nr #SQ_ON 0 .END \# .ds $QUOTE0 \[lq] .ds $QUOTE1 \[rq] \# \# Strings for foot and inch marks \# .ds FOOT \[fm] .ds INCH \[fm]\[fm] \# \# ===================================================================== \# \# +++LINE BREAKS+++ \# \# NO-SPACE BREAK \# -------------- \# *Argument: \# \# *Function: \# Breaks a line without advancing. \# *Notes: \# EL is the mnemonic used on older, dedicated typesetting machines \# to indicate "process the line, without advancing the galley \# medium." It stands for End Line. \# \# The \c inline must be appended to the end of input lines when in \# nofill mode; in fill modes, the \c inline must not be used. \# .MAC EL END . TRAP OFF . if \\n[#PSEUDO_FILL]=1 \& . br . sp -1v . TRAP .END \# \# An inline escape to accomplish the same thing. \# Preferable, since it works with filled and non-filled copy and \# doesn't require the user to remember whether to use (or not use) \# \c. \# .ds B \h'|0'\R'#NO_ADVANCE 1'\c \# \# ===================================================================== \# \# +++FILLING/QUADDING/JUSTIFYING+++ \# \# JUSTIFY \# ------- \# *Argument: \# \# *Function: \# Turns fill on and sets .ad to b. \# *Notes: \# Justifies text left and right. \# .MAC JUSTIFY END . if \\n[#TAB_ACTIVE]=0 \{\ . nr #QUAD 1 . ds $RESTORE_QUAD_VALUE \\*[$QUAD_VALUE] . \} ' ce 0 . QUAD J . if \\n[#PRINT_STYLE]=1 .QUAD L . nr #PSEUDO_FILL 0 .END \# \# QUAD \# ---- \# *Arguments: \# L | LEFT | R | RIGHT | C | CENTER/CENTRE \# *Function: \# Turns fill on and sets .ad to l, r, or c. \# *Notes: \# Terminology is a problem here. Some people call quad left \# left justified, flush left, or flush left/rag right (and the \# reverse for quad right). Quad center is sometimes called rag \# both. For our purposes, all "quad" modes mean that groff fill \# mode is enabled. \# .MAC QUAD END . ds $QUAD_VALUE \\$1 . if \\n[#TAB_ACTIVE]=0 \{\ . nr #QUAD 1 . ds $RESTORE_QUAD_VALUE \\*[$QUAD_VALUE] . \} ' ce 0 ' fi . if '\\*[$QUAD_VALUE]'L' \{\ . nr #JUSTIFY 0 . ad l . \} . if '\\*[$QUAD_VALUE]'LEFT' \{\ . nr #JUSTIFY 0 . ad l . \} . if '\\*[$QUAD_VALUE]'R' \{\ . nr #JUSTIFY 0 . ad r . \} . if '\\*[$QUAD_VALUE]'RIGHT' \{\ . nr #JUSTIFY 0 . ad r . \} . if '\\*[$QUAD_VALUE]'C' \{\ . nr #JUSTIFY 0 . ad c . \} . if '\\*[$QUAD_VALUE]'CENTER' \{\ . nr #JUSTIFY 0 . ad c . \} . if '\\*[$QUAD_VALUE]'CENTRE' \{\ . nr #JUSTIFY 0 . ad c . \} . if '\\*[$QUAD_VALUE]'J' \{\ . nr #JUSTIFY 1 . ad b . \} . if '\\*[$QUAD_VALUE]'JUSTIFY' \{\ . nr #JUSTIFY 1 . ad b . \} . nr #PSEUDO_FILL 0 .END \# \# LEFT, RIGHT, AND CENTER \# ----------------------- \# The purpose of these macros is to allow the user to enter lines \# of text that will be quadded LRC having to stick .BR or .br \# between lines. For the sake of consistency, all three appear to \# behave similarly (from the point of view of the user), although \# the underlying primitives don't. For this reason, LEFT, RIGHT, \# and CENTER must be followed by .QUAD [L R C J] or .JUSTIFY to \# restore text to fill mode. \# \# LEFT \# ---- \# *Argument: \# \# *Function: \# Turns fill mode off. Allows user to quad lines left without \# requiring the .BR or .br macro. \# *Notes: \# LEFT simply turns fill off. Lines that exceed the current LL \# will not be broken. Note that this behaviour differs from the \# RIGHT and CENTER macros. \# .MAC LEFT END . if \\n[#TAB_ACTIVE]=0 \{\ . rr #QUAD . ds $RESTORE_QUAD_VALUE LEFT . \} . ce 0 . nf . nr #PSEUDO_FILL 1 .\" Fix for a little conflict with DOCTYPE LETTER . if '\\n[.z]'LETTERHEAD1' .rr #DATE_FIRST .END \# \# RIGHT \# ----- \# *Argument: \# \# *Function: \# Turns fill on. Allows user to quad lines right without \# requiring the .BR or .br macro. \# *Notes: \# Lines that exceed the current LL will be broken, with the excess \# text quadded right. \# .MAC RIGHT END . if \\n[#TAB_ACTIVE]=0 \{\ . rr #QUAD . ds $RESTORE_QUAD_VALUE RIGHT . \} . nf . rj 100000 . nr #PSEUDO_FILL 1 .END \# \# CENTER \# ------ \# *Argument: \# \# *Function: \# Turns fill on. Allows user to center lines without \# requiring the .BR or .br macro. \# *Notes: \# Lines that exceed the current LL will be broken, with the excess \# text centered. \# .MAC CENTER END . if \\n[#TAB_ACTIVE]=0 \{\ . rr #QUAD . ds $RESTORE_QUAD_VALUE CENTER . \} . nf . ce 100000 . nr #PSEUDO_FILL 1 .END \# \# ===================================================================== \# \# +++TABS+++ \# \# There are two different kinds of tabs: typesetting tabs and \# string tabs. \# \# Typesetting tabs are set with TAB_SET, which requires a tab number, \# an indent (offset) from the left margin and a length (optionally \# with a quad direction and an instruction to fill lines). After tabs \# are set with TAB_SET, they are called with .TAB n, where "n" \# corresponds to the number passed to TAB_SET as a valid tab number. \# \# String tabs allow the user to mark off tab positions inline. Tab \# indents and lengths are calculated from the beginning and end \# positions of the marks. Up to 19 string tabs may be created, \# numbered 1-19. Once created, they are called with .TAB n, \# just like typesetting tabs. \# \# Setting up string tabs is a two-step procedure. First, the user \# enters an input line in which s/he wants to mark off string tabs. \# The beginning of a tab is marked with \*[STn], where "n" is \# the desired number of the tab. The end of the the tab is marked \# with \*[STnX]. All ST's must have a matching STX. String tabs \# may be nested. \# \# Next, the user invokes .ST n for every string tab defined, and \# optionally passes quad information to it. That done, string tabs \# can be called just like typesetting tabs. \# \# Strings for string tab inlines \# ------------------------------ \# Initialize string tab markers numbered 1 to 19. \# .nr #LOOP 0 1 .while \n+[#LOOP]<20 \{\ . ds ST\n[#LOOP] \Ek[#ST\n[#LOOP]_OFFSET] .\} \# .nr #LOOP 0 1 .while \n+[#LOOP]<20 \{\ . ds ST\n[#LOOP]X \Ek[#ST\n[#LOOP]_MARK] .\} .rr #LOOP \# \# These are reserved ST numbers for internal use .ds ST100 \Ek[#ST100_OFFSET] .ds ST100X \Ek[#ST100_MARK] .ds ST101 \Ek[#ST101_OFFSET] .ds ST101X \Ek[#ST101_MARK] \# \# QUAD AND SET STRING TABS \# ------------------------ \# *Arguments: \# L | R | C | J [QUAD] \# *Function: \# Creates strings $ST<#>_QUAD_DIR and $ST<#>_FILL, then sets up a \# tab based on the collected information. \# *Notes: \# Like TAB_SET, ST invoked without a quad direction will default to LEFT. \# If lines should be filled and quadded, use the optional argument QUAD. \# N.B. -- indents *must* be turned off before setting string tabs \# inside .PAD \# .MAC ST END . ds $ST\\$1_QUAD_DIR \\$2 . if \\n[#NUM_ARGS]=3 .ds $ST\\$1_FILL QUAD . nr #ST\\$1_LENGTH \\n[#ST\\$1_MARK]-\\n[#ST\\$1_OFFSET] . ie \\n[#IN_TAB] \ . TAB_SET \\$1 \\n[#ST\\$1_OFFSET]u+\\n[#ST_OFFSET]u \ \\n[#ST\\$1_LENGTH]u \\*[$ST\\$1_QUAD_DIR] \\*[$ST\\$1_FILL] . el \ . TAB_SET \\$1 \\n[#ST\\$1_OFFSET]u \\n[#ST\\$1_LENGTH]u \ \\*[$ST\\$1_QUAD_DIR] \\*[$ST\\$1_FILL] .END \# \# TAB SET \# ------- \# *Arguments: \# ident(ipPcm) length(ipPcm) [L | R | C | J [QUAD]] \# *Function: \# Creates macros TABn and TAB n, where "n" is any arbitrary number. \# TABn is a typesetting tab (i.e. a tab defined as an indent \# from the page left offset plus a line length.) \# *Notes: \# n = arbitrary digit to identify the tab \# indent = indent from left margin; unit of measure required \# length = length of tab (unit of measure required; can be \# \w''u--if more than one word in string, surround \# with double quotes "\w''" \# LRCJ = quad for tab (left, right, center, justified) \# If option QUAD afterwards is not given, quad is line for line \# (no fill mode), meaning that there's no need for .BR or .br \# between lines. \# QUAD = fill tab (so it behaves as if .QUAD LRC or .JUSTIFY \# had been given). \# \# N.B. -- indents *must* be turned off before setting tabs \# \# Tabs are not columnar in behaviour. .TN and \*[TB+] permit \# bottom-line to bottom-line tab movement. \# \# When resetting tabs, .TQ must be invoked before .TAB_SET. \# \# Indents are turned off automatically whenever a new tab is called \# with TAB . \# \# Generally, it's a good idea to make sure all indents are off \# before setting tabs. \# .MAC TAB_SET END . br . nr #TAB_NUMBER \\$1 . ds $CURRENT_TAB \\n[#TAB_NUMBER] . nr #TAB_OFFSET (\\$2) . nr #TAB_LENGTH (\\$3) . MAC TAB\\n[#TAB_NUMBER] . if !\\\\n[#TB+]=1 .br . if \\\\n[#TB+]=1 \{\ . EL . vpt 0 . rr #TB+ . \} . in 0 . nr #TAB_ACTIVE 1 . nr #CURRENT_TAB \\n[#TAB_NUMBER] . ds $CURRENT_TAB \\*[$CURRENT_TAB] . nr #TAB_OFFSET\\*[$CURRENT_TAB] \\n[#TAB_OFFSET] . nr #ST_OFFSET \\n[#TAB_OFFSET] . ie !'\\\\n[.z]'' \ \!. po \\\\n[#L_MARGIN]u+\\\\n[#TAB_OFFSET\\\\*[$CURRENT_TAB]]u . el \ . po \\\\n[#L_MARGIN]u+\\\\n[#TAB_OFFSET\\\\*[$CURRENT_TAB]]u . ll \\n[#TAB_LENGTH]u . ta \En[.l]u . ie '\\$5'QUAD' \{\ . if '\\$4'L' .QUAD L . if '\\$4'R' .QUAD R . if '\\$4'C' .QUAD C . if '\\$4'J' .JUSTIFY . \} . el \{\ . if '\\$4'' .LEFT . if '\\$4'L' .LEFT . if '\\$4'R' .RIGHT . if '\\$4'C' .CENTER . if '\\$4'J' .JUSTIFY . \} . if \\\\n[#TN]=1 \{\ . TRAP . rr #TN . \} .. . rr #TAB_ACTIVE .END \# \# TAB \# --- \# *Arguments: \# \# *Function: \# Moves to tab number passed as an argument. \# .MAC TAB END . ds $TAB_NUMBER \\$1 . TAB\\*[$TAB_NUMBER] . nr #IN_TAB 1 .END \# \# TAB NEXT \# -------- \# *Argument: \# \# *Function: \# Automagically moves to TAB on the same line as the last \# line of the previous tab. \# *Notes: \# The \c inline must be appended to the end of input lines when in \# nofill mode; in fill modes, the \c inline must not be used. \# .MAC TN END . nr #TN 1 . TRAP OFF . sp -1v . nr #NEXT_TAB \\n[#CURRENT_TAB]+1 . TAB\\n[#NEXT_TAB] . TRAP .END \# \# An inline escape to accomplish the same thing. Preferable, since \# it works with filled and non-filled copy and doesn't require the \# user to remember to use (or not use) the \c. \# .ds TB+ \ "\c\R'#TB+ 1'\R'#TN 1'\R'#NEXT_TAB \\n[#CURRENT_TAB]+1'\\*[TAB\\n[#NEXT_TAB]]\c \# \# TAB QUIT \# -------- \# *Argument: \# \# *Function: \# Sets #TAB_ACTIVE to "0" (off). \# Resets left margin to value in effect prior to tabs. \# Resets line length to value in effect prior to tabs. \# Checks #QUAD to see if we were in flush or quad mode \# prior to tabs (0=off, 1=on). \# Resets QUAD [ L|R|C ], LEFT, RIGHT, CENTER, or JUSTIFY \# in effect prior to tabs. \# *Notes: \# TQ must precede setting new tabs to get the tabs' indents \# measured from page left. Otherwise, the tabs' indents are \# measured from the left margin of the currently active tab. \# .MAC TQ END . br . rr #TAB_ACTIVE . rr #IN_TAB . nr #LOOP 0 1 . while \\n+[#LOOP]<20 \{\ . rm $ST\\n[#LOOP]_FILL . \} . rr #LOOP . po \\n[#L_MARGIN]u . ll \\n[#L_LENGTH]u . ta \\n[.l]u . ie \\n[#QUAD] \{\ . ie '\\*[$RESTORE_QUAD_VALUE]'J' .JUSTIFY . el .QUAD \\*[$RESTORE_QUAD_VALUE] . \} . el \{\ . if '\\*[$RESTORE_QUAD_VALUE]'LEFT' .LEFT . if '\\*[$RESTORE_QUAD_VALUE]'RIGHT' .RIGHT . if '\\*[$RESTORE_QUAD_VALUE]'CENTER' .CENTER . \} .END \# \# ==================================================================== \# \# COLOR HANDLING \# ============== \# \# COLOR \# ----- \# *Arguments: \# \# *Function: \# Allows the inline escape for setting color to be called \# as a macro. \# .MAC COLOR END . ie \\n[.u]=1 \{\ \c \\*[\\$1]\c . \} . el \\*[\\$1] .END \# \# NEWCOLOR \# -------- \# *Arguments: \# [] \# *Function: \# Based on .defcolor, allows users to name and define colors using \# one of the four color schemes rgb, cmy, cmyk and grey. The new \# color is then defined as a string so that it can be called inline \# with \*[COLORNAME] or with .COLOR. \# *Notes: \# With only two args, the default color scheme is rgb. \# \# It is highly recommended that users define new colors as \# all-cap strings, to differentiate them from x colors, which must \# be in lower case. \# .MAC NEWCOLOR END . if \\n[#NUM_ARGS]=2 .defcolor \\$1 rgb \\$2 . if \\n[#NUM_ARGS]=3 \{\ . if '\\$2'RGB' .ds $COLOR_SCHEME rgb . if '\\$2'CYM' .ds $COLOR_SCHEME cym . if '\\$2'CMYK' .ds $COLOR_SCHEME cmyk . if '\\$2'GRAY' .ds $COLOR_SCHEME gray . if '\\$2'GREY' .ds $COLOR_SCHEME gray . defcolor \\$1 \\*[$COLOR_SCHEME] \\$3 . \} . ds \\$1 \\m[\\$1] .END \# \# XCOLOR \# ------ \# *Arguments: \# [] \# *Function: \# Defines a string of x color name (i.e. a predefined x \# color). If is given, creates a string of \# that references the x color name of the first argument. \# *Notes: \# The color name must be a valid color name from rgb.txt, and \# must be given entirely in lower case, all one word. \# .MAC XCOLOR END . ds \\$1 \m[\\$1] . if \\n[#NUM_ARGS]=2 \{\ . ds \\$2 \m[\\$1] . ds $\\$2_FILL \\$1 . ds COLAL_\\$2 \\$1 . \} .END \# \# Pre-define xcolors black and white \# .ds black \m[black] .ds BLACK \m[black] .ds white \m[white] .ds WHITE \m[WHITE] \# \# ===================================================================== \# \# +++MISCELLANEOUS USEFUL MACROS AND STRINGS+++ \# \# UNDERLINE \# --------- \# *Arguments: \# | \# *Function: \# Simulates typewriter-style underlining of italic passages. \# *Notes: \# Defaults for rule weight and distance from baseline are below. \# UNDERLINE_SPECS lets user change them \# .nr _w 500 .nr _d 1250 \# .MAC UNDERLINE_SPECS END . ie \B'\\$1' .nr _w (u;\\$1) . el \{\ . ie '\\$1'DEFAULT' .nr _w 500 . el \{\ . nr _w 500 . tm1 "[mom]: The first argument to \\$0 must be a numeric . tm1 " argument with a unit of measure appended, or DEFAULT. . tm1 " Setting underline weight to DEFAULT. . \} . \} . shift . ie \B'\\$1' .nr _d (u;\\$1) . el \{\ . ie '\\$1'DEFAULT' .nr _d 1250 . el \{\ . nr _d 1250 . tm1 "[mom]: The second argument to \\$0 must be a numeric . tm1 " argument with a unit of measure appended, or DEFAULT. . tm1 " Setting underline distance from baseline to DEFAULT. . \} . \} .END \# .MAC UNDERLINE END \c . ds $SAVED_SS_VAR \\*[$SS_VAR] . ie '\\$1'' \{\ . nr #UNDERLINE_ON 1 . ss \\n[.ss] (\\n[.ss]-\\n[.ss]) . ie !n .nop \X'ps: exec \\n[_w] \\n[_d] decorline'\c . el .ul 1000 . \} . el \{\ . nr #UNDERLINE_ON 0 . SS \\*[$SAVED_SS_VAR] . ie !n .nop \X'ps: exec decornone'\c . el .ul 0 . \} .END \# \# UL/ULX \# ------ \# *Arguments: \# \# *Function: \# Simulates typewriter-style underlining of italic passages. \# *Notes: \# Intended to be called with inline escapes \*[UL] (underline \# on) and \*[ULX] (underline off). \# .MAC UL END \c . ds $SAVED_SS_VAR \\*[$SS_VAR] . ss \\n[.ss] (\\n[.ss]-\\n[.ss]) . ie !'\\n[.z]'' \{\ \c . ie !n \{\ . if !\\n[.k]=0 \?\h'-\w'\\n[.ss]'u'\? \?\R'#UNDERLINE_ON 1'\X'ps: exec \\n[_w] \\n[_d] decorline'\?\c . \} . el \{\ \?\R'#UNDERLINE_ON 1'\?\c . ul 1000 . \} . \} . el \{\ . ie !n \{\ . nr #UNDERLINE_ON 1 . nop \X'ps: exec \\n[_w] \\n[_d] decorline'\c . \} . el \{\ \R'#UNDERLINE_ON 1'\c . ul 1000 . \} . \} .END \# .MAC ULX END \c . SS \\*[$SAVED_SS_VAR] . rm $SAVED_SS_VAR . ie !'\\n[.z]'' \{\ \c . ie !n \{\ \?\R'#UNDERLINE_ON 0'\X'ps: exec decornone'\?\c . \} . el \{\ \?\R'#UNDERLINE_ON 0'\?\c . ul 0 . \} . \} . el \{\ . ie !n \{\ . nr #UNDERLINE_ON 0 . nop \X'ps: exec decornone'\c . \} . el \{\ . nr #UNDERLINE_ON 0 . ul 0 . \} . \} .END \# \# UNDERSCORE \# ---------- \# *Arguments: \# [] "text" \# *Function: \# Places an underscore 2 points under the string if no lead given, \# otherwise places underscore under string by user specified amount. \# *Notes: \# When using this macro, the string to be underscored must begin \# with double-quotes ("), regardless of whether it's the sole \# argument or the second. \# E.g.: \# .UNDERSCORE "Text to be underscored \# or \# .UNDERSCORE 2p "Text to be underscored \# \# UNDERSCORE does not work across line breaks. Each line of text \# must be entered separately. If the UNDERSCORE begins in the \# middle of a line and crosses over a break, the portion before \# the break and the portion afterwards must be entered \# separately. \# .MAC UNDERSCORE END . nr #SAVED_UNDERSCORE_WEIGHT \\n[#UNDERSCORE_WEIGHT] . nr #SAVED_UNDERSCORE_WEIGHT_ADJ \\n[#UNDERSCORE_WEIGHT_ADJ] . ds $SAVED_UNDERSCORE_GAP \\*[$UNDERSCORE_GAP] . if \\n[#FROM_BIB_STRING]=1 \{\ . nr #UNDERSCORE_WEIGHT \\n[#BIB_STRING_UNDERLINE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#BIB_STRING_UNDERLINE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$BIB_STRING_UNDERLINE_GAP] . \} . if \\n[#FROM_COVER]=1 \{\ . nr #UNDERSCORE_WEIGHT \\n[#COVER_UNDERLINE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#COVER_UNDERLINE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$COVER_UNDERLINE_GAP] . \} . if \\n[#FROM_DOC_COVER]=1 \{\ . nr #UNDERSCORE_WEIGHT \\n[#DOC_COVER_UNDERLINE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#DOC_COVER_UNDERLINE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$DOC_COVER_UNDERLINE_GAP] . \} . if \\n[#FROM_DOCTYPE]=1 \{\ . nr #UNDERSCORE_WEIGHT \\n[#DOCTYPE_UNDERLINE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#DOCTYPE_UNDERLINE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$DOCTYPE_UNDERLINE_GAP] . \} . if \\n[#FROM_EN_STRING]=1 \{\ . nr #UNDERSCORE_WEIGHT \\n[#EN_STRING_UNDERLINE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#EN_STRING_UNDERLINE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$EN_STRING_UNDERLINE_GAP] . \} . if \\n[#FROM_EN_TITLE]=1 \{\ . nr #UNDERSCORE_WEIGHT \\n[#EN_TITLE_UNDERLINE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#EN_TITLE_UNDERLINE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$EN_TITLE_UNDERLINE_GAP] . \} . ie \\n[#NUM_ARGS]=1 \{\ . nr #TEXT_WIDTH \w'\\$1' \\$1\ \D't \\n[#UNDERSCORE_WEIGHT]'\ \h'-\\n[#TEXT_WIDTH]u-\\n[#UNDERSCORE_WEIGHT]u'\ \v'+(\\*[$UNDERSCORE_GAP])+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \D't \\n[#RULE_WEIGHT]'\ \h'-\\n[#RULE_WEIGHT]u'\ \v'-(\\*[$UNDERSCORE_GAP])-\\n[#UNDERSCORE_WEIGHT_ADJ]u' . \} . el \{\ . nr #TEXT_WIDTH \w'\\$2' \\$2\ \h'-\\n[#TEXT_WIDTH]u-\\n[#UNDERSCORE_WEIGHT]u'\ \v'+(\\$1)+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\ \D't \\n[#UNDERSCORE_WEIGHT]'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \D't \\n[#RULE_WEIGHT]'\ \h'-\\n[#RULE_WEIGHT]u'\ \v'-(\\$1)-\\n[#UNDERSCORE_WEIGHT_ADJ]u' . \} . nr #UNDERSCORE_WEIGHT \\n[#SAVED_UNDERSCORE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#SAVED_UNDERSCORE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$SAVED_UNDERSCORE_GAP] . rr #SAVED_UNDERSCORE_WEIGHT . rr #SAVED_UNDERSCORE_WEIGHT_ADJ . rm $SAVED_UNDERSCORE_GAP .END \# \# DOUBLE UNDERSCORE \# ----------------- \# *Arguments: \# [points below baseline] [points distance between rules] "text" \# *Function: \# Same as UNDERSCORE, except it produces a double underscore. The default \# distance between the rules is 2 points. \# *Notes: \# The same double-quote requirement as UNDERSCORE. \# .MAC UNDERSCORE2 END . nr #SAVED_UNDERSCORE_WEIGHT \\n[#UNDERSCORE_WEIGHT] . nr #SAVED_UNDERSCORE_WEIGHT_ADJ \\n[#UNDERSCORE_WEIGHT_ADJ] . ds $SAVED_UNDERSCORE_GAP \\*[$UNDERSCORE_GAP] . ds $SAVED_RULE_GAP \\*[$RULE_GAP] . if \\n[#NUM_ARGS]=2 \{\ . ds $UNDERSCORE_GAP \\$1 . \} . if \\n[#NUM_ARGS]=3 \{\ . ds $UNDERSCORE_GAP \\$1 . ds $RULE_GAP \\$2 . \} . if \\n[#FROM_BIB_STRING] \{\ . nr #UNDERSCORE_WEIGHT \\n[#BIB_STRING_UNDERLINE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#BIB_STRING_UNDERLINE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$BIB_STRING_UNDERLINE_GAP] . ds $RULE_GAP \\*[$BIB_STRING_RULE_GAP] . \} . if \\n[#FROM_EN_STRING] \{\ . nr #UNDERSCORE_WEIGHT \\n[#EN_STRING_UNDERLINE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#EN_STRING_UNDERLINE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$EN_STRING_UNDERLINE_GAP] . ds $RULE_GAP \\*[$EN_STRING_RULE_GAP] . \} . if \\n[#NUM_ARGS]=1 \{\ . nr #TEXT_WIDTH \w'\\$1' \\$1\ \D't \\n[#UNDERSCORE_WEIGHT]'\ \v'+\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\ \h'-\\n[#TEXT_WIDTH]u-\\n[#UNDERSCORE_WEIGHT]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \v'+\\*[$RULE_GAP]+\\n[#UNDERSCORE_WEIGHT]u'\ \h'-\\n[#TEXT_WIDTH]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \D't \\n[#RULE_WEIGHT]'\ \h'-\\n[#RULE_WEIGHT]u'\ \v'-(\\*[$UNDERSCORE_GAP]+\\*[$RULE_GAP])-(\\n[#UNDERSCORE_WEIGHT]u*2u)' . \} . if \\n[#NUM_ARGS]=2 \{\ . nr #TEXT_WIDTH \w'\\$2' \\$2\ \D't \\n[#UNDERSCORE_WEIGHT]'\ \v'+\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\ \h'-\\n[#TEXT_WIDTH]u-\\n[#UNDERSCORE_WEIGHT]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \v'+(\\*[$RULE_GAP])+\\n[#UNDERSCORE_WEIGHT]u'\ \h'-\\n[#TEXT_WIDTH]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \D't \\n[#RULE_WEIGHT]'\ \h'-\\n[#RULE_WEIGHT]u'\ \v'-(\\*[$UNDERSCORE_GAP]+\\*[$RULE_GAP])+(\\n[#UNDERSCORE_WEIGHT]u*2u)' . \} . if \\n[#NUM_ARGS]=3 \{\ . nr #TEXT_WIDTH \w'\\$3' \\$3\ \D't \\n[#UNDERSCORE_WEIGHT]'\ \v'+\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\ \h'-\\n[#TEXT_WIDTH]u-\\n[#UNDERSCORE_WEIGHT]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \v'+\\*[$RULE_GAP]+\\n[#UNDERSCORE_WEIGHT]u'\ \h'-\\n[#TEXT_WIDTH]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \D't \\n[#RULE_WEIGHT]'\ \h'-\\n[#RULE_WEIGHT]u'\ \v'-(\\*[$UNDERSCORE_GAP]+\\*[$RULE_GAP])-(\\n[#UNDERSCORE_WEIGHT]u*2u)' . \} . nr #UNDERSCORE_WEIGHT \\n[#SAVED_UNDERSCORE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#SAVED_UNDERSCORE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$SAVED_UNDERSCORE_GAP] . rr #SAVED_UNDERSCORE_WEIGHT . rr #SAVED_UNDERSCORE_WEIGHT_ADJ . rm $SAVED_UNDERSCORE_GAP . rm $SAVED_RULE_GAP .END \# \# Default underscoring rule gaps \# .ds $BIB_STRING_UNDERLINE_GAP 2p .ds $BIB_STRING_RULE_GAP 2p .ds $COVER_UNDERLINE_GAP 2p .ds $DOC_COVER_UNDERLINE_GAP 2p .ds $DOCTYPE_UNDERLINE_GAP 2p .ds $EN_STRING_UNDERLINE_GAP 2p .ds $EN_STRING_RULE_GAP 2p .ds $EN_TITLE_UNDERLINE_GAP 2p .ds $RULE_GAP 2p .ds $UNDERSCORE_GAP 2p \# \# SUPERSCRIPT \# ----------- \# *Function: \# Prints everything after inline invocation as superscript. \# *Notes: \# \*[SUP] and \*[SUPX] turn superscript on and off respectively. \# If running type is pseudo-condensed/expanded, invoke the superscript \# strings as \*[CONDSUP] or \*[EXTSUP] and turn off with \*[CONDSUPX] \# and \*[EXTSUPX] respectively. \# \# Default raise/lower amount .ds $SUP_RAISE \v'-.3m' .ds $SUP_LOWER \v'.3m' \# \# SUPERSCRIPT RAISE \# ----------------- \# *Argument: \# \# *Function: \# Defines strings $SUP_RAISE and $SUP_LOWER for use with \*[SUP], \# \*[CONDSUP] and \*[EXTSUP]. \# .MAC SUPERSCRIPT_RAISE_AMOUNT END . ds $SUP_RAISE_AMOUNT \\$1 . ds $SUP_RAISE \v'-\\*[$SUP_RAISE_AMOUNT]' . ds $SUP_LOWER \v'\\*[$SUP_RAISE_AMOUNT]' .END \# .ds SUP \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#SUP_PT_SIZE \En[#PT_SIZE_IN_UNITS]u*6u/10u'\ \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_RAISE]\s[\En[#SUP_PT_SIZE]u] \# .ds SUPX \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_LOWER] \# .ds CONDSUP \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#SUP_PT_SIZE \En[#PT_SIZE_IN_UNITS]u*6u/10u'\ \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_RAISE]\s[\En[#SUP_PT_SIZE]u]\E*[COND_FOR_SUP] \# .ds CONDSUPX \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_LOWER]\E*[COND] \# .ds EXTSUP \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#SUP_PT_SIZE \En[#PT_SIZE_IN_UNITS]u*6u/10u'\ \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_RAISE]\s[\En[#SUP_PT_SIZE]u]\E*[EXT_FOR_SUP] \# .ds EXTSUPX \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_LOWER]\E*[EXT] \# \# SLANT \# ----- \# \# SETSLANT \# -------- \# *Arguments: \# | RESET \# *Function: \# Modifies register #DEGREES for use with \*[SLANT], or resets \# it to the default. Defines string \*[SLANTX] \# *Notes: \# \*[SLANT] permits pseudo-italicizing of a font in cases where \# no italic font exists in a particular family. \# \# Default # of degrees is 15. \# \# Do not use unit of measure with arg to SETSLANT. \# \# It may be necessary to adjust the spacing on either side of \# [SLANT] and [SLANTX]. \# \# In docs, SLANT carries over from para to para. \# .nr #DEGREES 15 .ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' .ds SLANTX \ER'#SLANT_ON 0'\ES'0' \# .MAC SETSLANT END . ie '\\$1'RESET' \{\ . nr #DEGREES 15 . if \\n[#PRINT_STYLE]=1 \ . if \\n[#UNDERLINE_SLANT] .return . ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' . \} . el \{\ . nr #DEGREES \\$1 . if \\n[#PRINT_STYLE]=1 \ . if \\n[#UNDERLINE_SLANT] .return . ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' . \} . ds SLANTX \ER'#SLANT_ON 0'\ES'0' .END \# \# BOLDER \# ------ \# \# SETBOLDER \# --------- \# *Arguments: \# | RESET \# *Function: \# Modifies register #BOLDER_UNITS for use with \*[BOLDER], or resets \# it to the default 700 units. \# *Notes: \# \*[BOLDER] allows pseudo-emboldening of a font where no bold \# font exists in a particular family. \# \# Default for SETBOLDER is 700 units. Do not use unit of measure \# with arg to SETBOLDER. \# .nr #BOLDER_UNITS 700 \# .MAC SETBOLDER END . if \\n[#IGNORE]=1 .return . ie '\\$1'RESET' .nr #BOLDER_UNITS 700 . el .nr #BOLDER_UNITS \\$1 .END \# .MAC BOLDER END \c .bd \\n[.f] \\n[#BOLDER_UNITS] .END \# .MAC BOLDERX END \c .bd \\n[.f] .END \# \# +++CONDENSE/EXTEND+++ \# \# CONDENSE/EXTEND \# --------------- \# *Arguments: \# \# *Function: \# Stores current point size in z's in #PT_SIZE_IN_UNITS, figures out \# new point size (for character width) from arg, and defines string \# COND or EXT, which set the type size to the new character width, \# and sets the height of type to the value stored in CURRENT_PT_SIZE \# *Notes: \# CONDENSE_OR_EXTEND is invoked from the aliases \# CONDENSE and EXTEND. CONDENSE implies <100, EXTEND \# implies >100. Do not use a percent sign in the argument. \# \# There is no default setting for CONDENSE or EXTEND. \# 80 is a good approximation of condensed type, 120 is okay \# for extended. \# \# The value set by CONDENSE or EXTEND applies to all \# subsequent \*[COND] or \*[EXT] escapes until a new value is set. \# \# \*[COND] or \*[EXT] must be turned off before all changes of point \# size and reinvoked afterwards (if so desired). This refers to \# changes of point size via control lines AND with via inlines. \# .MAC CONDENSE_OR_EXTEND END . if '\\$0'CONDENSE' \{\ . ds $COND_PERCENT \\$1 . if \\n[#PRINT_STYLE]=1 \{\ . rm $COND_PERCENT . ds $COND_PERCENT 100 . \} . ds COND \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#CONDENSE 1'\ \R'#COND_WIDTH (\En[#PT_SIZE_IN_UNITS]u*\E*[$COND_PERCENT]u)/100'\ \Es[\En[#COND_WIDTH]u]\EH'\En[#PT_SIZE_IN_UNITS]u' . ds COND_FOR_SUP \ \R'#COND_WIDTH (\En[#SUP_PT_SIZE]u*\E*[$COND_PERCENT]u)/100'\ \Es[\En[#COND_WIDTH]u]\H'\En[#SUP_PT_SIZE]u' . \} . if '\\$0'EXTEND' \{\ . ds $EXT_PERCENT \\$1 . if \\n[#PRINT_STYLE]=1 \{\ . rm $EXT_PERCENT . ds $EXT_PERCENT 100 . \} . ds EXT \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#EXTEND 1'\ \R'#EXT_WIDTH (\En[#PT_SIZE_IN_UNITS]u*\E*[$EXT_PERCENT]u)/100'\ \Es[\En[#EXT_WIDTH]u]\EH'\En[#PT_SIZE_IN_UNITS]u' . ds EXT_FOR_SUP \ \R'#EXT_WIDTH (\En[#SUP_PT_SIZE]u*\E*[$EXT_PERCENT]u)/100'\ \Es[\En[#EXT_WIDTH]u]\H'\En[#EXT_PT_SIZE]u' . \} .END \# .ds CONDX \ \ER'#CONDENSE 0'\Es[0]\R'#PT_SIZE_IN_UNITS \En[.ps]'\H'\En[#PT_SIZE_IN_UNITS]u' .ds EXTX \ \ER'#EXTEND 0'\Es[0]\R'#PT_SIZE_IN_UNITS \En[.ps]'\H'\En[#PT_SIZE_IN_UNITS]u' \# \# +++PAD LINES+++ (insert space) \# \# PAD MARKER \# ---------- \# *Arguments: \# \# *Function: \# Defines string $PAD_MARKER, used in PAD \# *Notes: \# $PAD_MARKER is normally # (the pound sign). \# .MAC PAD_MARKER END . ds $PAD_MARKER \\$1 .END \# \# PAD \# --- \# *Argments: \# "" \# "" \# *Function: \# Defines and redefines padding character (default=pound sign \# unless padding character has been set with PAD_MARKER) \# several times so that when the string is output at the end \# of the macro, every # has been converted to an equal-sized \# amount of padding (blank space) on a line. \# *Notes: \# String tabs may be marked off during PAD. \# .MAC PAD END . if \\n[.u]=1 .nr #FILL_MODE 1 . nf . if !d$PAD_MARKER .ds $PAD_MARKER # . char \\*[$PAD_MARKER] \R'#PAD_COUNT \En[#PAD_COUNT]+1' . ds $FAMILY_FOR_PAD \\n[.fam] .\" .if !n .fp \\n[.fp] \\n[.sty] . ds $FONT_FOR_PAD \\n[.sty] . nr #SIZE_FOR_PAD \\n[.ps] . ds $PAD_STRING \\$1 . as $PAD_STRING \Ekp . di PAD_STRING . fam \\*[$FAMILY_FOR_PAD] \\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] . br . di . char \\*[$PAD_MARKER] \ \R'#SPACE_TO_END \En[.l]-\En[p]'\R'#PAD_SPACE \En[#SPACE_TO_END]/\En[#PAD_COUNT]' . di PAD_STRING . fam \\*[$FAMILY_FOR_PAD] \\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] . br . di . char \\*[$PAD_MARKER] \h'\En[#PAD_SPACE]u' . if \\n[#SILENT] .SILENT . fam \\*[$FAMILY_FOR_PAD] \\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u] . ie '\\$2'' .nop \\*[$PAD_STRING] . el \{\ . ie !'\\$2'NOBREAK' .pdfhref L -D "\\$2" -E -- \&\\*[$PAD_STRING] . el .nop \\*[$PAD_STRING] . \} . if \\n[#SILENT] .SILENT OFF . br . if \\n[#FILL_MODE]=1 \{\ . fi . rr #FILL_MODE . \} . rr #PAD_COUNT . rr #SPACE_TO_END . rr #PAD_SPACE . rm $PAD_STRING . rm PAD_STRING . rchar # . if '\\$2'NOBREAK' \{\ . TRAP OFF . EOL . TRAP . \} .END \# \# +++LEADERS+++ \# \# The leader mechanism is primitive, but it works. Basically, every \# macro in this set that includes a line length also sets a single \# groff tab stop at the right hand end of the line. That way, \# whenever Ctrl-A is invoked (always at the end of an input line), \# leader of the correct length gets deposited. Ctrl-A is accessed by \# the string LEADER (i.e. inline, as \*[LEADER]). Leaders within tabs \# get their length from the tab line length. \# \# SET LEADER CHARACTER \# -------------------- \# *Arguments: \# \# *Function: \# Set leader character. \# .MAC LEADER_CHARACTER END . lc \\$1 .END \# .ds LEADER  \# \# +++DROP CAPS+++ \# \# DROP CAP FAMILY \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies string $DC_FAM. \# .MAC DROPCAP_FAMILY END . ds $DC_FAM \\$1 .END \# \# DROP CAP FONT \# ------------- \# *Argument: \# \# *Function: \# Creates or modifies string $DC_FT. \# .MAC DROPCAP_FONT END . ds $DC_FT \\$1 .END \# \# DROPCAP COLOR \# ------------- \# *Arguments: \# \# *Function: \# Defines string $DC_COLOR to argument. \# *Notes: \# User must define an XCOLOR or NEWCOLOR before using \# DC_COLOR. \# .MAC DROPCAP_COLOR END . if \\n[#PRINT_STYLE]=1 .return . nr #DC_COLOR 1 . ds $DC_COLOR \\$1 .END \# \# DROP CAP GUTTER \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies register #DC_GUT. \# *Notes: \# Requires unit of measure. Default is 3p. \# .MAC DROPCAP_GUTTER END . nr #DC_GUT (\\$1) .END \# \# DROP CAP ADJUST \# --------------- \# *Argument: \# <+|- # of points to in/decrease point size of drop cap letter> \# *Function: \# Creates or modifies string $DC_ADJUST. \# *Notes: \# Despite its best efforts, DROPCAP doesn't always get the point \# size of the drop cap critically perfect. DROPCAP_ADJUST lets \# the user add or subtract points (or fractions of points) to \# get the size right. \# \# Requires the + or - sign. \# .MAC DROPCAP_ADJUST END . ds $DC_ADJUST \\$1 .END \# \# DROP CAP \# -------- \# *Arguments: \# <# of lines> [COND <% to condense> | EXT <% to extend>] \# *Function: \# Calculates point size of dropcap based on # of lines passed as \# arg 2. Sets indent for text based on dropcap width+gutter. \# Advances and prints dropcap; reverses and prints indented text \# to bottom of dropcap, then resets indent to left margin (plus \# any indent that was in effect prior to invoking DROPCAP). \# *Notes: \# Drop caps when using the doc processing macro PP only work with \# initial paragraphs (i.e. at doc start, or after heads), only when \# DROPCAPS comes immediately after PP, and only when the PRINTSTYLE \# is TYPESET. If these conditions aren't met, DROPCAPS is silently \# ignored. \# \# The COND or EXT argument are processed separately from all \# other COND or EXT inlines or macros, hence passing COND or \# EXT has no effect on running type. \# .MAC DROPCAP END . if \\n[#IGNORE]=1 \{\ . PRINT \\$1\c . return . \} . br . if n \{\ . PRINT \\$1\c . return . \} . if \\n[#DOCS] \{\ . if \\n[#PRINT_STYLE]=1 \{\ . PRINT \\$1\c . return . \} . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#PP_STYLE]=2 \{\ . PRINT \\$1\c . return . \} . if \\n[#PP]>1 \{\ . PRINT \\$1\c . return . \} . ti 0 . \} . \} . ds $DROPCAP \\$1 . nr #DC_LINES \\$2-1 . if \\n[#CONDENSE]=1 \{\ . ds $RESTORE_COND \\*[$COND_PERCENT] \\*[CONDX] . nr #CONDENSE_WAS_ON 1 . \} . if \\n[#EXTEND]=1 \{\ . ds $RESTORE_EXT \\*[$EXT_PERCENT] \\*[EXTX] . nr #EXTEND_WAS_ON 1 . \} . if '\\$3'COND' .CONDENSE \\$4 . if '\\$3'EXT' .EXTEND \\$4 . if !r#DC_GUT .nr #DC_GUT (3p) . ie \\n[#DOCS] .ds $RESTORE_FAM \\*[$DOC_FAM] . el .ds $RESTORE_FAM \\n[.fam] . ie \\n[#DOCS] .ds $RESTORE_FT \\*[$PP_FT] . el .ds $RESTORE_FT \\*[$FONT] . nr #RESTORE_PT_SIZE \\n[#PT_SIZE] . nr #RESTORE_INDENT \\n[.i] . SIZESPECS . nr #DC_HEIGHT \\n[#DC_LINES]*\\n[#LEAD]+\\n[#CAP_HEIGHT] . ie !d$DC_FAM .FAM \\n[.fam] . el .FAM \\*[$DC_FAM] . ie !d$DC_FT .FT \\*[$FONT] . el .FT \\*[$DC_FT] . while \\n[#GET_DC_HEIGHT]<\\n[#DC_HEIGHT] \{\ . ps \\n[#PT_SIZE]u+100u . SIZESPECS . nr #GET_DC_HEIGHT \\n[#CAP_HEIGHT] . \} . if d$DC_ADJUST .ps \\*[$DC_ADJUST]p . nr #DC_LINES +1 . if \\n[#DC_LINES]v>\\n[.t] \{\ . nr pgnum \\n%+\\n[#PAGE_NUM_ADJ] 1 . tm1 "[mom]: Dropcap at line \\n[.c] does not fit on page \\n[#PAGENUMBER]. . tm1 " Shifting paragraph to top of page \\n+[pgnum]. . bp . \} . ie \\n[#DC_COLOR]=1 \{\ . ie !'\\$3'' \{\ . ie '\\$3'COND' \ . PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \m[\\*[$DC_COLOR]]\\*[COND]\\*[$DROPCAP]\\*[CONDX]\m[]\\*[UP \\n[#DC_LINES]v] . el \ . PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \m[\\*[$DC_COLOR]]\\*[EXT]\\*[$DROPCAP]\\*[EXTX]\m[]\\*[UP \\n[#DC_LINES]v] . \} . el .PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \m[\\*[$DC_COLOR]]\\*[$DROPCAP]\m[]\\*[UP \\n[#DC_LINES]v] . \} . el \{\ . ie !'\\$3'' \{\ . ie '\\$3'COND' \ . PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \\*[COND]\\*[$DROPCAP]\\*[CONDX]\\*[UP \\n[#DC_LINES]v] . el \ . PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \\*[EXT]\\*[$DROPCAP]\\*[EXTX]\\*[UP \\n[#DC_LINES]v] . \} . el .PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \m[\\*[$DC_COLOR]]\\*[$DROPCAP]\m[]\\*[UP \\n[#DC_LINES]v] . \} . if '\\$3'COND' \E*[COND] . if '\\$3'EXT' \E*[EXT] . ie \\n[.i] \{\ . vs 0 . br . in +\w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u . vs . \} . el \{\ . vs 0 . br . in \w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u . vs . \} . if '\\$3'COND' \E*[CONDX]\c . if '\\$3'EXT' \E*[EXTX]\c . FAM \\*[$RESTORE_FAM] . FT \\*[$RESTORE_FT] . ps \\n[#RESTORE_PT_SIZE]u . if \\n[#CONDENSE_WAS_ON] \{\ . CONDENSE \\*[$RESTORE_COND] \\*[COND]\c . \} . if \\n[#EXTEND_WAS_ON] \{\ . EXTEND \\*[$RESTORE_EXT] \\*[EXT]\c . \} . ie \\n[.u] .wh \\n[.d]u+\\n[#DC_HEIGHT]u-1v DROPCAP_OFF . el .wh \\n[.d]u+\\n[#DC_HEIGHT]u DROPCAP_OFF . rr #CONDENSE_WAS_ON . rr #EXTEND_WAS_ON . rm $DROPCAP . rr #DC_LINES . rm $RESTORE_COND . rm $RESTORE_EXT . rm $RESTORE_FAM . rm $RESTORE_FT . rr #RESTORE_PT_SIZE . rr #RESTORE_INDENT . rr #DC_HEIGHT . rr #GET_DC_HEIGHT . rr x .END \# .MAC DROPCAP_OFF END ' in \\n[#RESTORE_INDENT]u . ch DROPCAP_OFF .END \# \# ===================================================================== \# \# +++GRAPHICAL OBJECTS+++ \# \# HORIZONTAL RULE - DRH \# --------------------- \# *Arguments: \# | [ ] \# *Function: \# With no arg, draws a full measure rule. With args, draws \# described horizontal rule. \# *Notes: \# Rules are drawn left-to-right, from the baseline down, and \# return to their point of origin. Color must be set in the \# macro; otherwise the color will be black, regardless of current \# .gcolor. If no arg given, the rule weight is the one set by \# RULE_WEIGHT. \# .MAC DRH END . if \\n[.vpt]=1 \{\ . vpt 0 . nr #RESTORE_TRAP 1 . \} . ie !\\n[#NO_ADVANCE]=1 .br . el \{\ . sp -1v . rr #NO_ADVANCE . \} . ie \\n[.u]=1 \{\ . nr #FILLED 1 . nr #FILL_MODE \\n[.j] . \} . el \{\ . nr #NOFILL 1 . if \\n[.ce]>0 .nr #NOFILL_MODE 3 . if \\n[.rj]>0 .nr #NOFILL_MODE 5 . ce 0 . rj 0 . \} . nf . ds $RL_WEIGHT \\$1 . ds $RL_INDENT \\$2 . ds $RL_LENGTH \\$3 . ie !'\\$4'' .ds $RL_COLOR \\$4 . el .ds $RL_COLOR default . nr #SAVED_WEIGHT \\n[#RULE_WEIGHT] . nr #SAVED_WEIGHT_ADJ \\n[#RULE_WEIGHT_ADJ] . di NULL . if \\n[#NUM_ARGS]>=1 .RULE_WEIGHT \\*[$RL_WEIGHT] . di . gcolor \\*[$RL_COLOR] . ie \\n[#NUM_ARGS]=0 \{\ . ie \\n[#INDENT_ACTIVE] \{\ . nr #RESTORE_L_LENGTH \\n[.l] . if \\n[#INDENT_BOTH_ACTIVE] .ll \\n[.l]u-\\n[#BL_INDENT]u . if \\n[#INDENT_LEFT_ACTIVE] .ll \\n[.l]u-\\n[#L_INDENT]u \D't \\n[#RULE_WEIGHT]'\ \h'\\*[$RL_INDENT]-\\n[#RULE_WEIGHT]u'\ \v'\\n[#RULE_WEIGHT_ADJ]u'\ \D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\ \v'-\\n[#RULE_WEIGHT_ADJ]u'\ \D't \\n[#SAVED_RULE_WEIGHT]' . ll \\n[#RESTORE_L_LENGTH]u . rr #RESTORE_L_LENGTH . \} . el \{\ \D't \\n[#RULE_WEIGHT]'\ \h'\\*[$RL_INDENT]-\\n[#RULE_WEIGHT]u'\ \v'\\n[#RULE_WEIGHT_ADJ]u'\ \D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\ \v'-\\n[#RULE_WEIGHT_ADJ]u'\ \D't \\n[#SAVED_RULE_WEIGHT]' . \} . \} . el \{\ \D't \\n[#RULE_WEIGHT]'\ \h'\\*[$RL_INDENT]-\\n[#RULE_WEIGHT]u'\ \v'\\n[#RULE_WEIGHT_ADJ]u'\ \D'l \\*[$RL_LENGTH] 0'\ \v'-\\n[#RULE_WEIGHT_ADJ]u'\ \D't \\n[#SAVED_RULE_WEIGHT]' . \} . if \\n[#FILLED]=1 \{\ . if \\n[#FILL_MODE]=0 .QUAD LEFT . if \\n[#FILL_MODE]=1 .JUSTIFY . if \\n[#FILL_MODE]=3 .QUAD CENTER . if \\n[#FILL_MODE]=5 .QUAD RIGHT . rr #FILLED . \} . sp -1v . if \\n[#NOFILL]=1 \{\ . if \\n[#NOFILL_MODE]=3 .CENTER . if \\n[#NOFILL_MODE]=5 .RIGHT . \} . gcolor . nr #RULE_WEIGHT \\n[#SAVED_WEIGHT] . nr #RULE_WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ] . rr #SAVED_WEIGHT . rr #SAVED_WEIGHT_ADJ . if \\n[#RESTORE_TRAP]=1 \{\ . vpt 1 . rr #RESTORE_TRAP . \} . if '\\n[.z]'FLOAT*DIV' \ . if !(\\n[.d]+\\n[#WEIGHT])<\\n[D-float] .nr D-float \\n[.d]+\\n[#WEIGHT] .END \# \# RULE \# ---- \# *Argument: \# \# *Function: \# Draws a rule the length of the current measure. \# *Notes: \# A convenience macro. DRH with no argument does the same thing. \# Kept in for backward compatibility. \# .MAC RULE END . if \\n[.u]=1 \{\ . nr #FILLED 1 . ds $CURRENT_QUAD \\*[$QUAD_VALUE] . nf . \} . ie \\n[#INDENT_ACTIVE] \{\ . if \\n[#INDENT_BOTH_ACTIVE] .ll \\n[.l]u-\\n[#BL_INDENT]u . if \\n[#INDENT_LEFT_ACTIVE] .ll \\n[.l]u-\\n[#L_INDENT]u . PRINT \ \D't \\n[#RULE_WEIGHT]'\v'\\n[#RULE_WEIGHT_ADJ]u'\ \D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\h'|0'\c . ll . rr #RESTORE_L_LENGTH . \} . el \{\ . PRINT \ \D't \\n[#RULE_WEIGHT]'\v'\\n[#RULE_WEIGHT_ADJ]u'\ \D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\h'|0'\c . \} . if r #FILLED \{\ . fi . rr #FILLED . QUAD \\*[$CURRENT_QUAD] . rm $CURRENT_QUAD . \} . EOL .END \# \# VERTICAL RULE - DRV \# ------------------- \# *Arguments: \# [ ] \# *Function: \# Draws described vertical rule. \# *Notes: \# Rules are drawn left-to-right, from the baseline down, and \# return to their point of origin. Color must be set in the \# macro; otherwise the color will be black, regardless of current \# .gcolor. \# .MAC DRV END . if \\n[.vpt]=1 \{\ . vpt 0 . nr #RESTORE_TRAP 1 . \} . ie !\\n[#NO_ADVANCE]=1 .br . el \{\ . sp -1v . rr #NO_ADVANCE . \} . ie \\n[.u]=1 \{\ . nr #FILLED 1 . nr #FILL_MODE \\n[.j] . \} . el \{\ . nr #NOFILL 1 . if \\n[.ce]>0 .nr #NOFILL_MODE 3 . if \\n[.rj]>0 .nr #NOFILL_MODE 5 . ce 0 . rj 0 . \} . nf . ds $RL_WEIGHT \\$1 . ds $RL_INDENT \\$2 . ds $RL_DEPTH \\$3 . ie !'\\$4'' \{\ . ds $RL_COLOR \\$4 . \} . el .ds $RL_COLOR default . nr #SAVED_WEIGHT \\n[#RULE_WEIGHT] . nr #SAVED_WEIGHT_ADJ \\n[#RULE_WEIGHT_ADJ] . RULE_WEIGHT \\*[$RL_WEIGHT] . gcolor \\*[$RL_COLOR] \D't \\n[#RULE_WEIGHT]'\ \h'\\*[$RL_INDENT]-\\n[#RULE_WEIGHT_ADJ]u'\ \D'l 0 \\*[$RL_DEPTH]'\ \D't \\n[#SAVED_RULE_WEIGHT]' . if \\n[#FILLED]=1 \{\ . if \\n[#FILL_MODE]=0 .QUAD LEFT . if \\n[#FILL_MODE]=1 .JUSTIFY . if \\n[#FILL_MODE]=3 .QUAD CENTER . if \\n[#FILL_MODE]=5 .QUAD RIGHT . rr #FILLED . \} . sp -1v . if \\n[#NOFILL]=1 \{\ . if \\n[#NOFILL_MODE]=3 .CENTER . if \\n[#NOFILL_MODE]=5 .RIGHT . \} . gcolor . nr #RULE_WEIGHT \\n[#SAVED_WEIGHT] . nr #RULE_WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ] . if \\n[#RESTORE_TRAP]=1 \{\ . vpt 1 . rr #RESTORE_TRAP . \} . if '\\n[.z]'FLOAT*DIV' \{\ . if !(\\n[.d]+\\*[$RL_DEPTH])<\\n[D-float] .nr D-float \\n[.d]+\\*[$RL_DEPTH] . \} .END \# \# BOXES - DBX \# ----------- \# *Arguments: \# [ ] \# *Function: \# Draws described box. \# *Notes: \# Boxes are drawn left-to-right, from the baseline down, and \# return to their point of origin. Box rules are drawn from the \# perimeter inwards. Color must be set in the macro; otherwise \# the color will be black, regardless of current .gcolor. If no \# arg given, the rule weight is the one set by RULE_WEIGHT. \# .MAC DBX END . if \\n[.vpt]=1 \{\ . vpt 0 . nr #RESTORE_TRAP 1 . \} . ie !\\n[#NO_ADVANCE]=1 .br . el \{\ . sp -1v . rr #NO_ADVANCE . \} . ie \\n[.u]=1 \{\ . nr #FILLED 1 . nr #FILL_MODE \\n[.j] . \} . el \{\ . nr #NOFILL 1 . if \\n[.ce]>0 .nr #NOFILL_MODE 3 . if \\n[.rj]>0 .nr #NOFILL_MODE 5 . ce 0 . rj 0 . \} . nf . ie '\\$1'SOLID' .nr #BX_SOLID 1 . el .ds $BX_WEIGHT \\$1 . ds $BX_INDENT \\$2 . ds $BX_WIDTH \\$3 . ds $BX_DEPTH \\$4 . ie !'\\$5'' \{\ . ie d$\\$5_FILL .ds $BX_COLOR \\*[$\\$5_FILL] . el .ds $BX_COLOR \\$5 . \} . el .ds $BX_COLOR default . nr #SAVED_WEIGHT \\n[#RULE_WEIGHT] . nr #SAVED_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . if !'\\$1'SOLID' .RULE_WEIGHT \\*[$BX_WEIGHT] . ds $BX_INDENT \\*[$BX_INDENT]-\\n[#WEIGHT_ADJ]u . ie \\n[#BX_SOLID]=1 \{\ . fcolor \\*[$BX_COLOR] \h'\\*[$BX_INDENT]'\ \D'P \\*[$BX_WIDTH] 0 0 \\*[$BX_DEPTH] -\\*[$BX_WIDTH] 0 0 -\\*[$BX_DEPTH]' . fcolor . rr #BX_SOLID . \} . el \{\ . gcolor \\*[$BX_COLOR] \D't \\n[#RULE_WEIGHT]'\ \h'\\*[$BX_INDENT]'\ \v'\\n[#WEIGHT_ADJ]u'\ \D'p \\*[$BX_WIDTH]-\\n[#RULE_WEIGHT]u 0 0 \\*[$BX_DEPTH]-\\n[#RULE_WEIGHT]u -\\*[$BX_WIDTH]+\\n[#RULE_WEIGHT]u 0 0 -\\*[$BX_DEPTH]+\\n[#RULE_WEIGHT]u'\ \v'-\\n[#WEIGHT_ADJ]u'\ \D't \\n[#SAVED_RULE_WEIGHT]' . gcolor . \} . sp -1v . if \\n[#FILLED]=1 \{\ . if \\n[#FILL_MODE]=0 .QUAD LEFT . if \\n[#FILL_MODE]=1 .JUSTIFY . if \\n[#FILL_MODE]=3 .QUAD CENTER . if \\n[#FILL_MODE]=5 .QUAD RIGHT . rr #FILLED . \} . if \\n[#NOFILL]=1 \{\ . if \\n[#NOFILL_MODE]=3 .CENTER . if \\n[#NOFILL_MODE]=5 .RIGHT . \} . nr #RULE_WEIGHT \\n[#SAVED_WEIGHT] . nr #WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ] . rr #SAVED_WEIGHT . rr #SAVED_WEIGHT_ADJ . if \\n[#RESTORE_TRAP]=1 \{\ . vpt 1 . rr #RESTORE_TRAP . \} . if '\\n[.z]'FLOAT*DIV' \ . if !(\\n[.d]+\\*[$BX_DEPTH])<\\n[D-float] .nr D-float \\n[.d]+\\*[$BX_DEPTH] .END \# \# ELLIPSES - DCL \# -------------- \# *Arguments: \# [ ] \# *Function: \# Draws described ellipses. \# *Notes: \# Ellipses (circles) are drawn left-to-right, from the baseline \# down, and return to their point of origin. Ellipse rules are \# drawn from the perimeter inwards. Color must be set in the \# macro; otherwise the color will be black, regardless of current \# .gcolor. If no arg given, the rule weight is the one set by \# RULE_WEIGHT. \# .MAC DCL END . if \\n[.vpt]=1 \{\ . vpt 0 . nr #RESTORE_TRAP 1 . \} . ie !\\n[#NO_ADVANCE]=1 .br . el \{\ . sp -1v . rr #NO_ADVANCE . \} . ie \\n[.u]=1 \{\ . nr #FILLED 1 . nr #FILL_MODE \\n[.j] . \} . el \{\ . nr #NOFILL 1 . if \\n[.ce]>0 .nr #NOFILL_MODE 3 . if \\n[.rj]>0 .nr #NOFILL_MODE 5 . ce 0 . rj 0 . \} . nf . ie '\\$1'SOLID' .nr #CL_SOLID 1 . el .ds $CL_WEIGHT \\$1 . ds $CL_INDENT \\$2 . ds $CL_WIDTH \\$3 . ds $CL_DEPTH \\$4 . ie !'\\$5'' \{\ . ie d$\\$5_FILL .ds $CL_COLOR \\*[$\\$5_FILL] . el .ds $CL_COLOR \\$5 . \} . el .ds $CL_COLOR default . nr #SAVED_WEIGHT \\n[#RULE_WEIGHT] . nr #SAVED_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . if !'\\$1'SOLID' .RULE_WEIGHT \\*[$CL_WEIGHT] . ds $CL_INDENT \\*[$CL_INDENT]-\\n[#WEIGHT_ADJ]u . ie \\n[#CL_SOLID]=1 \{\ . fcolor \\*[$CL_COLOR] \h'\\*[$CL_INDENT]'\ \v'\\*[$CL_DEPTH]/2u'\ \D'E \\*[$CL_WIDTH]-\\n[#RULE_WEIGHT]u \\*[$CL_DEPTH]-\\n[#RULE_WEIGHT]u'\ \v'-\\*[$CL_DEPTH]/2u' . fcolor . rr #CL_SOLID . \} . el \{\ . gcolor \\*[$CL_COLOR] \D't \\n[#RULE_WEIGHT]'\ \h'\\*[$CL_INDENT]'\ \v'\\*[$CL_DEPTH]/2u'\ \D'e \\*[$CL_WIDTH]-\\n[#RULE_WEIGHT]u \\*[$CL_DEPTH]-\\n[#RULE_WEIGHT]u'\ \v'-(\\*[$CL_DEPTH]/2u)'\ \D't \\n[#SAVED_RULE_WEIGHT]' . gcolor . \} . sp -1v . if \\n[#FILLED]=1 \{\ . if \\n[#FILL_MODE]=0 .QUAD LEFT . if \\n[#FILL_MODE]=1 .JUSTIFY . if \\n[#FILL_MODE]=3 .QUAD CENTER . if \\n[#FILL_MODE]=5 .QUAD RIGHT . rr #FILLED . \} . if \\n[#NOFILL]=1 \{\ . if \\n[#NOFILL_MODE]=3 .CENTER . if \\n[#NOFILL_MODE]=5 .RIGHT . \} . nr #RULE_WEIGHT \\n[#SAVED_WEIGHT] . nr #WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ] . rr #SAVED_WEIGHT . rr #SAVED_WEIGHT_ADJ . if \\n[#RESTORE_TRAP]=1 \{\ . vpt 1 . rr #RESTORE_TRAP . \} . if '\\n[.z]'FLOAT*DIV' \ . if !(\\n[.d]+\\*[$CL_DEPTH])<\\n[D-float] .nr D-float \\n[.d]+\\*[$CL_DEPTH] .END \# \# RULE WEIGHT \# ----------- \# *Argument: \# \# *Function: \# Sets \D't ' to the correct number of machine units for the \# argument given in points. \# *Notes: \# Decimal fractions are allowed. Rule weight must be < 100. \# .MAC RULE_WEIGHT END . di NULL \" Diverted so there's no problem with breaks, spacing, etc. . ds $ARG \\$1 . substring $ARG -1 . if !\B'\\*[$ARG]' \{\ . tm1 "[mom]: The argument to \\$0 must not have a unit of measure appended. . ab Aborting '\\n[.F]' at \\$0, line \\n[.c]. . \} . length #STR_LENGTH \\$1 . ds $ARG \\$1 . substring $ARG 0 0 . ie '\\*[$ARG]'.' \{\ . ds $ARG \\$1 . substring $ARG 1 \\n[#STR_LENGTH]-1 . nr #WEIGHT \\*[$ARG]*100 . if (\\n[#WEIGHT]>=1000) \{\ . while (\\n[#WEIGHT]>=1000) \{\ . nr #WEIGHT \\n[#WEIGHT]/10 . \} . \} . \} . el \{\ . ds $ARG \\$1 . substring $ARG 1 1 . ie '\\*[$ARG]'.' \{\ . ds $LHS \\$1 . substring $LHS 0 0 . ds $RHS \\$1 . substring $RHS 2 . nr #WEIGHT \\*[$LHS]\\*[$RHS]*100 . if (\\n[#WEIGHT]>=10000) \{\ . while (\\n[#WEIGHT]>=10000) \{\ . nr #WEIGHT \\n[#WEIGHT]/10 . \} . \} . \} . el \{\ . ie \\n[#STR_LENGTH]<=2 .nr #WEIGHT \\$1*1000 . el \{\ . ds $ARG \\$1 . substring $ARG 2 2 . ie !'\\*[$ARG]'.' \{\ . tm1 "[mom]: Invalid argument given to macro \\$0 at line \\n[.c]. . tm1 " Rule weight must be < 100 points. . tm1 " Falling back to default weight .5 points. . nr #WEIGHT 500 . \} . el \{\ . ds $LHS \\$1 . substring $LHS 0 1 . ds $RHS \\$1 . substring $RHS 3 . nr #WEIGHT \\*[$LHS]\\*[$RHS]*1000 . if (\\n[#WEIGHT]>=100000) \{\ . while (\\n[#WEIGHT]>=100000) \{\ . nr #WEIGHT \\n[#WEIGHT]/10 . \} . \} . \} . \} . \} . \} . nr #WEIGHT_ADJ \\n[#WEIGHT]/2 . if '\\$0'BIBLIOGRAPHY_STRING_UNDERLINE_WEIGHT' \{\ . nr #BIB_STRING_UNDERLINE_WEIGHT \\n[#WEIGHT] . nr #BIB_STRING_UNDERLINE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'COVER_UNDERLINE_WEIGHT' \{\ . nr #COVER_UNDERLINE_WEIGHT \\n[#WEIGHT] . nr #COVER_UNDERLINE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'DOC_COVER_UNDERLINE_WEIGHT' \{\ . nr #DOC_COVER_UNDERLINE_WEIGHT \\n[#WEIGHT] . nr #DOC_COVER_UNDERLINE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'DOCTYPE_UNDERLINE_WEIGHT' \{\ . nr #DOCTYPE_UNDERLINE_WEIGHT \\n[#WEIGHT] . nr #DOCTYPE_UNDERLINE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'ENDNOTE_STRING_UNDERLINE_WEIGHT' \{\ . nr #EN_STRING_UNDERLINE_WEIGHT \\n[#WEIGHT] . nr #EN_STRING_UNDERLINE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'ENDNOTE_TITLE_UNDERLINE_WEIGHT' \{\ . nr #EN_TITLE_UNDERLINE_WEIGHT \\n[#WEIGHT] . nr #EN_TITLE_UNDERLINE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'FOOTER_RULE_WEIGHT' \{\ . nr #FOOTER_RULE_WEIGHT \\n[#WEIGHT] . nr #FOOTER_RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'FOOTNOTE_RULE_WEIGHT' \{\ . nr #FN_RULE_WEIGHT \\n[#WEIGHT] . nr #FN_RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'HEADER_RULE_WEIGHT' \{\ . nr #HEADER_RULE_WEIGHT \\n[#WEIGHT] . nr #HEADER_RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'RULE_WEIGHT' \{\ . nr #RULE_WEIGHT \\n[#WEIGHT] . nr #RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'UNDERSCORE_WEIGHT' \{\ . nr #UNDERSCORE_WEIGHT \\n[#WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . di .END \# \# Aliases \# .ALIAS BIBLIOGRAPHY_STRING_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS COVER_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS DOC_COVER_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS DOCTYPE_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS ENDNOTE_STRING_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS ENDNOTE_TITLE_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS FOOTER_RULE_WEIGHT RULE_WEIGHT .ALIAS FOOTNOTE_RULE_WEIGHT RULE_WEIGHT .ALIAS HEADER_RULE_WEIGHT RULE_WEIGHT .ALIAS UNDERSCORE_WEIGHT RULE_WEIGHT \# \# Default rule weights \# ~~~~~~~~~~~~~~~~~~~~ .nr #BIB_STRING_UNDERLINE_WEIGHT 500 .nr #COVER_UNDERLINE_WEIGHT 500 .nr #DOC_COVER_UNDERLINE_WEIGHT 500 .nr #DOCTYPE_UNDERLINE_WEIGHT 500 .nr #EN_STRING_UNDERLINE_WEIGHT 500 .nr #EN_TITLE_UNDERLINE_WEIGHT 500 .nr #FN_RULE_WEIGHT 500 .nr #FOOTER_RULE_WEIGHT 500 .nr #HEADER_RULE_WEIGHT 500 .nr #RULE_WEIGHT 500 .nr #UNDERSCORE_WEIGHT 500 \# .nr #BIB_STRING_UNDERLINE_WEIGHT_ADJ \n[#BIB_STRING_UNDERLINE_WEIGHT]/2 .nr #COVER_UNDERLINE_WEIGHT_ADJ \n[#DOCTYPE_UNDERLINE_WEIGHT]/2 .nr #DOC_COVER_UNDERLINE_WEIGHT_ADJ \n[#DOCTYPE_RULE_WEIGHT]/2 .nr #DOCTYPE_UNDERLINE_WEIGHT_ADJ \n[#DOCTYPE_RULE_WEIGHT]/2 .nr #EN_STRING_UNDERLINE_WEIGHT_ADJ \n[#EN_STRING_UNDERLINE_WEIGHT]/2 .nr #EN_TITLE_UNDERLINE_WEIGHT_ADJ \n[#EN_STRING_UNDERLINE_WEIGHT]/2 .nr #FOOTER_RULE_WEIGHT_ADJ \n[#FOOTER_RULE_WEIGHT]/2 .nr #FN_RULE_WEIGHT_ADJ \n[#FN_RULE_WEIGHT]/2 .nr #HEADER_RULE_WEIGHT_ADJ \n[#HEADER_RULE_WEIGHT]/2 .nr #RULE_WEIGHT_ADJ \n[#RULE_WEIGHT]/2 .nr #UNDERSCORE_WEIGHT_ADJ \n[#UNDERSCORE_WEIGHT]/2 \# \# Set default rule weight \# .di NULL \D't 500' .di \# \# ===================================================================== \# \# +++WORD AND SENTENCE SPACING+++ \# \# WORD SPACE CONTROL \# ------------------ \# *Argument: \# <+|->wordspace | DEFAULT \# *Function: \# Increases or decreases interword space by user supplied amount. \# If DEFAULT, value is set to 12 (groff default). \# *Notes: \# $WS_CONSTANT is the groff default word space. \# $WS_VAR is the user supplied amount by which to in/decrease word space. \# $WS is a concatenation of WS_CONSTANT and WS_VAR. \# \# \n[.sss] holds the current sentence space value. \# .MAC WS END . ds $WS_CURR \\n[.ss] . ds $WS_VAR \\$1 . ie '\\$1'DEFAULT' .ss 12 \\n[.sss] . el \{\ . ds $WS (\\*[$WS_CURR]\\*[$WS_VAR]) . ie \\n[.sss]=12 .ss \\*[$WS] 12 . el \{\ . ss \\*[$WS] (\\*[$WS]\\*[$SS_VAR]) . SS \\*[$SS_VAR] . \} . \} .END \# \# SENTENCE SPACE CONTROL \# ---------------------- \# *Argument: \# <+-sentencespace> | 0 | DEFAULT \# *Function: \# Increases or decreases sentence space by user supplied amount. \# If 0, sentence spaces are ignored. If DEFAULT, value is \# set to 12 (groff default). \# *Notes: \# Because the user supplied value requires a literal + or - sign, \# the macro argument is stored in a string. \# \# Sentence space applies only to input where sentences are separated \# by two spaces (and/or, in fill mode [FLUSH L|R|C or JUSTIFY], an EOL). \# Changing .SS when sentences are separated by only one space has \# no effect on the space between sentences. \# \# \n[.ss] holds the current wordspace value. \# \n[.sss] holds the current sentence space value. \# .MAC SS END . ds $SS_VAR \\$1 . ie '\\$1'0' .ss \\n[.ss] (\\n[.ss]-\\n[.ss]) . el \{\ . ie '\\$1'DEFAULT' .ss \\n[.ss] . el .ss \\n[.ss] (0\\*[$SS_VAR]) . \} .END \# \# ===================================================================== \# \# INDENTS \# ------- \# \# +++INDENT LEFT+++ \# .MAC IL END . if \\n[#INDENT_STYLE_BOTH] .IBX . nr #INDENT_STYLE_LEFT 1 . nr #INDENT_ACTIVE 1 . nr #INDENT_LEFT_ACTIVE 1 . ie '\\$1'' \{\ . br . in \\n[#L_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . \} . el \{\ . br . nr #L_INDENT +(\\$1) . in \\n[#L_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . \} . if \\n[#IN_ITEM] .nr #IN_ITEM_L_INDENT +(\\$1) .END \# \# +++INDENT RIGHT+++ \# .MAC IR END . if \\n[#INDENT_STYLE_BOTH] .IBX . nr #INDENT_STYLE_RIGHT 1 . nr #INDENT_ACTIVE 1 . nr #INDENT_RIGHT_ACTIVE 1 . ie '\\$1'' \{\ . br . ie \\n[#TAB_ACTIVE] \{\ . ll \\n[.l]u-\\n[#R_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . \} . el \{\ . ll \\n[.l]u-\\n[#R_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . \} . \} . el \{\ . br . nr #R_INDENT +(\\$1) . ie \\n[#TAB_ACTIVE] \{\ . ll \\n[.l]u-\\n[#R_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . \} . el \{\ . ll \\n[.l]u-\\n[#R_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . \} . \} .END \# \# +++INDENT BOTH+++ \# .MAC IB END . if \\n[#INDENT_STYLE_LEFT] .ILX . if \\n[#INDENT_STYLE_RIGHT] .IRX . nr #INDENT_STYLE_BOTH 1 . nr #INDENT_ACTIVE 1 . nr #INDENT_BOTH_ACTIVE 1 . ie '\\$1'' \{\ . br . in \\n[#BL_INDENT]u . ie \\n[#TAB_ACTIVE] \{\ . ll \\n[.l]u-\\n[#BR_INDENT]u . ta \\n[.l]u-\\n[#BR_INDENT]u . \} . el \{\ . ll \\n[.l]u-\\n[#BR_INDENT]u . ta \\n[.l]u-\\n[#BR_INDENT]u . \} . \} . el \{\ . br . nr #BL_INDENT (\\n[#INDENT]+\\$1) . ie \\n[#NUM_ARGS]=2 .nr #BR_INDENT +(\\$2) . el .nr #BR_INDENT \\n[#BL_INDENT] . ie \\n[#TAB_ACTIVE] \{\ . in \\n[#BL_INDENT]u . ll \\n[.l]u-\\n[#BR_INDENT]u . ta \\n[.l]u-\\n[#BL_INDENT]u . \} . el \{\ . in \\n[#BL_INDENT]u . ll \\n[.l]u-\\n[#BR_INDENT]u . ta \\n[.l]u-\\n[#BR_INDENT]u . \} . \} .END \# \# +++TEMPORARY INDENT+++ \# .MAC TI END . br . ie '\\$1'' \{\ . ti \\n[#T_INDENT]u . if \\n[#INDENT_LEFT_ACTIVE] .ti \\n[#T_INDENT]u+\\n[#L_INDENT]u . if \\n[#INDENT_BOTH_ACTIVE] .ti \\n[#T_INDENT]u+\\n[#BL_INDENT]u . \} . el \{\ . nr #T_INDENT (\\$1) . ti \\n[#T_INDENT]u . \} .END \# \# +++HANGING INDENT+++ \# .MAC HI END . ie '\\$1'' .ti -\\n[#HL_INDENT]u . el \{\ . nr #HL_INDENT (\\$1) . ti -\\n[#HL_INDENT]u . \} .END \# \# +++INDENTS OFF+++ \# .MAC ILX END . ie \\n[#IN_ITEM] .nr #L_INDENT -\\n[#IN_ITEM_L_INDENT] . el \{\ . br . in 0 . rr #INDENT_LEFT_ACTIVE . \} . if '\\$1'CLEAR' \{\ . rr #L_INDENT . rr #INDENT_STYLE_LEFT . \} .END \# .MAC IRX END . br . rr #INDENT_RIGHT_ACTIVE . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . if '\\$1'CLEAR' \{\ . rr #R_INDENT . rr #INDENT_STYLE_RIGHT . \} .END \# .MAC IBX END . br . in 0 . rr #INDENT_BOTH_ACTIVE . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . if '\\$1'CLEAR' \{\ . rr #BL_INDENT . rr #BR_INDENT . rr #INDENT_STYLE_BOTH . \} .END \# .MAC IX END . if '\\$0'IX' \{\ . if !\\n[#IX_WARN] \{\ . tm1 "[mom]: Use of .IX is deprecated. Use .IQ instead. . tm1 " .IX will continue to behave as before, but to . tm1 " avoid this message, please update your document. . nr #IX_WARN 1 . \} . \} . br . in 0 . rr #INDENT_LEFT_ACTIVE . rr #INDENT_RIGHT_ACTIVE . rr #INDENT_BOTH_ACTIVE . if \\n[#INDENT_STYLE_RIGHT] \{\ . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . \} . if \\n[#INDENT_STYLE_BOTH] \{\ . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . \} . if '\\$1'CLEAR' \{\ . if \\n[#INDENT_STYLE_RIGHT] \{\ . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . \} . if \\n[#INDENT_STYLE_BOTH] \{\ . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . \} . rr #L_INDENT . rr #R_INDENT . rr #BL_INDENT . rr #BR_INDENT . rr #T_INDENT . rr #H_INDENT . rr #INDENT_STYLE_LEFT . rr #INDENT_STYLE_RIGHT . rr #INDENT_STYLE_BOTH . \} . rr #INDENT_ACTIVE .END \# \# ===================================================================== \# \# +++MULTIPLE COLUMNS+++ \# \# MULTIPLE COLUMNS ON \# ------------------- \# *Arguments: \# \# *Function: \# Marks the top of a column set \# .MAC MCO END . mk c .END \# \# MULTIPLE COLUMN RETURN \# ---------------------- \# *Arguments: \# \# *Function: \# Returns to the top of a column set \# .MAC MCR END . TRAP OFF . sp |\\n[c]u . TRAP .END \# \# MULTIPLE COLUMNS OFF \# -------------------- \# *Arguments: \# | \# *Function: \# Advances to the end of a column set \# *Notes: \# With no argument, advances to the next baseline (at the current \# leading value) beneath the longest column. With an argument \# (which requires a unit of measure), advances arg distance \# beneath the baseline of the deepest column. If the argument \# is zero, advances to the baseline of the deepest column. \# .MAC MCX END . TRAP OFF . ie '\\$1'' \{\ . TQ . sp |\\n[.h]u . \} . el \{\ . nr #MCX_ALD (\\$1) . TQ . ie \\n[#MCX_ALD]=0 .sp |\\n[.h]u-1v . el .sp |\\n[.h]u+\\n[#MCX_ALD]u . rr #MCX_ALD . \} . TRAP .END \# \# ===================================================================== \# \# +++TYPESETTING SUPPORT MACROS+++ \# \# TRAP \# ---- \# *Arguments: \# toggle \# *Function: \# Enables/disables traps. \# *Notes: \# EL and TN don't function as advertised on the last line before \# a trap (when they break the preceding line, they spring the \# trap, and groff won't back up to the line preceding the trap). \# TRAP is a kludge to get EL and TN work properly on last lines. \# The user simply enloses the offending lines in TRAP OFF/TRAP. \# .MAC TRAP END . ie '\\$1'' .vpt 1 . el .vpt 0 .END \# \# SILENT \# ------ \# *Arguments: \# | \# *Function: \# Diverts text so that it doesn't print, or turns the function off. \# *Notes: \# Useful for setting up autotabs where you don't want the line with \# the tab marks to print. \# \# Also aliased as COMMENT, in case user wants to input a batch of \# text that doesn't print. \# .MAC SILENT END . nr #SILENT 1 . if \\n[#QUAD] .br . ie '\\$1'' .di NO_FLASH . el \{\ . br . di . rm NO_FLASH . rr #SILENT . \} .END \# \# PRINT \# ----- \# *Function: \# Prints anything. A macro that helps keep my code nicely indented. \# .MAC PRINT END . nop \\$* .END \# \# CAPS \# ---- \# *Arguments: \# | \# *Function: \# Converts text to caps, or, if OFF, reverts to normal caps/lc. \# *Notes: \# For inline control of capitalization style, use \*[UC] and \# \*[LC]. \# .MAC CAPS END . ie '\\$1'' \{\ . tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ . tr ŕ\[`A] . tr â\[^A] . tr á\['A] . tr ä\[:A] . tr ĺ\[oA] . tr ă\[~A] . tr ć\[AE] . tr č\[`E] . tr ę\[^E] . tr é\['E] . tr ë\[:E] . tr ě\[`I] . tr î\[^I] . tr í\['I] . tr ď\[:I] . tr ň\[`O] . tr ô\[^O] . tr ó\['O] . tr ö\[:O] . tr ő\[~O] . tr ř\[/O] . tr ů\[`U] . tr ű\[^U] . tr ú\['U] . tr ü\[:U] . tr ç\[,C] . tr đ\[-D] . tr ń\[~N] . tr ţ\[TP] . tr ý\['Y] . tr ˙\[:Y] . nr #CAPS_ON 1 . \} . el \{\ . tr aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz . tr ŕ\[`a] . tr â\[^a] . tr á\['a] . tr ä\[:a] . tr ĺ\[oa] . tr ă\[~a] . tr ć\[ae] . tr č\[`e] . tr ę\[^e] . tr é\['e] . tr ë\[:e] . tr ě\[`i] . tr î\[^i] . tr í\['i] . tr ď\[:i] . tr ň\[`o] . tr ô\[^o] . tr ó\['o] . tr ö\[:o] . tr ő\[~o] . tr ř\[/o] . tr ů\[`u] . tr ű\[^u] . tr ú\['u] . tr ü\[:u] . tr ç\[,c] . tr đ\[Sd] . tr ń\[~n] . tr ţ\[Tp] . tr ý\['y] . tr ˙\[:y] . rr #CAPS_ON . \} .END \# .MAC UC END \c . tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ . tr ŕ\[`A] . tr â\[^A] . tr á\['A] . tr ä\[:A] . tr ĺ\[oA] . tr ă\[~A] . tr ć\[AE] . tr č\[`E] . tr ę\[^E] . tr é\['E] . tr ë\[:E] . tr ě\[`I] . tr î\[^I] . tr í\['I] . tr ď\[:I] . tr ň\[`O] . tr ô\[^O] . tr ó\['O] . tr ö\[:O] . tr ő\[~O] . tr ř\[/O] . tr ů\[`U] . tr ű\[^U] . tr ú\['U] . tr ü\[:U] . tr ç\[,C] . tr đ\[-D] . tr ń\[~N] . tr ţ\[TP] . tr ý\['Y] . tr ˙\[:Y] . nr #CAPS_ON 1 .END \# .MAC LC END \c . tr aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz . tr ŕ\[`a] . tr â\[^a] . tr á\['a] . tr ä\[:a] . tr ĺ\[oa] . tr ă\[~a] . tr ć\[ae] . tr č\[`e] . tr ę\[^e] . tr é\['e] . tr ë\[:e] . tr ě\[`i] . tr î\[^i] . tr í\['i] . tr ď\[:i] . tr ň\[`o] . tr ô\[^o] . tr ó\['o] . tr ö\[:o] . tr ő\[~o] . tr ř\[/o] . tr ů\[`u] . tr ű\[^u] . tr ú\['u] . tr ü\[:u] . tr ç\[,c] . tr đ\[Sd] . tr ń\[~n] . tr ţ\[Tp] . tr ý\['y] . tr ˙\[:y] . rr #CAPS_ON .END \# \# SIZESPECS \# --------- \# Argument: \# \# Function: \# Gets cap-height, x-height, and descender depth of the \# current font at the current point size. \# *Notes: \# The routine is diverted so it remains invisible to output. \# .MAC SIZESPECS END . if '\\n[.z]'FLOAT*DIV' \ . if \\n[dn] .nr saved-dn \\n[dn] . di TYPESIZE E\\R'#CAP_HEIGHT \\n[.cht]' e\\R'#X_HEIGHT \\n[.cht]' y\\R'#DESCENDER \\n[.cdp]' . br . ds $CAP_HEIGHT \\n[#CAP_HEIGHT]u . ds $X_HEIGHT \\n[#X_HEIGHT]u . ds $DESCENDER \\n[#DESCENDER]u . di . if '\\n[.z]'FLOAT*DIV' \ . nr dn \\n[saved-dn] .END \# \# ===================================================================== \# \# +++TYPESETTING ALIASES+++ \# .ALIAS ADD_SPACE ALD .ALIAS CENTRE CENTER .ALIAS COLOUR COLOR .ALIAS COMMENT SILENT .ALIAS CONDENSE CONDENSE_OR_EXTEND .ALIAS EXTEND CONDENSE_OR_EXTEND .ALIAS FAM FAMILY .ALIAS FONT FT .ALIAS HYPHENATE HY .ALIAS HYPHENATION HY .ALIAS HYSET HY_SET .ALIAS IBQ IBX .ALIAS ILQ ILX .ALIAS IQ IX .ALIAS IRQ IRX .ALIAS LIG LIGATURES .ALIAS NEWCOLOUR NEWCOLOR .ALIAS PADMARKER PAD_MARKER .ALIAS SP ALD .ALIAS SPACE ALD .ALIAS TABSET TAB_SET .ALIAS TB TAB .ALIAS UNDERSCORE_2 UNDERSCORE2 .ALIAS XCOLOUR XCOLOR .ALIAS PDF_LINK_COLOUR PDF_LINK_COLOR .ALIAS AUTO_TOC_RELOCATE AUTO_RELOCATE_TOC \# \# ==================================================================== \# \# DOCUMENT PROCESSING MACROS, STRINGS AND ALIASES \# =============================================== \# \# DOC_MACRO_ERROR \# ---------- \# *Arguments: \# None. \# *Function: \# Warning message if DOC_ called before START. \# .MAC DOC_MACRO_ERROR END . if '\\$1'DOC_L_MARGIN' .ds $REPLACEMENT L_MARGIN . if '\\$1'DOC_R_MARGIN' .ds $REPLACEMENT R_MARGIN . if '\\$1'DOC_LINE_LENGTH' .ds $REPLACEMENT LL . if '\\$1'DOC_FAMILY' .ds $REPLACEMENT "FAMILY or FAM . if '\\$1'DOC_PT_SIZE' .ds $REPLACEMENT PT_SIZE . if '\\$1'DOC_LEAD' .ds $REPLACEMENT LS . if '\\$1'DOC_QUAD' .ds $REPLACEMENT QUAD . tm1 "[mom]: \\$1 at line \\n[.c] of '\\n[.F]' should not be used before START. . tm1 " Use \\*[$REPLACEMENT] instead. . ab Aborting. .END \# \# +++PAGE DIMENSIONS+++ \# \# PAPER SIZE \# ---------- \# *Arguments: \# LETTER | LEGAL | STATEMENT | TABLOID | LEDGER | FOLIO | QUARTO | 10x14 | EXECUTIVE | A3 | A4 | A5 | B4 | B5 \# *Function: \# Sets up dimensions for different paper sizes. \# .MAC PAPER END . ds $PAPER \\$1 . if '\\*[$PAPER]'LETTER' \{\ . PAGEWIDTH 8.5i . PAGELENGTH 11i . \} . if '\\*[$PAPER]'LEGAL' \{\ . PAGEWIDTH 8.5i . PAGELENGTH 14i . \} . if '\\*[$PAPER]'STATEMENT' \{\ . PAGEWIDTH 5.5i . PAGELENGTH 8.5i . \} . if '\\*[$PAPER]'TABLOID' \{\ . PAGEWIDTH 11i . PAGELENGTH 17i . \} . if '\\*[$PAPER]'LEDGER' \{\ . PAGEWIDTH 17i . PAGELENGTH 11i . \} . if '\\*[$PAPER]'FOLIO' \{\ . PAGEWIDTH 8.5i . PAGELENGTH 13i . \} . if '\\*[$PAPER]'QUARTO' \{\ . PAGEWIDTH 610p . PAGELENGTH 780p . \} . if '\\*[$PAPER]'10x14' \{\ . PAGEWIDTH 10i . PAGELENGTH 14i . \} . if '\\*[$PAPER]'EXECUTIVE' \{\ . PAGEWIDTH 7.25i . PAGELENGTH 10.5i . \} . if '\\*[$PAPER]'A3' \{\ . PAGEWIDTH 842p . PAGELENGTH 1190p . \} . if '\\*[$PAPER]'A4' \{\ . PAGEWIDTH 595p . PAGELENGTH 842p . \} . if '\\*[$PAPER]'A5' \{\ . PAGEWIDTH 421p . PAGELENGTH 595p . \} . if '\\*[$PAPER]'B4' \{\ . PAGEWIDTH 709p . PAGELENGTH 1002p . \} . if '\\*[$PAPER]'B5' \{\ . PAGEWIDTH 501p . PAGELENGTH 709p . \} . if !r#L_MARGIN .L_MARGIN \\n[.o] . if !r#R_MARGIN .R_MARGIN 1i .END \# \# ==================================================================== \# \# +++PRINTSTYLE -- TYPEWRITE OR TYPESET+++ \# \# PRINTSTYLE \# ---------- \# *Arguments: \# TYPESET | TYPEWRITE [SINGLESPACE] \# *Function: \# Sets type specs for typewriter-style or typeset output. \# *Notes: \# Number registers: TYPEWRITE=1, TYPESET=2. \# .MAC PRINTSTYLE END . if !\\n[#COLLATE]=1 \{\ . if !d$PAPER .PAPER LETTER . if '\\$1'TYPEWRITE' \{\ . nr #PRINT_STYLE 1 . if !\\n[#DOC_TYPE]=4 .L_MARGIN 6P . if !\\n[#DOC_TYPE]=4 .R_MARGIN 6P . ds $TYPEWRITER_FAM C . ds $TYPEWRITER_PS 12 . TYPEWRITER . color 0 . ie '\\$2'SINGLESPACE' \{\ . nr #SINGLE_SPACE 1 . vs 12 . ie \\n[#DOC_TYPE]=4 .nr #FOOTER_ADJ \\n[.v] . el .nr #FOOTER_ADJ \\n[.v]*2 . nr #ORIGINAL_DOC_LEAD \\n[.v] . \} . el \{\ . if !\\n[#DOC_TYPE]=4 \{\ . vs 24 . nr #FOOTER_ADJ \\n[.v] . nr #ORIGINAL_DOC_LEAD \\n[.v] . \} . \} . QUAD L . HY OFF . SMARTQUOTES OFF . if !\\n[#PP_INDENT] .nr #PP_INDENT 3P . HDRFTR_RIGHT_CAPS . nr #BOLDER_UNITS 0 . nr #CONDENSE 0 . nr #EXTEND 0 . if !\\n[#ITALIC_MEANS_ITALIC] .rm IT . rm BD . rm BDI . if !\\n[#ITALIC_MEANS_ITALIC] .rm PREV . if !\\n[#SLANT_MEANS_SLANT] .UNDERLINE_SLANT . if !\\n[#ITALIC_MEANS_ITALIC] .UNDERLINE_ITALIC . if !\\n[#UNDERLINE_QUOTES] .UNDERLINE_QUOTES . nr #IGNORE_COLUMNS 1 . nr #RULE_WEIGHT 500 . char \[em] -- . tr `' . tr \[lq]" . tr \[rq]" . \} . if '\\$1'TYPESET' \{\ . nr #PRINT_STYLE 2 . if !\\n[#DOC_TYPE]=4 .L_MARGIN 6P . if !\\n[#DOC_TYPE]=4 .R_MARGIN 6P . FAMILY T . FT R . if !\\n[#DOC_TYPE]=4 .ps 12.5 . if !\\n[#DOC_TYPE]=4 .vs 16 .\" In DEFAULTS, TRAPS is run with this leading, so we need a register to .\" hold it for use with the .sp in FOOTER . nr #FOOTER_ADJ 12000 . JUSTIFY . HY . HY_SET 2 36p 1p . KERN . LIG . SS 0 . SMARTQUOTES . if !\\n[#PP_INDENT] \{\ . in 2m \"Set indent . nr #PP_INDENT \\n[.i] \"Read into #PP_INDENT . in 0 \"Remove indent . \} . HDRFTR_RIGHT_CAPS . rr #IGNORE_COLUMNS . \} .\" Set up default style for nine levels of headings . nr #HD_LEVEL 0 1 \" loop step . nr #LOOP 9 \" loop count . while \\n+[#HD_LEVEL]<=\\n[#LOOP] \{\ . HEADING_STYLE \\n[#HD_LEVEL] \ FONT B \ SIZE +0 \ QUAD L \ COLOR black .\" Set up default style for nine levels of TOC headings . TOC_ENTRY_STYLE \\n[#HD_LEVEL] \ FONT R \ SIZE +0 \ COLOR black . \} .\" Set up decreasing sizes for headings levels 1 - 3, starting at +3 . nr #HD_LEVEL 0 1 \" loop step . nr #LOOP 3 \" loop count . nr #HD_SIZE 4 1 . while \\n+[#HD_LEVEL]<=\\n[#LOOP] \{\ . nr #HD_SIZE_CHANGE \\n-[#HD_SIZE] . ds $HEAD_\\n[#HD_LEVEL]_SIZE +\\n[#HD_SIZE_CHANGE] . \} .\" Set up TOC title style . TOC_TITLE_STYLE \ FONT R \ SIZE +0 \ INDENT 0 . \} .END \# \# PRINTSTYLE TYPEWRITE control. \# .MAC TYPEWRITER_FAMILY END . ds $TYPEWRITER_FAM \\$1 .END \# .ALIAS TYPEWRITER_FAM TYPEWRITER_FAMILY \# .MAC TYPEWRITER_SIZE END . ds $TYPEWRITER_PS \\$1 .END \# .MAC TYPEWRITER END . fam \\*[$TYPEWRITER_FAM] . ft R . ps \\*[$TYPEWRITER_PS] .END \# \# ITALIC MEANS ITALIC \# ------------------- \# *Argument: \# \# *Function: \# Instructs TYPEWRITE to treat italics as italics, whether \# invoked via control lines or inline. \# *Notes: \# ITALIC_MEANS_ITALIC and UNDERLINE_ITALIC are mututally exclusive, \# hence invoking the one automatically turns off the other. \# .MAC ITALIC_MEANS_ITALIC END . if \\n[#PRINT_STYLE]=1 \{\ . nr #ITALIC_MEANS_ITALIC 1 . rr #UNDERLINE_ITALIC . rm ROM . rm IT . rm PREV . ds ROM \Ef[R] . ds IT \Ef[I] . ds PREV \Ef[] . \} .END \# \# UNDERLINE ITALIC \# ---------------- \# *Argument: \# \# *Function: \# Instructs TYPEWRITE to underline italics, whether invoked \# via control lines or inline. \# *Notes: \# UNDERLINE_ITALIC and ITALIC_MEANS_ITALIC are mututally exclusive, \# hence invoking the one automatically turns off the other. \# \# UNDERLINE_ITALIC is the default for TYPEWRITE. \# .MAC UNDERLINE_ITALIC END . if \\n[#PRINT_STYLE]=1 \{\ . nr #UNDERLINE_ITALIC 1 . rr #ITALIC_MEANS_ITALIC . rm ROM . rm IT . rm PREV . ds ROM \E*[ULX] . ds IT \E*[UL] . ds PREV \E*[ULX] . \} .END \# \# UNDERLINE SLANT \# --------------- \# *Arguments: \# | \# *Function: \# Instructs TYPEWRITE to underline occurrences of \*[SLANT], or \# turns feature off. \# *Notes: \# Users may want \*[SLANT] to mean slant in TYPEWRITE, although \# most of the time, \*[SLANT] most likely means the user wanted \# italic but didn't have it, ergo the need to tell TYPEWRITE to \# treat \*[SLANT] as italic (i.e. underlined). \# \# UNDERLINE_SLANT and SLANT_MEANS_SLANT are mututally exclusive, \# hence invoking the one automatically turns off the other. \# \# UNDERLINE_SLANT is the default for TYPEWRITE. \# .MAC UNDERLINE_SLANT END . if \\n[#PRINT_STYLE]=1 \{\ . rr #SLANT_MEANS_SLANT . nr #UNDERLINE_SLANT 1 . rm SLANT . rm SLANTX . ds SLANT \ER'#SLANT_ON 1'\E*[UL] . ds SLANTX \ER'#SLANT_ON 0'\E*[ULX] . \} .END \# .MAC SLANT_MEANS_SLANT END . if \\n[#PRINT_STYLE]=1 \{\ . rr #UNDERLINE_SLANT . nr #SLANT_MEANS_SLANT 1 . rm SLANT . rm SLANTX . ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' . ds SLANTX \ER'#SLANT_ON 0'\ES'0' . \} .END \# .MAC IGNORE_COLUMNS END . if \\n[#PRINT_STYLE]=1 .nr #NO_COLUMNS 1 .END \# \# ==================================================================== \# \# +++COPY STYLE -- DRAFT OR FINAL+++ \# \# COPY STYLE \# ---------- \# *Arguments: \# DRAFT | FINAL \# *Function: \# Sets registers that are used to determine what to put \# in the default header, and how to number pages. \# *Notes: \# DOCTYPE must come before COPYSTYLE. \# .MAC COPYSTYLE END . ds $COPY_STYLE \\$1 . if '\\*[$COPY_STYLE]'DRAFT' \{\ . nr #COPY_STYLE 1 . if !d$DRAFT .DRAFT 1 . \} . if '\\*[$COPY_STYLE]'FINAL' .nr #COPY_STYLE 2 . if !d$CHAPTER_STRING .CHAPTER_STRING "Chapter" . if !d$DRAFT_STRING .DRAFT_STRING "Draft" . if !d$REVISION_STRING .REVISION_STRING "Rev." .\" Default . if \\n[#DOC_TYPE]=1 \{\ . ie \\n[#COPY_STYLE]=1 \{\ . ie \\n[#PAGENUM_STYLE_SET] .PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el .PAGENUM_STYLE roman . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie \\n[#DRAFT_WITH_PAGENUM] .ds $HDRFTR_CENTER . el \{\ . ie '\\*[$REVISION]'' \{\ . ds $HDRFTR_CENTER \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . \} . \} . el \{\ . ie \\n[#PAGENUM_STYLE_SET] .PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el .PAGENUM_STYLE DIGIT . if \\n[#DRAFT_WITH_PAGENUM] .rr #DRAFT_WITH_PAGENUM . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ds $HDRFTR_CENTER . rr #USER_DEF_HDRFTR_CENTER . \} . \} . \} .\" Chapter . if \\n[#DOC_TYPE]=2 \{\ .\" Copystyle DRAFT . ie \\n[#COPY_STYLE]=1 \{\ . ie \\n[#PAGENUM_STYLE_SET] \ . PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el \ . PAGENUM_STYLE roman . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie \\n[#DRAFT_WITH_PAGENUM] \{\ . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . \} . el \{\ . ie '\\*[$REVISION]'' \{\ . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie '\\*[$DRAFT]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . \} . el \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING], \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . \} . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie '\\*[$DRAFT]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE_1], \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . \} . el \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING] \\*[$CHAPTER], \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . \} . \} . \} . el \{\ . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . el \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING], \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . el \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING] \\*[$CHAPTER], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING] \\*[$CHAPTER], \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . \} . \} . \} . \} . \} .\" Copystyle FINAL . el \{\ . if \\n[#DRAFT_WITH_PAGENUM] .rr #DRAFT_WITH_PAGENUM . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie \\n[#PAGENUM_STYLE_SET] \ . PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el .PAGENUM_STYLE DIGIT . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el \ . ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el \ . ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . \} . \} . \} .\" Named . if \\n[#DOC_TYPE]=3 \{\ . ie \\n[#COPY_STYLE]=1 \{\ . ie \\n[#PAGENUM_STYLE_SET] .PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el .PAGENUM_STYLE roman . ie \\n[#DRAFT_WITH_PAGENUM] \ . ds $HDRFTR_CENTER \\*[$DOC_TYPE] . el \{\ . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie '\\*[$REVISION]'' \{\ . ie '\\*[$DRAFT]'' \ . ds $HDRFTR_CENTER \\*[$DOC_TYPE] . el \{\ . ds $HDRFTR_CENTER \ \\*[$DOC_TYPE], \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . \} . el \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$DOC_TYPE], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$DOC_TYPE], \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . \} . \} . \} . el \{\ . if \\n[#DRAFT_WITH_PAGENUM] .rr #DRAFT_WITH_PAGENUM . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie \\n[#PAGENUM_STYLE_SET] .PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el .PAGENUM_STYLE DIGIT . ds $HDRFTR_CENTER \\*[$DOC_TYPE] . \} . \} . \} .END \# \# ==================================================================== \# \# +++COLLECT DOC INFO -- STRINGS AND REGISTERS FOR REFERENCE MACROS+++ \# \# *Arguments: \# various string/register arguments \# *Function: \# Collect information about documents. \# .MAC DOCTITLE END . rr #DOCTITLE_NUM . nr #DOCTITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#DOCTITLE_NUM] \{\ . ds $DOC_TITLE_\\n+[#DOCTITLE_NUM] \\$\\n[#DOCTITLE_NUM] . \} . ds $DOC_TITLE \\$* . PDF_TITLE \\*[$DOC_TITLE] .END \# .MAC TITLE END \"Document title . ie \\n[#NUM_ARGS]=0 \{\ . if \\n[#TITLE_NUM] \{\ . nr #ITEM 0 1 . while \\n[#TITLE_NUM]>\\n[#ITEM] \{\ . rm $TITLE_\\n+[#ITEM] . \} . rr #TITLE_NUM . \} . \} . el \{\ . nr #TITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#TITLE_NUM] \{\ . ds $TITLE_\\n+[#TITLE_NUM] \\$\\n[#TITLE_NUM] . \} . ds $TITLE \\$* . \} .END \# .MAC SUBTITLE END \"Document sub-title . ie \\n[#NUM_ARGS]=0 \{\ . if \\n[#SUBTITLE_NUM] \{\ . nr #ITEM 0 1 . while \\n[#SUBTITLE_NUM]>\\n[#ITEM] \{\ . rm $SUBTITLE_\\n+[#ITEM] . \} . rr #SUBTITLE_NUM . rm $SUBTITLE . \} . \} . el \{\ . if '\\$1'DOC_COVER' \{\ . shift . nr #SUBTITLE_DOC_COVER_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#SUBTITLE_DOC_COVER_NUM] \{\ . ds $SUBTITLE_DOC_COVER_\\n+[#SUBTITLE_DOC_COVER_NUM] \ \\$\\n[#SUBTITLE_DOC_COVER_NUM] . \} . return . \} . if '\\$1'COVER' \{\ . shift . nr #SUBTITLE_COVER_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#SUBTITLE_COVER_NUM] \{\ . ds $SUBTITLE_COVER_\\n+[#SUBTITLE_COVER_NUM] \ \\$\\n[#SUBTITLE_COVER_NUM] . \} . return . \} . nr #SUBTITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#SUBTITLE_NUM] \{\ . ds $SUBTITLE_\\n+[#SUBTITLE_NUM] \\$\\n[#SUBTITLE_NUM] . \} . ds $SUBTITLE \\$* . \} .END \# .MAC CHAPTER END \"If document is a chapter, the chapter number . nr #CHAPTER_CALLED 1 . ds $CHAPTER \\$1 . if r #CH_NUM \ . if \B'\\*[$CHAPTER]' .nr #CH_NUM \\*[$CHAPTER] .END \# .MAC CHAPTER_TITLE END \" This defines what comes after Chapter # . ie \\n[#NUM_ARGS]=0 \{\ . if \\n[#CHAPTER_TITLE_NUM] \{\ . nr #ITEM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>\\n[#ITEM] \{\ . rm $CHAPTER_TITLE_\\n+[#ITEM] . \} . rr #CHAPTER_TITLE_NUM . rm $CHAPTER_TITLE . \} . \} . el \{\ . rr #CHAPTER_TITLE_NUM . nr #CHAPTER_TITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#CHAPTER_TITLE_NUM] \{\ . ds $CHAPTER_TITLE_\\n+[#CHAPTER_TITLE_NUM] \ \\$\\n[#CHAPTER_TITLE_NUM] . \} . ds $CHAPTER_TITLE \\$* . \} .END \# .MAC DRAFT END \"Draft number . ie '\\$1'' .ds $DRAFT . el .ds $DRAFT " \\$1 .END \# .MAC REVISION END \"Revision number . ds $REVISION \\$1 .END \# .MAC DRAFT_WITH_PAGENUMBER END \"Attach draft/revision strings to page number . nr #DRAFT_WITH_PAGENUM 1 .END \# .MAC AUTHOR END \"Author. Enclose all args fully in double quotes. . if '\\$1'DOC_COVER' \{\ . shift . nr #AUTHOR_DOCCOVER_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#AUTHOR_DOCCOVER_NUM] \{\ . ds $AUTHOR_DOCCOVER_\\n+[#AUTHOR_DOCCOVER_NUM] \ \\$\\n[#AUTHOR_DOCCOVER_NUM] . \} . return . \} . if '\\$1'COVER' \{\ . shift . nr #AUTHOR_COVER_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#AUTHOR_COVER_NUM] \{\ . ds $AUTHOR_COVER_\\n+[#AUTHOR_COVER_NUM] \\$\\n[#AUTHOR_COVER_NUM] . \} . return . \} . nr #AUTHOR_NUM 0 1 . rm $AUTHORS . while \\n[#NUM_ARGS]>\\n[#AUTHOR_NUM] \{\ . ds $AUTHOR_\\n+[#AUTHOR_NUM] \\$\\n[#AUTHOR_NUM] . as $AUTHORS \\*[$AUTHOR_\\n[#AUTHOR_NUM]], \" . \} . ds $AUTHOR \\*[$AUTHOR_1] . substring $AUTHORS 0 -3 . ds PDF_AUTHORS \\*[$AUTHORS] . pdfmomclean PDF_AUTHORS . nop \!x X ps:exec [/Author (\\*[PDF_AUTHORS]) /DOCINFO pdfmark .END \# .ALIAS EDITOR AUTHOR \# .MAC COPYRIGHT END \"For use on cover pages only . ie \\n[#NUM_ARGS]=1 \{\ . ds $COPYRIGHT \[co]\\$1 . rm $COPYRIGHT_DOCCOVER . rm $COPYRIGHT_COVER . \} . el \{\ . if '\\$1'DOC_COVER' .ds $COPYRIGHT_DOCCOVER \[co]\\$2 . if '\\$1'COVER' .ds $COPYRIGHT_COVER \[co]\\$2 . \} .END \# .MAC MISC END \"For use on cover pages only; enclose all args in double quotes . ie \\n[#NUM_ARGS]=0 \{\ . if \\n[#MISC_NUM] \{\ . nr #ITEM 0 1 . while \\n[#MISC_NUM]>\\n[#ITEM] \{\ . rm $MISC_\\n+[#ITEM] . \} . rr #MISC_NUM . rr #NUM_MISCS . \} . if \\n[#MISC_DOC_COVER_NUM] \{\ . nr #ITEM 0 1 . while \\n[#MISC_DOC_COVER_NUM]>\\n[#ITEM] \{\ . rm $MISC_DOC_COVER_\\n+[#ITEM] . \} . rr #MISC_DOC_COVER_NUM . rr #NUM_MISCS . \} . if \\n[#MISC_COVER_NUM] \{\ . nr #ITEM 0 1 . while \\n[#MISC_COVER_NUM]>\\n[#ITEM] \{\ . rm $MISC_COVER_\\n+[#ITEM] . \} . rr #MISC_COVER_NUM . rr #NUM_MISCS . \} . \} . el \{\ . if !'\\$1'DOC_COVER' \{\ . if !'\\$1'COVER' .nr #NEITHER 1 . \} . if !'\\$1'COVER' \{\ . if !'\\$1'DOC_COVER' .nr #NEITHER 1 . \} . if '\\$1'DOC_COVER' \{\ . shift . nr #MISC_DOC_COVER_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#MISC_DOC_COVER_NUM] \{\ . ds $MISC_DOC_COVER_\\n+[#MISC_DOC_COVER_NUM] \ \\$[\\n[#MISC_DOC_COVER_NUM]] . \} . nr #NUM_MISCS_DOCCOVER \\n[#NUM_ARGS] . \} . if '\\$1'COVER' \{\ . shift . nr #MISC_COVER_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#MISC_COVER_NUM] \{\ . ds $MISC_COVER_\\n+[#MISC_COVER_NUM] \\$[\\n[#MISC_COVER_NUM]] . \} . nr #NUM_MISCS_COVER \\n[#NUM_ARGS] . \} . if \\n[#NEITHER]=1 \{\ . nr #MISC_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#MISC_NUM] \{\ . ds $MISC_\\n+[#MISC_NUM] \\$[\\n[#MISC_NUM]] . \} . nr #NUM_MISCS \\n[#NUM_ARGS] . rr #NEITHER . \} . \} .END \# .MAC PAGENUMBER END \"Page # that appears on page one. . nr #n%_AT_PAGENUM_SET \\n% . nr #PAGE_NUM_ADJ \\$1-\\n[#n%_AT_PAGENUM_SET] . rr #n%_AT_PAGENUM_SET . nr #PAGE_NUM_SET 1 .END \# \# ==================================================================== \# \# +++TYPE OF DOCUMENT+++ \# \# DOCUMENT TYPE \# ------------- \# *Argument: \# DEFAULT | CHAPTER | NAMED " | LETTER \# *Function: \# Creates strings and sets registers for document types. \# *Notes: \# Number registers: DEFAULT=1, CHAPTER=2, NAMED=3, LETTER=4 \# .MAC DOCTYPE END . if '\\$1'DEFAULT' .nr #DOC_TYPE 1 . if '\\$1'CHAPTER' .nr #DOC_TYPE 2 . if '\\$1'NAMED' \{\ . ds $DOC_TYPE \\$2 . nr #DOC_TYPE 3 . \} . if '\\$1'LETTER' \{\ . nr #DOC_TYPE 4 . L_MARGIN 1.125i . R_MARGIN 1.125i . ps 12 . vs 13.5 . nr #FOOTER_ADJ \\n[.v] . DOCHEADER OFF . PARA_INDENT 3m . INDENT_FIRST_PARAS . PARA_SPACE . ds $SUITE \En[#SUITE] . HEADER_MARGIN 3P+6p . HEADER_GAP 3P . FOOTERS . FOOTER_RULE OFF . FOOTER_LEFT "" . FOOTER_CENTER "" . FOOTER_RIGHT_SIZE +0 . FOOTER_RIGHT "\&.../\E*[$SUITE] . FOOTER_ON_FIRST_PAGE . em ALL_DONE . \} .END \# \# +++LETTER MACROS+++ \# \# First, create a register to hold incrementing numbers to be \# appended to LETTERHEAD. \# .nr #FIELD 0 1 \# \# DATE \# ---- \# *Arguments: \# \# *Function: \# Stores date (entered on the line after .DATE) in diversion \# LETTERHEAD \# .MAC DATE END . if !'\\n[.z]'' .di . di LETTERHEAD\\n+[#FIELD] . ie \\n[#FIELD]=1 \{\ . nr #DATE_FIRST 1 . RIGHT . \} . el .LEFT .END \# \# TO \# -- \# *Arguments: \# \# *Function: \# Stores addressee address (entered on the line after .TO) in \# diversion LETTERHEAD \# .MAC TO END . if !'\\n[.z]'' .di . di LETTERHEAD\\n+[#FIELD] . LEFT .END \# \# FROM \# ---- \# *Arguments: \# \# *Function: \# Stores addresser address (entered on the line after .FROM) in \# diversion LETTERHEAD \# .MAC FROM END . if !'\\n[.z]'' .di . di LETTERHEAD\\n+[#FIELD] . LEFT .END \# \# GREETING \# -------- \# *Arguments: \# \# *Function: \# Stores greeting (entered on the line after .GREETING) in \# diversion LETTERHEAD \# .MAC GREETING END . if !'\\n[.z]'' .di . di LETTERHEAD\\n+[#FIELD] . LEFT .END \# \# CLOSING \# ------- \# *Arguments: \# \# *Function: \# Stores greeting in diversion CLOSING. \# .MAC CLOSING END . if '\\*[$SIG_SPACE]'' .ds $SIG_SPACE 3v . ie ( (2v+\\*[$SIG_SPACE]) > \\n[.t] ) \{\ . ch HEADER . ch FOOTER . br . tm1 "[mom]: Insufficient room for \\$0 and signature line. . ab Aborting '\\n[.F]'. . \} . el .br . nr #CLOSING 1 . di CLOSING_TEXT .END \# \# CLOSING INDENT \# -------------- \# *Argument: \# \# *Function: \# Defines string $CLOSE_INDENT for use in macro, ALL_DONE. \# .MAC CLOSING_INDENT END . ds $CLOSE_INDENT \\$1 .END \# \# SIGNATURE_SPACE \# --------------- \# *Argument: \# \# *Function: \# Defines string $SIG_SPACE for use in macro, ALL_DONE. \# .MAC SIGNATURE_SPACE END . ds $SIG_SPACE \\$1 .END \# \# NO SUITE \# -------- \# *Arguments: \# \# *Function: \# Redefines $FOOTER_RIGHT to blank so that a suite number doesn't \# appear at the bottom of letter pages. \# .MAC NO_SUITE END . FOOTER_RIGHT "" .END \# \# ==================================================================== \# \# +++DEFAULTS+++ \# \# TYPE-STYLE CONTROL MACROS \# ------------------------- \# The control macros for family, font, size, quad and color are here \# grouped together. Each (e.g. _FAMILY or _FONT) tests for a calling \# alias before performing the action(s) appropriate to the calling \# macro. Defaults for all these guys are set in DEFAULTS, and listed \# in the "Control Macros" section of the documentation pertinent to \# the macro whose style is to be changed. \# .MAC _FAMILY END . if '\\$0'AUTHOR_FAMILY' \ . ds $AUTHOR_FAM \\$1 . if '\\$0'BIBLIOGRAPHY_FAMILY' \ . ds $BIB_FAM \\$1 . if '\\$0'BIBLIOGRAPHY_STRING_FAMILY' \ . ds $BIB_STRING_FAM \\$1 . if '\\$0'BLOCKQUOTE_FAMILY' \ . ds $BQUOTE_FAM \\$1 . if '\\$0'CITATION_FAMILY' \ . ds $BQUOTE_FAM \\$1 . if '\\$0'CITE_FAMILY' \ . ds $BQUOTE_FAM \\$1 . if '\\$0'CHAPTER_TITLE_FAMILY' \ . ds $CHAPTER_TITLE_FAM \\$1 . if '\\$0'COVER_AUTHOR_FAMILY' \ . ds $COVER_AUTHOR_FAM \\$1 . if '\\$0'COVER_CHAPTER_TITLE_FAMILY' \ . ds $COVER_CHAPTER_TITLE_FAM \\$1 . if '\\$0'COVER_COPYRIGHT_FAMILY' \ . ds $COVER_COPYRIGHT_FAM \\$1 . if '\\$0'COVER_DOCTYPE_FAMILY' \ . ds $COVER_DOCTYPE_FAM \\$1 . if '\\$0'COVER_FAMILY' \ . ds $COVER_FAM \\$1 . if '\\$0'COVER_MISC_FAMILY' \ . ds $COVER_MISC_FAM \\$1 . if '\\$0'COVER_SUBTITLE_FAMILY' \ . ds $COVER_SUBTITLE_FAM \\$1 . if '\\$0'COVER_TITLE_FAMILY' \ . ds $COVER_TITLE_FAM \\$1 . if '\\$0'DOC_COVER_AUTHOR_FAMILY' \ . ds $DOC_COVER_AUTHOR_FAM \\$1 . if '\\$0'DOC_COVER_CHAPTER_TITLE_FAMILY' \ . ds $DOC_COVER_CHAPTER_TITLE_FAM \\$1 . if '\\$0'DOC_COVER_COPYRIGHT_FAMILY' \ . ds $DOC_COVER_COPYRIGHT_FAM \\$1 . if '\\$0'DOC_COVER_DOCTYPE_FAMILY' \ . ds $DOC_COVER_DOCTYPE_FAM \\$1 . if '\\$0'DOC_COVER_FAMILY' \ . ds $DOC_COVER_FAM \\$1 . if '\\$0'DOC_COVER_MISC_FAMILY' \ . ds $DOC_COVER_MISC_FAM \\$1 . if '\\$0'DOC_COVER_SUBTITLE_FAMILY' \ . ds $DOC_COVER_SUBTITLE_FAM \\$1 . if '\\$0'DOC_COVER_TITLE_FAMILY' \ . ds $DOC_COVER_TITLE_FAM \\$1 . if '\\$0'DOCHEADER_FAMILY' \ . ds $DOCHEADER_FAM \\$1 . if '\\$0'DOCTYPE_FAMILY' \ . ds $DOCTYPE_FAM \\$1 . if '\\$0'ENDNOTE_FAMILY' \ . ds $EN_FAM \\$1 . if '\\$0'ENDNOTE_NUMBER_FAMILY' \ . ds $EN_NUMBER_FAM \\$1 . if '\\$0'ENDNOTE_LINENUMBER_FAMILY' \ . ds $EN_LN_FAM \\$1 . if '\\$0'ENDNOTE_STRING_FAMILY' \ . ds $EN_STRING_FAM \\$1 . if '\\$0'ENDNOTE_TITLE_FAMILY' \ . ds $EN_TITLE_FAM \\$1 . if '\\$0'EPIGRAPH_FAMILY' \ . ds $EPI_FAM \\$1 . if '\\$0'FOOTNOTE_FAMILY' \ . ds $FN_FAM \\$1 . if '\\$0'HDRFTR_CENTER_FAMILY' \ . ds $HDRFTR_CENTER_FAM \\$1 . if '\\$0'HDRFTR_FAMILY' \{\ . ds $HDRFTR_FAM \\$1 . ds $HDRFTR_LEFT_FAM \\$1 . ds $HDRFTR_CENTER_FAM \\$1 . ds $HDRFTR_RIGHT_FAM \\$1 . \} . if '\\$0'HDRFTR_LEFT_FAMILY' \ . ds $HDRFTR_LEFT_FAM \\$1 . if '\\$0'HDRFTR_RIGHT_FAMILY' \ . ds $HDRFTR_RIGHT_FAM \\$1 . if '\\$0'LINENUMBER_FAMILY' \ . ds $LN_FAM \\$1 . if '\\$0'PAGENUM_FAMILY' \ . ds $PAGE_NUM_FAM \\$1 . if '\\$0'QUOTE_FAMILY' \ . ds $QUOTE_FAM \\$1 . if '\\$0'SUBTITLE_FAMILY' \ . ds $SUBTITLE_FAM \\$1 . if '\\$0'TITLE_FAMILY' \ . ds $TITLE_FAM \\$1 . if '\\$0'TOC_FAMILY' \ . ds $TOC_FAM \\$1 . if '\\$0'TOC_FAM' \ . ds $TOC_FAM \\$1 . if '\\$0'TOC_HEADER_FAMILY' \ . ds $TOC_HEADER_FAM \\$1 . if '\\$0'TOC_PN_FAMILY' \ . ds $TOC_PN_FAM \\$1 .END \# .MAC _FONT END . if '\\$0'AUTHOR_FONT' \ . ds $AUTHOR_FT \\$1 . if '\\$0'BIBLIOGRAPHY_FONT' \ . ds $BIB_FT \\$1 . if '\\$0'BIBLIOGRAPHY_STRING_FONT' \ . ds $BIB_STRING_FT \\$1 . if '\\$0'BLOCKQUOTE_FONT' \ . ds $BQUOTE_FT \\$1 . if '\\$0'CITATION_FONT' \ . ds $BQUOTE_FT \\$1 . if '\\$0'CITE_FONT' \ . ds $BQUOTE_FT \\$1 . if '\\$0'CHAPTER_TITLE_FONT' \ . ds $CHAPTER_TITLE_FT \\$1 . if '\\$0'COVER_AUTHOR_FONT' \ . ds $COVER_AUTHOR_FT \\$1 . if '\\$0'COVER_CHAPTER_TITLE_FONT' \ . ds $COVER_CHAPTER_TITLE_FT \\$1 . if '\\$0'COVER_COPYRIGHT_FONT' \ . ds $COVER_COPYRIGHT_FT \\$1 . if '\\$0'COVER_DOCTYPE_FONT' \ . ds $COVER_DOCTYPE_FT \\$1 . if '\\$0'COVER_MISC_FONT' \ . ds $COVER_MISC_FT \\$1 . if '\\$0'COVER_SUBTITLE_FONT' \ . ds $COVER_SUBTITLE_FT \\$1 . if '\\$0'COVER_TITLE_FONT' \ . ds $COVER_TITLE_FT \\$1 . if '\\$0'DOC_COVER_AUTHOR_FONT' \ . ds $DOC_COVER_AUTHOR_FT \\$1 . if '\\$0'DOC_COVER_CHAPTER_TITLE_FONT' \ . ds $DOC_COVER_CHAPTER_TITLE_FT \\$1 . if '\\$0'DOC_COVER_COPYRIGHT_FONT' \ . ds $DOC_COVER_COPYRIGHT_FT \\$1 . if '\\$0'DOC_COVER_DOCTYPE_FONT' \ . ds $DOC_COVER_DOCTYPE_FT \\$1 . if '\\$0'DOC_COVER_MISC_FONT' \ . ds $DOC_COVER_MISC_FT \\$1 . if '\\$0'DOC_COVER_SUBTITLE_FONT' \ . ds $DOC_COVER_SUBTITLE_FT \\$1 . if '\\$0'DOC_COVER_TITLE_FONT' \ . ds $DOC_COVER_TITLE_FT \\$1 . if '\\$0'DOCTYPE_FONT' \ . ds $DOCTYPE_FT \\$1 . if '\\$0'ENDNOTE_FONT' \ . ds $EN_FT \\$1 . if '\\$0'ENDNOTE_NUMBER_FONT' \ . ds $EN_NUMBER_FT \\$1 . if '\\$0'ENDNOTE_LINENUMBER_FONT' \ . ds $EN_LN_FT \\$1 . if '\\$0'ENDNOTE_STRING_FONT' \ . ds $EN_STRING_FT \\$1 . if '\\$0'ENDNOTE_TITLE_FONT' \ . ds $EN_TITLE_FT \\$1 . if '\\$0'EPIGRAPH_FONT' \ . ds $EPI_FT \\$1 . if '\\$0'FOOTNOTE_FONT' \ . ds $FN_FT \\$1 . if '\\$0'HDRFTR_CENTER_FONT' \ . ds $HDRFTR_CENTER_FT \\$1 . if '\\$0'HDRFTR_LEFT_FONT' \ . ds $HDRFTR_LEFT_FT \\$1 . if '\\$0'HDRFTR_RIGHT_FONT' \ . ds $HDRFTR_RIGHT_FT \\$1 . if '\\$0'LINENUMBER_FONT' \ . ds $LN_FT \\$1 . if '\\$0'PAGENUM_FONT' \ . ds $PAGE_NUM_FT \\$1 . if '\\$0'QUOTE_FONT' \ . ds $QUOTE_FT \\$1 . if '\\$0'SUBTITLE_FONT' \ . ds $SUBTITLE_FT \\$1 . if '\\$0'TITLE_FONT' \ . ds $TITLE_FT \\$1 . if '\\$0'TOC_HEADER_FONT' \ . ds $TOC_HEADER_FT \\$1 . if '\\$0'TOC_PN_FONT' \ . ds $TOC_PN_FT \\$1 .END \# .MAC _SIZE END . if '\\$0'AUTHOR_SIZE' \ . ds $AUTHOR_SIZE_CHANGE \\$1 . if '\\$0'BIBLIOGRAPHY_STRING_SIZE' \ . ds $BIB_STRING_SIZE_CHANGE \\$1 . if '\\$0'BLOCKQUOTE_SIZE' \ . ds $BQUOTE_SIZE_CHANGE \\$1 . if '\\$0'CITATION_SIZE' \ . ds $BQUOTE_SIZE_CHANGE \\$1 . if '\\$0'CITE_SIZE' \ . ds $BQUOTE_SIZE_CHANGE \\$1 . if '\\$0'CHAPTER_TITLE_SIZE' \ . ds $CHAPTER_TITLE_SIZE_CHANGE \\$1 . if '\\$0'COVER_AUTHOR_SIZE' \ . ds $COVER_AUTHOR_SIZE_CHANGE \\$1 . if '\\$0'COVER_CHAPTER_TITLE_SIZE' \ . ds $COVER_CHAPTER_TITLE_SIZE_CHANGE \\$1 . if '\\$0'COVER_COPYRIGHT_SIZE' \ . ds $COVER_COPYRIGHT_SIZE_CHANGE \\$1 . if '\\$0'COVER_DOCTYPE_SIZE' \ . ds $COVER_DOCTYPE_SIZE_CHANGE \\$1 . if '\\$0'COVER_MISC_SIZE' \ . ds $COVER_MISC_SIZE_CHANGE \\$1 . if '\\$0'COVER_SUBTITLE_SIZE' \ . ds $COVER_SUBTITLE_SIZE_CHANGE \\$1 . if '\\$0'COVER_TITLE_SIZE' \ . ds $COVER_TITLE_SIZE_CHANGE \\$1 . if '\\$0'DOC_COVER_AUTHOR_SIZE' \ . ds $DOC_COVER_AUTHOR_SIZE_CHANGE \\$1 . if '\\$0'DOC_COVER_CHAPTER_TITLE_SIZE' \ . ds $DOC_COVER_CHAPTER_TITLE_SIZE_CHANGE \\$1 . if '\\$0'DOC_COVER_COPYRIGHT_SIZE' \ . ds $DOC_COVER_COPYRIGHT_SIZE_CHANGE \\$1 . if '\\$0'DOC_COVER_DOCTYPE_SIZE' \ . ds $DOC_COVER_DOCTYPE_SIZE_CHANGE \\$1 . if '\\$0'DOC_COVER_MISC_SIZE' \ . ds $DOC_COVER_MISC_SIZE_CHANGE \\$1 . if '\\$0'DOC_COVER_SUBTITLE_SIZE' \ . ds $DOC_COVER_SUBTITLE_SIZE_CHANGE \\$1 . if '\\$0'DOC_COVER_TITLE_SIZE' \ . ds $DOC_COVER_TITLE_SIZE_CHANGE \\$1 . if '\\$0'DOCTYPE_SIZE' \ . ds $DOCTYPE_SIZE_CHANGE \\$1 . if '\\$0'ENDNOTE_NUMBER_SIZE' \ . ds $EN_NUMBER_SIZE_CHANGE \\$1 . if '\\$0'ENDNOTE_LINENUMBER_SIZE' \ . ds $EN_LN_SIZE_CHANGE \\$1 . if '\\$0'ENDNOTE_STRING_SIZE' \ . ds $EN_STRING_SIZE_CHANGE \\$1 . if '\\$0'ENDNOTE_TITLE_SIZE' \ . ds $EN_TITLE_SIZE_CHANGE \\$1 . if '\\$0'EPIGRAPH_SIZE' \ . ds $EPI_SIZE_CHANGE \\$1 . if '\\$0'FOOTNOTE_SIZE' \ . ds $FN_SIZE_CHANGE \\$1 . if '\\$0'HDRFTR_CENTER_SIZE' \ . ds $HDRFTR_CENTER_SIZE_CHANGE \\$1 . if '\\$0'HDRFTR_LEFT_SIZE' \ . ds $HDRFTR_LEFT_SIZE_CHANGE \\$1 . if '\\$0'HDRFTR_RIGHT_SIZE' \ . ds $HDRFTR_RIGHT_SIZE_CHANGE \\$1 . if '\\$0'HDRFTR_SIZE' \ . ds $HDRFTR_SIZE_CHANGE \\$1 . if '\\$0'LINENUMBER_SIZE' \ . ds $LN_SIZE_CHANGE \\$1 . if '\\$0'PAGENUM_SIZE' \ . ds $PAGE_NUM_SIZE_CHANGE \\$1 . if '\\$0'QUOTE_SIZE' \ . ds $QUOTE_SIZE_CHANGE \\$1 . if '\\$0'SUBTITLE_SIZE' \ . ds $SUBTITLE_SIZE_CHANGE \\$1 . if '\\$0'TITLE_SIZE' \ . ds $TITLE_SIZE_CHANGE \\$1 . if '\\$0'TOC_HEADER_SIZE' \ . ds $TOC_HEADER_SIZE_CHANGE \\$1 . if '\\$0'TOC_PN_SIZE' \ . ds $TOC_PN_SIZE_CHANGE \\$1 .END \# .MAC _COLOR END . if \\n[#PRINT_STYLE]=1 .return . if '\\$0'ATTRIBUTE_COLOR' \{\ . nr #ATTRIBUTE_COLOR 1 . ds $ATTRIBUTE_COLOR \\$1 . \} . if '\\$0'AUTHOR_COLOR' \{\ . nr #AUTHOR_COLOR 1 . ds $AUTHOR_COLOR \\$1 . \} . if '\\$0'BLOCKQUOTE_COLOR' \{\ . nr #BQUOTE_COLOR 1 . ds $BQUOTE_COLOR \\$1 . \} . if '\\$0'CITATION_COLOR' \{\ . nr #BQUOTE_COLOR 1 . ds $BQUOTE_COLOR \\$1 . \} . if '\\$0'CITE_COLOR' \{\ . nr #BQUOTE_COLOR 1 . ds $BQUOTE_COLOR \\$1 . \} . if '\\$0'CHAPTER_TITLE_COLOR' \{\ . nr #CHAPTER_TITLE_COLOR 1 . ds $CHAPTER_TITLE_COLOR \\$1 . \} . if '\\$0'CODE_COLOR' \{\ . nr #CODE_COLOR 1 . ds $CODE_COLOR \\$1 . \} . if '\\$0'COVER_ATTRIBUTE_COLOR' \{\ . nr #COVER_ATTRIBUTE_COLOR 1 . ds $COVER_ATTRIBUTE_COLOR \\$1 . \} . if '\\$0'COVER_AUTHOR_COLOR' \{\ . nr #COVER_AUTHOR_COLOR 1 . ds $COVER_AUTHOR_COLOR \\$1 . \} . if '\\$0'COVER_CHAPTER_TITLE_COLOR' \{\ . nr #COVER_CHAPTER_TITLE_COLOR 1 . ds $COVER_CHAPTER_TITLE_COLOR \\$1 . \} . if '\\$0'COVER_COLOR' \{\ . nr #COVER_COLOR 1 . ds $COVER_COLOR \\$1 . \} . if '\\$0'COVER_COPYRIGHT_COLOR' \{\ . nr #COVER_COPYRIGHT_COLOR 1 . ds $COVER_COPYRIGHT_COLOR \\$1 . \} . if '\\$0'COVER_MISC_COLOR' \{\ . nr #COVER_MISC_COLOR 1 . ds $COVER_MISC_COLOR \\$1 . \} . if '\\$0'COVER_TITLE_COLOR' \{\ . nr #COVER_TITLE_COLOR 1 . ds $COVER_TITLE_COLOR \\$1 . \} . if '\\$0'COVER_SUBTITLE_COLOR' \{\ . nr #COVER_SUBTITLE_COLOR 1 . ds $COVER_SUBTITLE_COLOR \\$1 . \} . if '\\$0'COVER_DOCTYPE_COLOR' \{\ . nr #COVER_DOCTYPE_COLOR 1 . ds $COVER_DOCTYPE_COLOR \\$1 . \} . if '\\$0'DOC_COVER_ATTRIBUTE_COLOR' \{\ . nr #DOC_COVER_ATTRIBUTE_COLOR 1 . ds $DOC_COVER_ATTRIBUTE_COLOR \\$1 . \} . if '\\$0'DOC_COVER_AUTHOR_COLOR' \{\ . nr #DOC_COVER_AUTHOR_COLOR 1 . ds $DOC_COVER_AUTHOR_COLOR \\$1 . \} . if '\\$0'DOC_COVER_CHAPTER_TITLE_COLOR' \{\ . nr #DOC_COVER_CHAPTER_TITLE_COLOR 1 . ds $DOC_COVER_CHAPTER_TITLE_COLOR \\$1 . \} . if '\\$0'DOC_COVER_COLOR' \{\ . nr #DOC_COVER_COLOR 1 . ds $DOC_COVER_COLOR \\$1 . \} . if '\\$0'DOC_COVER_COPYRIGHT_COLOR' \{\ . nr #DOC_COVER_COPYRIGHT_COLOR 1 . ds $DOC_COVER_COPYRIGHT_COLOR \\$1 . \} . if '\\$0'DOC_COVER_MISC_COLOR' \{\ . nr #DOC_COVER_MISC_COLOR 1 . ds $DOC_COVER_MISC_COLOR \\$1 . \} . if '\\$0'DOC_COVER_TITLE_COLOR' \{\ . nr #DOC_COVER_TITLE_COLOR 1 . ds $DOC_COVER_TITLE_COLOR \\$1 . \} . if '\\$0'DOC_COVER_SUBTITLE_COLOR' \{\ . nr #DOC_COVER_SUBTITLE_COLOR 1 . ds $DOC_COVER_SUBTITLE_COLOR \\$1 . \} . if '\\$0'DOC_COVER_DOCTYPE_COLOR' \{\ . nr #DOC_COVER_DOCTYPE_COLOR 1 . ds $DOC_COVER_DOCTYPE_COLOR \\$1 . \} . if '\\$0'DOCHEADER_COLOR' \{\ . nr #DOCHEADER_COLOR 1 . ds $DOCHEADER_COLOR \\$1 . \} . if '\\$0'DOCTYPE_COLOR' \{\ . nr #DOCTYPE_COLOR 1 . ds $DOCTYPE_COLOR \\$1 . \} . if '\\$0'ENDNOTE_STRING_COLOR' \{\ . nr #ENDNOTE_STRING_COLOR 1 . ds $ENDNOTE_STRING_COLOR \\$1 . \} . if '\\$0'EPIGRAPH_COLOR' \{\ . nr #EPI_COLOR 1 . ds $EPI_COLOR \\$1 . \} . if '\\$0'FINIS_COLOR' \{\ . nr #FINIS_COLOR 1 . ds $FINIS_COLOR \\$1 . \} . if '\\$0'FOOTNOTE_COLOR' \{\ . nr #FOOTNOTE_COLOR 1 . ds $FOOTNOTE_COLOR \\$1 . \} . if '\\$0'HDRFTR_CENTER_COLOR' \{\ . nr #HDRFTR_CENTER_COLOR 1 . ds $HDRFTR_CENTER_COLOR \\$1 . \} . if '\\$0'HDRFTR_COLOR' \{\ . nr #HDRFTR_COLOR 1 . ds $HDRFTR_COLOR \\$1 . \} . if '\\$0'HDRFTR_LEFT_COLOR' \{\ . nr #HDRFTR_LEFT_COLOR 1 . ds $HDRFTR_LEFT_COLOR \\$1 . \} . if '\\$0'HDRFTR_RIGHT_COLOR' \{\ . nr #HDRFTR_RIGHT_COLOR 1 . ds $HDRFTR_RIGHT_COLOR \\$1 . \} . if '\\$0'HDRFTR_RULE_COLOR' \{\ . nr #HDRFTR_RULE_COLOR 1 . ds $HDRFTR_RULE_COLOR \\$1 . \} . if '\\$0'LINEBREAK_COLOR' \{\ . nr #LINEBREAK_COLOR 1 . ds $LINEBREAK_COLOR \\$1 . \} . if '\\$0'LINENUMBER_COLOR' \{\ . nr #LINENUMBER_COLOR 1 . ds $LN_COLOR \\$1 . \} . if '\\$0'PAGENUM_COLOR' \{\ . nr #PAGE_NUM_COLOR 1 . ds $PAGENUM_COLOR \\$1 . \} . if '\\$0'QUOTE_COLOR' \{\ . nr #QUOTE_COLOR 1 . ds $QUOTE_COLOR \\$1 . \} . if '\\$0'SECTION_COLOR' \{\ . nr #LINEBREAK_COLOR 1 . ds $LINEBREAK_COLOR \\$1 . \} . if '\\$0'SUBTITLE_COLOR' \{\ . nr #SUBTITLE_COLOR 1 . ds $SUBTITLE_COLOR \\$1 . \} . if '\\$0'TITLE_COLOR' \{\ . nr #TITLE_COLOR 1 . ds $TITLE_COLOR \\$1 . \} .END \# .MAC _QUAD END . if '\\$0'BIBLIOGRAPHY_QUAD' \{\ . ds $BIB_QUAD \\$1 . if '\\*[$BIB_QUAD]'R' \ .ab \\$0 at line \\n[.c] must be set to either L or J. Aborting \\n'[.F]'. . if '\\*[$BIB_QUAD]'C' \ .ab \\$0 at line \\n[.c] must be set to either L or J. Aborting \\n'[.F]'. . \} . if '\\$0'BIBLIOGRAPHY_STRING_QUAD' \ . ds $BIB_STRING_QUAD \\$1 . if '\\$0'BLOCKQUOTE_QUAD' \ . ds $BQUOTE_QUAD \\$1 . if '\\$0'CITATION_QUAD' \ . ds $BQUOTE_QUAD \\$1 . if '\\$0'CITE_QUAD' \ . ds $BQUOTE_QUAD \\$1 . if '\\$0'COVER_COPYRIGHT_QUAD' \ . ds $COVER_COPYRIGHT_QUAD \\$1 . if '\\$0'COVER_MISC_QUAD' \ . ds $COVER_MISC_QUAD \\$1 . if '\\$0'COVER_QUAD' \ . ds $COVER_QUAD \\$1 . if '\\$0'DOC_COVER_COPYRIGHT_QUAD' \ . ds $DOC_COVER_COPYRIGHT_QUAD \\$1 . if '\\$0'DOC_COVER_MISC_QUAD' \ . ds $DOC_COVER_MISC_QUAD \\$1 . if '\\$0'DOC_COVER_QUAD' \ . ds $DOC_COVER_QUAD \\$1 . if '\\$0'DOCHEADER_QUAD' \ . ds $DOCHEADER_QUAD \\$1 . if '\\$0'DOC_QUAD' \{\ . if !\\n[DOCS] .DOC_MACRO_ERROR \\$0 . ds $DOC_QUAD \\$1 . QUAD \\*[$DOC_QUAD] . \} . if '\\$0'ENDNOTE_QUAD' \{\ . ds $EN_QUAD \\$1 . if '\\*[$EN_QUAD]'R' \ .ab \\$0 at line \\n[.c] must be set to either L or J. Aborting \\n'[.F]'. . if '\\*[$EN_QUAD]'C' \ .ab \\$0 at line \\n[.c] must be set to either L or J. Aborting \\n'[.F]'. . \} . if '\\$0'ENDNOTE_STRING_QUAD' \ . ds $EN_STRING_QUAD \\$1 . if '\\$0'ENDNOTE_TITLE_QUAD' \ . ds $EN_TITLE_QUAD \\$1 . if '\\$0'EPIGRAPH_QUAD' \ . ds $EPI_QUAD \\$1 . if '\\$0'FOOTNOTE_QUAD' \ . ds $FN_QUAD \\$1 . if '\\$0'TOC_HEADER_QUAD' \ . ds $TOC_HEADER_QUAD \\$1 .END \# \# DEFAULTS \# -------- \# *Arguments: \# \# *Function: \# Sets up defaults if no values are entered prior to START. \# *Notes: \# The defaults for $CHAPTER_STRING, $DRAFT_STRING, and \# $REVISION_STRING are in the COPYSTYLE macro. \# .MAC DEFAULTS END . if !d $PAPER .PAPER LETTER . if !\\n[#DOC_TYPE] .DOCTYPE DEFAULT . ie \\n[#PAGENUM_STYLE_SET] .PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el \ . if !\\n[#COPY_STYLE]=1 .PAGENUM_STYLE DIGIT . if !\\n[#COPY_STYLE] .COPYSTYLE FINAL . if \\n[#DRAFT_WITH_PAGENUM] .COPYSTYLE \\*[$COPY_STYLE] . if \\n[#DOC_TYPE]=4 \{\ . if !\\n[#USER_SET_L_LENGTH] \{\ . R_MARGIN \\n[#R_MARGIN]u . rr #USER_SET_L_LENGTH . \} . if \\n[#PRINT_STYLE]=1 .PRINTSTYLE TYPEWRITE SINGLESPACE . \} . if \\n[#COPY_STYLE]=1 \{\ . COPYSTYLE DRAFT . PAGENUMBER 1 . \} . if !r #DOC_HEADER .DOCHEADER . if !r #HEADERS_ON .HEADERS . if !r #PAGINATE .PAGINATE .\" . if !r #HEADER_MARGIN .HEADER_MARGIN 4P+6p . if !r #HEADER_GAP .HEADER_GAP 3P .\" . if \\n[#FOOTERS_ON] \{\ . HEADERS OFF . ie \\n[#PAGINATE] \ . if \\n[#PAGE_NUM_POS_SET]=0 .PAGENUM_POS TOP CENTER . el \ . if !\\n[#T_MARGIN] .T_MARGIN 6P . \} . if !\\n[#HEADERS_ON] \{\ . if !\\n[#FOOTERS_ON] \{\ . ie \\n[#PAGE_NUM_V_POS]=1 \{\ . HEADER_MARGIN \\n[#HEADER_MARGIN] . HEADER_GAP \\n[#HEADER_GAP] . \} . el .if !r #T_MARGIN .T_MARGIN 6P . \} . \} . if !r #T_MARGIN .T_MARGIN \\n[#HEADER_MARGIN]+\\n[#HEADER_GAP] . if !r #DOCHEADER_ADVANCE .nr #DOCHEADER_ADVANCE \\n[#T_MARGIN] . if !r #FOOTER_MARGIN .FOOTER_MARGIN 3P . if !r #FOOTER_GAP .FOOTER_GAP 3P . if !r #B_MARGIN .B_MARGIN \\n[#FOOTER_MARGIN]u+\\n[#FOOTER_GAP]u . if (\\n[#FOOTER_MARGIN]+\\n[.v]>=\\n[#B_MARGIN]) \{\ . tm1 "[mom]: Your chosen bottom margin for running text is too close to the footer margin. . tm1 " No footers or bottom-of-page page numbers will be printed. . tm1 " Please reset B_MARGIN or FOOTER_MARGIN to allow enough space. . tm1 " If no footers or bottom-of-page page numbers are required, . tm1 " invoke .FOOTER_MARGIN 0 before .START . \} . if !r #HEADER_RULE_GAP .HEADER_RULE_GAP 4p . if !r #FOOTER_RULE_GAP .FOOTER_RULE_GAP 4p . if !r #HDRFTR_RULE .HDRFTR_RULE . if !r #PAGE_NUM_SET .PAGENUMBER 1 .\" Read in number registers and strings for type parameters . nr #DOC_L_MARGIN \\n[#L_MARGIN] . nr #DOC_L_LENGTH \\n[#L_LENGTH] . nr #DOC_R_MARGIN \\n[#PAGE_WIDTH]-(\\n[#DOC_L_MARGIN]+\\n[#L_LENGTH]) . ds $DOC_FAM \\*[$FAMILY] . nr #DOC_PT_SIZE \\n[#PT_SIZE] .\" . if \\n[#TOC] .nr #DOC_PT_SIZE \\n[#TOC_PS] . if \\n[#ENDNOTES] .nr #DOC_PT_SIZE \\n[#EN_PS] . if \\n[#BIBLIOGRAPHY] .nr #DOC_PT_SIZE \\n[#BIB_PS] .\" . nr #DOC_LEAD \\n[#LEAD] . nr #DOC@LEAD \\n[#DOC_LEAD] . if \\n[#AUTO_LEAD] .nr #DOC_AUTOLEAD \\n[#AUTOLEAD_VALUE] .\" #SAVED_DOC_LEAD is set in COLLATE . if \\n[#SAVED_DOC_LEAD] \{\ . if !\\n[#TOC] \ . if !\\n[#DOC_LEAD]=\\n[#SAVED_DOC_LEAD] .nr #RERUN_TRAPS 1 . \} . ie \\n[#ADJ_DOC_LEAD]=1 . . el \ . if !\\n[#DOC_LEAD_ADJUST_OFF] .DOC_LEAD_ADJUST . ds $DOC_QUAD \\*[$QUAD_VALUE] . if '\\*[$FONT]'' .FT R . if '\\*[$PP_FT]'' .ds $PP_FT \\*[$FONT] . if !'\\*[$PP_FT]'' .ds $PP_FT \\*[$FONT] .\" Counters . nr #PP 0 . nr #FN_NUMBER 0 1 . nr #EN_NUMBER 0 1 . nr #FN_COUNT_FOR_COLS 0 1 . nr #DONE_ONCE 0 1 .\" Enable shimming if user hasn't turned it off . if \\n[#NO_SHIM]=2 .rr #NO_SHIM .\" General style defaults for both PRINTSTYLEs . nr #PP_STYLE 1 . PARA_INDENT \\n[#PP_INDENT]u . if !d $HDRFTR_FAM .HDRFTR_FAMILY \\*[$DOC_FAM] . if !d $HDRFTR_SIZE_CHANGE .HDRFTR_SIZE +0 . if !d $PAGE_NUM_FAM .PAGENUM_FAMILY \\*[$DOC_FAM] . if !d $PAGE_NUM_FT .PAGENUM_FONT R . if !d $PAGE_NUM_SIZE_CHANGE .PAGENUM_SIZE +0 . if !r #PAGE_NUM_POS_SET .PAGENUM_POS BOTTOM CENTER . ie \\n[#PAGE_NUM_HYPHENS_SET] \{\ . if \\n[#PAGE_NUM_HYPHENS]=0 .PAGENUM_HYPHENS OFF . if \\n[#PAGE_NUM_HYPHENS]=1 .PAGENUM_HYPHENS . \} . el .PAGENUM_HYPHENS . if !r #HDRFTR_RIGHT_CAPS .HDRFTR_RIGHT_CAPS . if \\n[#HDRFTR_RIGHT_CAPS]=0 \ . if !d $HDRFTR_RIGHT_SIZE_CHANGE .HDRFTR_RIGHT_SIZE +0 . if !d $FN_FAM .FOOTNOTE_FAMILY \\*[$DOC_FAM] . if !d $FN_FT .FOOTNOTE_FONT R . if !d $FN_QUAD .FOOTNOTE_QUAD \\*[$DOC_QUAD] . if !r #FN_RULE .FOOTNOTE_RULE . if !r #FN_MARKERS .FOOTNOTE_MARKERS . if \\n[#FN_MARKERS]=1 \{\ . if \\n[#FN_REF]=1 \ . if !\\n[#FN_MARKER_STYLE] .FOOTNOTE_MARKER_STYLE NUMBER . if !\\n[#FN_MARKER_STYLE] .FOOTNOTE_MARKER_STYLE STAR . \} . if !r #EN_MARKER_STYLE .ENDNOTE_MARKER_STYLE SUPERSCRIPT . if !d $EN_PN_STYLE .ENDNOTES_PAGENUM_STYLE digit . if !d $EN_FAM .ENDNOTE_FAMILY \\*[$DOC_FAM] . if !d $EN_FT .ENDNOTE_FONT R . if !d $EN_QUAD .ENDNOTE_QUAD \\*[$DOC_QUAD] . if !d $EN_STRING .ENDNOTE_STRING "Endnotes" . if !d $EN_STRING_FAM .ENDNOTE_STRING_FAMILY \\*[$EN_FAM] . if !d $EN_STRING_QUAD .ENDNOTE_STRING_QUAD CENTER . if !r #EN_STRING_UNDERLINE .nr #EN_STRING_UNDERLINE 2 . if !r #EN_STRING_CAPS .ENDNOTE_STRING_CAPS . if !d $EN_TITLE \{\ . ie \\n[#DOC_TYPE]=2 \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie '\\*[$CHAPTER]'' .ENDNOTE_TITLE "\\*[$CHAPTER_TITLE]" . el .ENDNOTE_TITLE \ "\\*[$CHAPTER_STRING] \\*[$CHAPTER]: \\*[$CHAPTER_TITLE]" . \} . el \{\ . ie '\\*[$CHAPTER]'' .ENDNOTE_TITLE "\\*[$CHAPTER_STRING]" . el .ENDNOTE_TITLE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . \} . \} . el .ENDNOTE_TITLE "\\*[$TITLE]" . \} . if !d $EN_TITLE_FAM .ENDNOTE_TITLE_FAMILY \\*[$EN_FAM] . if !d $EN_TITLE_QUAD .ENDNOTE_TITLE_QUAD LEFT . if !r #EN_TITLE_UNDERLINE .nr #EN_TITLE_UNDERLINE 1 . if !d $EN_NUMBER_FAM .ENDNOTE_NUMBER_FAMILY \\*[$EN_FAM] . if !d $EN_LN_FAM .ENDNOTE_LINENUMBER_FAMILY \\*[$EN_FAM] . if !r #EN_NUMBERS_ALIGN_LEFT \{\ . if !r #EN_NUMBERS_ALIGN_RIGHT \{\ . ie !\\n[#EN_MARKER_STYLE]=2 .ENDNOTE_NUMBERS_ALIGN RIGHT 2 . el .ENDNOTE_NUMBERS_ALIGN RIGHT 4 . \} . \} . if !r #EN_LN_GAP .ENDNOTE_LINENUMBER_GAP 1m . if !r #EN_ALLOWS_HEADERS .ENDNOTES_ALLOWS_HEADERS . if !d $BIB_PN_STYLE .BIBLIOGRAPHY_PAGENUM_STYLE digit . if !d $BIB_FAM .BIBLIOGRAPHY_FAMILY \\*[$DOC_FAM] . if !d $BIB_FT .BIBLIOGRAPHY_FONT R . if !d $BIB_QUAD .BIBLIOGRAPHY_QUAD \\*[$DOC_QUAD] . if !d $BIB_STRING .BIBLIOGRAPHY_STRING "Bibliography" . if !d $BIB_STRING_FAM .BIBLIOGRAPHY_STRING_FAMILY \\*[$BIB_FAM] . if !d $BIB_STRING_QUAD .BIBLIOGRAPHY_STRING_QUAD CENTER . if !r #BIB_STRING_UNDERLINE .nr #BIB_STRING_UNDERLINE 2 . if !r #BIB_STRING_CAPS .BIBLIOGRAPHY_STRING_CAPS . if !d $TOC_HEADER_STRING .TOC_HEADER_STRING "Contents" . if !d $TOC_HEADER_QUAD .TOC_HEADER_QUAD LEFT . if !d $TOC_PN_STYLE .TOC_PAGENUM_STYLE roman . if !r #TOC_PN_PADDING .TOC_PADDING 3 .\" Line numbering . if !r #LN_GUTTER .nr #LN_GUTTER 2 . if !r #Q_LN_GUTTER .nr #Q_LN_GUTTER 2 . if !r #BQ_LN_GUTTER .nr #BQ_LN_GUTTER 2 . if !d $LN_FAM .ds $LN_FAM \\*[$DOC_FAM] . if !d $LN_FT .ds $LN_FT R . if !d $LN_SIZE_CHANGE .ds $LN_SIZE_CHANGE +0 . if !d $LN_COLOR .ds $LN_COLOR black .\" PDF link colour . if !\\n[PDFHREF_COLOR_SET] .PDF_LINK_COLOR 0.0 0.3 0.9 .\" String defaults for both PRINTSTYLEs . ie \\n[#DOC_TYPE]=1 \{\ . ie '\\*[$DOC_TITLE]'' \{\ . if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE] . \} . el \{\ . if \\n[#COPY_STYLE]=1 .DRAFT_WITH_PAGENUMBER . if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . if \\n[#USER_DEF_HDRFTR_CENTER]=0 .ds $HDRFTR_CENTER \\*[$TITLE] . if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$DOC_TITLE] . \} . \} . el \{\ . if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE] . \} . if !d $ATTRIBUTE_STRING .ds $ATTRIBUTE_STRING by . if !d $FINIS_STRING .FINIS_STRING "End" . if !r #FINIS_STRING_CAPS .nr #FINIS_STRING_CAPS 1 .\" Covers . if !r #DOC_COVERS_OFF .nr #DOC_COVERS 1 . if !r #COVERS_OFF .nr #COVERS 1 . if !d $COVER_COPYRIGHT_QUAD .COVER_COPYRIGHT_QUAD R . if !d $COVER_MISC_QUAD .COVER_MISC_QUAD L . if !d $DOC_COVER_COPYRIGHT_QUAD .DOC_COVER_COPYRIGHT_QUAD R . if !d $DOC_COVER_MISC_QUAD .DOC_COVER_MISC_QUAD L . if !r #DOC_COVER_UNDERLINE .DOC_COVER_UNDERLINE . if !r #COVER_UNDERLINE .COVER_UNDERLINE .\" Defaults for printstyle TYPEWRITE . if \\n[#PRINT_STYLE]=1 \{\ . SS DEFAULT . if \\n[#UNDERLINE_QUOTES]=1 .UNDERLINE_QUOTES . if \\n[#UNDERLINE_QUOTES]=0 .UNDERLINE_QUOTES OFF .\" +Doctype underlining (if NAMED) . if !r #DOCTYPE_UNDERLINE .nr #DOCTYPE_UNDERLINE 1 .\" +Quotes and blockquotes . if !r #Q_OFFSET_VALUE \{\ . if '\\*[$Q_OFFSET_VALUE]'' .QUOTE_INDENT 1 . \} .\" +Epigraphs . if !r #EPI_OFFSET_VALUE \ . if '\\*[$EPI_OFFSET_VALUE]'' .EPIGRAPH_INDENT 2 .\" +Linebreaks . if !d $LINEBREAK_CHAR .LINEBREAK_CHAR * 3 2p .\" +Footnotes . if !d $FN_SIZE_CHANGE .FOOTNOTE_SIZE +0 . if !r #FN_RULE_LENGTH .FOOTNOTE_RULE_LENGTH 2i .\" +Endnotes . if !r #EN_PP_INDENT .ENDNOTE_PARA_INDENT \\n[#PP_INDENT] .\" +Footnotes . if !r #FN_RULE_ADJ .FOOTNOTE_RULE_ADJ 6p .\" +Slant stuff . if !r #SLANT_MEANS_SLANT \{\ . ie \\n[#UNDERLINE_SLANT]=1 .UNDERLINE_SLANT . el .UNDERLINE_SLANT OFF . \} . \} .\" Defaults for printstyle TYPESET . if \\n[#PRINT_STYLE]=2 \{\ . if !d $DOCHEADER_LEAD_ADJ .DOCHEADER_LEAD +0 .\" +Cover . if !d $COVER_LEAD_ADJ .COVER_LEAD +0 . if !d $COVER_FAM .COVER_FAMILY \\*[$DOC_FAM] .\" (title) . if !d $COVER_TITLE_FAM \{\ . ie !d $COVER_FAM .COVER_TITLE_FAMILY \\*[$DOC_FAM] . el .COVER_TITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_TITLE_FT .COVER_TITLE_FONT B . if !d $COVER_TITLE_SIZE_CHANGE .COVER_TITLE_SIZE +3.5 .\" (chapter title) . if !d $COVER_CHAPTER_TITLE_FAM \{\ . ie !d $COVER_FAM .COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] . el .COVER_CHAPTER_TITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_CHAPTER_TITLE_FT .COVER_CHAPTER_TITLE_FONT BI . if !d $COVER_CHAPTER_TITLE_SIZE_CHANGE .COVER_CHAPTER_TITLE_SIZE +4 .\" (subtitle) . if !d $COVER_SUBTITLE_FAM \{\ . ie !d $COVER_FAM .COVER_SUBTITLE_FAMILY \\*[$DOC_FAM] . el .COVER_SUBTITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_SUBTITLE_FT .COVER_SUBTITLE_FONT R . if !d $COVER_SUBTITLE_SIZE_CHANGE .COVER_SUBTITLE_SIZE +0 .\" (attribution and author[s]) . if !d $COVER_AUTHOR_FAM \{\ . ie !d $COVER_FAM .COVER_AUTHOR_FAMILY \\*[$DOC_FAM] . el .COVER_AUTHOR_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_AUTHOR_FT .COVER_AUTHOR_FONT I . if !d $COVER_AUTHOR_SIZE_CHANGE .COVER_AUTHOR_SIZE +0 .\" (doctype if "named") . if !d $COVER_DOCTYPE_FAM \{\ . ie !d $COVER_FAM .COVER_DOCTYPE_FAMILY \\*[$DOC_FAM] . el .COVER_DOCTYPE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_DOCTYPE_FT .COVER_DOCTYPE_FONT BI . if !d $COVER_DOCTYPE_SIZE_CHANGE .COVER_DOCTYPE_SIZE +3 .\" (copyright) . if !d $COVER_COPYRIGHT_FAM \{\ . ie !d $COVER_FAM .COVER_COPYRIGHT_FAMILY \\*[$DOC_FAM] . el .COVER_COPYRIGHT_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_COPYRIGHT_FT .COVER_COPYRIGHT_FONT R . if !d $COVER_COPYRIGHT_SIZE_CHANGE .COVER_COPYRIGHT_SIZE -2 .\" (misc) . if !d $COVER_MISC_FAM .COVER_MISC_FAMILY \\*[$DOC_FAM] . if !d $COVER_MISC_FT .COVER_MISC_FONT R . if !d $COVER_MISC_SIZE_CHANGE .COVER_MISC_SIZE -2 . if !r #COVER_MISC_AUTOLEAD .COVER_MISC_AUTOLEAD 2 .\" +Doc cover . if !d $DOC_COVER_LEAD_ADJ .DOC_COVER_LEAD +0 . if !d $DOC_COVER_FAM .DOC_COVER_FAMILY \\*[$DOC_FAM] .\" (title) . if !d $DOC_COVER_TITLE_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_TITLE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_TITLE_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_TITLE_FT .DOC_COVER_TITLE_FONT B . if !d $DOC_COVER_TITLE_SIZE_CHANGE .DOC_COVER_TITLE_SIZE +3.5 .\" (chapter title) . if !d $DOC_COVER_CHAPTER_TITLE_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_CHAPTER_TITLE_FT .DOC_COVER_CHAPTER_TITLE_FONT BI . if !d $DOC_COVER_CHAPTER_TITLE_SIZE_CHANGE .DOC_COVER_CHAPTER_TITLE_SIZE +4 .\" (subtitle) . if !d $DOC_COVER_SUBTITLE_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_SUBTITLE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_SUBTITLE_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_SUBTITLE_FT .DOC_COVER_SUBTITLE_FONT R . if !d $DOC_COVER_SUBTITLE_SIZE_CHANGE .DOC_COVER_SUBTITLE_SIZE +0 .\" (attribution and author[s]) . if !d $DOC_COVER_AUTHOR_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_AUTHOR_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_AUTHOR_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_AUTHOR_FT .DOC_COVER_AUTHOR_FONT I . if !d $DOC_COVER_AUTHOR_SIZE_CHANGE .DOC_COVER_AUTHOR_SIZE +0 .\" (doctype if "named") . if !d $DOC_COVER_DOCTYPE_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_DOCTYPE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_DOCTYPE_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_DOCTYPE_FT .DOC_COVER_DOCTYPE_FONT BI . if !d $DOC_COVER_DOCTYPE_SIZE_CHANGE .DOC_COVER_DOCTYPE_SIZE +3 .\" (copyright) . if !d $DOC_COVER_COPYRIGHT_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_COPYRIGHT_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_COPYRIGHT_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_COPYRIGHT_FT .DOC_COVER_COPYRIGHT_FONT R . if !d $DOC_COVER_COPYRIGHT_SIZE_CHANGE .DOC_COVER_COPYRIGHT_SIZE -2 .\" (misc) . if !d $DOC_COVER_MISC_FAM .DOC_COVER_MISC_FAMILY \\*[$DOC_FAM] . if !d $DOC_COVER_MISC_FT .DOC_COVER_MISC_FONT R . if !d $DOC_COVER_MISC_SIZE_CHANGE .DOC_COVER_MISC_SIZE -2 . if !r #DOC_COVER_MISC_AUTOLEAD .DOC_COVER_MISC_AUTOLEAD 2 .\" +Docheader . if !d $DOCHEADER_FAM .DOCHEADER_FAMILY \\*[$DOC_FAM] . if !d $TITLE_FAM \{\ . ie !d $DOCHEADER_FAM .TITLE_FAMILY \\*[$DOC_FAM] . el .TITLE_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $TITLE_FT .TITLE_FONT B . if !d $TITLE_SIZE_CHANGE \{\ . ie \\n[#DOC_TYPE]=2 .TITLE_SIZE +4 . el .TITLE_SIZE +3.5 . \} . if !d $CHAPTER_TITLE_FAM \{\ . ie !d $DOCHEADER_FAM .CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] . el .CHAPTER_TITLE_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $CHAPTER_TITLE_FT .CHAPTER_TITLE_FONT BI . if !d $CHAPTER_TITLE_SIZE_CHANGE .CHAPTER_TITLE_SIZE +4 . if !d $SUBTITLE_FAM \{\ . ie !d $DOCHEADER_FAM .SUBTITLE_FAMILY \\*[$DOC_FAM] . el .SUBTITLE_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $SUBTITLE_FT .SUBTITLE_FONT R . if !d $SUBTITLE_SIZE_CHANGE .SUBTITLE_SIZE +0 . if !d $AUTHOR_FAM \{\ . ie !d $DOCHEADER_FAM .AUTHOR_FAMILY \\*[$DOC_FAM] . el .AUTHOR_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $AUTHOR_FT .AUTHOR_FONT I . if !d $AUTHOR_SIZE_CHANGE .AUTHOR_SIZE +0 . if !d $DOCTYPE_FAM \{\ . ie !d $DOCHEADER_FAM .DOCTYPE_FAMILY \\*[$DOC_FAM] . el .DOCTYPE_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $DOCTYPE_FT .DOCTYPE_FONT BI . if !d $DOCTYPE_SIZE_CHANGE .DOCTYPE_SIZE +3 . if !r #DOCTYPE_UNDERLINE .DOCTYPE_UNDERLINE .\" +Headers and footers . if !d $HDRFTR_LEFT_FAM .HDRFTR_LEFT_FAMILY \\*[$DOC_FAM] . if !d $HDRFTR_LEFT_FT .HDRFTR_LEFT_FONT R . if \\n[#HDRFTR_LEFT_CAPS] \ . if !d $HDRFTR_LEFT_SIZE_CHANGE .HDRFTR_LEFT_SIZE -2 . if !d $HDRFTR_LEFT_SIZE_CHANGE .HDRFTR_LEFT_SIZE -.5 . if !d $HDRFTR_CENTER_FAM .HDRFTR_CENTER_FAMILY \\*[$DOC_FAM] . if !d $HDRFTR_CENTER_FT .HDRFTR_CENTER_FONT I . if \\n[#HDRFTR_CENTER_CAPS] \ . if !d $HDRFTR_CENTER_SIZE_CHANGE .HDRFTR_CENTER_SIZE -2 . if !d $HDRFTR_CENTER_SIZE_CHANGE .HDRFTR_CENTER_SIZE -.5 . if !d $HDRFTR_RIGHT_FAM .HDRFTR_RIGHT_FAMILY \\*[$DOC_FAM] . if !d $HDRFTR_RIGHT_FT .HDRFTR_RIGHT_FONT R . if \\n[#HDRFTR_RIGHT_CAPS] \ . if !d $HDRFTR_RIGHT_SIZE_CHANGE .HDRFTR_RIGHT_SIZE -2 . if !d $HDRFTR_RIGHT_SIZE_CHANGE .HDRFTR_RIGHT_SIZE -.5 .\" +Quotes . if !d $QUOTE_FAM .QUOTE_FAMILY \\*[$DOC_FAM] . if !d $QUOTE_FT .QUOTE_FONT I . if !d $QUOTE_SIZE_CHANGE .QUOTE_SIZE+0 . if !r #Q_OFFSET_VALUE \ . if '\\*[$Q_OFFSET_VALUE]'' .QUOTE_INDENT 3 .\" +Blockquotes .\" Note: the leading for quotes and blockquotes is set after .DEFAULTS in START . if !d $BQUOTE_FAM .BLOCKQUOTE_FAMILY \\*[$DOC_FAM] . if !d $BQUOTE_FT .BLOCKQUOTE_FONT R . if !d $BQUOTE_SIZE_CHANGE .BLOCKQUOTE_SIZE -1 . if !d $BQUOTE_QUAD .BLOCKQUOTE_QUAD LEFT .\" +Epigraphs . if !d $EPI_FAM .EPIGRAPH_FAMILY \\*[$DOC_FAM] . if !d $EPI_FT .EPIGRAPH_FONT R . if !d $EPI_SIZE_CHANGE .EPIGRAPH_SIZE -1.5 . if !r #EPI_AUTOLEAD .EPIGRAPH_AUTOLEAD 2 . if !d $EPI_QUAD .EPIGRAPH_QUAD \\*[$DOC_QUAD] . if !\\n[#EPI_OFFSET_VALUE] \ . if '\\*[$EPI_OFFSET_VALUE]'' .EPIGRAPH_INDENT 3 .\" +Linebreaks . if !d $LINEBREAK_CHAR .LINEBREAK_CHAR * 3 3p . if !d $LINEBREAK_COLOR .LINEBREAK_COLOR black .\" +Footnotes . if !r #FN_RULE_LENGTH .FOOTNOTE_RULE_LENGTH 4P . if !r #FN_RULE_ADJ .FOOTNOTE_RULE_ADJ 3p . if !d $FN_SIZE_CHANGE .FOOTNOTE_SIZE -2 . if !r #FN_AUTOLEAD .FOOTNOTE_AUTOLEAD 2 .\" +Endnotes . if !r #EN_PS .ENDNOTE_PT_SIZE (\\n[#DOC_PT_SIZE]u) . if !d $EN_STRING_FT .ENDNOTE_STRING_FONT B . if !d $EN_STRING_SIZE_CHANGE .ENDNOTE_STRING_SIZE +1 . if !d $EN_TITLE_FT .ENDNOTE_TITLE_FONT B . if !d $EN_TITLE_SIZE_CHANGE .ENDNOTE_TITLE_SIZE +0 . if !d $EN_NUMBER_FT .ENDNOTE_NUMBER_FONT B . if !d $EN_LN_FT .ENDNOTE_LINENUMBER_FONT R . if !d $EN_NUMBER_SIZE_CHANGE .ENDNOTE_NUMBER_SIZE +0 . if !d $EN_LN_SIZE_CHANGE .ENDNOTE_LINENUMBER_SIZE +0 . if !r #EN_PP_INDENT .ENDNOTE_PARA_INDENT 1.5m . if !d $EN_SPACE .ENDNOTE_SPACING 0 .\" +Bibliography . if !r #BIB_LIST .BIBLIOGRAPHY_TYPE PLAIN . if !r #BIB_PS .BIBLIOGRAPHY_PT_SIZE (\\n[#DOC_PT_SIZE]u) . if !d $BIB_STRING_FT .BIBLIOGRAPHY_STRING_FONT B . if !d $BIB_STRING_SIZE_CHANGE .BIBLIOGRAPHY_STRING_SIZE +1 .\" +Table of contents . if !d $TOC_FAM .TOC_FAMILY \\*[$DOC_FAM] . if !r #TOC_PS .TOC_PT_SIZE (\\n[#DOC_PT_SIZE]u) . if '\\*[$TOC_LEAD]'' .TOC_LEAD \\n[#DOC@LEAD]u ADJUST . if !d $TOC_HEADER_FAM .TOC_HEADER_FAMILY \\*[$TOC_FAM] . if !d $TOC_HEADER_SIZE_CHANGE .TOC_HEADER_SIZE +4 . if !d $TOC_HEADER_FT .TOC_HEADER_FONT B . if !d $TOC_PN_FAM .TOC_PN_FAMILY \\*[$TOC_FAM] . if !d $TOC_PN_FT .TOC_PN_FONT R . if !d $TOC_PN_SIZE_CHANGE .TOC_PN_SIZE +0 . \} .\" +Refer support . if !r #EN_REF .nr #FN_REF 1 . if !d $REF_FN_INDENT \{\ . if \\n[#PRINT_STYLE]=1 .INDENT_REFS FOOTNOTE .5i . if \\n[#PRINT_STYLE]=2 .INDENT_REFS FOOTNOTE 2m . \} . if !d $REF_EN_INDENT \{\ . if \\n[#PRINT_STYLE]=1 .INDENT_REFS ENDNOTE .5i . if \\n[#PRINT_STYLE]=2 .INDENT_REFS ENDNOTE 2m . \} . if !d $REF_BIB_INDENT \{\ . if \\n[#PRINT_STYLE]=1 .INDENT_REFS BIBLIO .5i . if \\n[#PRINT_STYLE]=2 .INDENT_REFS BIBLIO 2m . \} .\" Define strings for idem entries . if \\n[#PRINT_STYLE]=1 .char \[idem] \[hy]\[hy]\[hy] . if \\n[#PRINT_STYLE]=2 .char \[idem] \v'-.3m'\l'3m'\v'.3m' .\" Adjust doc leading for PRINTSTYLE TYPESET . if \\n[#PRINT_STYLE]=2 \ . if \\n[#ADJ_DOC_LEAD]=1 .DOC_LEAD_ADJUST .\" This diversion is to get a value for #FN_AUTOLEAD . di NULL . if \\n[#AUTO_LEAD] \{\ . nr #RESTORE_AUTO_LEAD 1 . nr #SAVED_AUTOLEAD_VALUE \\n[#AUTOLEAD_VALUE] . \} . ev NULL . if \\n[#PRINT_STYLE]=1 \{\ . ps \\*[$TYPEWRITER_PS] . ie \\n[#SINGLE_SPACE]=1 .vs \\n[#ORIGINAL_DOC_LEAD]u . el .vs \\n[#ORIGINAL_DOC_LEAD]u/2u . \} . if \\n[#PRINT_STYLE]=2 \{\ . ps \\n[#DOC_PT_SIZE]u\\*[$FN_SIZE_CHANGE] . vs \\n[.ps]u+\\n[#FN_AUTOLEAD] . \} . nr #FN_LEAD \\n[#LEAD] . ev . di . if \\n[#RESTORE_AUTO_LEAD] \{\ . nr #AUTO_LEAD 1 . nr #AUTOLEAD_VALUE \\n[#SAVED_AUTOLEAD_VALUE] . \} . ie !\\n[#COLLATE] \{\ .\" DOC_LEAD adjusted (or not) here . TRAPS . if \\n[#REMOVE_ADJ] .DOC_LEAD \\n[#DOC_LEAD]u-\\n[#DOC_LEAD_ADJ]u .\" Endnote, bibliography and toc leading . nr #OK_PROCESS_LEAD 1 . nr #RESTORE_DOC_LEAD \\n[.v] . nr #RESTORE_B_MARGIN \\n[#B_MARGIN] . if \\n[#PRINT_STYLE]=1 \{\ . ie \\n[#SINGLE_SPACE] \{\ . ENDNOTE_LEAD 12 ADJUST . BIBLIOGRAPHY_LEAD 12 ADJUST . \} . el \{\ . ie \\n[#EN_SINGLESPACE] .ENDNOTE_LEAD 12 ADJUST . el .ENDNOTE_LEAD 24 ADJUST . ie \\n[#BIB_SINGLESPACE] .BIBLIOGRAPHY_LEAD 12 ADJUST . el .BIBLIOGRAPHY_LEAD 24 ADJUST . \} . \} . if \\n[#PRINT_STYLE]=2 \{\ . ie !d $EN_LEAD .ENDNOTE_LEAD \\n[#UNADJUSTED_DOC_LEAD]u ADJUST . el .ENDNOTE_LEAD \\*[$EN_LEAD] \\*[$ADJUST_EN_LEAD] . ie !d $BIB_LEAD .BIBLIOGRAPHY_LEAD \\n[#UNADJUSTED_DOC_LEAD]u ADJUST . el .BIBLIOGRAPHY_LEAD \\*[$BIB_LEAD] \\*[$ADJUST_BIB_LEAD] . ie !d $TOC_LEAD .TOC_LEAD \\n[#UNADJUSTED_DOC_LEAD]u \\*[$ADJUST_TOC_LEAD] . el .TOC_LEAD \\*[$TOC_LEAD] \\*[$ADJUST_TOC_LEAD] . \} . ie !d $BIB_SPACE .BIBLIOGRAPHY_SPACING 0 . el \{\ . if \\n[#DEFER_BIB_SPACING]=1 \{\ . BIBLIOGRAPHY_SPACING \\*[$BIB_SPACE] . rr #DEFER_BIB_SPACING . \} . \} . nr #DOC_LEAD \\n[#RESTORE_DOC_LEAD]u . nr #B_MARGIN \\n[#RESTORE_B_MARGIN] . \} . el \{\ . if \\n[#COLLATE] \{\ . if !\\n[#PRINT_STYLE]=1 \{\ . if \\n[#RERUN_TRAPS] \{\ . TRAPS . rr #RERUN_TRAPS . \} . \} . \} . \} .\" Set default heading and toc-entry family if not done already . nr #HD_LEVEL 0 1 \" loop step . nr #LOOP 9 \" loop count . while \\n+[#HD_LEVEL]<=\\n[#LOOP] \{\ . if '\\*[$HEAD_\\n[#HD_LEVEL]_FAM]'' \ . ds $HEAD_\\n[#HD_LEVEL]_FAM \\*[$DOC_FAM] . if '\\*[$HEAD_\\n[#HD_LEVEL]_BASELINE_ADJ]'' \ . ds $HEAD_\\n[#HD_LEVEL]_BASELINE_ADJ \\n[.v]/10 . if '\\*[$TOC_HEAD_\\n[#HD_LEVEL]_FAM]'' \ . ds $TOC_HEAD_\\n[#HD_LEVEL]_FAM \\*[$DOC_FAM] . \} . if '\\*[$TOC_TITLE_FAM]'' .ds $TOC_TITLE_FAM \\*[$DOC_FAM] .\" Re-run MNinit to capture strings and registers set in DEFAULTS. . if !'\\*[$MN-arg1]'' \{\ . MNinit \ \\*[$MN-arg1] \\*[$MN-arg2] \ \\*[$MN-arg3] \\*[$MN-arg4] \ \\*[$MN-arg5] \\*[$MN-arg6] \ \\*[$MN-arg7] \\*[$MN-arg8] \ \\*[$MN-arg9] . \} . if \\n[#PRINT_STYLE]=1 .nr #IGNORE 1 . if \\n[#AUTO_LEAD] \{\ . rr #AUTO_LEAD . rr #AUTOLEAD_VALUE . \} .END \# \# ==================================================================== \# \# +++START THE DOCUMENT+++ \# \# THE START MACRO \# --------------- \# *Arguments: \# \# *Function: \# Reads in default document style parameters and any parameters \# the user has changed before issuing START. \# Using the information gathered in the opening macros, \# prints appropriate title (or chapter #), subtitle, author \# and document type (if appropriate). \# *Notes: \# The .PRINT \& (zero-width character) is required to get the \# subsequent .sp request to work as advertised. \# \# The overall document line length, family, and point-size \# are stored in #DOC_L_LENGTH, $DOC_FAM, and #DOC_PT_SIZE for \# use in the HEADER and FOOTER macros. \# \# First, define some strings for point sizes \# \# Doc cover \# .ds $DOC_COVER_AUTHOR_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_AUTHOR_SIZE_CHANGE] .ds $DOC_COVER_CHAPTER_TITLE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_CHAPTER_TITLE_SIZE_CHANGE] .ds $DOC_COVER_COPYRIGHT_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_COPYRIGHT_SIZE_CHANGE] .ds $DOC_COVER_DOCTYPE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_DOCTYPE_SIZE_CHANGE] .ds $DOC_COVER_MISC_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_MISC_SIZE_CHANGE] .ds $DOC_COVER_SUBTITLE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_SUBTITLE_SIZE_CHANGE] .ds $DOC_COVER_TITLE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_TITLE_SIZE_CHANGE] \# Cover .ds $COVER_AUTHOR_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$COVER_AUTHOR_SIZE_CHANGE] .ds $COVER_CHAPTER_TITLE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$COVER_CHAPTER_TITLE_SIZE_CHANGE] .ds $COVER_COPYRIGHT_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$COVER_COPYRIGHT_SIZE_CHANGE] .ds $COVER_DOCTYPE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$COVER_DOCTYPE_SIZE_CHANGE] .ds $COVER_MISC_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$COVER_MISC_SIZE_CHANGE] .ds $COVER_SUBTITLE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$COVER_SUBTITLE_SIZE_CHANGE] .ds $COVER_TITLE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$COVER_TITLE_SIZE_CHANGE] \# Docheader .ds $AUTHOR_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$AUTHOR_SIZE_CHANGE] .ds $CHAPTER_TITLE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$CHAPTER_TITLE_SIZE_CHANGE] .ds $COPYRIGHT_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$COPYRIGHT_SIZE_CHANGE] .ds $DOCTYPE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$DOCTYPE_SIZE_CHANGE] .ds $SUBTITLE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$SUBTITLE_SIZE_CHANGE] .ds $TITLE_PT_SIZE \ \\n[#DOC_PT_SIZE]u\\*[$TITLE_SIZE_CHANGE] \# \# Next, some utility macros for various routines to prevent repetition \# .MAC DOC_HEADER_QUAD END . if '\\$0'DOC_HEADER_QUAD' .ds $CALLING_MACRO DOCHEADER . if '\\$0'COVER_H_POS' .ds $CALLING_MACRO COVER . if '\\$0'DOC_COVER_H_POS' .ds $CALLING_MACRO DOC_COVER . ie !'\\*[$\\*[$CALLING_MACRO]_QUAD]'' \{\ . if '\\*[$\\*[$CALLING_MACRO]_QUAD]'L' .LEFT . if '\\*[$\\*[$CALLING_MACRO]_QUAD]'LEFT' .LEFT . if '\\*[$\\*[$CALLING_MACRO]_QUAD]'R' .RIGHT . if '\\*[$\\*[$CALLING_MACRO]_QUAD]'RIGHT' .RIGHT . if '\\*[$\\*[$CALLING_MACRO]_QUAD]'C' .RIGHT . if '\\*[$\\*[$CALLING_MACRO]_QUAD]'CENTER' .CENTER . if '\\*[$\\*[$CALLING_MACRO]_QUAD]'CENTRE' .CENTER . \} . el .CENTER .END \# \# Aliases for DOC_HEADER_QUAD \# .ALIAS COVER_H_POS DOC_HEADER_QUAD .ALIAS DOC_COVER_H_POS DOC_HEADER_QUAD \# .MAC PRINT_AUTHORS END . ie r#DOING_COVER \{\ . if \\n[#DOC_COVER]=1 \{\ . ie !'\\*[$AUTHOR_DOCCOVER_1]'' \{\ . nr #AUTHORS \\n[#AUTHOR_DOCCOVER_NUM] . nr #NEXT_AUTHOR 0 1 . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . ie \\n[#DOC_COVER_AUTHOR_COLOR]=1 \ . PRINT \ \m[\\*[$DOC_COVER_AUTHOR_COLOR]]\\*[$AUTHOR_DOCCOVER_\\n+[#NEXT_AUTHOR]]\m[] . el .PRINT \\*[$AUTHOR_DOCCOVER_\\n+[#NEXT_AUTHOR]] . \} . \} . el \{\ . nr #AUTHORS \\n[#AUTHOR_NUM] . nr #NEXT_AUTHOR 0 1 . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . ie \\n[#DOC_COVER_AUTHOR_COLOR]=1 \ . PRINT \ \m[\\*[$DOC_COVER_AUTHOR_COLOR]]\\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]\m[] . el .PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] . \} . \} . return . \} . if \\n[#COVER]=1 \{\ . ie !'\\*[$AUTHOR_COVER_1]'' \{\ . nr #AUTHORS \\n[#AUTHOR_COVER_NUM] . nr #NEXT_AUTHOR 0 1 . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . ie \\n[#COVER_AUTHOR_COLOR]=1 \ . PRINT \ \m[\\*[$COVER_AUTHOR_COLOR]]\\*[$AUTHOR_COVER_\\n+[#NEXT_AUTHOR]]\m[] . el .PRINT \\*[$AUTHOR_COVER_\\n+[#NEXT_AUTHOR]] . \} . \} . el \{\ . nr #AUTHORS \\n[#AUTHOR_NUM] . nr #NEXT_AUTHOR 0 1 . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . ie \\n[#COVER_AUTHOR_COLOR]=1 \ . PRINT \ \m[\\*[$COVER_AUTHOR_COLOR]]\\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]\m[] . el .PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] . \} . \} . return . \} . \} . el \{\ . nr #AUTHORS \\n[#AUTHOR_NUM] . nr #NEXT_AUTHOR 0 1 . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . ie \\n[#AUTHOR_COLOR]=1 \ . PRINT \m[\\*[$AUTHOR_COLOR]]\\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]\m[] . el .PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] . \} . \} .END \# .MAC DEFAULT_DOCHEADER END . DOC_HEADER_QUAD . if !'\\*[$TITLE_1]'' \{\ . FAMILY \\*[$TITLE_FAM] . FT \\*[$TITLE_FT] . ps \\*[$TITLE_PT_SIZE] . vs \\n[#DOCHEADER_LEAD]u . nr #ARG_NUM 0 1 . while \\n[#TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#TITLE_COLOR]=1 \ . PRINT "\m[\\*[$TITLE_COLOR]]\\*[$TITLE_\\n[#ARG_NUM]]\m[] . el .PRINT "\\*[$TITLE_\\n[#ARG_NUM]] . \} . \} . if !'\\*[$SUBTITLE_1]'' \{\ . FAMILY \\*[$SUBTITLE_FAM] . FT \\*[$SUBTITLE_FT] . ps \\*[$SUBTITLE_PT_SIZE] . nr #ARG_NUM 0 1 . while \\n[#SUBTITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#SUBTITLE_COLOR]=1 \ . PRINT "\m[\\*[$SUBTITLE_COLOR]]\\*[$SUBTITLE_\\n[#ARG_NUM]]\m[] . el .PRINT "\\*[$SUBTITLE_\\n[#ARG_NUM]] . \} . \} . if !'\\*[$AUTHOR_1]'' \{\ . FAMILY \\*[$AUTHOR_FAM] . FT \\*[$AUTHOR_FT] . ps \\*[$AUTHOR_PT_SIZE] . ie \\n[#ATTRIBUTE_COLOR]=1 \ . PRINT \&\m[\\*[$ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] . el .PRINT \&\\*[$ATTRIBUTE_STRING] . PRINT_AUTHORS . \} . FAMILY \\*[$DOC_FAM] . FT R .END \# .MAC CHAPTER_DOCHEADER END . DOC_HEADER_QUAD . FAMILY \\*[$TITLE_FAM] . FT \\*[$TITLE_FT] . ps \\*[$TITLE_PT_SIZE] . vs \\n[#DOCHEADER_LEAD]u .\" Chapter title only . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . if \\n[#PRINT_STYLE]=2 \{\ . FAMILY \\*[$CHAPTER_TITLE_FAM] . FT \\*[$CHAPTER_TITLE_FT] . ps \\*[$CHAPTER_TITLE_PT_SIZE] . vs \\n[#DOCHEADER_LEAD]u . \} . nr #ARG_NUM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#TITLE_COLOR]=1 \ . PRINT \ \m[\\*[$TITLE_COLOR]]\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]\m[] . el .PRINT \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . \} . \} . el \{\ . ie \\n[#TITLE_COLOR]=1 \ . PRINT \m[\\*[$TITLE_COLOR]]\\*[$CHAPTER_STRING]\m[] . el .PRINT \\*[$CHAPTER_STRING] . \} . \} .\" Chapter string, possibly with a chapter title . el \{\ . ie \\n[#TITLE_COLOR]=1 \ . PRINT \m[\\*[$TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] . el .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] . if !'\\*[$CHAPTER_TITLE_1]'' \{\ . if \\n[#PRINT_STYLE]=2 \{\ . FAMILY \\*[$CHAPTER_TITLE_FAM] . FT \\*[$CHAPTER_TITLE_FT] . ps \\*[$CHAPTER_TITLE_PT_SIZE] . vs \\n[#DOCHEADER_LEAD]u . ALD \\n[.v]u/4u \" Put a little space before the chapter title . \} . nr #ARG_NUM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#CHAPTER_TITLE_COLOR]=1 \ . PRINT \ \m[\\*[$CHAPTER_TITLE_COLOR]]\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]\m[] . el .PRINT \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . \} . RLD \\n[#DOC_LEAD]u \" Just looks better this way . \} . \} . FAMILY \\*[$DOC_FAM] . FT R .END \# .MAC NAMED_DOCHEADER END . DOC_HEADER_QUAD . FAMILY \\*[$TITLE_FAM] . FT \\*[$TITLE_FT] . ps \\*[$TITLE_PT_SIZE] . vs \\n[#DOCHEADER_LEAD]u . if !'\\*[$TITLE_1]'' \{\ . nr #ARG_NUM 0 1 . while \\n[#TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#TITLE_COLOR]=1 \ . PRINT "\m[\\*[$TITLE_COLOR]]\\*[$TITLE_\\n[#ARG_NUM]]\m[] . el .PRINT "\\*[$TITLE_\\n[#ARG_NUM]] . \} . \} . if !'\\*[$SUBTITLE]'' \{\ . FAMILY \\*[$SUBTITLE_FAM] . FT \\*[$SUBTITLE_FT] . ps \\*[$SUBTITLE_PT_SIZE] . nr #ARG_NUM 0 1 . while \\n[#SUBTITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#SUBTITLE_COLOR]=1 \ . PRINT "\m[\\*[$SUBTITLE_COLOR]]\\*[$SUBTITLE_\\n[#ARG_NUM]]\m[] . el .PRINT "\\*[$SUBTITLE_\\n[#ARG_NUM]] . \} . \} . if !'\\*[$AUTHOR_1]'' \{\ . FAMILY \\*[$AUTHOR_FAM] . FT \\*[$AUTHOR_FT] . ps \\*[$AUTHOR_PT_SIZE] . ie \\n[#ATTRIBUTE_COLOR]=1 \ . PRINT \&\m[\\*[$ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] . el .PRINT \&\\*[$ATTRIBUTE_STRING] . PRINT_AUTHORS . \} . FAMILY \\*[$DOCTYPE_FAM] . FT \\*[$DOCTYPE_FT] . ps \\*[$DOCTYPE_PT_SIZE] . vs \\n[#DOCHEADER_LEAD]u . ALD \\n[#DOCHEADER_LEAD]u . nr #FROM_DOCTYPE 1 . if \\n[#DOCTYPE_COLOR]=1 .COLOR \\*[$DOCTYPE_COLOR] . ie \\n[#DOCTYPE_UNDERLINE]=1 \ . UNDERSCORE \\*[$DOCTYPE_UNDERLINE_GAP] "\\*[$DOC_TYPE]" . el .PRINT "\\*[$DOC_TYPE]" . COLOR black . FAMILY \\*[$DOC_FAM] . FT R . rr #FROM_DOCTYPE .END \# \# COVER PAGE \# ---------- \# *Arguments: \# TITLE | DOCTITLE | CHAPTER | CHAPTER_TITLE | CHAPTER+TITLE | COVERTITLE \ \# [ SUBTITLE AUTHOR DOCTYPE COPYRIGHT MISC BLANKPAGE ] \# *Function: \# Toggles the number register for each cover page element \# passed as an argument. \# *Notes: \# TITLE, DOCTITLE, CHAPTER, CHAPTER_TITLE or CHAPTER+TITLE must \# be supplied. After that, users may enter as many or as few of \# the arguments as they like. BLANKPAGE inserts a blank page \# after the cover. \# \# If called as DOC_COVER, performs the same operations, but \# applies everything to a doc cover. \# .MAC COVER END . ie '\\$0'DOC_COVER' \{\ . nr #DOC_COVER 1 . ds DOC_ DOC_ . \} . el .nr #COVER 1 . nr #ARG_NUM 0 1 . nr #COVER_ITEM \\n[#NUM_ARGS] \"loop count . while \\n+[#ARG_NUM]<=\\n[#COVER_ITEM] \{\ . if '\\$1'TITLE' \{\ . nr #\\*[DOC_]COVER_TITLE 1 . shift . \} . if '\\$1'DOCTITLE' \{\ . nr #\\*[DOC_]COVER_TITLE 2 . shift . \} . if '\\$1'CHAPTER' \{\ . nr #\\*[DOC_]COVER_TITLE 3 . shift . \} . if '\\$1'CHAPTER_TITLE' \{\ . nr #\\*[DOC_]COVER_TITLE 4 . shift . \} . if '\\$1'CHAPTER+TITLE' \{\ . nr #\\*[DOC_]COVER_TITLE 5 . shift . \} . if '\\$1'\\*[DOC_]COVERTITLE' \{\ . nr #\\*[DOC_]COVER_TITLE 6 . shift . \} . if '\\$1'SUBTITLE' \{\ . nr #\\*[DOC_]COVER_SUBTITLE 1 . shift . \} . if '\\$1'AUTHOR' \{\ . nr #\\*[DOC_]COVER_AUTHOR 1 . shift . \} . if '\\$1'DOCTYPE' \{\ . nr #\\*[DOC_]COVER_DOCTYPE 1 . shift . \} . if '\\$1'COPYRIGHT' \{\ . nr #\\*[DOC_]COVER_COPYRIGHT 1 . shift . \} . if '\\$1'MISC' \{\ . nr #\\*[DOC_]COVER_MISC 1 . shift . \} . if '\\$1'PDF_OUTLINE_LABEL' \{\ . shift . ds $PDF_\\*[DOC_]COVER_LABEL \\$1 . shift . \} . if '\\$1'BLANKPAGE' \{\ . nr #\\*[DOC_]COVER_BLANKPAGE 1 . shift . \} . \} . if '\\$0'DOC_COVER' .rm DOC_ .END \# .MAC COVERTITLE END . ie '\\$0'DOC_COVERTITLE' \{\ . ie \\n[#NUM_ARGS]=0 \{\ . if \\n[#DOC_COVER_TITLE_NUM] \{\ . nr #ITEM 0 1 . while \\n[#DOC_COVER_TITLE_NUM]>\\n[#ITEM] \{\ . rm $DOC_COVER_TITLE_\\n+[#ITEM] . \} . rr #DOC_COVER_TITLE_NUM . rm $DOC_COVER_TITLE . \} . \} . el \{\ . nr #DOC_COVER_TITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#DOC_COVER_TITLE_NUM] \{\ . ds \ $DOC_COVER_TITLE_\\n+[#DOC_COVER_TITLE_NUM] \\$\\n[#DOC_COVER_TITLE_NUM] . \} . ds $DOC_COVER_TITLE \\$* . \} . \} . el \{\ . ie \\n[#NUM_ARGS]=0 \{\ . if \\n[#COVER_TITLE_NUM] \{\ . nr #ITEM 0 1 . while \\n[#COVER_TITLE_NUM]>\\n[#ITEM] \{\ . rm $COVER_TITLE_\\n+[#ITEM] . \} . rr #COVER_TITLE_NUM . rm $COVER_TITLE . \} . \} . el \{\ . nr #COVER_TITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#COVER_TITLE_NUM] \{\ . ds $COVER_TITLE_\\n+[#COVER_TITLE_NUM] \\$\\n[#COVER_TITLE_NUM] . \} . ds $COVER_TITLE \\$* .\" . if \\n[#DOCTITLE_NUM]=0 .PDF_TITLE \\*[$COVER_TITLE] . \} . \} .END \# \# COVER PAGE LEADING \# ------------------ \# *Arguments: \# <+|- amount by which to in/decrease leading of cover/doc cover> \# *Function: \# Stores user supplied lead in/decrease in string $COVER_LEAD_ADJ \# or $DOC_COVER_LEAD_ADJ, depending on whether the macro was called \# with an alias (DOC_COVER_LEAD). \# *Notes: \# A unit of measure must be supplied. Decimal fractions OK. \# Default is +0, i.e. same as DOC_LEAD. \# .MAC COVER_LEAD END . ie '\\$0'DOC_COVER_LEAD' .ds $DOC_COVER_LEAD_ADJ \\$1 . el .ds $COVER_LEAD_ADJ \\$1 .END \# \# MISCs get treated similarly to QUOTEs and BLOCKQUOTEs with respect to \# leading \# .MAC MISC_AUTOLEAD END . if '\\$0'DOC_COVER_MISC_AUTOLEAD' .nr #DOC_COVER_MISC_AUTOLEAD \\$1 . if '\\$0'COVER_MISC_AUTOLEAD' .nr #COVER_MISC_AUTOLEAD \\$1 .END \# .ALIAS DOC_COVER_MISC_AUTOLEAD MISC_AUTOLEAD .ALIAS COVER_MISC_AUTOLEAD MISC_AUTOLEAD \# \# COVER PAGE START POSITION \# ------------------------- \# *Arguments: \# \# *Function: \# Stores user supplied lead in/decrease in #COVER_START_POS \# or #DOC_COVER_START_POS, depending on whether the macro was \# called by an alias (DOC_COVER_ADVANCE). \# *Notes: \# A unit of measure must be supplied. Decimal fractions OK. \# If user doesn't invoke this macro, the default starting \# position for both covers and doc covers is 1/3 of the way \# down the page (setup in DO_COVER). \# .MAC COVER_ADVANCE END . ie '\\$0'DOC_COVER_ADVANCE' .nr #DOC_COVER_START_POS (\\$1) . el .nr #COVER_START_POS (\\$1) .END \# \# UNDERLINE CONTROL \# ----------------- \# *Arguments: \# [ DOUBLE ] [ [] ] | | \# *Function: \# Toggles underlining of the element indicated by the calling alias \# on or off. Uses #_UNDERLINE_WEIGHT to set the weight, \# and defines string $_UNDERLINE_GAP. \# *Notes: \# Calling aliases COVER_ and DOCCOVER_ only apply if DOCTYPE is \# NAMED and the DOCTYPE arg is passed to COVER or DOC_COVER. \# .MAC _UNDERLINE END . ie '\\$1'' \{\ . if '\\$0'BIBLIOGRAPHY_STRING_UNDERLINE' \ . nr #BIB_STRING_UNDERLINE 1 . if '\\$0'BIBLIOGRAPHY_STRING_UNDERSCORE' \ . nr #BIB_STRING_UNDERLINE 1 . if '\\$0'COVER_UNDERLINE' \ . nr #COVER_UNDERLINE 1 . if '\\$0'DOC_COVER_UNDERLINE' \ . nr #DOC_COVER_UNDERLINE 1 . if '\\$0'DOCTYPE_UNDERLINE' \ . nr #DOCTYPE_UNDERLINE 1 . if '\\$0'ENDNOTE_STRING_UNDERLINE' \ . nr #EN_STRING_UNDERLINE 1 . if '\\$0'ENDNOTE_STRING_UNDERSCORE' \ . nr #EN_STRING_UNDERLINE 1 . if '\\$0'ENDNOTE_TITLE_UNDERLINE' \ . nr #EN_TITLE_UNDERLINE 1 . if '\\$0'ENDNOTE_TITLE_UNDERSCORE' \ . nr #EN_TITLE_UNDERLINE 1 . \} . el \{\ . ie \\n[#NUM_ARGS]=1 \{\ . ds $ARG \\$1 . substring $ARG -1 . ie \B'\\*[$ARG]' \{\ . if !\\n[#PRINT_STYLE]=1 \{\ . if '\\$0'BIBLIOGRAPHY_STRING_UNDERLINE' \ . BIBLIOGRAPHY_STRING_UNDERLINE_WEIGHT \\$1 . if '\\$0'BIBLIOGRAPHY_STRING_UNDERSCORE' \ . BIBLIOGRAPHY_STRING_UNDERLINE_WEIGHT \\$1 . if '\\$0'COVER_UNDERLINE' \ . COVER_UNDERLINE_WEIGHT \\$1 . if '\\$0'DOC_COVER_UNDERLINE' \ . DOC_COVER_UNDERLINE_WEIGHT \\$1 . if '\\$0'DOCTYPE_UNDERLINE' \ . DOCTYPE_UNDERLINE_WEIGHT \\$1 . if '\\$0'ENDNOTE_STRING_UNDERLINE' \ . ENDNOTE_STRING_UNDERLINE_WEIGHT \\$1 . if '\\$0'ENDNOTE_STRING_UNDERSCORE' \ . ENDNOTE_STRING_UNDERLINE_WEIGHT \\$1 . if '\\$0'ENDNOTE_TITLE_UNDERLINE' \ . ENDNOTE_TITLE_UNDERLINE_WEIGHT \\$1 . if '\\$0'ENDNOTE_TITLE_UNDERSCORE' \ . ENDNOTE_TITLE_UNDERLINE_WEIGHT \\$1 . \} . \} . el \{\ . if '\\$0'BIBLIOGRAPHY_STRING_UNDERLINE' \{\ . ie '\\$1'DOUBLE' .nr #BIB_STRING_UNDERLINE 2 . el .nr #BIB_STRING_UNDERLINE 0 . \} . if '\\$0'BIBLIOGRAPHY_STRING_UNDERSCORE' \{\ . ie '\\$1'DOUBLE' .nr #BIB_STRING_UNDERLINE 2 . el .nr #BIB_STRING_UNDERLINE 0 . \} . if '\\$0'COVER_UNDERLINE' .nr #COVER_UNDERLINE 0 . if '\\$0'DOC_COVER_UNDERLINE' .nr #DOC_COVER_UNDERLINE 0 . if '\\$0'DOCTYPE_UNDERLINE' .nr #DOCTYPE_UNDERLINE 0 . if '\\$0'ENDNOTE_STRING_UNDERLINE' \{\ . ie '\\$1'DOUBLE' .nr #EN_STRING_UNDERLINE 2 . el .nr #EN_STRING_UNDERLINE 0 . \} . if '\\$0'ENDNOTE_STRING_UNDERSCORE' \{\ . ie '\\$1'DOUBLE' .nr #EN_STRING_UNDERLINE 2 . el .nr #EN_STRING_UNDERLINE 0 . \} . \} . \} . el \{\ . if !\\n[#PRINT_STYLE]=1 \{\ . if '\\$0'BIBLIOGRAPHY_STRING_UNDERLINE' \{\ . nr #BIB_STRING_UNDERLINE 1 . if '\\$1'DOUBLE' \{\ . nr #BIB_STRING_UNDERLINE 2 . shift . \} . BIBLIOGRAPHY_STRING_UNDERLINE_WEIGHT \\$1 . if !'\\$2'' \{\ . ds $BIB_STRING_UNDERLINE_GAP \\$2 . \} . if !'\\$3'' \{\ . ds $BIB_STRING_RULE_GAP \\$3 . \} . \} . if '\\$0'BIBLIOGRAPHY_STRING_UNDERSCORE' \{\ . nr #BIB_STRING_UNDERLINE 1 . if '\\$1'DOUBLE' \{\ . nr #BIB_STRING_UNDERLINE 2 . shift . \} . BIBLIOGRAPHY_STRING_UNDERLINE_WEIGHT \\$1 . if !'\\$2'' .ds $BIB_STRING_UNDERLINE_GAP \\$2 . if !'\\$3'' .ds $BIB_STRING_RULE_GAP \\$3 . \} . if '\\$0'COVER_UNDERLINE' \{\ . nr #COVER_UNDERLINE 1 . COVER_UNDERLINE_WEIGHT \\$1 . ds $COVER_UNDERLINE_GAP \\$2 . \} . if '\\$0'DOC_COVER_UNDERLINE' \{\ . nr #DOC_COVER_UNDERLINE 1 . DOC_COVER_UNDERLINE_WEIGHT \\$1 . ds $DOC_COVER_UNDERLINE_GAP \\$2 . \} . if '\\$0'DOCTYPE_UNDERLINE' \{\ . nr #DOCTYPE_UNDERLINE 1 . DOCTYPE_UNDERLINE_WEIGHT \\$1 . ds $DOCTYPE_UNDERLINE_GAP \\$2 . \} .\" ENDNOTE_STRING_UNDERLINE and ENDNOTE_STRING_UNDERSCORE are identical; .\" _UNDERSCORE left in for backward compatibility. . if '\\$0'ENDNOTE_STRING_UNDERLINE' \{\ . nr #EN_STRING_UNDERLINE 1 . if '\\$1'DOUBLE' \{\ . nr #EN_STRING_UNDERLINE 2 . shift . \} . ENDNOTE_STRING_UNDERLINE_WEIGHT \\$1 . if !'\\$2'' .ds $EN_STRING_UNDERLINE_GAP \\$2 . if !'\\$3'' .ds $EN_STRING_RULE_GAP \\$3 . \} . if '\\$0'ENDNOTE_STRING_UNDERSCORE' \{\ . nr #EN_STRING_UNDERLINE 1 . if '\\$1'DOUBLE' \{\ . nr #EN_STRING_UNDERLINE 2 . shift . \} . ENDNOTE_STRING_UNDERLINE_WEIGHT \\$1 . if !'\\$2'' .ds $EN_STRING_UNDERLINE_GAP \\$2 . if !'\\$3'' .ds $EN_STRING_RULE_GAP \\$3 . \} .\" ENDNOTE_TITLE_UNDERLINE and ENDNOTE_TITLE_UNDERSCORE are identical; .\" _UNDERSCORE version left in for backward compatibility. . if '\\$0'ENDNOTE_TITLE_UNDERLINE' \{\ . nr #ENDNOTE_TITLE_UNDERLINE 1 . ENDNOTE_TITLE_UNDERLINE_WEIGHT \\$1 . ds $EN_TITLE_UNDERLINE_GAP \\$2 . \} . if '\\$0'ENDNOTE_TITLE_UNDERSCORE' \{\ . nr #ENDNOTE_TITLE_UNDERLINE 1 . ENDNOTE_TITLE_UNDERLINE_WEIGHT \\$1 . ds $EN_TITLE_UNDERLINE_GAP \\$2 . \} . \} . \} . \} .END \# .ALIAS BIBLIOGRAPHY_STRING_UNDERSCORE _UNDERLINE .ALIAS BIBLIOGRAPHY_STRING_UNDERLINE _UNDERLINE .ALIAS COVER_UNDERLINE _UNDERLINE .ALIAS DOC_COVER_UNDERLINE _UNDERLINE .ALIAS DOCTYPE_UNDERLINE _UNDERLINE .ALIAS ENDNOTE_STRING_UNDERLINE _UNDERLINE .ALIAS ENDNOTE_STRING_UNDERSCORE _UNDERLINE .ALIAS ENDNOTE_TITLE_UNDERLINE _UNDERLINE .ALIAS ENDNOTE_TITLE_UNDERSCORE _UNDERLINE \# \# COVERS - WHETHER TO PRINT \# ------------------------- \# *Arguments: \# | \# *Function: \# Creates or removes registers #COVERS and #COVERS_OFF, checked for \# in DEFAULTS (in START) prior to printing \# .MAC COVERS END . ie '\\$0'DOC_COVERS' \{\ . ie '\\$1'' \{\ . rr #DOC_COVERS_OFF . nr #DOC_COVERS 1 . \} . el \{\ . rr #DOC_COVERS . nr #DOC_COVERS_OFF 1 . \} . \} . el \{\ . ie '\\$1'' \{\ . rr #COVERS_OFF . nr #COVERS 1 . \} . el \{\ . rr #COVERS . nr #COVERS_OFF 1 . \} . \} .END \# \# COVER_COUNTS_PAGES \# ------------------ \# *Arguments: \# | \# *Function: \# Creates or removes registers #COVERS_COUNT or #DOCCOVERS_COUNT, \# used in END_COVER to determine whether to increment the page \# number silently when doc covers or covers are output. \# .MAC COVER_COUNTS_PAGES END . if '\\$0'DOC_COVER_COUNTS_PAGES' \{\ . ie '\\$1'' .nr #DOCCOVERS_COUNT 1 . el .rr #DOCCOVERS_COUNT . return . \} . if '\\$0'COVER_COUNTS_PAGES' \{\ . ie '\\$1'' .nr #COVERS_COUNT 1 . el .rr #COVERS_COUNT . return . \} .END \# .MAC DO_COVER END . nr #DOING_COVER 1 . ev COVER . evc 0 . TRAP OFF . if \\n[#PAGINATE]=1 \{\ . nr #PAGINATION_WAS_ON 1 . rr #PAGINATE . \} . if \\n[#HEADERS_ON]=1 \{\ . nr #HEADERS_WERE_ON 1 . HEADERS OFF . \} . if \\n[#FOOTERS_ON]=1 \{\ . nr #FOOTERS_WERE_ON 1 . FOOTERS OFF . \} . if \\n[#COLUMNS]=1 \{\ . nr #COLUMNS_WERE_ON 1 . rr #COLUMNS . \} . ds PDF_BM . ie '\\$0'DO_DOC_COVER' \{\ . ds DOC_ DOC_ . nr #DOC_COVER_DONE 1 . if '\\*[$PDF_DOC_COVER_LABEL]'' \ . ds $PDF_DOC_COVER_LABEL Cover: . \} . el \{\ . if '\\*[$PDF_COVER_LABEL]'' .ds $PDF_COVER_LABEL Title Page: . \} . if !r#\\*[DOC_]COVER_START_POS \ . nr #\\*[DOC_]COVER_START_POS \\n[#PAGE_LENGTH]/3 . if \\n[#PRINT_STYLE]=1 \{\ . ie \\n[#SINGLE_SPACE]=1 .vs \\n[#DOC_LEAD]u*2u . el .vs \\n[#DOC_LEAD]u . \} . if \\n[#PRINT_STYLE]=2 \{\ . vs \\n[#DOC_LEAD]u\\*[$\\*[DOC_]COVER_LEAD_ADJ] . nr #\\*[DOC_]COVER_LEAD \\n[#LEAD] . \} . if \\n[.ns] .rs . if '\\$0'DO_COVER' \{\ . if \\n[TOC.RELOCATE]==5 \{\ . if !rTOC_BH .TOC_BEFORE_HERE . \} . \} . if '\\$0'DO_DOC_COVER' \{\ . if \\n[TOC.RELOCATE]==3 \{\ . if !rTOC_BH .TOC_BEFORE_HERE . \} . \} . RV_HARD_SET_MARGINS . sp |\\n[#\\*[DOC_]COVER_START_POS]u-1v . if \\n[#\\*[DOC_]COVER_COLOR]=1 \{\ . nf \m[\\*[$\\*[DOC_]COVER_COLOR]] . EOL . \} . \\*[DOC_]COVER_H_POS . fam \\*[$\\*[DOC_]COVER_TITLE_FAM] . ft \\*[$\\*[DOC_]COVER_TITLE_FT] . ps \\*[$\\*[DOC_]COVER_TITLE_PT_SIZE] . ie \\n[#PRINT_STYLE]=1 \{\ . ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u*2u \} . el \{ .vs \\n[#DOC_LEAD]u \} . \} . el .vs \\n[#\\*[DOC_]COVER_LEAD]u . if \\n[#PRINT_STYLE]=1 .TYPEWRITER . if \\n[#\\*[DOC_]COVER_TITLE] \{\ . nr PDFHREF.VIEW.LEADING.H \\n[PDFHREF.VIEW.LEADING] . nr PDFHREF.VIEW.LEADING \\n[nl]u-1v-1000u . \} . if \\n[#\\*[DOC_]COVER_TITLE]=1 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . nr #ARG_NUM 0 1 . while \\n[#TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE "\\*[$TITLE_\\n[#ARG_NUM]]" . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$TITLE_\\n[#ARG_NUM]] . \} . CAPS OFF . \} . el \{\ . nr #ARG_NUM 0 1 . while \\n[#TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#\\*[DOC_]COVER_TITLE_COLOR]=1 \ . PRINT \ \m[\\*[$\\*[DOC_]COVER_TITLE_COLOR]]\\*[$TITLE_\\n[#ARG_NUM]]\m[] . el \ . PRINT "\\*[$TITLE_\\n[#ARG_NUM]] . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$TITLE_\\n[#ARG_NUM]] . \} . \} . PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM] .\" . PDF_TITLE \\*[PDF_BM] . \} . if \\n[#\\*[DOC_]COVER_TITLE]=2 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . nr #ARG_NUM 0 1 . while \\n[#DOCTITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE "\\*[$\\*[DOC_]TITLE_\\n[#ARG_NUM]]" . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$\\*[DOC_]TITLE_\\n[#ARG_NUM]] . \} . CAPS OFF . \} . el \{\ . nr #ARG_NUM 0 1 . while \\n[#DOCTITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#\\*[DOC_]COVER_TITLE_COLOR]=1 \ . PRINT \ \m[\\*[$\\*[DOC_]COVER_TITLE_COLOR]]\\*[$\\*[DOC_]TITLE_\\n[#ARG_NUM]]\m[] . el .PRINT \\*[$\\*[DOC_]TITLE_\\n[#ARG_NUM]] . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$\\*[DOC_]TITLE_\\n[#ARG_NUM]] . \} . \} . PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM] .\" . PDF_TITLE \\*[PDF_BM] . \} . if \\n[#\\*[DOC_]COVER_TITLE]=3 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] . CAPS OFF . \} . el \{\ . ie \\n[#\\*[DOC_]COVER_TITLE_COLOR]=1 \ . PRINT \ \m[\\*[$\\*[DOC_]COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] . el .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . PDF_BOOKMARK 1 \ \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[$CHAPTER_STRING] \\*[$CHAPTER] .\" . PDF_TITLE \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . if \\n[#\\*[DOC_]COVER_TITLE]=4 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . nr #ARG_NUM 0 1 . ie \\n[#SINGLE_SPACE]=0 .vs \\n[#DOC_LEAD]u/2u . el .vs \\n[#DOC_LEAD]u . sp . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE "\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]" . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . \} . CAPS OFF . if \\n[#SINGLE_SPACE]=0 .vs \\n[#DOC_LEAD]u . \} . el \{\ . nr #ARG_NUM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#\\*[DOC_]COVER_TITLE_COLOR]=1 \ . PRINT \ \m[\\*[$\\*[DOC_]COVER_TITLE_COLOR]]\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]\m[] . el .PRINT \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . \} . \} . PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM] .\" . PDF_TITLE \\*[PDF_BM] . \} . if \\n[#\\*[DOC_]COVER_TITLE]=5 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] . CAPS OFF . \} . el \{\ . ie \\n[#\\*[DOC_]COVER_TITLE_COLOR]=1 \ . PRINT \ \m[\\*[$\\*[DOC_]COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] . el .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . if !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . ie \\n[#SINGLE_SPACE]=0 .vs \\n[#DOC_LEAD]u/2u . el .vs \\n[#DOC_LEAD]u . sp . nr #ARG_NUM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE "\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]" . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . \} . if \\n[#SINGLE_SPACE]=0 .vs \\n[#DOC_LEAD]u . \} . el \{\ . fam \\*[$\\*[DOC_]COVER_CHAPTER_TITLE_FAM] . ft \\*[$\\*[DOC_]COVER_CHAPTER_TITLE_FT] . ps \\*[$\\*[DOC_]COVER_CHAPTER_TITLE_PT_SIZE] . ALD \\n[.v]u/4u \"Put a little space before the chapter title . nr #ARG_NUM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#\\*[DOC_]COVER_TITLE_COLOR]=1 \ . PRINT \ \m[\\*[$\\*[DOC_]COVER_TITLE_COLOR]]\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]\m[] . el .PRINT \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . \} . \} . \} . PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM] .\" . PDF_TITLE \\*[PDF_BM] . \} . if \\n[#\\*[DOC_]COVER_TITLE]=6 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . nr #ARG_NUM 0 1 . while \\n[#\\*[DOC_]COVER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE "\\*[$\\*[DOC_]COVER_TITLE_\\n[#ARG_NUM]]" . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$\\*[DOC_]COVER_TITLE_\\n[#ARG_NUM]] . \} . CAPS OFF . \} . el \{\ . nr #ARG_NUM 0 1 . while \\n[#\\*[DOC_]COVER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#\\*[DOC_]COVER_TITLE_COLOR]=1 \ . PRINT \ \m[\\*[$\\*[DOC_]COVER_TITLE_COLOR]]\ \\*[$\\*[DOC_]COVER_TITLE_\\n[#ARG_NUM]]\m[] . el .PRINT \\*[$\\*[DOC_]COVER_TITLE_\\n[#ARG_NUM]] . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$\\*[DOC_]COVER_TITLE_\\n[#ARG_NUM]] . \} . \} . PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM] .\" . PDF_TITLE \\*[PDF_BM] . \} . if \\n[#\\*[DOC_]COVER_TITLE] \{\ . nr PDFHREF.VIEW.LEADING \\n[PDFHREF.VIEW.LEADING.H] . rr PDFHREF.VIEW.LEADING.H . \} . if !\\n[#DOC_TYPE]=2 \{\ . if \\n[#\\*[DOC_]COVER_SUBTITLE]=1 \{\ . fam \\*[$\\*[DOC_]COVER_SUBTITLE_FAM] . ft \\*[$\\*[DOC_]COVER_SUBTITLE_FT] . ps \\*[$\\*[DOC_]COVER_SUBTITLE_PT_SIZE] . if \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . ie \\n[#SINGLE_SPACE]=0 .vs \\n[#DOC_LEAD]u/2u . el .vs \\n[#DOC_LEAD]u . sp . \} . if \\n[#\\*[DOC_]COVER]=1 \{\ . ie !'\\*[$SUBTITLE_\\*[DOC_]COVER_1]'' \{\ . nr #SUBTITLES \\n[#SUBTITLE_\\*[DOC_]COVER_NUM] . nr #NEXT_SUBTITLE 0 1 . while \\n[#SUBTITLES]>\\n[#NEXT_SUBTITLE] \{\ . ie \\n[#\\*[DOC_]COVER_SUBTITLE_COLOR]=1 \ . PRINT \ \m[\\*[$\\*[DOC_]COVER_SUBTITLE_COLOR]]\ \\*[$SUBTITLE_\\*[DOC_]COVER_\\n+[#NEXT_SUBTITLE]]\m[] . el .PRINT \ \\*[$SUBTITLE_\\*[DOC_]COVER_\\n+[#NEXT_SUBTITLE]] . \} . \} . el \{\ . nr #SUBTITLES \\n[#SUBTITLE_NUM] . nr #NEXT_SUBTITLE 0 1 . while \\n[#SUBTITLES]>\\n[#NEXT_SUBTITLE] \{\ . ie \\n[#\\*[DOC_]COVER_SUBTITLE_COLOR]=1 \ . PRINT \ \m[\\*[$\\*[DOC_]COVER_SUBTITLE_COLOR]]\\*[$SUBTITLE_\\n+[#NEXT_SUBTITLE]]\m[] . el .PRINT \\*[$SUBTITLE_\\n+[#NEXT_SUBTITLE]] . \} . \} . \} . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#SINGLE_SPACE]=0 .vs . \} . \} . if \\n[#PRINT_STYLE]=1 \{\ . if !r#\\*[DOC_]COVER_SUBTITLE .sp . \} . \} . if \\n[#\\*[DOC_]COVER_AUTHOR]=1 \{\ . fam \\*[$\\*[DOC_]COVER_AUTHOR_FAM] . ft \\*[$\\*[DOC_]COVER_AUTHOR_FT] . ps \\*[$\\*[DOC_]COVER_AUTHOR_PT_SIZE] . if \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . ie \\n[#SINGLE_SPACE]=1 .vs \\n[#DOC_LEAD]u . el .vs \\n[#DOC_LEAD]u/2u . sp . \} . ie d$ATTRIBUTE_STRING_DO_CCOVER \{\ . ie \\n[#\\*[DOC_]COVER_ATTRIBUTE_COLOR]=1 \ . PRINT \ \&\m[\\*[$\\*[DOC_]COVER_ATTRIBUTE_COLOR]]\ \\*[$ATTRIBUTE_STRING_\\*[DOC_]COVER]\m[] . el .PRINT \&\\*[$ATTRIBUTE_STRING_\\*[DOC_]COVER] . \} . el \{\ . if d$ATTRIBUTE_STRING \{\ . ie \\n[#\\*[DOC_]COVER_ATTRIBUTE_COLOR]=1 \ . PRINT \ \&\m[\\*[$\\*[DOC_]COVER_ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] . el .PRINT \&\\*[$ATTRIBUTE_STRING] . \} . \} . PRINT_AUTHORS . \} . fam \\*[$\\*[DOC_]COVER_DOCTYPE_FAM] . ft \\*[$\\*[DOC_]COVER_DOCTYPE_FT] . ps \\*[$\\*[DOC_]COVER_DOCTYPE_PT_SIZE] . sp . if \\n[#DOC_TYPE]=3 \{\ . if \\n[#\\*[DOC_]COVER_DOCTYPE]=1 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . vs \\n[#DOC_LEAD]u . UNDERSCORE2 "\\*[$DOC_TYPE]" . \} . el \{\ . nr #FROM_\\*[DOC_]COVER 1 . ie \\n[#\\*[DOC_]COVER_DOCTYPE_COLOR]=1 \{\ . COLOR \\*[$\\*[DOC_]COVER_DOCTYPE_COLOR] . ie \\n[#\\*[DOC_]COVER_UNDERLINE]=1 \ . UNDERSCORE \\*[$\\*[DOC_]COVER_UNDERLINE_GAP] "\\*[$DOC_TYPE]" . el .PRINT "\\*[$DOC_TYPE]" . \} . el \{\ . ie \\n[#\\*[DOC_]COVER_UNDERLINE]=1 \ . UNDERSCORE \ \\*[$\\*[DOC_]COVER_UNDERLINE_GAP] "\\*[$DOC_TYPE]" . el .PRINT "\\*[$DOC_TYPE]" . \} . rr #FROM_\\*[DOC_]COVER . \} . \} . \} . sp |\\n[#VISUAL_B_MARGIN]u . ie \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . ie \\n[#SINGLE_SPACE]=1 .vs \\n[#DOC_LEAD]u . el .vs \\n[#DOC_LEAD]u/2u . sp . \} . el \{\ . fam \\*[$\\*[DOC_]COVER_COPYRIGHT_FAM] . ft \\*[$\\*[DOC_]COVER_COPYRIGHT_FT] . ps \\*[$\\*[DOC_]COVER_COPYRIGHT_PT_SIZE] . vs \\n[.ps]u+\\n[#\\*[DOC_]COVER_MISC_AUTOLEAD] . nr #COPYRIGHT_V_ADJ \\n[#DOC_LEAD]-\\n[.v] . sp \\n[#COPYRIGHT_V_ADJ]u . rr #COPYRIGHT_V_ADJ . \} . if \\n[#\\*[DOC_]COVER_COPYRIGHT]=1 \{\ . if !'\\*[$COPYRIGHT_DOCCOVER]'' \{\ . ds $SAVED_COPYRIGHT \\*[$COPYRIGHT] . ds $COPYRIGHT \\*[$COPYRIGHT_DOCCOVER] . \} . QUAD \\*[$\\*[DOC_]COVER_COPYRIGHT_QUAD] . ie \\n[#\\*[DOC_]COVER_COPYRIGHT_COLOR]=1 \ . PRINT \m[\\*[$\\*[DOC_]COVER_COPYRIGHT_COLOR]]\\*[$COPYRIGHT]\m[] . el .PRINT \\*[$COPYRIGHT] . if d$SAVED_COPYRIGHT .ds $COPYRIGHT \\*[$SAVED_COPYRIGHT] . \} . br . if \\n[#\\*[DOC_]COVER_MISC]=1 \{\ . if \\n[#PRINT_STYLE]=2 \{\ . fam \\*[$\\*[DOC_]COVER_MISC_FAM] . ft \\*[$\\*[DOC_]COVER_MISC_FT] . ps \\*[$\\*[DOC_]COVER_MISC_PT_SIZE] . \} . QUAD \\*[$\\*[DOC_]COVER_MISC_QUAD] . ie !'\\*[$MISC_\\*[DOC_]COVER_1]'' \{\ . nr #MISCS \\n[#MISC_\\*[DOC_]COVER_NUM] . nr #NEXT_MISC 0 1 . while \\n[#MISCS]>\\n[#NEXT_MISC] \{\ . ie \\n[#\\*[DOC_]COVER_MISC_COLOR]=1 \{\ . da MISC_DIV . PRINT \ \m[\\*[$\\*[DOC_]COVER_MISC_COLOR]]\\*[$MISC_\\*[DOC_]COVER_\\n+[#NEXT_MISC]]\m[] . br . da . rm $MISC_\\*[DOC_]COVER_\\n[#NEXT_MISC] . rm $MISC_\\n[#NEXT_MISC] . \} . el \{\ . da MISC_DIV . PRINT \\*[$MISC_\\*[DOC_]COVER_\\n+[#NEXT_MISC]] . br . da . rm $MISC_\\*[DOC_]COVER_\\n[#NEXT_MISC] . rm $MISC_\\n[#NEXT_MISC] . \} . \} . rm $MISC_\\n+[#NEXT_MISC] . \} . el \{\ . nr #MISCS \\n[#MISC_NUM] . nr #NEXT_MISC 0 1 . while \\n[#MISCS]>\\n[#NEXT_MISC] \{\ . ie \\n[#\\*[DOC_]COVER_MISC_COLOR]=1 \{\ . da MISC_DIV . PRINT \ \m[\\*[$\\*[DOC_]COVER_MISC_COLOR]]\\*[$MISC_\\n+[#NEXT_MISC]]\m[] . br . da . \} . el \{\ . da MISC_DIV . PRINT \\*[$MISC_\\n+[#NEXT_MISC]] . br . da . \} . nr #MISC_DEPTH +\\n[dn] . \} . \} . nr #MISC_DEPTH -\\n[#DOC_LEAD] . sp |\\n[#VISUAL_B_MARGIN]u-\\n[#MISC_DEPTH]u . nf . MISC_DIV . rm MISC_DIV . rr #MISC_DEPTH . \} . if '\\$0'DO_COVER' .nr #COVER_END 1 . if '\\$0'DO_DOC_COVER' .nr #DOC_COVER_END 1 . if \\n[TOC.RELOCATE]==1 \{\ . if !\\n[#COVER_BLANKPAGE] \ . if !rTOC_BH .TOC_AFTER_HERE . \} . if '\\$0'DO_COVER' \{\ . if \\n[TOC.RELOCATE]==6 \ . if !rTOC_BH .TOC_AFTER_HERE . \} . if '\\$0'DO_DOC_COVER' \{\ . if \\n[TOC.RELOCATE]==4 \ . if !rTOC_BH .TOC_AFTER_HERE . \} . if '\\$0'DO_DOC_COVER' .rm DOC_ . END_COVER .END \# \# Macro to terminate (doc)cover processing \# .MAC END_COVER END . EOL . TRAP . NEWPAGE . if \\n[#PAGINATION_WAS_ON]=1 .nr % +1 . if \\n[#DOC_COVER_END]=1 \{\ . ie \\n[#DOC_COVER_BLANKPAGE]=1 \{\ . if \\n[TOC.RELOCATE] \ . if !\\n[#TOC_BH] .TOC_AFTER_HERE . NEWPAGE . rr #DOC_COVER_BLANKPAGE . if !\\n[#DOCCOVERS_COUNT]=1 .nr % -2 . \} . el \ . if !\\n[#DOCCOVERS_COUNT]=1 .nr #PAGE_NUM_ADJ -1 . rr #DOC_COVER_END . \} . if \\n[#COVER_END]=1 \{\ . ie \\n[#COVER_BLANKPAGE]=1 \{\ . if \\n[TOC.RELOCATE] \ . if !\\n[TOC_BH] .TOC_AFTER_HERE . NEWPAGE . rr #COVER_BLANKPAGE . if !\\n[#COVERS_COUNT]=1 .nr % -2 . \} . el \ . if !\\n[#COVERS_COUNT]=1 .nr #PAGE_NUM_ADJ -1 . rr #COVER_END . \} . ev . if \\n[#PAGINATION_WAS_ON] \{\ . rr #PAGINATION_WAS_ON . PAGINATE . PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ]-1 . \} . if \\n[#HEADERS_WERE_ON] \{\ . rr #HEADERS_WERE_ON . HEADERS . \} . if \\n[#FOOTERS_WERE_ON] \{\ . rr #FOOTERS_WERE_ON . FOOTERS . \} . if \\n[#COLUMNS_WERE_ON]=1 \{\ . rr #COLUMNS_WERE_ON 1 . nr #COLUMNS 1 . \} . rr #DOING_COVER . if \\n[.ns] .nop \& . if \\n[#RECTO_VERSO] .nr #RV_POST_COVER 1 .END \# \# Macro to begin document processing \# .MAC START END . nr #DOCS 1 . if \\n[TOC.RELOCATE]==2 \{\ . if !\\n[TOC_BH] .TOC_BEFORE_HERE . \} . if !n .nop \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap' . if !\\n[#PRINT_STYLE] \{\ . PRINTSTYLE TYPEWRITE . PRINT \& . po 6P . ll 39P . ta \\n[.l]u . sp |1i-1v . CENTER . PRINT "You neglected to enter a PRINTSTYLE" . fl . ab [mom]: PRINTSTYLE missing. Aborting '\\n[.F]'. . \} . if \\n[#LINENUMBERS]=1 \{\ . nn . NUMBER_LINES OFF . nr #LINENUMBERS 2 . \} . if \\n[#COLLATE] \{\ . COPYSTYLE \\*[$COPY_STYLE] . nr #HEADERS_ON \\n[#HEADER_STATE] . if \\n[#PAGE_NUM_V_POS]=1 .nr #PAGINATE \\n[#PAGINATION_STATE] . PRINT \& . if !'\\*[$RESTORE_PAGENUM_STYLE]'' \{\ . PAGENUM_STYLE \\*[$RESTORE_PAGENUM_STYLE] . rm $RESTORE_PAGENUM_STYLE . \} . \} . DEFAULTS . rr #RESET_TRAPS . if !r#EN_Q_AUTOLEAD .nr #EN_Q_LEAD \\n[#EN_LEAD] . if !r#EN_BQ_AUTOLEAD .nr #EN_BQ_LEAD \\n[#EN_LEAD] .\" TOC/recto-verso stuff . if !r@L_MARGIN .nr @L_MARGIN \\n[#DOC_L_MARGIN] . if !r@R_MARGIN .nr @R_MARGIN \\n[#DOC_R_MARGIN] .\" Covers and doc covers . if \\n[#DOC_COVERS]=1 \{\ . if \\n[#DOC_COVER]=1 \{\ . DO_DOC_COVER . rr #DOC_COVER . rr #DOC_COVER_TITLE . rr #DOC_COVER_SUBTITLE . rr #DOC_COVER_AUTHOR . rr #DOC_COVER_DOCTYPE . rr #DOC_COVER_COPYRIGHT . rr #DOC_COVER_MISC . \} . \} . if \\n[#COVERS]=1 \{\ . if \\n[#COVER]=1 \{\ . DO_COVER . rr #COVER . rr #COVER_TITLE . rr #COVER_SUBTITLE . rr #COVER_AUTHOR . rr #COVER_DOCTYPE . rr #COVER_COPYRIGHT . rr #COVER_MISC . \} . \} . if !\\n[#TOC] .RV_HARD_SET_MARGINS . if \\n[#COLUMNS] .COLUMNS \\n[#NUM_COLS] \\n[#GUTTER]u .\" Collect TITLE for TOC. . if !\\n[#TOC]=1 \{\ . nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ] . af #TOC_ENTRY_PN \\g[#PAGENUMBER] . ie \\n[#USER_SET_TITLE_ITEM] \{\ . ds $TOC_TITLE_ITEM \\*[$USER_SET_TITLE_ITEM] . rr #USER_SET_TITLE_ITEM . rm $USER_SET_TITLE_ITEM . \} . el \{\ . ie \\n[#DOC_TYPE]=2 \{\ . ie '\\*[$CHAPTER_TITLE]'' \ . ds $TOC_TITLE_ITEM \\*[$CHAPTER_STRING] \\*[$CHAPTER] . el \{\ . ie '\\*[$CHAPTER]'' \ . ds $TOC_TITLE_ITEM \\*[$CHAPTER_TITLE] . el \ . ds $TOC_TITLE_ITEM \ \\*[$CHAPTER_STRING] \\*[$CHAPTER]: \\*[$CHAPTER_TITLE] . \} . \} . el \ . ds $TOC_TITLE_ITEM \\*[$TITLE] . \} . if \\n[#TOC_AUTHORS]=1 \{\ . ie '\\*[$TOC_AUTHORS]'' \ . as $TOC_TITLE_ITEM / \\*[$AUTHOR_1] . el \{\ . as $TOC_TITLE_ITEM / \\*[$TOC_AUTHORS] . rm $TOC_AUTHORS . \} . \} . nop . sp |\\n[#DOCHEADER_ADVANCE]u-\\n[#DOC_LEAD]u . PDF_BOOKMARK 1 \\*[$TOC_TITLE_ITEM] . as $TOC_TITLE_ITEM \| . if \\n[#PREFIX_CH_NUM] \{\ . rn $TOC_TITLE_ITEM $TOC_TITLE_ITEM_OLD . ds $TOC_CH_NUM \\n[#CH_NUM].\[toc-hd-num-spacer] . ds $TOC_TITLE_ITEM \\*[$TOC_CH_NUM]\\*[$TOC_TITLE_ITEM_OLD] . rm $TOC_TITLE_ITEM_OLD . \} . TITLE_TO_TOC . \} . if !\\n[#TOC] .nr #POST_TOP 1 .\" End TITLE collection . if \\n[#PRINT_PAGENUM_ON_PAGE_1] \{\ . br . sp |\\n[#HEADER_MARGIN]u . PRINT_PAGE_NUMBER . \} . rr #COLLATE . rr #PAGINATION_STATE .\" End collate stuff . ie \\n[#DOC_HEADER]=0 \{\ . if \\n[.ns] .rs . if \\n[#DOC_TYPE]=4 \ . if !'\\n[.z]'' .di . nr #STORED_PP_INDENT \\n[#PP_INDENT] . PARA_INDENT 0 . PP . PARA_INDENT \\n[#STORED_PP_INDENT]u . rr #STORED_PP_INDENT . ie r#ADVANCE_FROM_TOP \{\ . br . sp |\\n[#ADVANCE_FROM_TOP]u-1v . if \\n[#ADJ_DOC_LEAD]=1 .SHIM . \} . el \{\ . br . sp |\\n[#T_MARGIN]u-1v . \} . if \\n[#COLUMNS] \{\ . mk dc . nr #COL_NUM 0 1 . po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . ll \\n[#COL_L_LENGTH]u . \} . nr #PP 0 . \} . el \{\ . if \\n[#AUTO_LEAD] .nr #RESTORE_AUTO_LEAD 1 . if \\n[#PRINT_STYLE]=2 .vs \\n[#DOC_LEAD]u\\*[$DOCHEADER_LEAD_ADJ] . if \\n[#RESTORE_AUTO_LEAD] \{\ . nr #AUTO_LEAD 1 . nr #AUTOLEAD_VALUE \\n[#SAVED_AUTOLEAD_VALUE] . \} . nr #DOCHEADER_LEAD \\n[#LEAD] .\" Default doctype . if \\n[#DOC_TYPE]=1 \{\ . if \\n[.ns] .rs . ev DOCHEADER . if \\n[#DOCHEADER_COLOR]=1 \{\ . nf \m[\\*[$DOCHEADER_COLOR]] . EOL . \} . L_MARGIN \\n[#DOC_L_MARGIN]u . LL \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . if \\n[#PRINT_STYLE]=1 \{\ . CENTER . TYPEWRITER . if !\\n[#SINGLE_SPACE] .vs \\n[#DOC_LEAD]u/2u . if !'\\*[$TITLE_1]'' \{\ . CAPS . nr #ARG_NUM 0 1 . while \\n[#TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE 4p "\\*[$TITLE_\\n[#ARG_NUM]]" . \} . CAPS OFF . \} . if !'\\*[$SUBTITLE]'' \{\ . sp . nr #ARG_NUM 0 1 . while \\n[#SUBTITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE 4p "\\*[$SUBTITLE_\\n[#ARG_NUM]]" . \} . \} . if !'\\*[$AUTHOR_1]'' \{\ . sp . PRINT \&\\*[$ATTRIBUTE_STRING] . nr #AUTHORS \\n[#AUTHOR_NUM] . nr #NEXT_AUTHOR 0 1 . if !\\n[#SINGLE_SPACE] .vs \\n[#DOC_LEAD]u/2u . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] . \} . \} . \} . if \\n[#PRINT_STYLE]=2 \{\ . DEFAULT_DOCHEADER . \} . ev . \} .\" Chapter doctype . if \\n[#DOC_TYPE]=2 \{\ . if \\n[.ns] .rs . ev DOCHEADER . if \\n[#DOCHEADER_COLOR]=1 \{\ . nf \m[\\*[$DOCHEADER_COLOR]] . EOL . \} . L_MARGIN \\n[#DOC_L_MARGIN]u . LL \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . if \\n[#PRINT_STYLE]=1 \{\ . CENTER . TYPEWRITER . vs \\n[#DOC_LEAD]u . if !\\n[#SINGLE_SPACE]=1 .vs \\n[#DOC_LEAD]u/2u . ie '\\*[$CHAPTER]'' \{\ . CAPS . ie !'\\*[$CHAPTER_TITLE]'' \{\ . nr #ARG_NUM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE 4p "\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]" . \} . \} . el \{\ . CAPS . UNDERSCORE 4p "\\*[$CHAPTER_STRING]" . \} . CAPS OFF . RLD 1v . \} . el \{\ . CAPS . PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] . CAPS OFF . if !'\\*[$CHAPTER_TITLE]'' \{\ . sp . nr #ARG_NUM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE 4p "\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]" . \} . \} . RLD 1v . \} . vs \\n[#DOC_LEAD]u . if \\n[#SINGLE_SPACE] .ALD 2v . \} . if \\n[#PRINT_STYLE]=2 \{\ . CHAPTER_DOCHEADER . di DOCHEADER_DIVERSION \" This diversion is only . br \" necessary to find the depth of the . CHAPTER_DOCHEADER \" docheader . br . di . nr #DOCHEADER_DEPTH \\n[dn]-\\n[#DOCHEADER_LEAD] \" Storing the depth (height) of the diversion . \" in #DOCHEADER_DEPTH . rm DOCHEADER_DIVERSION \" Removing the diversion macro . \} . ev . \} .\" Named . if \\n[#DOC_TYPE]=3 \{\ . if \\n[.ns] .rs . ev DOCHEADER . if \\n[#DOCHEADER_COLOR]=1 \{\ . nf \m[\\*[$DOCHEADER_COLOR]] . EOL . \} . L_MARGIN \\n[#DOC_L_MARGIN]u . LL \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . if \\n[#PRINT_STYLE]=1 \{\ . CENTER . TYPEWRITER . if !\\n[#SINGLE_SPACE] .vs \\n[#DOC_LEAD]u/2u . CAPS . if !'\\*[$TITLE]'' \{\ . nr #ARG_NUM 0 1 . while \\n[#TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE 4p "\\*[$TITLE_\\n[#ARG_NUM]]" . \} . \} . CAPS OFF . if !'\\*[$SUBTITLE]'' \{\ . sp . nr #ARG_NUM 0 1 . while \\n[#SUBTITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE 4p "\\*[$SUBTITLE_\\n[#ARG_NUM]]" . \} . \} . if !'\\*[$AUTHOR_1]'' \{\ . sp . PRINT \&\\*[$ATTRIBUTE_STRING] . nr #AUTHORS \\n[#AUTHOR_NUM] . nr #NEXT_AUTHOR 0 1 . if !\\n[#SINGLE_SPACE] .vs \\n[#DOC_LEAD]u/2u . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] . \} . \} . ie !\\n[#SINGLE_SPACE] .sp 2 . el .sp . ie \\n[#DOCTYPE_UNDERLINE] \{\ . UNDERSCORE2 4p "\\*[$DOC_TYPE]" . \} . el \ . PRINT "\\*[$DOC_TYPE]" . if \\n[#SINGLE_SPACE]=1 .sp . \} . if \\n[#PRINT_STYLE]=2 .NAMED_DOCHEADER . ev . \} . if !\\n[#DOC_TYPE]=4 \{\ . if \\n[#PRINT_STYLE]=1 .sp . if \\n[#PRINT_STYLE]=2 .ALD \\n[#DOC_LEAD]u*2u . if \\n[#COLUMNS] \{\ . nr #COL_NUM 0 1 . nr #L_LENGTH_FOR_EPI \\n[#L_LENGTH] . ie \\n[#RV_POST_COVER] \{\ . nr #COL_\\n+[#COL_NUM]_L_MARGIN \\n[#DOC_L_MARGIN] . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . rr #RV_POST_COVER . \} . el \{\ . po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . \} . LL \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . \} . \} . vs \\n[#DOC_LEAD]u . if \\n[#ADJ_DOC_LEAD]=1 \{\ . ie !r#ADVANCE_FROM_TOP \ . if \\n[#DOC_HEADER]=1 .SHIM . el .rr #ADVANCE_FROM_TOP . \} . mk dc . QUAD \\*[$DOC_QUAD] . CLEANUP_DEFAULTS . nr #START_FOR_FOOTERS 1 . if !\\n[#DOC_TYPE]=4 .em TERMINATE . if \\n[#LINENUMBERS]=2 \{\ . NUMBER_LINES RESUME . nr #LINENUMBERS 1 . \} . if \\n[#RUN_ON]=1 \{\ . if \\n[#FN_MARKER_STYLE]=1 .RUNON_WARNING . if \\n[#FN_MARKER_STYLE]=2 .RUNON_WARNING . \} .END \# .MAC CLEANUP_DEFAULTS END . nr #START 1 . if \\n[#DOC_HEADER]=1 .nr #DOC_HEADER 2 . rm $TOC_TITLE_ITEM . rr #MISC_NUM . rr #MISCS . rr #NEXT_AUTHOR . rr #NEXT_MISC .END \# \# ==================================================================== \# \# +++MACROS TO CHANGE SOME DEFAULTS+++ \# \# DOCUMENT HEADER \# --------------- \# *Argument: \# | [distance to advance from top of page] \# *Function: \# Turns printing of document header on or off. If a second \# numeric argument with units of measure is given, advances that \# distance from the top of the page without printing the document \# header. \# *Notes: \# Default is on. If the 1st argument is (which turns \# document headers off), the optional 2nd argument may be given \# (with a unit of measure). \# .MAC DOCHEADER END . ie '\\$1'' .nr #DOC_HEADER 1 . el \{\ . if !'\\$2'' .nr #ADVANCE_FROM_TOP (\\$2) . nr #DOC_HEADER 0 . \} .END \# \# DOCUMENT HEADER LEADING \# ----------------------- \# *Arguments: \# <+|- amount by which to in/decrease leading of doc header> \# *Function: \# Stores user supplied lead in/decrease in string $DOCHEADER_LEAD_ADJ. \# *Notes: \# A unit of measure must be supplied. Decimal fractions OK. \# Default is +0, i.e. same as DOC_LEAD. \# .MAC DOCHEADER_LEAD END . ds $DOCHEADER_LEAD_ADJ \\$1 .END \# \# DOCHEADER ADVANCE \# ----------------- \# *Arguments: \# \# *Function: \# Creates register #DOCHEADER_ADVANCE, used in START. \# *Notes: \# Unit of measure required. \# Default is same as T_MARGIN. \# .MAC DOCHEADER_ADVANCE END . nr #DOCHEADER_ADVANCE (\\$1) .END \# \# DOCUMENT LEFT MARGIN \# -------------------- \# *Argument: \# \# *Function: \# Creates or modifies register #DOC_L_MARGIN. \# *Notes: \# Affects everything on the page. \# .MAC DOC_LEFT_MARGIN END . if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0 . br . nr #DOC_L_MARGIN (\\$1) . L_MARGIN \\n[#DOC_L_MARGIN]u .END \# \# DOCUMENT RIGHT MARGIN \# --------------------- \# *Argument: \# \# *Function: \# Creates or modifies register #DOC_R_MARGIN. \# *Notes: \# Affects everything on the page. \# .MAC DOC_RIGHT_MARGIN END . br . nr #DOC_R_MARGIN (\\$1) . R_MARGIN \\n[#DOC_R_MARGIN] . nr #DOC_L_LENGTH \\n[#L_LENGTH] .END \# \# DOCUMENT LINE LENGTH \# -------------------- \# *Argument: \# \# *Function: \# Creates or modifies register #DOC_L_LENGTH. \# *Notes: \# Affects everything on the page. \# .MAC DOC_LINE_LENGTH END . if !\\n[DOCS] .DOC_MACRO_ERROR \\$0 . br . nr #DOC_L_LENGTH (\\$1) . LL \\n[#DOC_L_LENGTH]u . ta \\n[.l]u .END \# \# DOCUMENT FAMILY \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies string $DOC_FAM. \# *Notes: \# Affects everything except headers and footers. \# .MAC DOC_FAMILY END . if !\\n[DOCS] .DOC_MACRO_ERROR \\$0 . br . ds $DOC_FAM \\$1 . ds $FAMILY \\*[$DOC_FAM] . AUTHOR_FAMILY \\*[$DOC_FAM] . BLOCKQUOTE_FAMILY \\*[$DOC_FAM] . DOCHEADER_FAMILY \\*[$DOC_FAM] . DOCTYPE_FAMILY \\*[$DOC_FAM] . EPIGRAPH_FAMILY \\*[$DOC_FAM] . FOOTNOTE_FAMILY \\*[$DOC_FAM] . HDRFTR_FAMILY \\*[$DOC_FAM] . LINENUMBER_FAMILY \\*[$DOC_FAM] . QUOTE_FAMILY \\*[$DOC_FAM] . SUBTITLE_FAMILY \\*[$DOC_FAM] . TITLE_FAMILY \\*[$DOC_FAM] .END \# \# DOCUMENT POINT SIZE \# ------------------- \# *Argument: \# \# *Function: \# Creates or modifies register #DOC_PT_SIZE. \# *Notes: \# DOC_PT_SIZE is the basis for calculating all type sizes in \# a document. Ignored if PRINTSTYLE TYPEWRITE. \# .ALIAS DOC_PT_SIZE PT_SIZE \# \# DOCUMENT LEAD \# ------------- \# *Argument: \# [ADJUST] \# *Function: \# Creates or modifies register #DOC_LEAD. If the optional \# ADJUST argument is given, adjusts leading so that the last \# line of text falls exactly on #B_MARGIN. \# *Notes: \# DOC_LEAD is the basis for calculating all leading changes in \# a document. Default for TYPESET is 16; 24 for TYPEWRITE. \# \# Because the visible bottom or footer margin of a page depends \# on the overall document lead supplied by the register #DOC_LEAD, \# DOC_LEAD, in the body of a document, should always be associated \# with the start of a new page (in other words, just before or \# just after a manual NEWPAGE). Ignored if PRINTSTYLE TYPEWRITE. \# .MAC DOC_LEAD END . if \\n[#IGNORE] .return . if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0 . br . if '\\$0'DOC_LEAD' \{\ . vs \\$1 . rr #DOC_AUTOLEAD . rr #DOC_AUTOLEAD_FACTOR . nr #DOC_LEAD \\n[.v] . \} . nr #RESET_TRAPS 1 . if !\\n[#ADJ_DOC_LEAD] .nr #REMOVE_ADJ 1 . if !'\\$0'DOC_LEAD' \{\ . if '\\$0'EN_LEAD' .nr #DOC_LEAD \\n[#EN_LEAD] . if '\\$0'BIB_LEAD' .nr #DOC_LEAD \\n[#BIB_LEAD] . if '\\$0'TOC_LEAD' .nr #DOC_LEAD \\n[#TOC_LEAD] . if '\\$2'ADJUST' .TRAPS . rr #RESET_TRAPS . \} .END \# \# ADJUST DOCUMENT LEAD \# -------------------- \# *Arguments: \# | \# *Function: \# Adjusts document lead so that the last line of text falls exactly \# on #B_MARGIN. \# .MAC DOC_LEAD_ADJUST END . ie '\\$1'' \{\ . nr #ADJ_DOC_LEAD 1 . rr #DOC_LEAD_ADJUST_OFF . \} . el \{\ . nr #ADJ_DOC_LEAD 0 . nr #DOC_LEAD_ADJUST_OFF 1 . \} .END \# \# SHIM \# ---- \# *Argument: \# None \# *Function: \# Advances to the next "valid" baseline. \# *Notes: \# If a user plays around with spacing in a doc (say, with ALD), \# it isn't easy to get mom back on track so she can achieve \# perfectly flush bottom margins. Any time SHIM is used, it \# ensures that the next output line falls on a valid baseline. \# \# First, a little convenience macro \# .MAC PROCESS_SHIM END . while \\n+[#VALID_BASELINE]<\\n[#CURRENT_V_POS] \{\ . . \} . nr #SHIM \\n[#VALID_BASELINE]-\\n[#CURRENT_V_POS] .END \# \# And a macro to disable SHIM \# .MAC NO_SHIM END . ie '\\$1'' .nr #NO_SHIM 1 . el .rr #NO_SHIM .END \# .nr #NO_SHIM 2 \" Restored to 1 in DEFAULTS. \# .MAC SHIM END . ie \\n[#NO_SHIM] .return . el \{\ . nr #VALID_BASELINE \\n[#T_MARGIN]-1v \\n[#DOC_LEAD] . if !r#CURRENT_V_POS .nr #CURRENT_V_POS \\n[.d] . ie r#ADVANCE_FROM_TOP \{\ . ie \\n[#CURRENT_V_POS]<(\\n[#T_MARGIN]-1v) \{\ . while \\n-[#VALID_BASELINE]>\\n[#CURRENT_V_POS] \{\ . . \} . nr #VALID_BASELINE +\\n[#DOC_LEAD] . nr #SHIM \\n[#VALID_BASELINE]-\\n[#CURRENT_V_POS] . \} . el .PROCESS_SHIM . \} . el .PROCESS_SHIM . ALD \\n[#SHIM]u . rr #CURRENT_V_POS . \} .END \# \# ==================================================================== \# \# +++INTERNATIONALIZATION+++ \# \# ATTRIBUTE STRING \# ---------------- \# *Argument: \# \# *Function: \# Creates or modifies string $ATTRIBUTE_STRING. \# *Notes: \# Default is "by". A blank string ("") may be used if no \# attribution is desired. Blank line results. \# .MAC ATTRIBUTE_STRING END . if !'\\$1'DOC_COVER' \ . if !'\\$1'COVER' .nr #NEITHER 1 . if !'\\$1'COVER' \ . if !'\\$1'DOC_COVER' .nr #NEITHER 1 . if '\\$1'DOC_COVER' \ . ds $ATTRIBUTE_STRING_DOC_COVER \\$2 . if '\\$1'COVER' \ . ds $ATTRIBUTE_STRING_COVER \\$2 . if \\n[#NEITHER]=1 \{\ . ds $ATTRIBUTE_STRING \\$1 . rr #NEITHER . \} .END \# \# CHAPTER STRING \# -------------- \# *Argument: \# \# *Function: \# Creates or modifies string $CHAPTER_STRING. \# *Notes: \# Default is "chapter". \# .MAC CHAPTER_STRING END . ds $CHAPTER_STRING \\$1 .END \# \# DRAFT STRING \# ------------ \# *Argument: \# \# *Function: \# Creates or modifies string $DRAFT_STRING. \# *Notes: \# Default is "draft". \# .MAC DRAFT_STRING END . ds $DRAFT_STRING \\$1 .END \# \# REVISION STRING \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies string $REVISION_STRING. \# *Notes: \# Default is "revision". \# .MAC REVISION_STRING END . ds $REVISION_STRING \\$1 .END \# \# FINIS STRING \# ------------ \# *Argument: \# \# *Function: \# Creates or modifies string $FINIS_STRING. \# *Notes: \# Default is "END". \# .MAC FINIS_STRING END . ds $FINIS_STRING \\$1 .END \# .MAC FINIS_STRING_CAPS END . ie '\\$1'' .nr #FINIS_STRING_CAPS 1 . el .nr #FINIS_STRING_CAPS 0 .END \# \# ==================================================================== \# \# +++RECTO/VERSO+++ \# \# RECTO_VERSO \# ----------- \# *Arguments: \# | \# *Function: \# Switches HDRFTR_LEFT and HDRFTR_RIGHT on alternate pages. Also \# switches page numbers left and right if either is chosen rather \# than the default centered page numbers. Switches left and right \# margins if differing values have been entered. \# *Notes: \# Default is OFF. \# .MAC RECTO_VERSO END . ie '\\$1'' .nr #RECTO_VERSO 1 . el .nr #RECTO_VERSO 0 .END \# \# FORCE RECTO \# ----------- \# *Function: \# Forces doccover and cover pages to recto \# .MAC RV_HARD_SET_MARGINS END . DOC_LEFT_MARGIN \\n[@L_MARGIN]u . DOC_RIGHT_MARGIN \\n[@R_MARGIN]u . po \\n[#DOC_L_MARGIN]u . LL \\n[#DOC_L_LENGTH]u .END \# \# ==================================================================== \# \# +++EPIGRAPHS+++ \# \# EPIGRAPH INDENT \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies register #EPI_OFFSET_VALUE. \# *Notes: \# Default is 2 for TYPEWRITE, 3 for TYPESET. \# .MAC EPIGRAPH_INDENT END . if \\n[#EPI_OFFSET_VALUE] .rr #EPI_OFFSET_VALUE . if !'\\*[$EPI_OFFSET_VALUE]'' .rm $EPI_OFFSET_VALUE . ds $EVAL_EI_ARG \\$1 . substring $EVAL_EI_ARG -1 . ie \B'\\*[$EVAL_EI_ARG]' .nr #EPI_OFFSET_VALUE \\$1 . el .ds $EPI_OFFSET_VALUE \\$1 . rm $EVAL_EI_ARG .END \# \# EPIGRAPH AUTOLEAD \# ----------------- \# *Argument: \# \# *Function: \# Creates or modifies register #EPI_AUTOLEAD. \# *Notes: \# Default is 2 (for TYPESET; TYPEWRITE doesn't require this). \# .MAC EPIGRAPH_AUTOLEAD END . nr #EPI_AUTOLEAD \\$1 .END \# \# EPIGRAPH \# -------- \# *Arguments: \# BLOCK | \# *Function: \# Places an epigraph before the document's text, after the \# document header, or after a HEAD. \# *Notes: \# #EPIGRAPH 1 = centered; 2 = block \# \# By default, epigraphs are centered, allowing the user \# to input them on a line per line basis. To change this \# behaviour, the user can supply the argument BLOCK, which \# will produce indented, filled text similar to BLOCKQUOTE. \# \# If a block epigraph contains more than one para, ALL paras of \# the epigraph must be preceded by PP. Otherwise, PP is optional. \# .MAC EPIGRAPH END . nr #PP_STYLE 2 . nr #Q_PP 0 . if \\n[#LINENUMBERS]=1 \{\ . NUMBER_LINES OFF . nr #LINENUMBERS 2 . \} . if \\n[#START] \{\ . if \\n[#PRINT_STYLE]=1 \ . if \\n[#AUTHOR_LINES]=1 .ALD \\n[#DOC_LEAD]u . \} . ie '\\$1'' \{\ . nr #EPIGRAPH 1 . ev EPIGRAPH . nr #IN_DIVER 1 . ll \\n[#L_LENGTH]u . ta \\n[.l]u . CHECK_INDENT . if \\n[#COLUMNS] \{\ . ie \\n[#START] \{\ . ll \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . \} . CENTER . if \\n[#PRINT_STYLE]=1 \{\ . fam \\*[$TYPEWRITER_FAM] . ft R . if '\\*[$EPI_FT]'I' .FT I . ps \\*[$TYPEWRITER_PS] . ie \\n[#SINGLE_SPACE] .vs \\n[#DOC_LEAD]u . el .vs \\n[#DOC_LEAD]u/2u . nr #EPI_LEAD \\n[#LEAD] . nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] . \} . if \\n[#PRINT_STYLE]=2 \{\ . FAMILY \\*[$EPI_FAM] . FT \\*[$EPI_FT] . ps \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE] . if \\n[#EPI_COLOR]=1 \{\ . nf \m[\\*[$EPI_COLOR]] . EOL . \} . vs \\n[.ps]u+\\n[#EPI_AUTOLEAD] . nr #EPI_LEAD \\n[#LEAD] . nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] . \} . di EPI_TEXT . nr #DIVERSIONS_HY_MARGIN (p;\\n[.ps]u*2.75)/1000 . HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p . hy 14 . nr #EPI_ACTIVE 1 . \} . el \{\ . ie '\\$1'BLOCK' \{\ . nr #EPIGRAPH 2 . ev EPIGRAPH . ie \\n[#START] \{\ . ie \\n[#COLUMNS] \{\ . ie r#EPI_OFFSET_VALUE \ . ll \ \\n[#L_LENGTH_FOR_EPI]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . el \ . ll \ \\n[#L_LENGTH_FOR_EPI]u-(\\*[$EPI_OFFSET_VALUE]u*2u) . ta \\n[.l]u . \} . el \{\ . ie r#EPI_OFFSET_VALUE \ . ll \ \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . el \ . ll \\n[#L_LENGTH]u-(\\*[$EPI_OFFSET_VALUE]*2u) . ta \\n[.l]u . \} . \} . el \{\ . ie r#EPI_OFFSET_VALUE \ . ll \ \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . el \ . ll \\n[#L_LENGTH]u-(\\*[$EPI_OFFSET_VALUE]*2u) . ta \\n[.l]u . if \\n[#COLUMNS] \{\ . ie r#EPI_OFFSET_VALUE \ . ll \ \\n[#COL_L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . el \ . ll \\n[#COL_L_LENGTH]u-(\\*[$EPI_OFFSET_VALUE]*2u) . ta \\n[.l]u . \} . CHECK_INDENT . \} . if \\n[#PRINT_STYLE]=1 \{\ . fam \\*[$TYPEWRITER_FAM] . ft R . if '\\*[$EPI_FT]'I' .FT I . ps \\*[$TYPEWRITER_PS] . ie \\n[#SINGLE_SPACE] .vs \\n[#DOC_LEAD]u . el .vs \\n[#DOC_LEAD]u/2u . QUAD LEFT . HY OFF . nr #EPI_LEAD \\n[#LEAD] . nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] . di EPI_TEXT . nr #EPI_ACTIVE 1 . \} . if \\n[#PRINT_STYLE]=2 \{\ . FAMILY \\*[$EPI_FAM] . FT \\*[$EPI_FT] . ps \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE] . if \\n[#EPI_COLOR]=1 \{\ . nf \m[\\*[$EPI_COLOR]] . EOL . \} . vs \\n[.ps]u+\\n[#EPI_AUTOLEAD] . QUAD \\*[$EPI_QUAD] . nr #DIVERSIONS_HY_MARGIN (p;\\n[.ps]u*2.75)/1000 . HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p . hy 14 . nr #EPI_LEAD \\n[#LEAD] . nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] . di EPI_TEXT . nr #EPI_ACTIVE 1 . \} . \} . el .DO_EPIGRAPH . \} .END \# \# DO EPIGRAPH \# ----------- \# *Arguments: \# \# *Function: \# Ends diversion started in EPIGRAPH. Makes spacing \# adjustments to compensate for the difference between epigraph \# leading and overall document leading, so that the bottom of \# the pages remain flush. \# *Notes: \# In addition to its usual place at the beginning of a \# document, EPIGRAPH may also be used after HEAD. \# .MAC DO_EPIGRAPH END . br . di . rr #IN_DIVER . if \\n[#RESET_FN_COUNTERS]=2 \{\ . if !\\n[#FN_COUNT]=1 \{\ . if ((\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS])+\\n[#DIVER_DEPTH])>(\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS]) \{\ . DIVER_FN_2_POST . rr #RESET_FN_COUNTERS . \} . \} . \} . nr #SAVED_FN_NUMBER \\n[#FN_NUMBER] . nr #DONE_ONCE 0 1 . REMOVE_INDENT . ev . nr #EPI_DEPTH \\n[#DIVER_DEPTH]-\\n[#EPI_LEAD] . nr #EPI_LINES \\n[#EPI_DEPTH]/\\n[#EPI_LEAD] . ie \\n[#START] \{\ . RLD \\n[#SHIM]u . nr #EPI_WHITESPACE (\\n[#DOC_LEAD]*\\n[#EPI_LINES])-\\n[#EPI_DEPTH] . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] . \} . if \\n[#PRINT_STYLE]=1 \ . if !\\n[#SINGLE_SPACE]=1 .ALD \\n[#DOC_LEAD]u . if \\n[#PRINT_STYLE]=2 \{\ . ie !\\n[#DOC_TYPE]=2 .RLD \\n[#DOC_LEAD]u . el \{\ . ie '\\*[$CHAPTER_TITLE]'' .RLD \\n[#DOC_LEAD]u . el .if '\\*[$CHAPTER]'' .RLD \\n[#DOC_LEAD]u . \} . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \ . ALD \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u) . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \ . ALD \ \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u . \} . \} . el \{\ . ie \\n[#EPI_DEPTH]<\\n[#TRAP_DISTANCE] \{\ . nr #EPI_FITS 1 . nr #EPI_WHITESPACE (\\n[#DOC_LEAD]*\\n[#EPI_LINES])-\\n[#EPI_DEPTH] . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] . \} . ie \\n[#PRINT_STYLE]=1 \{\ . if \\n[#EPI_WHITESPACE]=\\n[#DOC_LEAD] \ . ALD \\n[#EPI_WHITESPACE]u/2u . \} . el \{\ . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \ . ALD \ \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u) . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \ . ALD \ \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u . \} . if \\n[#DIVER_FN]=2 .rr #DIVER_FN . \} . el \{\ . nr #EPI_LINES_TO_TRAP 0 1 . while \\n[#EPI_LEAD]*\\n+[#EPI_LINES_TO_TRAP]<\\n[#TRAP_DISTANCE] \{\ . nr #LOOP 1 . \} . nr #EPI_LINES_TO_TRAP -1 . nr #EPI_WHITESPACE \ (\\n[#EPI_LINES_TO_TRAP]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_TRAP]*\\n[#EPI_LEAD]) . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] . \} . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \ . ALD \\n[#EPI_WHITESPACE]u . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \ . ALD \\n[#EPI_WHITESPACE]u-\\n[#DOC_LEAD]u . \} . \} . if \\n[#EPIGRAPH]=1 \{\ . po \\n[#L_MARGIN]u . if \\n[#COLUMNS] \{\ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . \} . \} . if \\n[#EPIGRAPH]=2 \{\ . ie r#EPI_OFFSET_VALUE \ . nr #EPI_OFFSET \ \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) . el .nr #EPI_OFFSET \\n[#L_MARGIN]+\\*[$EPI_OFFSET_VALUE] . if \\n[#COLUMNS] \{\ . ie r#EPI_OFFSET_VALUE \ . nr #EPI_OFFSET \ \\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) . el .nr #EPI_OFFSET \ \\n[#COL_\\n[#COL_NUM]_L_MARGIN]+\\*[$EPI_OFFSET_VALUE] . \} . po \\n[#EPI_OFFSET]u . \} . nf . EPI_TEXT . br . ie \\n[#START] \{\ . if \\n[#PRINT_STYLE]=1 .SHIM . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \ . ALD \\n[#EPI_WHITESPACE]u/2u . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \ . ALD (\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u . SHIM . \} . \} . el \{\ . rr #EPI_ACTIVE . ie \\n[#EPI_FITS] \{\ . ie \\n[#FN_FOR_EPI] \{\ . nr #EPI_LINES_TO_END 1 . nr #EPI_WHITESPACE \ (\\n[#EPI_LINES_TO_END]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_END]*\\n[#EPI_LEAD]) . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] . \} . ALD \\n[#EPI_WHITESPACE]u-(\\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u) . \} . el \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . if \\n[#EPI_WHITESPACE]=\\n[#DOC_LEAD] \ . ALD \\n[#EPI_WHITESPACE]u . \} . el \{\ . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \ . ALD \\n[#EPI_WHITESPACE]u/2u . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \ . ALD (\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u . \} . \} . \} . el \{\ . nr #EPI_LINES_TO_END \\n[#EPI_LINES]-\\n[#EPI_LINES_TO_TRAP] . if \\n[#LOOP] .nr #EPI_LINES_TO_END +1 . rr #LOOP . nr #EPI_WHITESPACE \ (\\n[#EPI_LINES_TO_END]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_END]*\\n[#EPI_LEAD]) . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] . \} . ALD \\n[#EPI_WHITESPACE]u-(\\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u) . if \\n[#PRINT_STYLE]=1 \{\ . if !\\n[#SINGLE_SPACE] \{\ . nr #EPI_LINES_EVEN \\n[#EPI_LINES_TO_END]%2 . ie \\n[#EPI_LINES_EVEN] .ALD .5v . el .RLD .5v . rr #EPI_LINES_EVEN . \} . \} . \} . \} . nr #PP_STYLE 1 . rr #EPI_FITS . ALD \\n[#DOC_LEAD]u . QUAD \\*[$DOC_QUAD] . po \\n[#L_MARGIN]u . if \\n[#COLUMNS] \{\ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . \} . if \\n[#START] \{\ . if \\n[#COLUMNS] \{\ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . mk dc . \} . \} . if \\n[#LINENUMBERS]=2 \{\ . NUMBER_LINES RESUME . nr #LINENUMBERS 1 . \} .END \# \# ==================================================================== \# \# +++FINIS MACRO+++ \# \# FINIS \# ----- \# *Arguments: \# \# *Function: \# Deposits --END-- at the end of a document. \# .MAC FINIS END . if !\\n[@TOP] \{\ . if \\n[.t]<=2v \{\ . tm1 "[mom]: '\\n[.F]': Insufficient room to print \\$0 on last page. . return . \} . \} . br . ev FINIS . evc 0 . if \\n[#TAB_ACTIVE] .TQ . if \\n[#INDENT_ACTIVE] .IQ CLEAR . nr #EM_ADJUST (1m/8) . if \\n[#COLUMNS] \{\ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . \} . ALD \\n[#DOC_LEAD]u . CENTER . if \\n[#FINIS_STRING_CAPS]=1 .CAPS . if \\n[#PRINT_STYLE]=1 .PRINT "--\\*[$FINIS_STRING]-- . if \\n[#PRINT_STYLE]=2 \{\ . ie \\n[#FINIS_COLOR] \ . PRINT \ \m[\\*[$FINIS_COLOR]]\v'-\\n[#EM_ADJUST]u'\[em]\v'+\\n[#EM_ADJUST]u'\ \\*[$FINIS_STRING]\v'-\\n[#EM_ADJUST]u'\*[FU1]\[em]\m[]\c . el .PRINT \ \v'-\\n[#EM_ADJUST]u'\[em]\v'+\\n[#EM_ADJUST]u'\ \\*[$FINIS_STRING]\v'-\\n[#EM_ADJUST]u'\*[FU1]\[em]\m[]\c . \} . EL . if \\n[#FINIS_STRING_CAPS]=1 .CAPS OFF . ev . pdfsync .END \# \# ==================================================================== \# \# +++HEADERS/FOOTERS+++ \# \# Define a string so that the current page number can be incorporated \# into the strings for hdrftr left, right, and center. NOTE: This is \# not the same thing as using the shortform # in hdrftr strings. \# .ds PAGE# \En[#PAGENUMBER] \# \# HDRFTR RULE GAP \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies register #HDRFTR_RULE_GAP to hold amount \# of space between header/footer and header/footer rule. \# *Notes: \# Default is 4p. \# .MAC HDRFTR_RULE_GAP END . nr #HDRFTR_RULE_GAP (\\$1) . if '\\$0'HEADER_RULE_GAP' \{\ . nr #HEADER_RULE_GAP \\n[#HDRFTR_RULE_GAP] . if r #FOOTER_RULE_GAP .nr #FOOTER_RULE_GAP \\n[#FOOTER_RULE_GAP] . \} . if '\\$0'FOOTER_RULE_GAP' \{\ . nr #FOOTER_RULE_GAP \\n[#HDRFTR_RULE_GAP] . if r #HEADER_RULE_GAP .nr #HEADER_RULE_GAP \\n[#HEADER_RULE_GAP] . \} .END \# \# HDRFTR LEFT \# ----------- \# *Argument: \# \# *Function: \# Creates or modifies string $HDRFTR_LEFT. \# Creates register #USER_DEF_HDRFTR_LEFT, which, if 1, \# overrides the $HDRFTR_LEFT string created by default \# in DEFAULTS. \# *Notes: \# Especially useful if doc has more than one author, and a list \# of authors by last name is desired in header/footers. \# Default is author. \# \# If the argument is the # character, simply prints the current \# page number. \# \# If the user wants to incorporate the page number into the string, \# \*[PAGE#] must be used. For example, if the user wants to put \# an elipsis before the page number in the string, s/he should use \# ...\*[PAGE#], not ...# \# .MAC HDRFTR_LEFT END . nr #USER_DEF_HDRFTR_LEFT 1 . ds $HDRFTR_LEFT \\$1 .END \# \# HDRFTR LEFT CAPS \# ---------------- \# *Argument: \# | \# *Function: \# Turns capitalisation of $HDRFTR_LEFT (typically, the author of \# the document) on or off. \# *Notes: \# Default is on. \# .MAC HDRFTR_LEFT_CAPS END . ie '\\$1'' .nr #HDRFTR_LEFT_CAPS 1 . el \{\ . nr #HDRFTR_LEFT_CAPS 0 . ds $HDRFTR_LEFT_SIZE_CHANGE +0 . \} .END \# \# HDRFTR CENTER \# ------------- \# *Argument: \# \# *Function: \# Creates or modifies string $HDRFTR_CENTER. \# Creates register #USER_DEF_HDRFTR_CENTER, which, if 1, \# overrides the $HDRFTR_CENTER string created by default \# in COPYSTYLE. \# *Notes: \# Default is document type if DOCTYPE NAMED, Chapter # if DOCTYPE \# CHAPTER, draft and revision number if COPYSTYLE DRAFT. \# \# If the argument is the # character, simply prints the current \# page number. \# \# If the user wants to incorporate the page number into the string, \# \*[PAGE#] must be used. For example, if the user wants to put \# an elipsis before the page number in the string, s/he should use \# ...\*[PAGE#], not ...# \# .MAC HDRFTR_CENTER END . nr #USER_DEF_HDRFTR_CENTER 1 . if '\\$0'FOOTER_CENTER' \{\ . ds $HDRFTR_CENTER_OLD \\*[$HDRFTR_CENTER] . ds $HDRFTR_CENTER_NEW \\$1 . \} . if '\\$0'FOOTER_CENTRE' \{\ . ds $HDRFTR_CENTER_OLD \\*[$HDRFTR_CENTER] . ds $HDRFTR_CENTER_NEW \\$1 . \} . ds $HDRFTR_CENTER \\$1 .END \# \# HDRFTR CENTER CAPS \# ------------------ \# *Argument: \# | \# *Function: \# Turns capitalisation of $HDRFTR_CENTER (typically, doctype of \# the document) on or off. \# *Notes: \# Default is on. \# .MAC HDRFTR_CENTER_CAPS END . ie '\\$1'' .nr #HDRFTR_CENTER_CAPS 1 . el \{\ . nr #HDRFTR_CENTER_CAPS 0 . ds $HDRFTR_CENTER_SIZE_CHANGE +0 . \} .END \# \# HDRFTR CENTER PADDING \# --------------------- \# *Argument: \# LEFT | RIGHT \# *Function: \# Creates or modifies registers #HDRFTR_CTR_PAD_LEFT or \# #HDRFTR_CTR_PAD_RIGHT. \# *Notes: \# By default, the HDRFTR_CENTER string is centered on the doc \# line length. Long titles or long author names can screw up \# visual centering, or create overprints. This macro allows the \# user to pad the center string by the specified amount of space \# to fix these problems. \# \# A unit of measure is required. \# .MAC HDRFTR_CENTER_PAD END . if '\\$1'LEFT' .nr #HDRFTR_CTR_PAD_LEFT (\\$2) . if '\\$1'RIGHT' .nr #HDRFTR_CTR_PAD_RIGHT (\\$2) .END \# \# SWITCH HDRFTR CENTER PADDING SIDE - support macro \# -------------------------------- \# *Argument: \# \# *Function: \# Switches the padding side of hdrftr center padding. \# *Notes: \# Required to keep spacing around hdrftr string constant \# in recto/verso documents. \# .MAC SWITCH_HDRFTR_CENTER_PAD END . nr #HDRFTR_CTR_PAD_TMP \\n[#HDRFTR_CTR_PAD_LEFT] . HDRFTR_CENTER_PAD LEFT \\n[#HDRFTR_CTR_PAD_RIGHT]u . HDRFTR_CENTER_PAD RIGHT \\n[#HDRFTR_CTR_PAD_TMP]u .END \# \# HDRFTR RIGHT \# ------------ \# *Argument: \# \# *Function: \# Creates or modifies string $HDRFTR_RIGHT. \# Creates register #USER_DEF_HDRFTR_RIGHT, which, if 1, \# overrides the $HDRFTR_RIGHT string created by default \# in DEFAULTS. \# *Notes: \# Default is document title. \# \# If the argument is the # character, simply prints the current \# page number. \# \# If the user wants to incorporate the page number into the string, \# \*[PAGE#] must be used. For example, if the user wants to put \# an elipsis before the page number in the string, s/he should use \# ...\*[PAGE#], not ...# \# .MAC HDRFTR_RIGHT END . nr #USER_DEF_HDRFTR_RIGHT 1 . ds $HDRFTR_RIGHT \\$1 .END \# \# HDRFTR RIGHT CAPS \# ----------------- \# *Argument: \# | \# *Function: \# Turns capitalisation of $HDRFTR_RIGHT (typically, the title of \# the document) on or off. \# *Notes: \# Default is on. \# .MAC HDRFTR_RIGHT_CAPS END . ie '\\$1'' .nr #HDRFTR_RIGHT_CAPS 1 . el \{\ . nr #HDRFTR_RIGHT_CAPS 0 . ds $HDRFTR_RIGHT_SIZE_CHANGE +0 . \} .END \# \# HDRFTR RULE \# ----------- \# *Arguments: \# | \# *Function: \# If invoked via the alias HDRFTR_RULE_INTERNAL in HDRFTR, prints a rule \# under the header/over the footer. Otherwise, turns HDRFTR_RULE \# on or off. \# .MAC HDRFTR_RULE END . if r #HEADERS_ON \ . if \\n[#HEADERS_ON]=1 .nr #HDRFTR_RULE_GAP \\n[#HEADER_RULE_GAP] . if r #FOOTERS_ON \ . if \\n[#FOOTERS_ON]=1 .nr #HDRFTR_RULE_GAP \\n[#FOOTER_RULE_GAP] . if '\\$0'HDRFTR_RULE_INTERNAL' \{\ . ie \\n[#USERDEF_HDRFTR] \{\ . nr #CAP_HEIGHT_ADJUST \\n[#HDRFTR_HEIGHT] . if \\n[#HEADERS_ON] \{\ . rt \\n[y]u . ALD \\n[#HDRFTR_RULE_GAP]u . nr #HDRFTR_RULE_WEIGHT \\n[#HEADER_RULE_WEIGHT] . nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#HEADER_RULE_WEIGHT_ADJ] . \} . if \\n[#FOOTERS_ON] \{\ . rt \\n[y]u . RLD \ \\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u+\\n[#FOOTER_RULE_WEIGHT]u . nr #HDRFTR_RULE_WEIGHT \\n[#FOOTER_RULE_WEIGHT] . nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#FOOTER_RULE_WEIGHT_ADJ] . \} . ie \\n[#HDRFTR_RULE_COLOR]=1 \{\ \m[\\*[$HDRFTR_RULE_COLOR]]\ \D't \\n[#HDRFTR_RULE_WEIGHT]u'\ \h'|0'\ \v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\ \D'l \\n[#DOC_L_LENGTH]u 0'\ \D't \\n[#RULE_WEIGHT]u'\ \h'-\\n[#RULE_WEIGHT]u'\ \m[] . \} . el \{\ \D't \\n[#HDRFTR_RULE_WEIGHT]u'\ \h'|0'\ \v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\ \D'l \\n[#DOC_L_LENGTH]u 0'\ \D't \\n[#RULE_WEIGHT]u'\ \h'-\\n[#RULE_WEIGHT]u' . \} . br . \} . el \{\ . if \\n[#PRINT_STYLE]=1 .nr #CAP_HEIGHT_ADJUST \\n[#CAP_HEIGHT] . if \\n[#PRINT_STYLE]=2 \{\ . ie \\n[#LEFT_CAP_HEIGHT]>\\n[#CENTER_CAP_HEIGHT] \ . nr #CAP_HEIGHT_ADJUST \\n[#LEFT_CAP_HEIGHT] . el .nr #CAP_HEIGHT_ADJUST \\n[#CENTER_CAP_HEIGHT] . ie \\n[#CAP_HEIGHT_ADJUST]>\\n[#RIGHT_CAP_HEIGHT] \ . nr #CAP_HEIGHT_ADJUST \\n[#CAP_HEIGHT_ADJUST] . el .nr #CAP_HEIGHT_ADJUST \\n[#RIGHT_CAP_HEIGHT] . \} . if \\n[#HEADERS_ON] \{\ . rt \\n[y]u . ALD \\n[#HDRFTR_RULE_GAP]u . nr #HDRFTR_RULE_WEIGHT \\n[#HEADER_RULE_WEIGHT] . nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#HEADER_RULE_WEIGHT_ADJ] . \} . if \\n[#FOOTERS_ON] \{\ . rt \\n[y]u . RLD \ \\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u+\\n[#FOOTER_RULE_WEIGHT]u . nr #HDRFTR_RULE_WEIGHT \\n[#FOOTER_RULE_WEIGHT] . nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#FOOTER_RULE_WEIGHT_ADJ] . \} . ie \\n[#HDRFTR_RULE_COLOR]=1 \{\ \m[\\*[$HDRFTR_RULE_COLOR]]\ \D't \\n[#HDRFTR_RULE_WEIGHT]u'\ \h'|0'\ \v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\ \D'l \\n[#DOC_L_LENGTH]u 0'\ \D't \\n[#RULE_WEIGHT]u'\ \h'-\\n[#RULE_WEIGHT]u'\ \m[] . \} . el \{\ \D't \\n[#HDRFTR_RULE_WEIGHT]u'\ \h'|0'\ \v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\ \D'l \\n[#DOC_L_LENGTH]u 0'\ \D't \\n[#RULE_WEIGHT]u'\ \h'-\\n[#RULE_WEIGHT]u' . \} . br . \} . \} . if '\\$0'HEADER_RULE' \{\ . ie '\\$1'' \{\ . nr #HEADER_RULE 1 . nr #HDRFTR_RULE 1 . \} . el \{\ . nr #HEADER_RULE 0 . nr #HDRFTR_RULE 0 . \} . \} . if '\\$0'FOOTER_RULE' \{\ . ie '\\$1'' \{\ . nr #FOOTER_RULE 1 . nr #HDRFTR_RULE 1 . \} . el \{\ . nr #FOOTER_RULE 0 . nr #HDRFTR_RULE 0 . \} . \} . if '\\$0'HDRFTR_RULE' \{\ . ie '\\$1'' .nr #HDRFTR_RULE 1 . el .nr #HDRFTR_RULE 0 . \} .END \# .ALIAS HDRFTR_RULE_INTERNAL HDRFTR_RULE \# \# HDRFTR PLAIN \# ------------ \# *Arguments: \# \# *Function: \# Sets the family, font, and point size of all strings in \# header/footers to the same family and point size as running \# text. Font for the header/footer becomes roman throughout. \# .MAC HDRFTR_PLAIN END . HDRFTR_FAMILY \\*[$DOC_FAM] . HDRFTR_PT_SIZE \\n[#DOC_PT_SIZE] . HDRFTR_LEFT_FAMILY \\*[$DOC_FAM] . HDRFTR_LEFT_FONT R . HDRFTR_LEFT_SIZE +0 . HDRFTR_LEFT_CAPS OFF . HDRFTR_CENTER_FAMILY \\*[$DOC_FAM] . HDRFTR_CENTER_FONT R . HDRFTR_CENTER_SIZE +0 . HDRFTR_CENTER_CAPS OFF . HDRFTR_RIGHT_FAMILY \\*[$DOC_FAM] . HDRFTR_RIGHT_FONT R . HDRFTR_RIGHT_SIZE +0 . HDRFTR_RIGHT_CAPS OFF .END \# \# SWITCH HDRFTR \# ------------- \# *Arguments: \# | \# *Function: \# Creates or modifies register #SWITCH_HDRFTR, used to switch \# default location of HDRFTR_LEFT and HDRFTR_RIGHT. \# *Notes: \# Default is OFF. \# \# Typically, the author string appears at the left of header/footers, \# and the title string appears at the right. This switches the \# location of the two. Useful in conjunction with RECTO_VERSO to tweak \# switches on alternate pages to come out as the user wishes. The \# assumption of RECTO_VERSO is that the first page of the document \# (recto) is odd, and even though it has no header/footer, if it did \# have one, it would print as AUTHOR...CENTER...TITLE (or whatever \# strings the user has supplied for HDRFTR_LEFT/RIGHT), meaning that \# the next page, which does have a header/footer, will come out as \# TITLE...CENTER...AUTHOR (or whatever strings the user has supplied \# for HDRFTR_LEFT/RIGHT). SWITCH_HDRFTRS allows the user to get the \# desired string in the desired place on the desired recto/verso page. \# .MAC SWITCH_HDRFTR END . ie '\\$1'' .nr #SWITCH_HDRFTR 1 . el .nr #SWITCH_HDRFTR 0 .END \# \# USER DEFINED HDRFTR RECTO \# ------------------------- \# *Arguments: \# L | LEFT | C | CENTER | CENTER | R | RIGHT \# *Function: \# Toggles #USERDEF_HDRFTR on, stores quad as #USERDEF_HDRFTR_RECTO_QUAD, \# stores string in $USERDEF_HDRFTR_RECTO. \# *Notes: \# For use when users don't want 3-part headers/footers, but rather \# want to design their own headers/footers and need different \# headers/footers on recto and verso pages. Using just \# HEADER_RECTO, even when recto/verso is not on, allows users to \# design their own headers/footers for doc pages. \# .MAC HDRFTR_RECTO END . nr #USERDEF_HDRFTR 1 . if '\\$1'L' .nr #USERDEF_HDRFTR_RECTO_QUAD 1 . if '\\$1'LEFT' .nr #USERDEF_HDRFTR_RECTO_QUAD 1 . if '\\$1'C' .nr #USERDEF_HDRFTR_RECTO_QUAD 2 . if '\\$1'CENTER' .nr #USERDEF_HDRFTR_RECTO_QUAD 2 . if '\\$1'CENTRE' .nr #USERDEF_HDRFTR_RECTO_QUAD 2 . if '\\$1'R' .nr #USERDEF_HDRFTR_RECTO_QUAD 3 . if '\\$1'RIGHT' .nr #USERDEF_HDRFTR_RECTO_QUAD 3 . shift . ie '\\$1'CAPS' \{\ . nr #HDRFTR_RECTO_CAPS 1 . ds $USERDEF_HDRFTR_RECTO \\$2 . \} . el .ds $USERDEF_HDRFTR_RECTO \\$1 .END \# \# USER DEFINED HDRFTR VERSO \# ------------------------- \# *Arguments: \# L | LEFT | C | CENTER | CENTER | R | RIGHT \# *Function: \# Toggles #USERDEF_HDRFTR on, stores quad as #USERDEF_HDRFTR_VERSO_QUAD, \# stores string in $USERDEF_HDRFTR_VERSO. \# *Notes: \# For use when users don't want 3-part headers/footers, but rather \# want to design their own headers/footers and need different \# headers/footers on recto and verso pages. \# .MAC HDRFTR_VERSO END . nr #USERDEF_HDRFTR 1 . if '\\$1'L' .nr #USERDEF_HDRFTR_VERSO_QUAD 1 . if '\\$1'LEFT' .nr #USERDEF_HDRFTR_VERSO_QUAD 1 . if '\\$1'C' .nr #USERDEF_HDRFTR_VERSO_QUAD 2 . if '\\$1'CENTER' .nr #USERDEF_HDRFTR_VERSO_QUAD 2 . if '\\$1'CENTRE' .nr #USERDEF_HDRFTR_VERSO_QUAD 2 . if '\\$1'R' .nr #USERDEF_HDRFTR_VERSO_QUAD 3 . if '\\$1'RIGHT' .nr #USERDEF_HDRFTR_VERSO_QUAD 3 . shift . ie '\\$1'CAPS' \{\ . nr #HDRFTR_VERSO_CAPS 1 . ds $USERDEF_HDRFTR_VERSO \\$2 . \} . el .ds $USERDEF_HDRFTR_VERSO \\$1 .END \# \# PRINT FOOTER ON FIRST PAGE \# -------------------------- \# *Arguments: \# | \# *Function: \# Toggles register #PRINT_FOOTER_ON_PAGE_1 \# *Notes: \# Lets user choose whether to print footer on first \# page of doc. \# .MAC FOOTER_ON_FIRST_PAGE END . ie '\\$1'' .nr #PRINT_FOOTER_ON_PAGE_1 1 . el .rr #PRINT_FOOTER_ON_PAGE_1 .END \# \# PRINT PAGE NUMBER ON FIRST PAGE \# ------------------------------- \# *Arguments: \# | \# *Function: \# Toggles register #PRINT_PAGENUM_ON_PAGE_1 \# *Notes: \# Lets user choose whether to print page number on first \# page of doc and after collate when footers are on or page numbering \# has been user set at top of page. \# .MAC PAGENUM_ON_FIRST_PAGE END . ie '\\$1'' .nr #PRINT_PAGENUM_ON_PAGE_1 1 . el .rr #PRINT_PAGENUM_ON_PAGE_1 .END \# \# PRINT HEADER/FOOTER \# ------------------- \# *Arguments: \# \# *Function: \# Based on defaults or values entered by user, prints a \# three-part title at either the top or the bottom of the page. \# *Notes: \# Called from within either HEADER or FOOTER. \# .MAC PRINT_HDRFTR END . if \\n[#DOC_TYPE]=4 .nr #SUITE \En[.pn] . if \\n[#FOOTERS_ON] \{\ . if \\n[#START_FOR_FOOTERS] \{\ . rr #START_FOR_FOOTERS . if !\\n[#PRINT_FOOTER_ON_PAGE_1] \{\ . ie !\\n[#HDRFTR_BOTH] .return . el \{\ . rr #FOOTERS_ON . nr #HEADERS_ON 1 . ie \\n[#HEADER_RULE]=1 .HEADER_RULE . el .HEADER_RULE OFF . ie \\n[#HDRFTR_BOTH] .HEADER_VERSO \\*[$HDR_VERSO_QUAD] "\\*[$HDR_VERSO_STRING]" . el .HEADER_RECTO \\*[$HDR_RECTO_QUAD] "\\*[$HDR_RECTO_STRING]" . return . \} . \} . \} . \} . if \\n[#USERDEF_HDRFTR] \{\ . PRINT_USERDEF_HDRFTR . return . \} . if \\n[#SWITCH_HDRFTR] \{\ . ds $HDRFTR_TMP_SWITCH \\*[$HDRFTR_LEFT] . ds $HDRFTR_LEFT \\*[$HDRFTR_RIGHT] . ds $HDRFTR_RIGHT \\*[$HDRFTR_TMP_SWITCH] . ds $HDRFTR_TMP_SIZE_CHANGE_SWITCH \\*[$HDRFTR_LEFT_SIZE_CHANGE] . ds $HDRFTR_LEFT_SIZE_CHANGE \\*[$HDRFTR_RIGHT_SIZE_CHANGE] . ds $HDRFTR_RIGHT_SIZE_CHANGE \\*[$HDRFTR_TMP_SIZE_CHANGE_SWITCH] . nr #HDRFTR_TMP_CAPS_SWITCH \\n[#HDRFTR_LEFT_CAPS] . nr #HDRFTR_LEFT_CAPS \\n[#HDRFTR_RIGHT_CAPS] . nr #HDRFTR_RIGHT_CAPS \\n[#HDRFTR_TMP_CAPS_SWITCH] . ds $HDRFTR_TMP_COLOR_SWITCH \\*[$HDRFTR_LEFT_COLOR] . ds $HDRFTR_LEFT_COLOR \\*[$HDRFTR_RIGHT_COLOR] . ds $HDRFTR_RIGHT_COLOR \\*[$HDRFTR_TMP_COLOR_SWITCH] . rr #HDRFTR_TMP_CAPS_SWITCH . rm $HDRFTR_TMP_SWITCH . rm $HDRFTR_TMP_SIZE_CHANGE_SWITCH . rm $HDRFTR_TMP_COLOR_SWITCH . nr #SWITCH_HDRFTR 0 . \} . nr #PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ] . if \\n[#ENDNOTES] .PAGENUM_STYLE \\*[$EN_PN_STYLE] . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #LEFT_CAP_HEIGHT \\n[#CAP_HEIGHT] . di . \} . if o .RIGHT . if e .LEFT . if \\n[#RECTO_VERSO]=0 .LEFT . if \\n[#HDRFTR_LEFT_CAPS] .CAPS . ie '\\*[$HDRFTR_LEFT]'#' .PRINT \\n[#PAGENUMBER] . el \{\ . ie !'\\*[$HDRFTR_LEFT]'' .PRINT \\*[$HDRFTR_LEFT] . el .PRINT \& . \} . if \\n[#HDRFTR_LEFT_CAPS] .CAPS OFF . CENTER . if \\n[#HDRFTR_CENTER_CAPS] .CAPS . rt \\n[y]u . ie '\\*[$HDRFTR_CENTER]'#' .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\n[#PAGENUMBER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' . el \{\ . ie !'\\*[$HDRFTR_CENTER]'' .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\*[$HDRFTR_CENTER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' . el .PRINT \& . \} . if \\n[#HDRFTR_CENTER_CAPS] .CAPS OFF . if o .LEFT . if e .RIGHT . if \\n[#RECTO_VERSO]=0 .RIGHT . if \\n[#HDRFTR_RIGHT_CAPS] .CAPS . rt \\n[y]u . ie '\\*[$HDRFTR_RIGHT]'#' .PRINT \\n[#PAGENUMBER] . el \{\ . ie !'\\*[$HDRFTR_RIGHT]'' .PRINT \\*[$HDRFTR_RIGHT] . el .PRINT \& . \} . if \\n[#HDRFTR_RIGHT_CAPS] .CAPS OFF . \} . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#HDRFTR_COLOR]=1 \{\ . nf \m[\\*[$HDRFTR_COLOR]] . \} . fam \\*[$HDRFTR_LEFT_FAM] . ft \\*[$HDRFTR_LEFT_FT] . ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_LEFT_SIZE_CHANGE] . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #LEFT_CAP_HEIGHT \\n[#CAP_HEIGHT] . di . \} . if o .LEFT . if e .RIGHT . if \\n[#RECTO_VERSO]=0 .LEFT . if \\n[#HDRFTR_LEFT_CAPS] .CAPS . ie '\\*[$HDRFTR_LEFT]'#' \{\ . ie \\n[#HDRFTR_LEFT_COLOR]=1 \ . PRINT \m[\\*[$HDRFTR_LEFT_COLOR]]\\n[#PAGENUMBER]\m[] . el \ . PRINT \\n[#PAGENUMBER] . \} . el \{\ . ie !'\\*[$HDRFTR_LEFT]'' \{\ . ie \\n[#HDRFTR_LEFT_COLOR]=1 \ . PRINT \m[\\*[$HDRFTR_LEFT_COLOR]]\\*[$HDRFTR_LEFT]\m[] . el \ . PRINT \\*[$HDRFTR_LEFT] . \} . el .nop \& . \} . if \\n[#HDRFTR_LEFT_CAPS] .CAPS OFF . fam \\*[$HDRFTR_CENTER_FAM] . ft \\*[$HDRFTR_CENTER_FT] . ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_CENTER_SIZE_CHANGE] . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #CENTER_CAP_HEIGHT \\n[#CAP_HEIGHT] . di . \} . CENTER . if \\n[#HDRFTR_CENTER_CAPS] .CAPS . rt \\n[y]u . ie '\\*[$HDRFTR_CENTER]'#' \{\ . ie \\n[#HDRFTR_CENTER_COLOR]=1 .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\m[\\*[$HDRFTR_CENTER_COLOR]]\ \\n[#PAGENUMBER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u'\m[] . el .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\n[#PAGENUMBER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' . \} . el \{\ . ie !'\\*[$HDRFTR_CENTER]'' \{\ . ie \\n[#HDRFTR_CENTER_COLOR]=1 .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\m[\\*[$HDRFTR_CENTER_COLOR]]\ \\*[$HDRFTR_CENTER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u'\m[] . el .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\*[$HDRFTR_CENTER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' . \} . el .PRINT \& . \} . if \\n[#HDRFTR_CENTER_CAPS] .CAPS OFF . fam \\*[$HDRFTR_RIGHT_FAM] . ft \\*[$HDRFTR_RIGHT_FT] . ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_RIGHT_SIZE_CHANGE] . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #RIGHT_CAP_HEIGHT \\n[#CAP_HEIGHT] . di . \} . if o .RIGHT . if e .LEFT . if \\n[#RECTO_VERSO]=0 .RIGHT . if \\n[#HDRFTR_RIGHT_CAPS] .CAPS . rt \\n[y]u . ie '\\*[$HDRFTR_RIGHT]'#' \{\ . ie \\n[#HDRFTR_RIGHT_COLOR]=1 \ . PRINT \m[\\*[$HDRFTR_RIGHT_COLOR]]\\n[#PAGENUMBER]\m[] . el \ . PRINT \\n[#PAGENUMBER] . \} . el \{\ . ie !'\\*[$HDRFTR_RIGHT]'' \{\ . ie \\n[#HDRFTR_RIGHT_COLOR]=1 \ . PRINT \m[\\*[$HDRFTR_RIGHT_COLOR]]\\*[$HDRFTR_RIGHT]\m[] . el \ . PRINT \\*[$HDRFTR_RIGHT] . \} . el .PRINT \& . \} . if \\n[#HDRFTR_RIGHT_CAPS] .CAPS OFF . \} . if \\n[#HDRFTR_RULE] .HDRFTR_RULE_INTERNAL . br .END \# \# PRINT USER DEFINED HEADER/FOOTER \# -------------------------------- \# *Arguments: \# \# *Function: \# Based on defaults or values entered by user, prints a single part \# (i.e. not 3-part) title at either the top or the bottom of the page. \# *Notes: \# Called from within PRINT_HDRFTR. \# .MAC PRINT_USERDEF_HDRFTR END . nr #PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ] . fc ^ # . if \\n[#PRINT_STYLE]=2 \{\ . fam \\*[$HDRFTR_FAM] . ft R . ps \\n[#HDRFTR_PT_SIZE]u . if \\n[#HDRFTR_COLOR]=1 \{\ . nf . COLOR \\*[$HDRFTR_COLOR] . \} . \} . ie \\n[#RECTO_VERSO] \{\ . if o \{\ . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=1 .LEFT . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 .CENTER . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 .RIGHT . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS . if '\\n[.ev]'FOOTER' .vs 0 . PRINT \\*[$USERDEF_HDRFTR_RECTO] . if '\\n[.ev]'FOOTER' .vs . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS OFF . EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] . di . \} . \} . if e \{\ . ie !'\\*[$USERDEF_HDRFTR_VERSO]'' \{\ . if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=1 .LEFT . if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=2 .CENTER . if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=3 .RIGHT . if \\n[#HDRFTR_VERSO_CAPS]=1 .CAPS . if '\\n[.ev]'FOOTER' .vs 0 . PRINT \\*[$USERDEF_HDRFTR_VERSO] . if '\\n[.ev]'FOOTER' .vs . if \\n[#HDRFTR_VERSO_CAPS]=1 .CAPS OFF . EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] . di . \} . \} . el \{\ . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=1 .LEFT . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 .CENTER . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 .RIGHT . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS . if '\\n[.ev]'FOOTER' .vs 0 . PRINT \\*[$USERDEF_HDRFTR_RECTO] . if '\\n[.ev]'FOOTER' .vs . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS OFF . EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] . di . \} . \} . \} . \} . el \{\ . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=1 .LEFT . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 .CENTER . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 .RIGHT . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS . if '\\n[.ev]'FOOTER' .vs 0 . PRINT \\*[$USERDEF_HDRFTR_RECTO] . if '\\n[.ev]'FOOTER' .vs . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS OFF . EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] . di . \} . \} . fc . if \\n[#PRINT_STYLE]=2 \{\ . ie \\n[#HDRFTR_COLOR]=1 \m[\\*[$HDRFTR_COLOR]] . el \m[black] . \} . if \\n[#HDRFTR_RULE] \{\ . HDRFTR_RULE_INTERNAL . \} .END \# \# +++HEADERS+++ \# \# HEADERS (off or on) \# ------------------- \# *Arguments: \# | \# *Function: \# Turns headers at the top of the page off or on. \# *Notes: \# Default is on. \# .MAC HEADERS END . ie '\\$1'' .nr #HEADERS_ON 1 . el .nr #HEADERS_ON 0 .END \# \# HEADER MARGIN \# ------------- \# *Argument: \# \# *Function: \# Creates or modifies register #HEADER_MARGIN to hold amount \# of space between top of page and header. \# *Notes: \# Requires unit of measure. Default is 4P+6p, measured top-of-page \# to baseline. \# .MAC HEADER_MARGIN END . nr #HEADER_MARGIN (\\$1) .END \# \# HEADER GAP \# ---------- \# *Argument: \# \# *Function: \# Creates or modifies register #HEADER_GAP to hold amount \# of space between header and running text. \# *Notes: \# Default is 1P+6p. \# .MAC HEADER_GAP END . nr #HEADER_GAP (\\$1) .END \# \# HEADER \# ------ \# *Arguments: \# \# *Function: \# Prints header appropriate to DOC_TYPE, PRINTSTYLE, and COPYSTYLE. \# *Notes: \# In order to convert the title string to caps in the header \# (in the event that the user enters .TITLE in caps/lc), I've \# used quad left, quad centre, and quad right to arrange the \# three bits of the header, rather than .tl. This allows the \# use of the CAPS macro. The downside is that I have to add \# \\v'-(\\n[#LEAD]u*) in order for -Tlatin1 output to align \# the header/footer strings on the baseline. The console output \# still isn't brilliant, but at least it's comprehensible. \# .MAC HEADER END . vpt 0 . if \\n[#NEW_DOC_PT_SIZE] .nr #DOC_PT_SIZE \\n[#NEW_DOC_PT_SIZE] . rr #NEW_DOC_PT_SIZE . if \\n[#RESET_TRAPS] .TRAPS . if \\n[#REMOVE_ADJ] .nr #DOC_LEAD -\\n[#DOC_LEAD_ADJ] . rr #REMOVE_ADJ . rr #RESET_TRAPS . MNtop . rr #FROM_FOOTER . nr #FROM_HEADER 1 . nr #LAST_FN_COUNT_FOR_COLS \\n[#FN_COUNT_FOR_COLS] . if \\n[#FN_DEPTH] .PROCESS_FN_LEFTOVER . rr #RULED . if \\n[#RESET_FN_NUMBER] .nr #FN_NUMBER 0 1 . po \\n[#DOC_L_MARGIN]u . if \\n[#RECTO_VERSO] \{\ . nr #DOC_LR_MARGIN_TMP \\n[#DOC_L_MARGIN] . DOC_LEFT_MARGIN \\n[#DOC_R_MARGIN]u . if \\n[#CROPS] .DOC_LEFT_MARGIN \\n[#DOC_R_MARGIN]u+\\n[cropmarks]u . DOC_RIGHT_MARGIN \\n[#DOC_LR_MARGIN_TMP]u . if \\n[#CROPS] .DOC_RIGHT_MARGIN \\n[#DOC_LR_MARGIN_TMP]u-\\n[cropmarks]u . SWITCH_HDRFTR_CENTER_PAD . \} . \} . ev HEADER . if \\n[#PAGE_NUM_V_POS]=1 .vs 0 . sp |\\n[#HEADER_MARGIN]u-1v . mk y . ll \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . if \\n[#PRINT_STYLE]=1 \{\ . fam \\*[$TYPEWRITER_FAM] . ft R . ps \\*[$TYPEWRITER_PS]\\*[$HDRFTR_SIZE_CHANGE] . \} . if \\n[#PRINT_STYLE]=2 \{\ . fam \\*[$HDRFTR_FAM] . ft R . ps \\n[#DOC_PT_SIZE]u\\*[$HDRFTR_SIZE_CHANGE] . \} . nr #HDRFTR_PT_SIZE \\n[#PT_SIZE] . if \\n[#CAPS_ON] \{\ . nr #CAPS_WAS_ON 1 . CAPS OFF . \} . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#ENDNOTES]=1 \{\ .\" Single-spaced endotes have a different lead . if \\n[#EN_SINGLESPACE] \{\ . nr #RESTORE_DOC_LEAD \\n[#DOC_LEAD] . nr #DOC_LEAD \\n[#EN_LEAD]u . \} . \} . \} . if !n .nop \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap' . sp -1v . ie \\n[#HEADERS_ON] .PRINT_HDRFTR . el \{\ . if \\n[#PAGE_NUM_V_POS]=1 \{\ . if \\n[#PAGINATE] .PRINT_PAGE_NUMBER . \} . \} . sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#ENDNOTES]=1 \{\ . if \\n[#EN_SINGLESPACE] \{\ . nr #DOC_LEAD \\n[#RESTORE_DOC_LEAD]u . rr #RESTORE_DOC_LEAD . \} . \} . \} . nr #PAGE_TOP \\n[nl] . ev . po \\n[#L_MARGIN]u . if \\n[#RECTO_VERSO] .nr #L_MARGIN +\\n[#L_MARGIN_DIFF] . if \\n[#CAPS_WAS_ON] \{\ . CAPS . rr #CAPS_WAS_ON . \} . if \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB] . if \\n[#QUOTE] \{\ . ie \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB] . el \{\ . ie \\n[#Q_OFFSET_VALUE] .nr #Q_OFFSET \ \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE]) . el .nr #Q_OFFSET \\n[#L_MARGIN]+\\*[$Q_OFFSET_VALUE] . po \\n[#Q_OFFSET]u . \} . if \\n[#PRINT_STYLE]=2 .sp \\n[#Q_LEAD_DIFF]u . \} . if \\n[#EPIGRAPH] \{\ . ie \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB] . el \{\ . ie r#EPI_OFFSET_VALUE \ . nr #EPI_OFFSET \ \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) . el \ . nr #EPI_OFFSET \\n[#L_MARGIN]+\\*[$EPI_OFFSET_VALUE] . po \\n[#EPI_OFFSET]u . \} . \} . ie \\n[#EPIGRAPH] \{\ . ie !\\n[#EPI_ACTIVE] \{\ . ns . rr #EPI_ACTIVE . \} . el \{\ . ie \\n[#EPI_FITS] .ns . el .sp \\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u . \} . \} . el .ns . if \\n[#COLUMNS] \{\ . nr #FN_COUNT_FOR_COLS 0 1 . nr #L_MARGIN \\n[#DOC_L_MARGIN] . if \\n[#RECTO_VERSO] .COLUMNS \\n[#NUM_COLS] \\n[#GUTTER]u . nr #COL_NUM 0 1 . mk dc . po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . if \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB] . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . if \\n[#QUOTE] \{\ . ie \\n[#Q_OFFSET_VALUE] \ . po +(\\n[#PP_INDENT]u*\\n[#Q_OFFSET_VALUE]u) . el \ . po +\\*[$Q_OFFSET_VALUE] . \} . if \\n[#EPIGRAPH] \{\ . if \\n[#EPI_ACTIVE] \{\ . ie \\n[#EPI_FITS] . . el .nr dc -\\n[#EPI_LEAD_DIFF] . \} . ie r#EPI_OFFSET_VALUE \{\ . po \ \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u+(\\n[#PP_INDENT]u*\\n[#EPI_OFFSET_VALUE]u) . \} . el .po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u+\\*[$EPI_OFFSET_VALUE] . \} . \} . if \\n[#RESET_FN_COUNTERS]=1 \{\ . rr #RESET_FN_COUNTERS . PROCESS_FN_IN_DIVER . nr #FN_COUNT \\n[#SAVED_FN_COUNT] 1 . if \\n[#COLUMNS]=1 .nr #FN_COUNT_FOR_COLS \\n[#SAVED_FN_COUNT_FOR_COLS] 1 . ie \\n[#RESET_FN_NUMBER]=1 .nr #FN_NUMBER \\n[#SAVED_FN_NUMBER] 1 . el .nr #FN_NUMBER \\n[#FN_NUMBER] 1 . rm FN_IN_DIVER . if dRUNON_FN_IN_DIVER .rm RUNON_FN_IN_DIVER . \} . rr #FROM_HEADER . rr #DEFER_SPACE_ADDED . if !\\n[#FN_DEPTH] .if r #DIVERTED .rr #DIVERTED . if \\n[#MN_OVERFLOW_LEFT]=1 \{\ . MN LEFT . nf . MN_OVERFLOW_LEFT . MN . \} . if \\n[#MN_OVERFLOW_RIGHT]=1 \{\ . MN RIGHT . nf . MN_OVERFLOW_RIGHT . MN . \} . rm MN_OVERFLOW_LEFT . rr #MN_OVERFLOW_LEFT . rr #no-repeat-MN-left . rm MN_OVERFLOW_RIGHT . rr #MN_OVERFLOW_RIGHT . rr #no-repeat-MN-right . if \\n[#PRE_COLLATE]=1 .rr #PRE_COLLATE . if \\n[#UNDERLINE_WAS_ON]=1 \{\ . vs 0 . ie !n \ . nop \R'#UNDERLINE_ON 1'\X'ps: exec \\n[_w] \\n[_d] decorline' . el .ul 1000 . br . ns . rr #UNDERLINE_WAS_ON . \} . if \\n[#RESTORE_PAGINATION] \{\ . PAGINATE . rr #RESTORE_PAGINATION . \} . ch RR_@TOP . ie \\n[tbl*have-header] .rr @TOP . el .wh \\n[nl]u+1u RR_@TOP . if d PDF*IMAGE \{\ . rs . nf . PDF*IMAGE . sp \\n[pdf-img:depth]u . PDF_IMAGE_CLEAN . \} . if (\\n[float*defer]>0):(\\n[defer]=0) \{\ . nf . if !\\n[tbl*no-top-hook] .tbl@top-hook . rr tbl*no-top-hook . \} . if \\n[defer] \{\ . ev protect . evc 0 . rs . sp |\\n[#T_MARGIN]u-\\n[.v]u . if '\\*[float*type:1]'boxed' \{\ . if (\\n[.t] > 1)&(\\n[float-depth:1] > \\n[.t]) \ . tbl*float-warning . \} . nf . nr defer-count \\n[defer] . nr loop-count 0 1 . nr new-defer 0 1 . while \\n+[loop-count]<=\\n[defer-count] \{\ . if \\n[defer] .rnn defer float*defer \" So .if \n[defer] is skipped during float output . vpt . if \\n[loop-count]>1 .SHIM . sp 1u . nr #NEXT_TRAP \\n[.t] . sp -1u . if '\\*[float*type:\\n[loop-count]]'table' \{\ . ch FOOTER \\n[#VARIABLE_FOOTER_POS]u+\\n[#DOC_LEAD]u . ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u+\\n[#DOC_LEAD]u . \} . ie !\\n[float-span:\\n[loop-count]] \{\ . ie ((\\n[float-depth:\\n[loop-count]]-\\n[.v])>\\n[#NEXT_TRAP]):(\\n[D-float:\\n[loop-count]]>\\n[#NEXT_TRAP]) \{\ .\" Insufficient space, defer to next page . rn FLOAT*DIV:\\n[loop-count] NEW*FLOAT*DIV:\\n+[new-defer] . rnn float-depth:\\n[loop-count] new-float-depth:\\n[new-defer] . rnn D-float:\\n[loop-count] new-D-float:\\n[new-defer] . \} . el \{\ . output-float . \} . \} . el \{\ . output-float . \} . \} . rm FLOAT*DIV:\\n[loop-count] . rr float-depth:\\n[loop-count] . rm tbl*header-div:\\n[loop-count] . rm float*type:\\n[loop-count] .\" FLOAT arrays are empty now .\" Rename new arrays (FLOATs deferred to next page) to proper names . nr loop-count 0 1 . rnn new-defer defer . while \\n+[loop-count]<=\\n[defer] \{\ . rn NEW*FLOAT*DIV:\\n[loop-count] FLOAT*DIV:\\n[loop-count] . rnn new-float-depth:\\n[loop-count] float-depth:\\n[loop-count] . rnn new-D-float:\\n[loop-count] D-float:\\n[loop-count] . \} . rr float*defer . ch FOOTER \\n[#VARIABLE_FOOTER_POS]u . ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u . nr float*before-shim \\n[nl] . SHIM . nr float*after-shim \\n[nl] . if '\\*[float*type:\\n[loop-count]]'boxed' \ . if \\n[float*before-shim]=\\n[float*after-shim] .sp . if '\\*[float*type:\\n[loop-count]]'table' \ . if \\n[float*before-shim]=\\n[float*after-shim] .sp . ev . nr tbl*have-header 0 . rr loop-count . rr defer-count . rr float*before-shim . rr float*after-shim . rm float-adj . rm float-adj:top . rm float-adj:bottom . \} . vpt .END \# \# ==================================================================== \# \# +++FOOTERS+++ \# \# FOOTERS (off or on) \# ------------------- \# *Arguments: \# | \# *Function: \# Turns footers at the bottom of the page off or on. \# *Notes: \# Default is off. If on, page numbers automatically go at \# the top, centered, unless pagination has been turned off, \# or the pagenumber position has been changed to left or right. \# .MAC FOOTERS END . ie '\\$1'' \{\ . rr #HEADERS_ON . nr #FOOTERS_ON 1 . PAGENUM_POS TOP CENTER . \} . el .nr #FOOTERS_ON 0 .END \# \# FOOTER MARGIN \# ------------- \# *Argument: \#