.\" om.tmac .ig Mom -- a typesetting/document-processing macro set for groff. Copyright (C) 2002, 2003 Free Software Foundation, Inc. Written by Peter Schaffter (peter@faustus.dyn.ca) 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 2, 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 groff; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Version 1.3-a ------------- 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," so I'm leaving any major clean-up of redundancies and whatnot for a rainy day. Inasmuch as possible, macros that turn a feature on or off follow a similar style. Invoking the macro without an argument turns the feature on. Invoking it with any other argument turns it off. Use of the argument OFF is recommended, but not required; users may find other conventions preferable (e.g. NO, X, END, QUIT, etc.). "" in the description of arguments that can be passed to a macro means that any argument turns the feature off. .. \# \# ==================================================================== \# \# Check which version of groff is being run .if (\n[.x]\n[.y] < 118) \ . ab 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 The mom macros require that you be running GNU troff. .if \n(.C \ . ab The groff mom macros do not work in compatibility mode. \# Add supplementary styles .sty \n[.fp] L \" Light Roman .sty \n[.fp] LI \" Light Italic .sty \n[.fp] LCD \" Light Condensed Roman .sty \n[.fp] LCDI \" Light Condensed Italic .sty \n[.fp] LEX \" Light Extended Roman .sty \n[.fp] LEXI \" Light Extended Italic .sty \n[.fp] CD \" Medium/Book Condensed Roman .sty \n[.fp] CDI \" Medium/Book Condensed Italic .sty \n[.fp] EX \" Medium/Book Extended Roman .sty \n[.fp] EXI \" Medium/Book Extended Italic .sty \n[.fp] DB \" DemiBold Roman .sty \n[.fp] DBI \" DemiBold Italic .sty \n[.fp] BCD \" Bold Condensed Roman .sty \n[.fp] BCDI \" Bold Condensed Italic .sty \n[.fp] BEX \" Bold Extended Roman .sty \n[.fp] BEXI \" Bold Extended Italic .sty \n[.fp] HV \" Heavy Roman .sty \n[.fp] HVI \" Heavy Italic .sty \n[.fp] HVCD \" Heavy Condensed Roman .sty \n[.fp] HVCDI \" Heavy Condensed Italic .sty \n[.fp] HVEX \" Heavy Extended Roman .sty \n[.fp] HVEXI \" Heavy Extended Italic .sty \n[.fp] BL \" Black Roman .sty \n[.fp] BLI \" Black Italic .sty \n[.fp] BLCD \" Black Condensed Roman .sty \n[.fp] BLCDI \" Black Condensed Italic .sty \n[.fp] BLEX \" Black Extended Roman .sty \n[.fp] BLEXI \" Black Extended Italic .sty \n[.fp] UBL \" Ultra-Black Roman .sty \n[.fp] UBLI \" Ultra-Black Italic \# \# ==================================================================== \# \# 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 SP sp .ALIAS PAGELENGTH pl .ALIAS SPREAD brp .ALIAS ESC_CHAR ec .ALIAS STRING ds \# \# 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 (.vs, not .ls) .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 .warn 8192 \# .ig About the warn level -------------------- There's a lot of testing for the presence of number registers and strings in this macro file. Many of the registers and strings pop into and out of existence on the fly. For convenience, I often use .if \\n[whatever] and .if !\\n[whatever] to test "if the register exists and is (not) empty." Groff, encountering such tests when called with the -ww options, emits warning: number register whatever not defined. Groff also warns about strings similarly tested for. The warn level, above, is high in order to shut off those warnings. If you're futzing in this file and need more verbose warnings, either comment out ".warn 8192" or set the warnlevel to the one you need (but be ready for lots of what I've just described). .. \# \# ==================================================================== \# \# +++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 \} .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(.lu . 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 \# \# ===================================================================== \# \# +++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 . 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 . br . nr #NEWPAGE 1 . ie \\n[#B_MARGIN_SET]=1 \{\ . ie !\\n[#DOCS]=1 \{\ . ev NP . bp . ev . \} . el \{\ . if \\n[#COLUMNS]=1 \{ .nr #COL_NUM \\n[#NUM_COLS] \} . ie !\\n[#FN_DEPTH] \{\ . ch FN_OVERFLOW_TRAP . DO_B_MARGIN . wh -(\\n[#FN_OVERFLOW_TRAP_POS]u) FN_OVERFLOW_TRAP . \} . el \{\ . DO_B_MARGIN . \} . \} . \} . el \{\ . DO_B_MARGIN . \} .END \# \# ===================================================================== \# \# +++GENERAL STYLE MACROS+++ \# \# Macros that are likely to appear together to define general \# type style: line length, family, font, point size, and line \# spacing. \# \# 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(.lu .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 . if \\n[#PRINT_STYLE]=1 \{\ . fam C . return . \} . if \\n[#IGNORE] \{\ . fam C . return . \} . if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) \{\ . ds $SAVED_STYLE \\n[.sty] . \} . ds $FAMILY \\$1 . ft 0 . fam \\*[$FAMILY] . if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) \{\ . ft \\*[$SAVED_STYLE] . if !F\\n[.fn] \{\ . ft 0 . \} . \} . if \\n[#COLLATE]=1 \{\ . if !r#START \{ .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 . 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 . \} . ds $FONT \\$1 . ft 0 . ft \\*[$FONT] . if 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. . \} . 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 in font/devps. . ie \\n[#ABORT_FT_ERRORS]=0 \{\ . tm1 " Continuing to process using fallback font. . \} . el .ab Aborting. . \} . \} . \} . \} .END \# \# \# POINT SIZE \# ---------- \# *Arguments: \# \# *Function: \# Sets point size to user supplied value in scaled points. \# If #AUTO_LEAD is on, sets .vs to #AUTOLEAD_VALUE+#PT_SIZE. \# *Notes: \# Must NOT use a unit of measure. \# .MAC PT_SIZE END . if \\n[#PRINT_STYLE]=1 \{ .return \} . if \\n[#IGNORE] \{ .return \} . nr #PT_SIZE_SET 1 . ps \\$1 . if \\n[#AUTO_LEAD] \{\ . ie \\n[#AUTOLEAD_FACTOR] \{ .vs \\n[#PT_SIZE]u*\\n[#AUTOLEAD_VALUE]u/1000u \} . el \{ .vs \\n[#PT_SIZE]u+\\n[#AUTOLEAD_VALUE]u \} . \} . nr #PT_SIZE_IN_UNITS \\n[.ps] .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_FACTOR . \} . vs \\$1 . 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 \# .MAC RESET_LEAD END ' vs . ch RESET_LEAD .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 instead of the two being added \# together. \# .MAC AUTOLEAD END . if \\n[#PRINT_STYLE]=1 \{ .return \} . if \\n[#IGNORE] \{ .return \} . nr #AUTO_LEAD 1 . nr #OLD_LEAD \\n(.v . nr #AUTOLEAD_VALUE (p;\\$1) . ie \\n[#NUM_ARGS]=2 \{\ . if '\\$2'FACTOR' \{\ . nr #AUTOLEAD_FACTOR 1 . vs \\n[#PT_SIZE]u*\\n[#AUTOLEAD_VALUE]u/1000u . \} . \} . el \{\ . vs \\n[#PT_SIZE]u+\\n[#AUTOLEAD_VALUE]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 \EfR .ds IT \EfI .ds BD \EfB .ds BDI \Ef(BI .ds PREV \EfP .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 \# \# .ig INLINE KERNING AND HORIZONTAL MOVEMENT -------------------------------------- Kerning Inline kerning provides a simple method for users 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. In groff v. 1.17.2, it was not possible to pass arguments to macros that were called with inline escapes, nor thence to evaluate conditional expressions. Consequently, each pseudo-escape \[BU] had to be defined separately with ".char". As of v. 1.18, one can pass arguments to inline strings/macros, hence it is now possible to do \*[BU n] where n, inline, is the desired number of kern units. The original .char definitions have been left in for backward compatibility with documents created prior to mom-1.1.3c. .. \# .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 \# .ig Horizontal movements BP1...12.75 and FP1...12.75 move backwards or forwards inline by the specified number of points. Left in for backward compatibility with mom-1.1.3c, the preferred methods for inline horizontal movements are now \*[BCK ] and \*[FWD ]. .. \# .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 KERNING (RW and EW) \# ----------------------------- \# .ig The line kerning macros are special instances of track kerning, used where a complete line needs to be tightened (or relaxed) in order to accomodate or remove one or two more characters than the default justification permits. .. \# \# *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. \# .ig The groff documentation is a tad confusing about what unit of measure is used in track kerning, only that the width of each character is increased or decreased by the amount(s) passed as arguments to .tkf, and something about linear function of point size. In fact, with the way I've put this macro together, it doesn't matter. All the user needs to know is that a value of one 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 (e.g. .25, .5). Given that RW and EW are for massaging type, a certain amount of experimentation and previewing is expected and necessary. \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 \} . \} . tkf \\n(.f 1 -\\$1 1 -\\$1 .END \# \# .MAC EW END . if \\n[#BR_AT_LINE_KERN] \{\ . ie \\n[#JUSTIFY]=1 \{ .brp \} . el \{ .br \} . \} . 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 . if \\n(nl=0 \{ .nr #TOP 1 \} . if '\\$0'ALD' \{\ . nr #ALD (\\$1) . sp \\n[#ALD]u . \} . if '\\$0'ADD_SPACE' \{\ . nr #ALD (\\$1) . rs . sp \\n[#ALD]u . \} . if '\\$0'SPACE' \{\ . sp \\$1u . \} . if '\\$0'SP' \{\ . sp \\$1u . \} .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 . nr #RLD (\\$1) . sp -\\n[#RLD]u .END \# \# ALD/RLD STRINGS \# --------------- .ig 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 prefered 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 | ES | FR | IT | NL | NO | PT | SV ] | \# *Function: \# Turns smartquotes on (optionally with a quoting style from the \# argument list, or off). \# *Notes: \# The " character is read outside the macro when mom is \# processed. The strings for open/close ($QUOTE) are then \# defined in the macro. \# \# (Note to myself: code for " is \N'34'.) \# .char " \\*[$QUOTE\\n[#OPEN_CLOSE]]\R'#OPEN_CLOSE (1-\\n[#OPEN_CLOSE])' \# .MAC SMARTQUOTES END . rr #ARGS_TO_SQ . ie '\\$1'' \{\ . nr #OPEN_CLOSE 0 . ds $QUOTE0 \\[lq] . ds $QUOTE1 \\[rq] . \} . el \{\ . if '\\$1',,' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[Bq] . ds $QUOTE1 \\[lq] . \} . if '\\$1'<<' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[Fo] . ds $QUOTE1 \\[Fc] . \} . if '\\$1'>>' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[Fc] . ds $QUOTE1 \\[Fo] . \} . if '\\$1'DA' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[Fc] . ds $QUOTE1 \\[Fo] . \} . if '\\$1'DE' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[Bq] . ds $QUOTE1 \\[lq] . \} . if '\\$1'ES' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[lq] . ds $QUOTE1 \\[rq] . \} . if '\\$1'FR' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[Fo]\\| . ds $QUOTE1 \\|\\[Fc] . \} . if '\\$1'IT' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[Fo]\\| . ds $QUOTE1 \\|\\[Fc] . \} . if '\\$1'NL' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[rq] . ds $QUOTE1 \\[rq] . \} . if '\\$1'NO' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[Fo] . ds $QUOTE1 \\[Fc] . \} . if '\\$1'PT' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[Fo] . ds $QUOTE1 \\[Fc] . \} . if '\\$1'SV' \{\ . nr #ARGS_TO_SQ 1 . ds $QUOTE0 \\[Fc] . ds $QUOTE1 \\[Fc] . \} . if !r#ARGS_TO_SQ \{\ . ds $QUOTE0 \\[dq] . ds $QUOTE1 \\[dq] . \} . \} .END \# .ds $QUOTE0 \[dq] .ds $QUOTE1 \[dq] \# \# 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. Actually \# 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 B \h'|0'\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 \# ----------------------- \# .ig The purpose of these macros is to allow the user to enter lines of text that will be quadded LRC *without* the user having to enter .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 groff 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, just continued (indefinitely) until a return is \# encountered. 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 . \} . fi . 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 . \} . fi . ce 100000 . nr #PSEUDO_FILL 1 .END \# \# ===================================================================== \# \# +++TABS+++ \# .ig There are two different kinds of tabs available: 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. String tabs don't preview properly with gxditview. Use gv instead. .. \# \# 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 \# .ig Examples: -------- .TAB_SET 1 2P+6p 12P C means "create a tab numbered 1 that starts 2 picas and 6 points from the left margin, is 12 picas long, and centre each input line." .TAB_SET 1 2P+6P 12P C QUAD means exactly the same thing, except that input lines are joined and the area delimted by the tab filled with centered text. TAB n can be called at any time after being set. Tabs are NOT columnar in behaviour. If the text inside a tab runs to several lines, when you call the next tab a break occurs, meaning that the new tab starts one line below the last line in the previous tab. For columnar behaviour, you must use the multi-column macros in addition to tabs. If you want tabs to line up bottom-line to bottom-line (most likely single line tabs), use .TN (provided the tabs are numbered sequentially). Otherwise, you must use .EL then .TAB if you want them to align. If you want to reset tabs, you must use .TQ before .TAB_SET. Note that indents are turned off automatically whenever a new tab is called with TAB . Tabs themselves are user-invoked using the TAB macro with a numeric argument, e.g. TAB 1. Generally, in order not to get confused, 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] DONE \"Define TAB macro . 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] . po \\\\n[#L_MARGIN]u+\\\\n[#TAB_OFFSET\\\\*[$CURRENT_TAB]]u . ll \\n[#TAB_LENGTH]u . ta \En(.lu . 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 . \} .DONE . 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. Actually \# 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* come before setting any new tabs if you want the \# tabs' indents measured from page left. Otherwise, the tabs' \# indents are measured from the left margin of the tab you're \# currently in. \# .MAC TQ END . br . rr #TAB_ACTIVE . rr #IN_TAB . po \\n[#L_MARGIN]u . ll \\n[#L_LENGTH]u . ta \\n(.lu . 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 legal 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] .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: \# When on, underlines all letters, words, and digits in a passage, \# ignoring punctuation and spaces. \# *Notes: \# Only for use when the font family is COURIER, to simulate \# typewriter-style underlining of italic passages. \# .MAC UNDERLINE END . ie '\\$1'' \{\ . nr #UNDERLINE_ON 1 . char A _A . char B _B . char C _C . char D _D . char E _E . char F _F . char G _G . char H _H . char I _I . char J _J . char K _K . char L _L . char M _M . char N _N . char O _O . char P _P . char Q _Q . char R _R . char S _S . char T _T . char U _U . char V _V . char W _W . char X _X . char Y _Y . char Z _Z . char \[`A] _\[`A] . char \[^A] _\[^A] . char \['A] _\['A] . char \[:A] _\[:A] . char \[oA] _\[oA] . char \[~A] _\[~A] . char \[AE] _\[AE] . char \[`E] _\[`E] . char \[^E] _\[^E] . char \['E] _\['E] . char \[:E] _\[:E] . char \[`I] _\[`I] . char \[^I] _\[^I] . char \['I] _\['I] . char \[:I] _\[:I] . char \[`O] _\[`O] . char \[^O] _\[^O] . char \['O] _\['O] . char \[:O] _\[:O] . char \[~O] _\[~O] . char \[/O] _\[/O] . char \[`U] _\[`U] . char \[^U] _\[^U] . char \['U] _\['U] . char \[:U] _\[:U] . char \[,C] _\[,C] . char \[-D] _\[-D] . char \[~N] _\[~N] . char \[TP] _\[TP] . char \['Y] _\['Y] . char \[:Y] _\[:Y] . char a _a . char b _b . char c _c . char d _d . char e _e . char f _f . char g _g . char h _h . char i _i . char j _j . char k _k . char l _l . char m _m . char n _n . char o _o . char p _p . char q _q . char r _r . char s _s . char t _t . char u _u . char v _v . char w _w . char x _x . char y _y . char z _z . char \[`a] _\[`a] . char \[^a] _\[^a] . char \['a] _\['a] . char \[:a] _\[:a] . char \[oa] _\[oa] . char \[~a] _\[~a] . char \[ae] _\[ae] . char \[`e] _\[`e] . char \[^e] _\[^e] . char \['e] _\['e] . char \[:e] _\[:e] . char \[`i] _\[`i] . char \[^i] _\[^i] . char \['i] _\['i] . char \[:i] _\[:i] . char \[`o] _\[`o] . char \[^o] _\[^o] . char \['o] _\['o] . char \[:o] _\[:o] . char \[~o] _\[~o] . char \[/o] _\[/o] . char \[`u] _\[`u] . char \[^u] _\[^u] . char \['u] _\['u] . char \[:u] _\[:u] . char \[,c] _\[,c] . char \[Sd] _\[Sd] . char \[~n] _\[~n] . char \[Tp] _\[Tp] . char \['y] _\['y] . char \[:y] _\[:y] . char \[ss] _\[ss] . char ' _' . char 1 _1 . char 2 _2 . char 3 _3 . char 4 _4 . char 5 _5 . char 6 _6 . char 7 _7 . char 8 _8 . char 9 _9 . char 0 _0 . \} . el \{\ . nr #UNDERLINE_ON 0 . rchar A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \ a b c d e f g h i j k l m n o p q r s t u v w x y z \ \[`A] \[^A] \['A] \[:A] \[oA] \[~A] \[AE] \[`E] \[^E] \['E] \[:E] \ \[`I] \[^I] \['I] \[:I] \[`O] \[^O] \['O] \[:O] \[~O] \[/O] \[`U] \ \[^U] \['U] \[:U] \[,C] \[-D] \[~N] \[TP] \['Y] \[:Y] \ \[`a] \[^a] \['a] \[:a] \[oa] \[~a] \[ae] \[`e] \[^e] \['e] \[:e] \[`i] \ \[^i] \['i] \[:i] \[`o] \[^o] \['o] \[:o] \[~o] \[/o] \[`u] \[^u] \['u] \ \[:u] \[,c] \[Sd] \[~n] \[Tp] \['y] \[:y] \[ss] \ ' 1 2 3 4 5 6 7 8 9 0 . \} .END \# \# \# UL/ULX \# ------ \# *Arguments: \# \# *Function: \# Underscores all letters, words, and digits in a passage, \# ignoring punctuation and spaces. \# *Notes: \# Intended to be called with inline escapes \*[UL] (underline \# on) and \*[ULX] (underline off). Only works when the font family \# is COURIER, to simulate typewriter-style underlining of italic \# passages. \# .MAC UL END \c\R'#UNDERLINE_ON 1' . char A _A . char B _B . char C _C . char D _D . char E _E . char F _F . char G _G . char H _H . char I _I . char J _J . char K _K . char L _L . char M _M . char N _N . char O _O . char P _P . char Q _Q . char R _R . char S _S . char T _T . char U _U . char V _V . char W _W . char X _X . char Y _Y . char Z _Z . char \[`A] _\[`A] . char \[^A] _\[^A] . char \['A] _\['A] . char \[:A] _\[:A] . char \[oA] _\[oA] . char \[~A] _\[~A] . char \[AE] _\[AE] . char \[`E] _\[`E] . char \[^E] _\[^E] . char \['E] _\['E] . char \[:E] _\[:E] . char \[`I] _\[`I] . char \[^I] _\[^I] . char \['I] _\['I] . char \[:I] _\[:I] . char \[`O] _\[`O] . char \[^O] _\[^O] . char \['O] _\['O] . char \[:O] _\[:O] . char \[~O] _\[~O] . char \[/O] _\[/O] . char \[`U] _\[`U] . char \[^U] _\[^U] . char \['U] _\['U] . char \[:U] _\[:U] . char \[,C] _\[,C] . char \[-D] _\[-D] . char \[~N] _\[~N] . char \[TP] _\[TP] . char \['Y] _\['Y] . char \[:Y] _\[:Y] . char a _a . char b _b . char c _c . char d _d . char e _e . char f _f . char g _g . char h _h . char i _i . char j _j . char k _k . char l _l . char m _m . char n _n . char o _o . char p _p . char q _q . char r _r . char s _s . char t _t . char u _u . char v _v . char w _w . char x _x . char y _y . char z _z . char \[`a] _\[`a] . char \[^a] _\[^a] . char \['a] _\['a] . char \[:a] _\[:a] . char \[oa] _\[oa] . char \[~a] _\[~a] . char \[ae] _\[ae] . char \[`e] _\[`e] . char \[^e] _\[^e] . char \['e] _\['e] . char \[:e] _\[:e] . char \[`i] _\[`i] . char \[^i] _\[^i] . char \['i] _\['i] . char \[:i] _\[:i] . char \[`o] _\[`o] . char \[^o] _\[^o] . char \['o] _\['o] . char \[:o] _\[:o] . char \[~o] _\[~o] . char \[/o] _\[/o] . char \[`u] _\[`u] . char \[^u] _\[^u] . char \['u] _\['u] . char \[:u] _\[:u] . char \[,c] _\[,c] . char \[Sd] _\[Sd] . char \[~n] _\[~n] . char \[Tp] _\[Tp] . char \['y] _\['y] . char \[:y] _\[:y] . char \[ss] _\[ss] . char ' _' . char 1 _1 . char 2 _2 . char 3 _3 . char 4 _4 . char 5 _5 . char 6 _6 . char 7 _7 . char 8 _8 . char 9 _9 . char 0 _0 .END \# \# .MAC ULX END \c\R'#UNDERLINE_ON 0' . rchar A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \ a b c d e f g h i j k l m n o p q r s t u v w x y z \ \[`A] \[^A] \['A] \[:A] \[oA] \[~A] \[AE] \[`E] \[^E] \['E] \[:E] \ \[`I] \[^I] \['I] \[:I] \[`O] \[^O] \['O] \[:O] \[~O] \[/O] \[`U] \ \[^U] \['U] \[:U] \[,C] \[-D] \[~N] \[TP] \['Y] \[:Y] \ \[`a] \[^a] \['a] \[:a] \[oa] \[~a] \[ae] \[`e] \[^e] \['e] \[:e] \[`i] \ \[^i] \['i] \[:i] \[`o] \[^o] \['o] \[:o] \[~o] \[/o] \[`u] \[^u] \['u] \ \[:u] \[,c] \[Sd] \[~n] \[Tp] \['y] \[:y] \[ss] \ ' 1 2 3 4 5 6 7 8 9 0 .END \# \# \# UNDERSCORE \# ---------- \# *Arguments: \# [points below baseline] "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 \# \# All text is underscored (including punctuation and spaces). \# This is the primary difference between UNDERLINE and UNDERSCORE, \# aside from the fact the UNDERLINE only works with Courier. \# \# UNDERSCORE does not work across line breaks. Each line of \# text must be entered separately with UNDERSCORE. If the \# UNDERSCORE begins in the middle of a line and crosses over a \# break, the portion before the break must be entered in its own \# UNDERSCORE, as must the portion that comes after the break. \# .MAC UNDERSCORE END . nr #RESTORE_PT_SIZE \\n[#PT_SIZE] . ie \\n[#NUM_ARGS]=1 \{ \\$1\\s(12\\v'+2p'\\l'|0'\\v'-2p'\\s[\\n[#RESTORE_PT_SIZE]u] \} . el \{ \\$2\\s(12\\v'+(\\$1)'\\l'|0'\\v'-(\\$1)'\\s[\\n[#RESTORE_PT_SIZE]u] \} . rr #RESTORE_PT_SIZE .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 #RESTORE_PT_SIZE \\n[#PT_SIZE] . if \\n[#NUM_ARGS]=1 \{\ . PRINT \\$1\\s(12\\v'+2p'\\l'|0'\\v'+2p'\\l'|0'\\v'-4p'\\s[\\n[#RESTORE_PT_SIZE]u] . \} . if \\n[#NUM_ARGS]=2 \{\ . PRINT \\$2\\s(12\\v'+\\$1'\\l'|0'\\v'+2p'\\l'|0'\\v'-(2p+\\$1)'\\s[\\n[#RESTORE_PT_SIZE]u] . \} . if \\n[#NUM_ARGS]=3 \{\ . PRINT \\$3\\s(12\\v'+\\$1'\\l'|0'\\v'+\\$2'\\l'|0'\\v'-(\\$2+\\$1)'\\s[\\n[#RESTORE_PT_SIZE]u] . \} . rr #RESTORE_PT_SIZE .END \# \# \# SUPERSCRIPT INLINES \# ------------------- \# *Function: \# Prints everything after 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. \# .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]\v'-.26m'\s[\En[#SUP_PT_SIZE]u] \# .ds SUPX \s[\En[#PT_SIZE_IN_UNITS]u]\v'.26m' \# .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]\v'-.3m'\s[\En[#SUP_PT_SIZE]u]\E*[COND_FOR_SUP] \# .ds CONDSUPX \s[\En[#PT_SIZE_IN_UNITS]u]\v'.3m'\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]\v'-.3m'\s[\En[#SUP_PT_SIZE]u]\E*[EXT_FOR_SUP] \# .ds EXTSUPX \s[\En[#PT_SIZE_IN_UNITS]u]\v'.3m'\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'\Es0\R'#PT_SIZE_IN_UNITS \En[.ps]'\H'\En[#PT_SIZE_IN_UNITS]u' .ds EXTX \ER'#EXTEND 0'\Es0\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. # is equivalent to \# CompuGraphic's old . \# *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] \#. fp \\n[.fp] \\*[$FONT] . fp \\n[.fp] \\n[.sty] . ds $FONT_FOR_PAD \\*[$FONT] . 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-\Enp'\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' . ie \\n[#SILENT] \{\ . SILENT . fam \\*[$FAMILY_FOR_PAD] \\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] . br . SILENT OFF . \} . el \{\ . fam \\*[$FAMILY_FOR_PAD] \\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] . 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+++ \# .ig 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 put a strain on on resource-challenged systems. \# \# 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 #IGNORE \{ .return \} . br . if \\n[#DOCS] \{\ . if \\n[#PRINT_STYLE]=1 \{ .return \} . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#PP_STYLE]=2 \{ .return \} . if \\n[#PP]>1 \{ .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) \} . ds $RESTORE_FAM \\n[.fam] . 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 \} . mk x . sp \\n[#DC_LINES]v . ie \\n[#DC_COLOR]=1 \{\ . ie !'\\$3'' \{\ . ie '\\$3'COND' \{ .PRINT \m[\\*[$DC_COLOR]]\\*[COND]\\*[$DROPCAP]\\*[CONDX]\m[] \} . el \{ .PRINT \m[\\*[$DC_COLOR]]\\*[EXT]\\*[$DROPCAP]\\*[EXTX]\m[] \} . \} . el \{ .PRINT \m[\\*[$DC_COLOR]]\\*[$DROPCAP]\m[] \} . \} . el \{\ . ie !'\\$3'' \{\ . ie '\\$3'COND' \{ .PRINT \\*[COND]\\*[$DROPCAP]\\*[CONDX] \} . el \{ .PRINT \\*[EXT]\\*[$DROPCAP]\\*[EXTX] \} . \} . el \{ .PRINT \m[\\*[$DC_COLOR]]\\*[$DROPCAP]\m[] \} . \} . if '\\$3'COND' \{ \E*[COND] \} . if '\\$3'EXT' \{ \E*[EXT] \} . ie \\n(.i \{ .in +\w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u \} . el \{ .in \w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u \} . if '\\$3'COND' \{ \E*[CONDX]\c \} . if '\\$3'EXT' \{ \E*[EXTX]\c \} . rt \\nxu . 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(.du+\\n[#DC_HEIGHT]u-1v DROPCAP_OFF \} . el \{ .wh \\n(.du+\\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 .END \# \# \# RULE \# ---- \# *Argument: \# \# *Function: \# Draws a rule the length of the current measure. \# *Notes: \# .MAC RULE END \c . EL . if \\n(.u=1 \{\ . nr #FILL_WAS_ON 1 . ds $CURRENT_QUAD \\*[$QUAD_VALUE] . nf . \} . ie \\n[#INDENT_ACTIVE] \{\ . nr #RESTORE_L_LENGTH \\n(.l . if \\n[#INDENT_BOTH_ACTIVE] \{ .ll \\n(.lu-\\n[#BL_INDENT]u \} . if \\n[#INDENT_LEFT_ACTIVE] \{ .ll \\n(.lu-\\n[#L_INDENT]u \} . PRINT \El'\En(.lu'\c . ll \\n[#RESTORE_L_LENGTH]u . rr #RESTORE_L_LENGTH . \} . el \{\ . PRINT \El'\En(.lu'\c . \} . if r#FILL_WAS_ON \{\ . fi . rr #FILL_WAS_ON . QUAD \\*[$CURRENT_QUAD] . rm $CURRENT_QUAD . \} . EL .END \# \# ===================================================================== \# \# +++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. \# \# Because the user supplied value requires a literal + or - sign, \# the macro argument is stored in a string. \# \# \n[.sss] holds the current sentence space value. \# .MAC WS END . ds $WS_CONSTANT 12 . ds $WS_VAR \\$1 . ie '\\$1'DEFAULT' .ds $WS_VAR +0 . el .ds $WS (\\*[$WS_CONSTANT]\\*[$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 . ie '\\$1'0' \{ .ss \\n[.ss] (\\n[.ss]-\\n[.ss]) \} . el \{\ . ie '\\$1'DEFAULT' \{ .ss \\n[.ss] \} . el \{\ . ds $SS_VAR \\$1 . ss \\n[.ss] (0\\*[$SS_VAR]) . \} . \} .END \# \# \# ===================================================================== \# \# +++INDENTS+++ \# .ig There are five styles of indents: left, right, both, temporary, and hanging. Each is set/invoked with a different macro. Indent macros begin with the letter "I", hence .IL means "indent left," .IR means "indent right," and so on. The first time any of the indent macros is used, it requires an argument--the size of the indent (with a unit of measure). The size may also be entered using the \w escape--very useful for numbered lists using HI. The unit of measure is required. Subsequent invocations don't require the argument; the indent measure remains the same until it's changed by invoking the macro with an argument again. If no indents are in effect, the arguments passed to indent macros are measured from the left and right margins of the page. If a left indent or a right indent is already in effect, the arguments passed to the indent macros are calculated from the current values; in other words, the arguments are additive. If you quit an indent and later return to it, its value will be the value last in effect, unless you pass it an argument. If you do pass an argument, it is added to the last value in effect, unless you cleared the indent with one of .IX/Q macros. Example ------- .IL 2P ...some text... .IL 2P ...some text... .IQ ...some text... .IL ...some text... The first .IL 2P indents text 2P from the left margin. The second .IL 2P indents text by an additional 2P, i.e. 4P from the left margin. .IQ turns the indent off. The last .IL (which has no argument) takes its value from the total of all arguments passed to .IL (in this case, 2P and 2P), therefore it indents 2P+2P from the left margin, i.e. 4P. If you wanted the last .IL to indent just 2P, you'd either have to reset the .IL prior to .IQ (.IL -2P), or pass the last .IL the argument 2P. To reverse the sense of an indent added to an indent, you may use negative values. Indents can be turned off individually with ILX, IRX, and IBX. LEFT and RIGHT indents may be combined and manipulated separately, (e.g. you can have an IL of 2P and an IR of 4P operative at the same time, and then change, say, the IL to 4P--thereby left indenting 6P--while the IR remains at 4P. IB automatically turns off IL and IR. They have to be reinvoked again when needed. IL and IR automatically turn IB off; it, too, has to be reinvoked with needed. All indents can be turned off at once with IQ. The ILX, IRX, IBX, and IQ macros simply turn the indents off; the values stored in the respective indent macros (IL, IR, IB) remain in effect. If the user wishes to clear the values, the IX macros should be invoked with the single argument CLEAR. IQ CLEAR clears out the values stored for all indent styles. Indents *must* be turned off before settting string tabs inside PAD. Generally, in order not to get confused, it's a good idea to turn all indents off before setting any tabs. TI and HI are special cases. There's no need to turn them off, since they affect only one line--the first after their invocation. Like the other indent styles, the first time they're invoked, they require a value in iPpcm; each subsequent invocation without an argument will use the same value. To change the value, simply pass a new value. Values for TI and HI are *not* additive. HI presupposes that you already have a left or both indent on. HI will never hang a line outside the left margin of a document or column. In other words, you must have IL or IB on before you can use HI. .. \# \# 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(.lu-\\n[#L_INDENT]u . \} . el \{\ . br . nr #L_INDENT +(\\$1) . in \\n[#L_INDENT]u . ta \\n(.lu-\\n[#L_INDENT]u . \} .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(.lu-\\n[#R_INDENT]u . ta \\n(.lu-\\n[#L_INDENT]u . \} . el \{\ . ll \\n[#L_LENGTH]u-\\n[#R_INDENT]u . ta \\n(.lu-\\n[#L_INDENT]u . \} . \} . el \{\ . br . nr #R_INDENT +(\\$1) . ie \\n[#TAB_ACTIVE] \{\ . ll \\n(.lu-\\n[#R_INDENT]u . ta \\n(.lu-\\n[#L_INDENT]u . \} . el \{\ . ll \\n[#L_LENGTH]u-\\n[#R_INDENT]u . ta \\n(.lu-\\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(.lu-\\n[#BR_INDENT]u . ta \\n(.lu-\\n[#BR_INDENT]u . \} . el \{\ . ll \\n[#L_LENGTH]u-\\n[#BR_INDENT]u . ta \\n(.lu-\\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(.lu-\\n[#BR_INDENT]u . ta \\n(.lu-\\n[#BL_INDENT]u . \} . el \{\ . in \\n[#BL_INDENT]u . ll \\n[#L_LENGTH]u-\\n[#BR_INDENT]u . ta \\n(.lu-\\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 . 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(.lu . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n(.lu . \} . \} . 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(.lu . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n(.lu . \} . \} . 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 now 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(.lu . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n(.lu . \} . \} . \} . 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(.lu . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n(.lu . \} . \} . \} . 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(.lu . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n(.lu . \} . \} . \} . 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(.lu . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n(.lu . \} . \} . \} . 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 |\\ncu . 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 . ie '\\$1'' \{\ . TQ . sp |\\n(.hu . \} . el \{\ . nr #MCX_ALD (\\$1) . TQ . ie \\n[#MCX_ALD]=0 \{ .sp |\\n(.hu-1v \} . el \{ .sp |\\n(.hu+\\n[#MCX_ALD]u \} . rr #MCX_ALD . \} .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. \# .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 \# \# 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 . di TYPESIZE E\\R'#CAP_HEIGHT \\n[.cht]' e\\R'#X_HEIGHT \\n[.cht]' y\\R'#DESCENDER \\n[.cdp]' . br . di .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 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 \# \# \# ==================================================================== \# \# DOCUMENT PROCESSING MACROS, STRINGS AND ALIASES \# =============================================== \# \# +++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 \} . TYPEWRITER . color 0 . ie '\\$2'SINGLESPACE' \{\ . nr #SINGLE_SPACE 1 . vs 12 . nr #ORIGINAL_DOC_LEAD \\n(.v . \} . el \{\ . vs 24 . nr #ORIGINAL_DOC_LEAD \\n(.v . \} . QUAD L . HY OFF . SMARTQUOTES OFF . if !\\n[#PP_INDENT] \{\ . in 3P \"Set indent . nr #PP_INDENT \\n(.i \"Read into #PP_INDENT . in 0 \"Remove indent . \} . HDRFTR_RIGHT_CAPS . nr #BOLDER_UNITS 0 . nr #CONDENSE 0 . nr #EXTEND 0 . rm IT . rm BD . rm BDI . rm PREV . UNDERLINE_SLANT . UNDERLINE_ITALIC . UNDERLINE_QUOTES . nr #IGNORE_COLUMNS 1 . char \(em -- . tr `' . \} . 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 \{ .PT_SIZE 12.5 \} . if !\\n[#DOC_TYPE]=4 \{ .LS 16 \} . 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 . \} . \} .END \# \# \# Macros to control behaviour of PRINTSTYLE TYPEWRITE \# \# First, a little utility macro. \# .MAC TYPEWRITER END . fam C . ft R . ps 12 .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 \EfR . ds IT \EfI . ds PREV \EfR . \} .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 occurences 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 r#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]'' \{\ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . \} . el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE]'' \{\ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . \} . el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . \} . el \{\ . ie '\\*[$REVISION]'' \{\ . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE]'' \{\ . 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]'' \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$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]'' \{\ . 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]'' \{\ . 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 r#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]'' \{\ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . \} . el \{\ . ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] . \} . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE]'' \{\ . 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 r#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 . ds $DOC_TITLE \\$1 .END \# .MAC TITLE END \"Document title . ds $TITLE \\$1 .END \# \# .MAC SUBTITLE END \"Document sub-title . ds $SUBTITLE \\$1 .END \# \# .MAC CHAPTER END \"If document is a chapter, the chapter number . ds $CHAPTER \\$1 .END \# \# .MAC CHAPTER_TITLE END \" This defines what comes after Chapter # . ds $CHAPTER_TITLE \\$1 .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. . nr #AUTHOR_NUM -1 1 . while \\n[#NUM_ARGS]>\\n[#AUTHOR_NUM] \{\ . ds $AUTHOR_\\n+[#AUTHOR_NUM] \\$\\n[#AUTHOR_NUM] .\} . nr #NUM_AUTHORS \\n[#NUM_ARGS]%2 \"Use mod 2 to test if odd or even # of authors . ie \\n[#NUM_AUTHORS]=1 \{ .nr #AUTHOR_LINES 0 \} . el \{ .nr #AUTHOR_LINES 1 \} .END \# \# .MAC COPYRIGHT END \"For use on cover page only . ds $COPYRIGHT \[co]\\$1 .END \# \# .MAC MISC END \"For use on cover page only; enclose all args in double quotes . nr #MISC_NUM -1 1 . while \\n[#NUM_ARGS]>\\n[#MISC_NUM] \{\ . ds $MISC_\\n+[#MISC_NUM] \\$\\n[#MISC_NUM] .\} . nr #NUM_MISCS \\n[#NUM_ARGS] .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 . PT_SIZE 12 . LS 13.5 . 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 . br . nr #CLOSING 1 . di CLOSING . LEFT .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 \# ------------------------- \# .ig 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_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_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'HEAD_FAMILY' .ds $HEAD_FAM \\$1 . if '\\$0'PAGENUM_FAMILY' .ds $PAGE_NUM_FAM \\$1 . if '\\$0'PARAHEAD_FAMILY' .ds $PH_FAM \\$1 . if '\\$0'QUOTE_FAMILY' .ds $QUOTE_FAM \\$1 . if '\\$0'SUBHEAD_FAMILY' .ds $SH_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_HEAD_FAMILY' .ds $TOC_HEAD_FAM \\$1 . if '\\$0'TOC_PARAHEAD_FAMILY' .ds $TOC_PH_FAM \\$1 . if '\\$0'TOC_PN_FAMILY' .ds $TOC_PN_FAM \\$1 . if '\\$0'TOC_SUBHEAD_FAMILY' .ds $TOC_SH_FAM \\$1 . if '\\$0'TOC_TITLE_FAMILY' .ds $TOC_TITLE_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_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_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'HEAD_FONT' .ds $HEAD_FT \\$1 . if '\\$0'PAGENUM_FONT' .ds $PAGE_NUM_FT \\$1 . if '\\$0'PARAHEAD_FONT' .ds $PH_FT \\$1 . if '\\$0'QUOTE_FONT' .ds $QUOTE_FT \\$1 . if '\\$0'SUBHEAD_FONT' .ds $SH_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_HEAD_FONT' .ds $TOC_HEAD_FT \\$1 . if '\\$0'TOC_PARAHEAD_FONT' .ds $TOC_PH_FT \\$1 . if '\\$0'TOC_PN_FONT' .ds $TOC_PN_FT \\$1 . if '\\$0'TOC_SUBHEAD_FONT' .ds $TOC_SH_FT \\$1 . if '\\$0'TOC_TITLE_FONT' .ds $TOC_TITLE_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_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_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'HEAD_SIZE' .ds $HEAD_SIZE_CHANGE \\$1 . if '\\$0'PAGENUM_SIZE' .ds $PAGE_NUM_SIZE_CHANGE \\$1 . if '\\$0'PARAHEAD_SIZE' .ds $PH_SIZE_CHANGE \\$1 . if '\\$0'QUOTE_SIZE' .ds $QUOTE_SIZE_CHANGE \\$1 . if '\\$0'SUBHEAD_SIZE' .ds $SH_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_HEAD_SIZE' .ds $TOC_HEAD_SIZE_CHANGE \\$1 . if '\\$0'TOC_PARAHEAD_SIZE' .ds $TOC_PH_SIZE_CHANGE \\$1 . if '\\$0'TOC_PN_SIZE' .ds $TOC_PN_SIZE_CHANGE \\$1 . if '\\$0'TOC_SUBHEAD_SIZE' .ds $TOC_SH_SIZE_CHANGE \\$1 . if '\\$0'TOC_TITLE_SIZE' .ds $TOC_TITLE_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'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'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'HEAD_COLOR' \{\ . nr #HEAD_COLOR 1 . ds $HEAD_COLOR \\$1 . \} . if '\\$0'LINEBREAK_COLOR' \{\ . nr #LINEBREAK_COLOR 1 . ds $LINEBREAK_COLOR \\$1 . \} . if '\\$0'PAGENUM_COLOR' \{\ . nr #PAGE_NUM_COLOR 1 . ds $PAGENUM_COLOR \\$1 . \} . if '\\$0'PARAHEAD_COLOR' \{\ . nr #PH_COLOR 1 . ds $PH_COLOR \\$1 . \} . if '\\$0'QUOTE_COLOR' \{\ . nr #QUOTE_COLOR 1 . ds $QUOTE_COLOR \\$1 . \} . if '\\$0'SUBHEAD_COLOR' \{\ . nr #SH_COLOR 1 . ds $SH_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 Fatal error: \\$0 must be set to either L or J . if '\\*[$BIB_QUAD]'C' .ab Fatal error: \\$0 must be set to either L or J . \} . 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'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_QUAD' \{\ . ds $DOC_QUAD \\$1 . QUAD \\*[$DOC_QUAD] . \} . if '\\$0'ENDNOTE_QUAD' \{\ . ds $EN_QUAD \\$1 . if '\\*[$EN_QUAD]'R' .ab Fatal error: \\$0 must be set to either L or J . if '\\*[$EN_QUAD]'C' .ab Fatal error: \\$0 must be set to either L or J . \} . 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'HEAD_QUAD' .ds $HEAD_QUAD \\$1 . if '\\$0'SUBHEAD_QUAD' .ds $SH_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 \\n[#FOOTERS_ON] \{\ . HEADERS OFF . if \\n[#PAGE_NUM_POS_SET]=0 \{ .PAGENUM_POS TOP CENTER \} . \} . if !r#HEADER_MARGIN \{ .HEADER_MARGIN 4P+6p \} . if !r#HEADER_GAP \{ .HEADER_GAP 3P \} . if \\n[#FOOTERS_ON] \{\ . if \\n[#PAGINATE]=0 \{\ . if !r#T_MARGIN \{ .T_MARGIN 6P \} . \} . \} . if \\n[#HEADERS_ON]=0 \{\ . if \\n[#FOOTERS_ON]=0 \{\ . 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 " type in .FOOTER_MARGIN 0 before .START . \} . if !r#HDRFTR_RULE_GAP \{\ . if \\n[#HEADERS_ON] \{ .HDRFTR_RULE_GAP 4p \} . if \\n[#FOOTERS_ON] \{ .HDRFTR_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] . nr #DOC_LEAD \\n[#LEAD] .\" #SAVED_DOC_LEAD is set in COLLATE . if r#SAVED_DOC_LEAD \{\ . 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] . 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 . RESET_HEAD_NUMBER . RESET_SUBHEAD_NUMBER . RESET_PARAHEAD_NUMBER .\" 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 !d$HEAD_QUAD \{ .HEAD_QUAD CENTER \} . if !r#HEAD_CAPS \{ .HEAD_CAPS \} . if !r#HEAD_UNDERLINE \{ .HEAD_UNDERLINE \} . if !d$SH_QUAD \{ .SUBHEAD_QUAD LEFT \} . 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_MARKER_STYLE] \{ .FOOTNOTE_MARKER_STYLE STAR \} . if !\\n[#EN_MARKER_STYLE] \{ .ENDNOTE_MARKER_STYLE NUMBER \} . 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_UNDERSCORE \{ .ENDNOTE_STRING_UNDERSCORE 2 \} . if !r#EN_STRING_CAPS \{ .ENDNOTE_STRING_CAPS \} . if !d$EN_TITLE \{\ . ie \\n[#DOC_TYPE]=2 \{\ . 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_UNDERSCORE \{ .ENDNOTE_TITLE_UNDERSCORE \} . if !d$EN_NUMBER_FAM \{ .ENDNOTE_NUMBER_FAMILY \\*[$EN_FAM] \} . if !r#EN_NUMBERS_ALIGN_LEFT \{\ . if !r#EN_NUMBERS_ALIGN_RIGHT \{ .ENDNOTE_NUMBERS_ALIGN_RIGHT 2 \} . \} . if !d$EN_LN_GAP \{ .ENDNOTE_LINENUMBER_GAP 1.5n \} . 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_UNDERSCORE \{ .BIBLIOGRAPHY_STRING_UNDERSCORE 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 \} . if !r#TOC_TITLE_INDENT \{ .TOC_TITLE_INDENT 0 \} . if !r#TOC_HEAD_INDENT \{ .TOC_HEAD_INDENT 18p \} . if !r#TOC_SH_INDENT \{ .TOC_SUBHEAD_INDENT 30p \} . if !r#TOC_PH_INDENT \{ .TOC_PARAHEAD_INDENT 42p \} .\" 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] . rr #USER_DEF_HDRFTR_LEFT . if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE] . rr #USER_DEF_HDRFTR_RIGHT . \} . el \{\ . if \\n[#COPY_STYLE]=1 \{ .DRAFT_WITH_PAGENUMBER \} . if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . rr #USER_DEF_HDRFTR_LEFT . if \\n[#USER_DEF_HDRFTR_CENTER]=0 .ds $HDRFTR_CENTER \\*[$TITLE] . rr #USER_DEF_HDRFTR_CENTER . if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$DOC_TITLE] . rr #USER_DEF_HDRFTR_RIGHT . \} . \} . el \{\ . if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . rr #USER_DEF_HDRFTR_LEFT . if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE] . rr #USER_DEF_HDRFTR_RIGHT . \} . if !d$ATTRIBUTE_STRING \{ .ATTRIBUTE_STRING "by" \} . if !d$FINIS_STRING \{ .FINIS_STRING "END" \} .\" 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 \} .\" Defaults for printstyle TYPEWRITE . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#UNDERLINE_QUOTES]=1 \{ .UNDERLINE_QUOTES \} . if \\n[#UNDERLINE_QUOTES]=0 \{ .UNDERLINE_QUOTES OFF \} .\" +Quotes and blockquotes . if !r#Q_OFFSET_VALUE \{ .QUOTE_INDENT 2 \} .\" +Epigraphs . if !r#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 \} .\" +Paragraph heads . if !r#PH_INDENT \{ .PARAHEAD_INDENT \\n[#PP_INDENT]u/2u \} .\" +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 \{\ . ie !'\\*[$CHAPTER_TITLE]'' \{\ . ie !'\\*[$CHAPTER_STRING]'' \{\ . DOCHEADER_LEAD +4 . \} . el \{ .DOCHEADER_LEAD +0 \} . \} . el \{ .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 \} .\" +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 \} .\" +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 \} .\" +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 \} .\" +Heads . if !d$HEAD_FAM \{ .HEAD_FAMILY \\*[$DOC_FAM] \} . if !d$HEAD_FT \{ .HEAD_FONT B \} . if !d$HEAD_SIZE_CHANGE \{ .HEAD_SIZE +1 \} . if !r#HEAD_SPACE \{ .HEAD_SPACE \} .\" +Subheads . if !d$SH_FAM \{ .SUBHEAD_FAMILY \\*[$DOC_FAM] \} . if !d$SH_FT \{ .SUBHEAD_FONT B \} . if !d$SH_SIZE_CHANGE \{ .SUBHEAD_SIZE +.5 \} .\" +Paragraph heads . if !d$PH_FAM \{ .PARAHEAD_FAMILY \\*[$DOC_FAM] \} . if !d$PH_FT \{ .PARAHEAD_FONT BI \} . if !d$PH_SIZE_CHANGE \{ .PARAHEAD_SIZE -.25 \} . if !r#PH_INDENT \{ .PARAHEAD_INDENT \\n[#PP_INDENT]u/2u \} .\" +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 \{ .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 !r#EPI_OFFSET_VALUE \{ .EPIGRAPH_INDENT 3 \} .\" +Linebreaks . if !d$LINEBREAK_CHAR \{ .LINEBREAK_CHAR * 3 3p \} .\" +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_NUMBER_SIZE_CHANGE \{ .ENDNOTE_NUMBER_SIZE +0 \} . if !r#EN_PP_INDENT \{ .ENDNOTE_PARA_INDENT 1.5m \} .\" +Bibliography . if !r#BIB_LIST \{ .BIBLIOGRAPHY_TYPE LIST . \} . 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 !r#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_TITLE_FAM \{ .TOC_TITLE_FAMILY \\*[$TOC_FAM] \} . if !d$TOC_PN_FAM \{ .TOC_PN_FAMILY \\*[$TOC_FAM] \} . if !d$TOC_HEAD_FAM \{ .TOC_HEAD_FAMILY \\*[$TOC_FAM] \} . if !d$TOC_SH_FAM \{ .TOC_SUBHEAD_FAMILY \\*[$TOC_FAM] \} . if !d$TOC_PH_FAM \{ .TOC_PARAHEAD_FAMILY \\*[$TOC_FAM] \} . if !d$TOC_TITLE_FT \{ .TOC_TITLE_FONT BI \} . if !d$TOC_PN_FT \{ .TOC_PN_FONT R \} . if !d$TOC_HEAD_FT \{ .TOC_HEAD_FONT B \} . if !d$TOC_SH_FT \{ .TOC_SUBHEAD_FONT R \} . if !d$TOC_PH_FT \{ .TOC_PARAHEAD_FONT I \} . if !d$TOC_TITLE_SIZE_CHANGE \{ .TOC_TITLE_SIZE +.5 \} . if !d$TOC_PN_SIZE_CHANGE \{ .TOC_PN_SIZE +0 \} . if !d$TOC_HEAD_SIZE_CHANGE \{ .TOC_HEAD_SIZE +.5 \} . if !d$TOC_SH_SIZE_CHANGE \{ .TOC_SUBHEAD_SIZE +0 \} . if !d$TOC_PH_SIZE_CHANGE \{ .TOC_PARAHEAD_SIZE +0 \} . \} .\" +Refer support . if !r#ENDNOTE_REFS \{ .nr #FN_REFS 1 \} . if '\\*[$REF_FN_INDENT]'' \{\ . if \\n[#PRINT_STYLE]=1 \{ .INDENT_REFS FOOTNOTE 2m \} . if \\n[#PRINT_STYLE]=2 \{ .INDENT_REFS FOOTNOTE 1.5m \} . \} . if '\\*[$REF_EN_INDENT]'' \{\ . if \\n[#PRINT_STYLE]=1 \{ .INDENT_REFS ENDNOTE 2m \} . if \\n[#PRINT_STYLE]=2 \{ .INDENT_REFS ENDNOTE 1.5m \} . \} . if '\\*[$REF_BIB_INDENT]'' \{\ . if \\n[#PRINT_STYLE]=1 \{ .INDENT_REFS BIBLIO 2m \} . if \\n[#PRINT_STYLE]=2 \{ .INDENT_REFS BIBLIO 1.5m :\} . \} .\" Adjust doc leading for PRINTSTYLE TYPESET . if \\n[#PRINT_STYLE]=2 \{\ . ie \\n[#ADJ_DOC_LEAD]=1 \{ .DOC_LEAD_ADJUST \} . el \{ . \} . \} .\" This diversion is to get a value for #FN_AUTOLEAD . di NULL . ev NULL . if \\n[#PRINT_STYLE]=1 \{\ . ps 12 . ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#ORIGINAL_DOC_LEAD]u \} . el \{ .vs \\n[#ORIGINAL_DOC_LEAD]u/2u \} . \} . if \\n[#PRINT_STYLE]=2 \{\ . PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$FN_SIZE_CHANGE] . AUTOLEAD \\n[#FN_AUTOLEAD] . \} . nr #FN_LEAD \\n[#LEAD] . if \\n[#PRINT_STYLE]=2 \{ .LS \\n[#DOC_LEAD]u \} . ev . di . ie !\\n[#COLLATE] \{\ .\" DOC_LEAD adjusted (or not) here . TRAPS . rr #DOC_LEAD_ADJUST_OFF .\" 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 14 ADJUST \} . el \{ .ENDNOTE_LEAD \\*[$EN_LEAD] \\*[$ADJUST_EN_LEAD] \} . ie !d$BIB_LEAD \{ .BIBLIOGRAPHY_LEAD 14 ADJUST \} . el \{ .BIBLIOGRAPHY_LEAD \\*[$BIB_LEAD] \\*[$ADJUST_BIB_LEAD] \} . ie !d$TOC_LEAD \{ .TOC_LEAD \\n[#RESTORE_DOC_LEAD]u \} . el \{ .TOC_LEAD \\*[$TOC_LEAD] \\*[$ADJUST_TOC_LEAD] \} . rm $ADJUST_EN_LEAD . rm $ADJUST_BIB_LEAD . rm $ADJUST_TOC_LEAD . \} . ie !d$BIB_SPACE \{ .BIBLIOGRAPHY_SPACING 1v \} . el \{\ . if \\n[#DEFER_BIB_SPACING]=1 \{\ . BIBLIOGRAPHY_SPACING \\*[$BIB_SPACE] . rr #DEFER_BIB_SPACING . \} . \} . 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 \} . \} . \} . \} . if \\n[#PRINT_STYLE]=1 \{ .nr #IGNORE 1 \} .END \# \# ==================================================================== \# \# +++START THE DOCUMENT+++ \# \# THE START MACRO \# --------------- \# *Arguments: \# \# *Function: \# Reads in default document style parameters and any parameter \# 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_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_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 PRINT_AUTHORS END . nr #AUTHORS \\n[#AUTHOR_NUM] . nr #NEXT_AUTHOR 0 1 . ie r#DOING_COVER \{\ . if \\n[#COVER]=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]] \} .\} . \} . if \\n[#DOC_COVER]=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]] \} .\} . \} . \} . el \{\ . 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 . CENTER . FAMILY \\*[$TITLE_FAM] . FT \\*[$TITLE_FT] . PT_SIZE \\*[$TITLE_PT_SIZE] . LS \\n[#DOCHEADER_LEAD]u . ie \\n[#TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$TITLE_COLOR]]\\*[$TITLE]\m[] . \} . el \{ .PRINT \\*[$TITLE] \} . if !'\\*[$SUBTITLE]'' \{\ . FAMILY \\*[$SUBTITLE_FAM] . FT \\*[$SUBTITLE_FT] . PT_SIZE \\*[$SUBTITLE_PT_SIZE] . ie \\n[#SUBTITLE_COLOR]=1 \{\ . PRINT \m[\\*[$SUBTITLE_COLOR]]\\*[$TITLE]\m[] . \} . el \{ .PRINT \\*[$SUBTITLE] \} . \} . if !'\\*[$AUTHOR_1]'' \{\ . FAMILY \\*[$AUTHOR_FAM] . FT \\*[$AUTHOR_FT] . PT_SIZE \\*[$AUTHOR_PT_SIZE] . if !'\\*[$ATTRIBUTE_STRING]'' \{\ . ie \\n[#ATTRIBUTE_COLOR]=1 \{\ . PRINT \m[\\*[$ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] . \} . el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} . \} . PRINT_AUTHORS . \} .END \# \# .MAC CHAPTER_DOCHEADER END . CENTER . FAMILY \\*[$TITLE_FAM] . FT \\*[$TITLE_FT] . PT_SIZE \\*[$TITLE_PT_SIZE] . LS \\n[#DOCHEADER_LEAD]u .\" Chapter title only . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE]'' \{\ . if \\n[#PRINT_STYLE]=2 \{\ . FAMILY \\*[$CHAPTER_TITLE_FAM] . FT \\*[$CHAPTER_TITLE_FT] . PT_SIZE \\*[$CHAPTER_TITLE_PT_SIZE] . LS \\n[#DOCHEADER_LEAD]u . \} . ie \\n[#TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] . \} . el \{ .PRINT \\*[$CHAPTER_TITLE] \} . \} . 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]'' \{\ . if \\n[#PRINT_STYLE]=1 \{ .PRINT \\*[$CHAPTER_TITLE] \} . if \\n[#PRINT_STYLE]=2 \{\ . FAMILY \\*[$CHAPTER_TITLE_FAM] . FT \\*[$CHAPTER_TITLE_FT] . PT_SIZE \\*[$CHAPTER_TITLE_PT_SIZE] . LS \\n[#DOCHEADER_LEAD]u . ie \\n[#CHAPTER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$CHAPTER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] . \} . el \{ .PRINT \\*[$CHAPTER_TITLE] \} . RLD \\n[#DOC_LEAD]u \" Just looks better this way . \} . \} . \} .END \# \# .MAC NAMED_DOCHEADER END . CENTER . FAMILY \\*[$TITLE_FAM] . FT \\*[$TITLE_FT] . PT_SIZE \\*[$TITLE_PT_SIZE] . LS \\n[#DOCHEADER_LEAD]u . ie \\n[#TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$TITLE_COLOR]]\\*[$TITLE]\m[] . \} . el \{ .PRINT \\*[$TITLE] \} . if !'\\*[$SUBTITLE]'' \{\ . FAMILY \\*[$SUBTITLE_FAM] . FT \\*[$SUBTITLE_FT] . PT_SIZE \\*[$SUBTITLE_PT_SIZE] . ie \\n[#SUBTITLE_COLOR]=1 \{\ . PRINT \m[\\*[$SUBTITLE_COLOR]]\\*[$TITLE]\m[] . \} . el \{ .PRINT \\*[$SUBTITLE] \} . \} . if !'\\*[$AUTHOR_1]'' \{\ . FAMILY \\*[$AUTHOR_FAM] . FT \\*[$AUTHOR_FT] . PT_SIZE \\*[$AUTHOR_PT_SIZE] . if !'\\*[$ATTRIBUTE_STRING]'' \{\ . ie \\n[#ATTRIBUTE_COLOR]=1 \{\ . PRINT \m[\\*[$ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] . \} . el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} . \} . PRINT_AUTHORS . \} . FAMILY \\*[$DOCTYPE_FAM] . FT \\*[$DOCTYPE_FT] . PT_SIZE \\*[$DOCTYPE_PT_SIZE] . LS \\n[#DOCHEADER_LEAD]u . ALD \\n[#DOCHEADER_LEAD]u . ie \\n[#DOCTYPE_COLOR]=1 \{\ . COLOR \\*[$DOCTYPE_COLOR] . UNDERSCORE "\\*[$DOC_TYPE] . \} . el .UNDERSCORE "\\*[$DOC_TYPE] .END \# \# \# COVER PAGE \# ---------- \# *Arguments: \# TITLE | DOCTITLE | CHAPTER | CHAPTER_TITLE | CHAPTER+TITLE | COVERTITLE ... \# ... [ SUBTITLE AUTHOR DOCTYPE COPYRIGHT MISC ] \# *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; however, the arguments must appear \# in the order given above. \# \# 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 . if '\\$1'TITLE' \{ .nr #DOC_COVER_TITLE 1 \} . if '\\$1'DOCTITLE' \{ .nr #DOC_COVER_TITLE 2 \} . if '\\$1'CHAPTER' \{ .nr #DOC_COVER_TITLE 3 \} . if '\\$1'CHAPTER_TITLE' \{ .nr #DOC_COVER_TITLE 4 \} . if '\\$1'CHAPTER+TITLE' \{ .nr #DOC_COVER_TITLE 5 \} . if '\\$1'COVERTITLE' \{ .nr #DOC_COVER_TITLE 6 \} . if '\\$2'SUBTITLE' \{ .nr #DOC_COVER_SUBTITLE 1 \} . if '\\$2'AUTHOR' \{ .nr #DOC_COVER_AUTHOR 1 \} . if '\\$2'DOCTYPE' \{ .nr #DOC_COVER_DOCTYPE 1 \} . if '\\$2'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} . if '\\$2'MISC' \{ .nr #DOC_COVER_MISC 1 \} . if '\\$3'AUTHOR' \{ .nr #DOC_COVER_AUTHOR 1 \} . if '\\$3'DOCTYPE' \{ .nr #DOC_COVER_DOCTYPE 1 \} . if '\\$3'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} . if '\\$3'MISC' \{ .nr #DOC_COVER_MISC 1 \} . if '\\$4'DOCTYPE' \{ .nr #DOC_COVER_DOCTYPE 1 \} . if '\\$4'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} . if '\\$4'MISC' \{ .nr #DOC_COVER_MISC 1 \} . if '\\$5'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} . if '\\$5'MISC' \{ .nr #DOC_COVER_MISC 1 \} . if '\\$6'MISC' \{ .nr #DOC_COVER_MISC 1 \} . \} . el \{\ . nr #COVER 1 . if '\\$1'TITLE' \{ .nr #COVER_TITLE 1 \} . if '\\$1'DOCTITLE' \{ .nr #COVER_TITLE 2 \} . if '\\$1'CHAPTER' \{ .nr #COVER_TITLE 3 \} . if '\\$1'CHAPTER_TITLE' \{ .nr #COVER_TITLE 4 \} . if '\\$1'CHAPTER+TITLE' \{ .nr #COVER_TITLE 5 \} . if '\\$1'COVERTITLE' \{ .nr #COVER_TITLE 6 \} . if '\\$2'SUBTITLE' \{ .nr #COVER_SUBTITLE 1 \} . if '\\$2'AUTHOR' \{ .nr #COVER_AUTHOR 1 \} . if '\\$2'DOCTYPE' \{ .nr #COVER_DOCTYPE 1 \} . if '\\$2'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} . if '\\$2'MISC' \{ .nr #COVER_MISC 1 \} . if '\\$3'AUTHOR' \{ .nr #COVER_AUTHOR 1 \} . if '\\$3'DOCTYPE' \{ .nr #COVER_DOCTYPE 1 \} . if '\\$3'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} . if '\\$3'MISC' \{ .nr #COVER_MISC 1 \} . if '\\$4'DOCTYPE' \{ .nr #COVER_DOCTYPE 1 \} . if '\\$4'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} . if '\\$4'MISC' \{ .nr #COVER_MISC 1 \} . if '\\$5'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} . if '\\$5'MISC' \{ .nr #COVER_MISC 1 \} . if '\\$6'MISC' \{ .nr #COVER_MISC 1 \} . \} .END \# \# .MAC COVERTITLE END . ie '\\$0'DOC_COVERTITLE' .ds $DOC_COVER_TITLE \\$1 . el .ds $COVER_TITLE \\$1 .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 \# \# \# 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 \# \# \# 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 \# \# .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 . \} .\" Doc cover . ie '\\$0'DO_DOC_COVER' \{\ . 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 \{\ . LS \\n[#DOC_LEAD]u\\*[$DOC_COVER_LEAD_ADJ] . nr #DOC_COVER_LEAD \\n[#LEAD] . \} . PRINT \& . sp |\\n[#DOC_COVER_START_POS]u-1v . if \\n[#DOC_COVER_COLOR]=1 \{\ . nf \m[\\*[$DOC_COVER_COLOR]] . EOL . \} . CENTER . FAMILY \\*[$DOC_COVER_TITLE_FAM] . FT \\*[$DOC_COVER_TITLE_FT] . PT_SIZE \\*[$DOC_COVER_TITLE_PT_SIZE] . LS \\n[#DOC_COVER_LEAD]u . if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} . if \\n[#DOC_COVER_TITLE]=1 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . UNDERSCORE "\\*[$TITLE]" . CAPS OFF . \} . el \{\ . ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$TITLE]\m[] . \} . el \{ .PRINT \\*[$TITLE] \} . \} . \} . if \\n[#DOC_COVER_TITLE]=2 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . UNDERSCORE "\\*[$DOC_TITLE]" . CAPS OFF . \} . el \{\ . ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$DOC_TITLE]\m[] . \} . el \{ .PRINT \\*[$DOC_TITLE] \} . \} . \} . 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] \} . \} . \} . if \\n[#DOC_COVER_TITLE]=4 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . UNDERSCORE "\\*[$CHAPTER_TITLE]" . CAPS OFF . \} . el \{\ . ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] . \} . el \{ .PRINT \\*[$CHAPTER_TITLE] \} . \} . \} . 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]'' \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . UNDERSCORE "\\*[$CHAPTER_TITLE]" . \} . el \{\ . FAMILY \\*[$DOC_COVER_CHAPTER_TITLE_FAM] . FT \\*[$DOC_COVER_CHAPTER_TITLE_FT] . PT_SIZE \\*[$DOC_COVER_CHAPTER_TITLE_PT_SIZE] . ie \\n[#DOC_COVER_CHAPTER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$DOC_COVER_CHAPTER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] . \} . el \{ .PRINT \\*[$CHAPTER_TITLE] \} . \} . \} . \} . if \\n[#DOC_COVER_TITLE]=6 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . UNDERSCORE "\\*[$DOC_COVER_TITLE]" . CAPS OFF . \} . el \{\ . ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$DOC_COVER_TITLE]\m[] . \} . el \{ .PRINT \\*[$DOC_COVER_TITLE] \} . \} . \} . if \\n[#DOC_COVER_SUBTITLE]=1 \{\ . FAMILY \\*[$DOC_COVER_SUBTITLE_FAM] . FT \\*[$DOC_COVER_SUBTITLE_FT] . PT_SIZE \\*[$DOC_COVER_SUBTITLE_PT_SIZE] . if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} . ie \\n[#DOC_COVER_SUBTITLE_COLOR]=1 \{\ . PRINT \m[\\*[$DOC_COVER_SUBTITLE_COLOR]]\\*[$SUBTITLE]\m[] . \} . el \{ .PRINT \\*[$SUBTITLE] \} . \} . if \\n[#PRINT_STYLE]=1 \{\ . if !r#DOC_COVER_SUBTITLE \{ .SP \} . \} . if \\n[#DOC_COVER_AUTHOR]=1 \{\ . FAMILY \\*[$DOC_COVER_AUTHOR_FAM] . FT \\*[$DOC_COVER_AUTHOR_FT] . PT_SIZE \\*[$DOC_COVER_AUTHOR_PT_SIZE] . if \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . vs \\n[#DOC_LEAD]u/2u . \} . if !'\\*[$ATTRIBUTE_STRING]'' \{\ . ie \\n[#DOC_COVER_ATTRIBUTE_COLOR]=1 \{\ . PRINT \m[\\*[$DOC_COVER_ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] . \} . el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} . \} . PRINT_AUTHORS . \} . FAMILY \\*[$DOC_COVER_DOCTYPE_FAM] . FT \\*[$DOC_COVER_DOCTYPE_FT] . PT_SIZE \\*[$DOC_COVER_DOCTYPE_PT_SIZE] . SP . if \\n[#DOC_COVER_DOCTYPE]=1 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . vs \\n[#DOC_LEAD]u . UNDERSCORE2 "\\*[$DOC_TYPE] . \} . el \{\ . ie \\n[#DOC_COVER_DOCTYPE_COLOR]=1 \{\ . COLOR \\*[$DOC_COVER_DOCTYPE_COLOR] . UNDERSCORE "\\*[$DOC_TYPE] . \} . el .UNDERSCORE "\\*[$DOC_TYPE] . \} . \} . sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u . ie \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u \} . el \{ .vs \\n[#DOC_LEAD]u/2u \} . \} . el \{\ . FAMILY \\*[$DOC_COVER_COPYRIGHT_FAM] . FT \\*[$DOC_COVER_COPYRIGHT_FT] . AUTOLEAD 2 . PT_SIZE \\*[$DOC_COVER_COPYRIGHT_PT_SIZE] . \} . if \\n[#DOC_COVER_COPYRIGHT]=1 \{\ . QUAD \\*[$DOC_COVER_COPYRIGHT_QUAD] . ie \\n[#DOC_COVER_COPYRIGHT_COLOR]=1 \{\ . PRINT \m[\\*[$DOC_COVER_COPYRIGHT_COLOR]]\\*[$COPYRIGHT]\m[] . \} . el \{ .PRINT \\*[$COPYRIGHT] \} . \} . sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u . if \\n[#DOC_COVER_MISC]=1 \{\ . QUAD \\*[$DOC_COVER_MISC_QUAD] . nr #MISCS \\n[#MISC_NUM] . sp -\\n[#MISCS]+1 . nr #NEXT_MISC 0 1 . while \\n[#MISCS]>\\n[#NEXT_MISC] \{\ . ie \\n[#DOC_COVER_MISC_COLOR]=1 \{\ . PRINT \m[\\*[$DOC_COVER_MISC_COLOR]]\\*[$MISC_\\n+[#NEXT_MISC]]\m[] . br . \} . el \{\ . PRINT \\*[$MISC_\\n+[#NEXT_MISC]] . br . \} .\} . \} . \} .\" Cover . el \{\ . if !r#COVER_START_POS \{\ . nr #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 \{\ . LS \\n[#DOC_LEAD]u\\*[$COVER_LEAD_ADJ] . nr #COVER_LEAD \\n[#LEAD] . \} . PRINT \& . sp |\\n[#COVER_START_POS]u-1v . if \\n[#COVER_COLOR]=1 \{\ . nf \m[\\*[$COVER_COLOR]] . EOL . \} . CENTER . FAMILY \\*[$COVER_TITLE_FAM] . FT \\*[$COVER_TITLE_FT] . PT_SIZE \\*[$COVER_TITLE_PT_SIZE] . LS \\n[#COVER_LEAD]u . if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} . if \\n[#COVER_TITLE]=1 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . UNDERSCORE "\\*[$TITLE]" . CAPS OFF . \} . el \{\ . ie \\n[#COVER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$TITLE]\m[] . \} . el \{ .PRINT \\*[$TITLE] \} . \} . \} . if \\n[#COVER_TITLE]=2 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . UNDERSCORE "\\*[$DOC_TITLE]" . CAPS OFF . \} . el \{\ . ie \\n[#COVER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$DOC_TITLE]\m[] . \} . el \{ .PRINT \\*[$DOC_TITLE] \} . \} . \} . if \\n[#COVER_TITLE]=3 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] . CAPS OFF . \} . el \{\ . ie \\n[#COVER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] . \} . el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} . \} . \} . if \\n[#COVER_TITLE]=4 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . UNDERSCORE "\\*[$CHAPTER_TITLE]" . CAPS OFF . \} . el \{\ . ie \\n[#COVER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] . \} . el \{ .PRINT \\*[$CHAPTER_TITLE] \} . \} . \} . if \\n[#COVER_TITLE]=5 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] . CAPS OFF . \} . el \{\ . ie \\n[#COVER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] . \} . el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} . \} . if !'\\*[$CHAPTER_TITLE]'' \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . UNDERSCORE "\\*[$CHAPTER_TITLE]" . \} . el \{\ . FAMILY \\*[$COVER_CHAPTER_TITLE_FAM] . FT \\*[$COVER_CHAPTER_TITLE_FT] . PT_SIZE \\*[$COVER_CHAPTER_TITLE_PT_SIZE] . ie \\n[#COVER_CHAPTER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_CHAPTER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] . \} . el \{ .PRINT \\*[$CHAPTER_TITLE] \} . \} . \} . \} . if \\n[#COVER_TITLE]=6 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . UNDERSCORE "\\*[$COVER_TITLE]" . CAPS OFF . \} . el \{\ . ie \\n[#COVER_TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$COVER_TITLE]\m[] . \} . el \{ .PRINT \\*[$COVER_TITLE] \} . \} . \} . if \\n[#COVER_SUBTITLE]=1 \{\ . FAMILY \\*[$COVER_SUBTITLE_FAM] . FT \\*[$COVER_SUBTITLE_FT] . PT_SIZE \\*[$COVER_SUBTITLE_PT_SIZE] . if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} . ie \\n[#COVER_SUBTITLE_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_SUBTITLE_COLOR]]\\*[$SUBTITLE]\m[] . \} . el \{ .PRINT \\*[$SUBTITLE] \} . \} . if \\n[#PRINT_STYLE]=1 \{\ . if !r#COVER_SUBTITLE \{ .SP \} . \} . if \\n[#COVER_AUTHOR]=1 \{\ . FAMILY \\*[$COVER_AUTHOR_FAM] . FT \\*[$COVER_AUTHOR_FT] . PT_SIZE \\*[$COVER_AUTHOR_PT_SIZE] . if \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . vs \\n[#DOC_LEAD]u/2u . \} . if !'\\*[$ATTRIBUTE_STRING]'' \{\ . ie \\n[#COVER_ATTRIBUTE_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] . \} . el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} . \} . PRINT_AUTHORS . \} . FAMILY \\*[$COVER_DOCTYPE_FAM] . FT \\*[$COVER_DOCTYPE_FT] . PT_SIZE \\*[$COVER_DOCTYPE_PT_SIZE] . SP . if \\n[#COVER_DOCTYPE]=1 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . vs \\n[#DOC_LEAD]u . UNDERSCORE2 "\\*[$DOC_TYPE] . \} . el \{\ . ie \\n[#COVER_DOCTYPE_COLOR]=1 \{\ . COLOR \\*[$COVER_DOCTYPE_COLOR] . UNDERSCORE "\\*[$DOC_TYPE] . \} . el .UNDERSCORE "\\*[$DOC_TYPE] . \} . \} . sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u . ie \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u \} . el \{ .vs \\n[#DOC_LEAD]u/2u \} . \} . el \{\ . FAMILY \\*[$COVER_COPYRIGHT_FAM] . FT \\*[$COVER_COPYRIGHT_FT] . AUTOLEAD 2 . PT_SIZE \\*[$COVER_COPYRIGHT_PT_SIZE] . \} . if \\n[#COVER_COPYRIGHT]=1 \{\ . QUAD \\*[$COVER_COPYRIGHT_QUAD] . ie \\n[#COVER_COPYRIGHT_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_COPYRIGHT_COLOR]]\\*[$COPYRIGHT]\m[] . \} . el \{ .PRINT \\*[$COPYRIGHT] \} . \} . sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u . if \\n[#COVER_MISC]=1 \{\ . QUAD \\*[$COVER_MISC_QUAD] . nr #MISCS \\n[#MISC_NUM] . sp -\\n[#MISCS]+1 . nr #NEXT_MISC 0 1 . while \\n[#MISCS]>\\n[#NEXT_MISC] \{\ . ie \\n[#COVER_MISC_COLOR]=1 \{\ . PRINT \m[\\*[$COVER_MISC_COLOR]]\\*[$MISC_\\n+[#NEXT_MISC]]\m[] . br . \} . el \{\ . PRINT \\*[$MISC_\\n+[#NEXT_MISC]] . br . \} .\} . \} . \} . EOL . TRAP . NEWPAGE . 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 .END \# \# .MAC START END . if !\\n[#PRINT_STYLE] \{\ . PRINTSTYLE TYPEWRITE . PRINT \& . po 6P . ll 39P . ta \\n(.lu . sp |1i-1v . CENTER . PRINT "You neglected to enter a PRINTSTYLE" . fl . ab PRINTSTYLE missing . \} . nr #DOCS 1 . if \\n[#LINENUMBERS]=1 \{\ . 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] \} . sp |\\n[#HEADER_MARGIN]u . PRINT \& . if !'\\*[$RESTORE_PAGENUM_STYLE]'' \{\ . PAGENUM_STYLE \\*[$RESTORE_PAGENUM_STYLE] . rm $RESTORE_PAGENUM_STYLE . \} . \} . DEFAULTS .\" Quote and blockquote default leads are the same as #DOC_LEAD, so .\" they have to be set after DEFAULTS (where DOC_LEAD is finalized) . if !r#Q_AUTOLEAD \{ .nr #Q_LEAD \\n[#DOC_LEAD] \} . if !r#BQ_AUTOLEAD \{ .nr #BQ_LEAD \\n[#DOC_LEAD] \} . if !r#EN_Q_AUTOLEAD \{ .nr #EN_Q_LEAD \\n[#EN_LEAD] \} . if !r#EN_BQ_AUTOLEAD \{ .nr #EN_BQ_LEAD \\n[#EN_LEAD] \} .\" 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 . \} . \} .\" Collate related stuff . ie \\n[#COLLATED_DOC]=1 \{\ .\" Collect TITLE for TOC. . 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 . \} . \} .\" Note the use of \!, which transparently embeds the macros used .\" in the TOC_ENTRIES diversion. The elements they control must be .\" processed literally when the diversion is output. . ev TOC_EV . da TOC_ENTRIES . if \\n[#PRINT_STYLE]=1 \{\ \!. fam C \!. ft R \!. ps 12 . \} . if \\n[#PRINT_STYLE]=2 \{\ \!. FAMILY \\*[$TOC_TITLE_FAM] \!. FT \\*[$TOC_TITLE_FT] \!. PT_SIZE \\n[#TOC_PS]u\\*[$TOC_TITLE_SIZE_CHANGE] . \} \!. TRAP OFF . ie \\n[#PRINT_STYLE]=1 \{\ \!. PAD "\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN_TYPEWRITE]" . \} . el \{\ \!. PAD "\\h'\\n[#TOC_TITLE_INDENT]u'\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN]" . \} \!. EOL \!. ST 100 L \!. ST 101 R . if \\n[#PRINT_STYLE]=2 \{\ \!. FAMILY \\*[$TOC_PN_FAM] \!. FT \\*[$TOC_PN_FT] \!. PT_SIZE \\n[#TOC_PS]u\\*[$TOC_PN_SIZE_CHANGE] . \} \!. TAB 100 \!. PRINT \\*[LEADER] \!. TN \!. TRAP \!. PRINT \\n[#TOC_ENTRY_PN] \!. TQ . di . ev . \} . el \{\ . nr #FIRST_DOC_TITLE_PN \\n%+\\n[#PAGE_NUM_ADJ] . af #FIRST_DOC_TITLE_PN \\g[#PAGENUMBER] . nr #FIRST_DOC_TOC_PN_PADDING \\n[#TOC_PN_PADDING] . \} .\" End TITLE collection . if \\n[#PRINT_PAGENUM_ON_PAGE_1] \{\ . sp |\\n[#HEADER_MARGIN]u . PRINT_PAGE_NUMBER . \} . rr #COLLATE . rr #PAGINATION_STATE .\" End collate stuff . ie \\n[#DOC_HEADER]=0 \{\ . PRINT \& . 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 \{\ . sp |\\n[#ADVANCE_FROM_TOP]u-1v . if \\n[#ADJ_DOC_LEAD]=1 \{ .SHIM \} . \} . el \{ .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 . rr #DOC_HEADER . if r#ADVANCE_FROM_TOP \{ .rr #ADVANCE_FROM_TOP \} . \} . el \{\ . if \\n[#PRINT_STYLE]=2 \{ .LS \\n[#DOC_LEAD]u\\*[$DOCHEADER_LEAD_ADJ] \} . nr #DOCHEADER_LEAD \\n[#LEAD] .\" Default . if \\n[#DOC_TYPE]=1 \{\ . PRINT \& . sp |\\n[#DOCHEADER_ADVANCE]u-1v . 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(.lu . if \\n[#PRINT_STYLE]=1 \{\ . CENTER . TYPEWRITER . ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} . el \{ .vs \\n[#DOC_LEAD]u \} . CAPS . if !'\\*[$TITLE]'' \{ .UNDERSCORE "\\*[$TITLE]\} . CAPS OFF . if !'\\*[$SUBTITLE]'' \{\ . ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} . el \{ .vs \\n[#DOC_LEAD]u \} . PRINT \\*[$SUBTITLE] . \} . if '\\*[$SUBTITLE]'' \{\ . ALD \\n[#DOC_LEAD]u . \} . ie !'\\*[$AUTHOR_1]'' \{\ . ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u \} . el \{ .vs \\n[#DOC_LEAD]u/2u \} . if !d$SUBTITLE \{\ . ie \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} . el \{ .ALD \\n[#DOC_LEAD]u*2u \} . \} . PRINT \\*[$ATTRIBUTE_STRING] . nr #AUTHORS \\n[#AUTHOR_NUM] . nr #NEXT_AUTHOR 0 1 . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] .\} . if \\n[#AUTHOR_LINES]=1 \{\ . ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u \} . el \{ .ALD \\n[#DOC_LEAD]u/2u \} . \} . \} . el \{\ . ie !d$SUBTITLE \{\ . ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u*2u \} . el \{ .RLD \\n[#DOC_LEAD]u \} . \} . el \{\ . ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u*2u \} . el \{ .ALD \\n[#DOC_LEAD]u \} . \} . \} . \} . if \\n[#PRINT_STYLE]=2 \{\ . DEFAULT_DOCHEADER . di DOCHEADER_DIVERSION \" This diversion is only . br \" necessary to find the depth of the . DEFAULT_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 . \} .\" Chapter . if \\n[#DOC_TYPE]=2 \{\ . PRINT \& . sp |\\n[#DOCHEADER_ADVANCE]u-1v . 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(.lu . if \\n[#PRINT_STYLE]=1 \{\ . CENTER . TYPEWRITER . vs \\n[#DOC_LEAD]u . ie '\\*[$CHAPTER]'' \{\ . CAPS . ie !'\\*[$CHAPTER_TITLE]'' \{\ . PRINT \\*[$CHAPTER_TITLE] . \} . el \{\ . CAPS . PRINT \\*[$CHAPTER_STRING] . \} . CAPS OFF . \} . el \{\ . CAPS . PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] . CAPS OFF . if !'\\*[$CHAPTER_TITLE]'' \{\ . if \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} . UNDERSCORE "\\*[$CHAPTER_TITLE] . \} . \} . if \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} . \} . 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 \{\ . PRINT \& . sp |\\n[#DOCHEADER_ADVANCE]u-1v . 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(.lu . if \\n[#PRINT_STYLE]=1 \{\ . CENTER . TYPEWRITER . ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} . el \{ .vs \\n[#DOC_LEAD]u \} . CAPS . if !'\\*[$TITLE]'' \{ .UNDERSCORE "\\*[$TITLE]\} . CAPS OFF . if !'\\*[$SUBTITLE]'' \{\ . ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} . el \{ .vs \\n[#DOC_LEAD]u \} . PRINT \\*[$SUBTITLE] . \} . if '\\*[$SUBTITLE]'' \{\ . ALD \\n[#DOC_LEAD]u . \} . ie !'\\*[$AUTHOR_1]'' \{\ . ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u \} . el \{ .vs \\n[#DOC_LEAD]u/2u \} . if !d$SUBTITLE \{\ . ie \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} . el \{ .ALD \\n[#DOC_LEAD]u*2u \} . \} . PRINT \\*[$ATTRIBUTE_STRING] . nr #AUTHORS \\n[#AUTHOR_NUM] . nr #NEXT_AUTHOR 0 1 . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] .\} . if \\n[#AUTHOR_LINES]=1 \{\ . ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u \} . el \{ .ALD \\n[#DOC_LEAD]u/2u \} . \} . vs \\n[#DOC_LEAD]u . \} . el \{\ . ie !d$SUBTITLE \{\ . ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u*2u \} . el \{ .RLD \\n[#DOC_LEAD]u \} . \} . el \{\ . ie \\n[#SINGLE_SPACE] \{ . \} . el \{ .RLD \\n[#DOC_LEAD]u \} . \} . \} . ie \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u*2u \} . el \{ .ALD \\n[#DOC_LEAD]u \} . UNDERSCORE2 "\\*[$DOC_TYPE] . if \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} . \} . if \\n[#PRINT_STYLE]=2 \{\ . NAMED_DOCHEADER . di DOCHEADER_DIVERSION \" This diversion is only . br \" necessary to find the depth of the . NAMED_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 . \} . if !\\n[#DOC_TYPE]=4 \{\ . if \\n[#PRINT_STYLE]=1 \{ .ALD \\n[#DOC_LEAD]u \} . nr #DOCHEADER_SPACE_ADJ \\n[#DOCHEADER_DEPTH]%\\n[#DOC_LEAD] . ie !\\n[#DOCHEADER_SPACE_ADJ]=0 \{ .nr #DOCHEADER_EXTRA_SPACE \\n[#DOC_LEAD]-\\n[#DOCHEADER_SPACE_ADJ] \} . el \{ .nr #DOCHEADER_EXTRA_SPACE 0 \} . if \\n[#PRINT_STYLE]=2 \{ .ALD (\\n[#DOC_LEAD]u*2u)+\\n[#DOCHEADER_EXTRA_SPACE]u \} . if \\n[#COLUMNS] \{\ . nr #COL_NUM 0 1 . nr #L_LENGTH_FOR_EPI \\n[#L_LENGTH] . po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n(.o . LL \\n[#COL_L_LENGTH]u . ta \\n(.lu . mk dc . \} . \} . \} . LS \\n[#DOC_LEAD]u . if \\n[#ADJ_DOC_LEAD]=1 \{ .SHIM \} . QUAD \\*[$DOC_QUAD] . CLEANUP_DEFAULTS . nr #START_FOR_FOOTERS 1 . if \\n[#COLLATED_DOC]=1 \{\ . if !\\n[MNinit_DEFERRED]=1 \{\ . MN_INIT rerun . \} . \} . if \\n[#MNinit_DEFERRED]=1 \{\ . rr #MNinit_DEFERRED . nr #START_FOR_MNinit 1 . MN_INIT \\*[$MN-arg1] \\*[$MN-arg2] \\*[$MN-arg3] \\*[$MN-arg4] \\*[$MN-arg5] \\*[$MN-arg6] \\*[$MN-arg7] \\*[$MN-arg8] \\*[$MN-arg9] . \} . nr #START_FOR_MNinit 2 . 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 .\" Family strings for docheader . rm $AUTHOR_FAM . rm $CHAPTER_TITLE_FAM . rm $DOCTYPE_FAM . rm $SUBTITLE_FAM . rm $TITLE_FAM .\" Family strings for cover . rm $COVER_AUTHOR_FAM . rm $COVER_CHAPTER_TITLE_FAM . rm $COVER_COPYRIGHT_FAM . rm $COVER_DOCTYPE_FAM . rm $COVER_LEAD_ADJ . rm $COVER_SUBTITLE_FAM . rm $COVER_TITLE_FAM .\" Family strings for doc cover . rm $DOC_COVER_AUTHOR_FAM . rm $DOC_COVER_CHAPTER_TITLE_FAM . rm $DOC_COVER_COPYRIGHT_FAM . rm $DOC_COVER_DOCTYPE_FAM . rm $DOC_COVER_LEAD_ADJ . rm $DOC_COVER_SUBTITLE_FAM . rm $DOC_COVER_TITLE_FAM .\" Quad args to copyright and misc . rm $COVER_COPYRIGHT_QUAD . rm $COVER_MISC_QUAD . rm $DOC_COVER_COPYRIGHT_QUAD . rm $DOC_COVER_MISC_QUAD .\" Miscellaneous strings . rm $TOC_TITLE_ITEM . rm $DOCHEADER_LEAD_ADJ .\" Various registers . rr #ADJ_DOC_LEAD . rr #ADVANCE_FROM_TOP . rr #AUTHOR_NUM . rr #AUTHORS . rr #COVER_LEAD . rr #DEPTH_1 . rr #DEPTH_2 . rr #DOC_COVER_LEAD . rr #DOCHEADER_ADVANCE . rr #DOCHEADER_EXTRA_SPACE . rr #DOCHEADER_LEAD . rr #DOCHEADER_SPACE_ADJ . rr #MISC_NUM . rr #MISCS . rr #NEXT_AUTHOR . rr #NEXT_MISC . rr #NUM_AUTHORS .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 argument \# in 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 . 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 string $DOC_L_LENGTH. \# *Notes: \# Affects EVERYTHING on the page. \# .MAC DOC_LINE_LENGTH END . br . nr #DOC_L_LENGTH (\\$1) . LL \\n[#DOC_L_LENGTH]u . ta \\n(.lu .END \# \# \# DOCUMENT FAMILY \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies string $DOC_FAM. \# *Notes: \# Affects everything EXCEPT headers and footers. \# .MAC DOC_FAMILY END . br . ds $DOC_FAM \\$1 . ds $FAMILY \\*[$DOC_FAM] . TITLE_FAMILY \\*[$DOC_FAM] . SUBTITLE_FAMILY \\*[$DOC_FAM] . AUTHOR_FAMILY \\*[$DOC_FAM] . DOCTYPE_FAMILY \\*[$DOC_FAM] . HEAD_FAMILY \\*[$DOC_FAM] . SUBHEAD_FAMILY \\*[$DOC_FAM] . QUOTE_FAMILY \\*[$DOC_FAM] . BLOCKQUOTE_FAMILY \\*[$DOC_FAM] . EPIGRAPH_FAMILY \\*[$DOC_FAM] . HDRFTR_FAMILY \\*[$DOC_FAM] . FOOTNOTE_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. \# .MAC DOC_PT_SIZE END . if \\n[#IGNORE] \{ .return \} . br . PT_SIZE \\$1 . nr #DOC_PT_SIZE \\n[#PT_SIZE] .END \# \# \# 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). \# .MAC DOC_LEAD END . if \\n[#IGNORE] \{ .return \} . br . vs \\$1 . nr #DOC_LEAD \\n[#LEAD] . if '\\$2'ADJUST' \{ .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 . \} . el \{\ . nr #ADJ_DOC_LEAD 0 . nr #DOC_LEAD_ADJUST_OFF 1 . \} .END \# \# \# SHIM \# ---- \# *Argument: \# None \# *Function: \# Advances to the next "legal" 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 legal baseline. \# \# First, a little convenience macro \# .MAC PROCESS_SHIM END . while \\n+[#LEGAL_BASELINE]<\\n[#CURRENT_V_POS] \{\ . .\} . nr #SHIM \\n[#LEGAL_BASELINE]-\\n[#CURRENT_V_POS] .END \# \# .MAC SHIM END . nr #LEGAL_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-[#LEGAL_BASELINE]>\\n[#CURRENT_V_POS] \{\ . .\} . nr #LEGAL_BASELINE +\\n[#DOC_LEAD] . nr #SHIM \\n[#LEGAL_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. \# .MAC ATTRIBUTE_STRING END . ds $ATTRIBUTE_STRING \\$1 .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 . nr #FINIS 1 . CAPS . ds $FINIS_STRING \\$1 . CAPS OFF .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 \# \# ==================================================================== \# \# +++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 . nr #EPI_OFFSET_VALUE \\$1 .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(.lu . CHECK_INDENT . if \\n[#COLUMNS] \{\ . ie \\n[#START] \{\ . ll \\n[#DOC_L_LENGTH]u . ta \\n(.lu . \} . el \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n(.lu . \} . \} . CENTER . if \\n[#PRINT_STYLE]=1 \{\ . fam C . ft R . if '\\*[$EPI_FT]'I' \{\ . FT I . \} . ps 12 . 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] . PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE] . if \\n[#EPI_COLOR]=1 \{\ . nf \m[\\*[$EPI_COLOR]] . EOL . \} . AUTOLEAD \\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] \{\ . ll \\n[#L_LENGTH_FOR_EPI]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . ta \\n(.lu . \} . el \{\ . ll \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . ta \\n(.lu . \} . \} . el \{\ . ll \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . ta \\n(.lu . if \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . ta \\n(.lu . \} . CHECK_INDENT . \} . if \\n[#PRINT_STYLE]=1 \{\ . fam C . ft R . if '\\*[$EPI_FT]'I' \{\ . FT I . \} . ps 12 . 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] . PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE] . if \\n[#EPI_COLOR]=1 \{\ . nf \m[\\*[$EPI_COLOR]] . EOL . \} . AUTOLEAD \\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]=2 \{\ . 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 \{\ . nr #EPI_OFFSET \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) . if \\n[#COLUMNS] \{\ . nr #EPI_OFFSET \\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) . \} . po \\n[#EPI_OFFSET]u . \} . nf . EPI_TEXT . br . ie \\n[#START] \{\ . if \\n[#PRINT_STYLE]=1 \{\ . ie \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} . el \{\ . ie \\n[#EPI_LINES]%2=1 \{ .ALD \\n[#DOC_LEAD]u \} . el \{ .ALD \\n[#DOC_LEAD]u/2u \} . \} . 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 . 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[#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[] . \} . el \{ .PRINT \v'-\\n[#EM_ADJUST]u'\(em\v'+\\n[#EM_ADJUST]u'\\*[$FINIS_STRING]\v'-\\n[#EM_ADJUST]u'\*[FU1]\(em\m[] \} . \} . ev .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) .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. Use only one of LEFT or RIGHT. \# \# 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 \"To print rule under header/over footer. . ie '\\$0'HDRFTR_RULE_INTERNAL' \{\ . ie \\n[#USERDEF_HDRFTR] \{\ . nr #CAP_HEIGHT_ADJUST \\n[#HDRFTR_HEIGHT] . ps 12 . if \\n[#HEADERS_ON] \{\ . rt \\nyu . ALD \\n[#HDRFTR_RULE_GAP]u . \} . if \\n[#FOOTERS_ON] \{\ . rt \\nyu . RLD \\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u+1p . \} . ie \\n[#HDRFTR_RULE_COLOR]=1 \{\ . PRINT \m[\\*[$HDRFTR_RULE_COLOR]]\\l'\\n[#DOC_L_LENGTH]u'\m[] . \} . el \{\ . PRINT \\l'\\n[#DOC_L_LENGTH]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] \} . \} . ps 12 . if \\n[#HEADERS_ON] \{\ . rt \\nyu . ALD \\n[#HDRFTR_RULE_GAP]u . \} . if \\n[#FOOTERS_ON] \{\ . rt \\nyu . RLD \\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u+1p . \} . ie \\n[#HDRFTR_RULE_COLOR]=1 \{\ . PRINT \m[\\*[$HDRFTR_RULE_COLOR]]\\l'\\n[#DOC_L_LENGTH]u'\m[] . \} . el \{\ . PRINT \\l'\\n[#DOC_L_LENGTH]u' . \} . br . \} . \} . el \{\ . 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: \# .ig 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 conjuction 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. Default is OFF. .. \# .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 \} . ds $USERDEF_HDRFTR_RECTO \\$2 .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 \} . ds $USERDEF_HDRFTR_VERSO \\$2 .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] \{ .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 \\nyu . 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 \\nyu . 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]] . EOL . \} . fam \\*[$HDRFTR_LEFT_FAM] . ft \\*[$HDRFTR_LEFT_FT] . ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_LEFT_SIZE_CHANGE] . vs 12 . 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 \{ .PRINT \& \} . \} . 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] . vs 12 . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #CENTER_CAP_HEIGHT \\n[#CAP_HEIGHT] . di . \} . CENTER . if \\n[#HDRFTR_CENTER_CAPS] \{ .CAPS \} . rt \\nyu . 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] . vs 12 . 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 \\nyu . 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 \{\ . FAMILY \\*[$HDRFTR_FAM] . FT R . PT_SIZE \\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 \} . PRINT \\*[$USERDEF_HDRFTR_RECTO] . 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 \} . PRINT \\*[$USERDEF_HDRFTR_VERSO] . 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 \} . PRINT \\*[$USERDEF_HDRFTR_RECTO] . 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 \} . PRINT \\*[$USERDEF_HDRFTR_RECTO] . 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 . 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] \{\ . if !\\n[#TOC_RV_SWITCH] \{\ . nr #DOC_LR_MARGIN_TMP \\n[#DOC_L_MARGIN] . DOC_LEFT_MARGIN \\n[#DOC_R_MARGIN]u . DOC_RIGHT_MARGIN \\n[#DOC_LR_MARGIN_TMP]u . SWITCH_HDRFTR_CENTER_PAD . \} . rr #TOC_RV_SWITCH . \} . 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(.lu . if \\n[#PRINT_STYLE]=1 \{\ . fam C . ft R . ps 12\\*[$HDRFTR_SIZE_CHANGE] . \} . if \\n[#PRINT_STYLE]=2 \{\ . fam \\*[$HDRFTR_FAM] . ft R . ps \\n[#DOC_PT_SIZE]u\\*[$HDRFTR_SIZE_CHANGE] . vs 12 . \} . nr #HDRFTR_PT_SIZE \\n[#PT_SIZE] . if \\n[#CAPS_ON] \{\ . nr #CAPS_WAS_ON 1 . CAPS OFF . \} . if \\n[#UNDERLINE_ON] \{\ . nr #UNDERLINE_WAS_ON 1 . UNDERLINE 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 . \} . \} . \} . ie \\n[#HEADERS_ON] \{\ . PRINT_HDRFTR . sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u . \} . el \{\ . ie \\n[#PAGE_NUM_V_POS]=1 \{\ . ie \\n[#PAGINATE] \{\ . PRINT_PAGE_NUMBER . sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u . \} . el \{ .sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u \} . \} . el \{ .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[#UNDERLINE_WAS_ON] \{\ . UNDERLINE . rr #UNDERLINE_WAS_ON . \} . if \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} . if \\n[#QUOTE] \{\ . ie \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} . el \{\ . nr #Q_OFFSET \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE]) . po \\n[#Q_OFFSET]u . \} . ALD \\n[#Q_LEAD_DIFF]u . \} . if \\n[#EPIGRAPH] \{\ . ie \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} . el \{\ . nr #EPI_OFFSET \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#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 \{ .ALD \\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u \} . \} . \} . el \{ .ns \} . 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(.lu . if \\n[#QUOTE] \{\ . po +(\\n[#PP_INDENT]u*\\n[#Q_OFFSET_VALUE]u) . \} . if \\n[#EPIGRAPH] \{\ . if \\n[#EPI_ACTIVE] \{\ . ie \\n[#EPI_FITS] \{ . \} . el \{ .nr dc -\\n[#EPI_LEAD_DIFF] \} . \} . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u+(\\n[#PP_INDENT]u*\\n[#EPI_OFFSET_VALUE]u) . \} . \} . 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 \} . \} . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#SLANT_ON] \{\ . if \\n[#UNDERLINE_SLANT] \{ .UNDERLINE \} . \} . \} . 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 .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'' \{\ . nr #FOOTERS_ON 1 . PAGE_NUM_POS TOP CENTER . \} . el \{ .nr #FOOTERS_ON 0 \} .END \# \# \# FOOTER MARGIN \# ------------- \# *Argument: \#