summaryrefslogtreecommitdiff
path: root/contrib/mom/om.tmac
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/mom/om.tmac')
-rw-r--r--contrib/mom/om.tmac8120
1 files changed, 8120 insertions, 0 deletions
diff --git a/contrib/mom/om.tmac b/contrib/mom/om.tmac
new file mode 100644
index 00000000..e8a85d87
--- /dev/null
+++ b/contrib/mom/om.tmac
@@ -0,0 +1,8120 @@
+.\" om.tmac
+.\"
+.\" Copyright (C) 2002 Free Software Foundation, Inc.
+.\" Written by Peter Schaffter (df191@ncf.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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+.\"
+.
+.
+\# 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.).
+\#
+\# "<anything>" in the description of arguments that can be passed
+\# to a macro means that any argument turns the feature off.
+\#
+\# ====================================================================
+\#
+\# TYPESETTING MACROS, STRINGS, AND ALIASES
+\# ========================================
+\#
+\# +++ALIASES+++
+\#
+.als ALIAS als \"Alias .als as ALIAS
+.als ALIASN aln \"Alias .aln (number registers) as ALIASN
+\#
+.ALIAS MAC de
+.ALIAS BR br
+.ALIAS SPACE sp
+.ALIAS SP sp
+.ALIAS PAGELENGTH pl
+.ALIAS NEWPAGE bp
+.ALIAS SPREAD brp
+.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
+\#
+\#
+\# ====================================================================
+\#
+\# END MACRO
+\# ---------
+\# *Arguments:
+\# none
+\# *Function:
+\# The .em macro executed at the end of letters. Turns footers and
+\# pagination off, terminates and outputs diversion CLOSING, indented with
+\# the author's name underneath.
+\#
+.MAC ALL_DONE END
+. br
+. FOOTERS OFF
+. PAGINATION OFF
+. if \\n[#DOC_TYPE]=4 \{\
+. br
+. if !'\\n(.z'' \{ .di \}
+. IX CLEAR
+. TQ
+. TS 1 \\n[#DOC_L_LENGTH]u/2u \\n[#DOC_L_LENGTH]u/2u LEFT
+. ALD \\n[#DOC_LEAD]u*2u
+. TAB 1
+. if \\n[#CLOSING] \{\
+. nf
+. CLOSING
+. \}
+. ALD \\n[#DOC_LEAD]u*3u
+. PRINT \\*[$AUTHOR_1]
+. \}
+.DO_FOOTER
+.END
+\#
+\#
+\# =====================================================================
+\#
+\# +++PAGE LAYOUT+++
+\#
+\# Macros that control the physical layout of the page: paper size
+\# and margins.
+\#
+\# PAGE WIDTH
+\# ----------
+\# *Argument:
+\# <width of printer sheet (ipPc)>
+\# *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:
+\# <offset from page left (ipPc)>
+\# *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:
+\# <width of right margin (ipPc)>
+\# *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:
+\# <distance to advance from top of page (ipPcv)>
+\# *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
+. br
+. nr #T_MARGIN (\\$1)
+. nr #T_MARGIN_SET 1
+. if !\\n[#DOCS] \{\
+. PRINT \&
+. sp |\\n[#T_MARGIN]u-1v
+. \}
+. wh 0i DO_T_MARGIN
+.END
+\#
+\#
+\# B_MARGIN
+\# --------
+\# *Argument:
+\# <space to leave at the bottom of the page (ipPcv)>
+\# *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)
+. wh -\\n[#B_MARGIN]u DO_B_MARGIN
+.END
+\#
+\#
+\# PAGE
+\# ----
+\# *Arguments:
+\# <pagewidth> [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_HEADER
+\# ---------
+\# *Argument:
+\# <none>
+\# *Function:
+\# Plants the top margin (set in .PAGE) at the top of each page.
+\# *Notes:
+\# The trap is set in .PAGE
+\#
+.MAC DO_T_MARGIN END
+. ev 1
+. sp |\\n[#T_MARGIN]u-1v
+. ev
+.END
+\#
+\#
+\# DO_FOOTER
+\# ---------
+\# *Argument:
+\# <none>
+\# *Function:
+\# Plants the bottom margin (set in .PAGE) at the bottom of each page.
+\# *Notes:
+\# The trap is set in .PAGE.
+\#
+.MAC DO_B_MARGIN END
+.ev 1
+. bp
+.ev
+.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:
+\# <line length (iPpc)>
+\# *Function:
+\# Stores user supplied line length in register #L_LENGTH.
+\# Sets .ll to #L_LENGTHu
+\# *Notes:
+\# Requires unit of measure.
+\#
+.MAC LL END
+. nr #L_LENGTH (\\$1)
+. nr #USER_SET_L_LENGTH 1
+. ll \\n[#L_LENGTH]u
+. ta \\n(.lu
+.END
+\#
+\#
+\# FAMILY
+\# ------
+\# *Argument:
+\# <font family>
+\# *Function:
+\# Stores user supplied font family in string $FAMILY. Sets .fam
+\# to $FAMILY.
+\#
+.MAC FAMILY END
+. if \\n[#PRINT_STYLE]=1 \{ .return \}
+. if \\n[#IGNORE] \{ .return \}
+. ds $FAMILY \\$1
+. 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 \\*[$FONT]
+.END
+\#
+\#
+\# POINT SIZE
+\# ----------
+\# *Arguments:
+\# <point size of type>
+\# *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 PS 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
+\#
+\#
+\# LEADING
+\# -------
+\# *Argument:
+\# <leading between lines of text>
+\# *Function:
+\# Turns off #AUTO_LEAD if it's on.
+\# Sets .vs to user supplied value.
+\# *Notes:
+\# Does not require unit of measure. LEAD automatically turns off AUTOLEAD.
+\#
+.MAC LS END
+. if \\n[#PRINT_STYLE]=1 \{ .return \}
+. if \\n[#IGNORE] \{ .return \}
+. nr #LEAD_SET 1
+. if \\n[#AUTO_LEAD] \{\
+. rr #AUTO_LEAD
+. rr #AUTOLEAD_FACTOR
+. \}
+. vs \\$1
+. if \\n[#T_MARGIN_SET]=1 \{\
+. sp |\\n[#T_MARGIN]u-1v
+. rr #T_MARGIN_SET
+. \}
+.END
+\#
+\#
+\# AUTOLEAD
+\# --------
+\# *Argument:
+\# <leading value to add to #PT_SIZE> [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 PS 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.
+\#
+\# When AUTOLEAD is turned off, the leading reverts to the leading value
+\# in effect prior to invoking AUTOLEAD.
+\#
+.MAC AUTOLEAD END
+. if \\n[#PRINT_STYLE]=1 \{ .return \}
+. if \\n[#IGNORE] \{ .return \}
+. nr #AUTO_LEAD 1
+. 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[#T_MARGIN_SET] \{\
+. sp |\\n[#T_MARGIN]u-1v
+. rr #T_MARGIN_SET
+. \}
+.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:
+\# <none> | <anything>
+\# *Function:
+\# Turns automatic pairwise kerning on or off.
+\#
+.MAC KERN END
+. ie '\\$1'' \{\
+. kern
+. nr #KERN 1
+. \}
+. el \{
+. kern 0
+. nr #KERN 0
+. \}
+.END
+\#
+\#
+\# INLINE KERNING
+\# --------------
+\# 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 automatice kerning is
+\# turned on.
+\#
+\# Owing to some stupidities of groff, it is not possible
+\# pass arguments to macros that are executed with inline
+\# escapes, nor thence to evaluate conditional expressions.
+\# Consequently, each pseudo-escape \[BU#] must be defined
+\# separately with ".char". I'd have prefered something like
+\# this
+\#
+\# .de BU
+\# \c
+\# \\h'-(\\n[#PT_SIZE]u/\\n[#KERN_UNIT]u*\\$1u)'\c
+\# ..
+\#
+\# with the BU escape looking like "\*[BU #]", but that's
+\# just not possible. Bottom line? The user can only BU or FU
+\# up to 36 Us, and there are too many lines of code for
+\# such a simple function.
+\#
+\# BP and FP do the same thing as BU and FU, except that the
+\# unit is points, and it only goes up to FP12/BP12 (1 pica)
+\#
+\#
+.nr #KERN_UNIT 36
+.ds BU1 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*1u)'
+.ds BU2 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*2u)'
+.ds BU3 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*3u)'
+.ds BU4 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*4u)'
+.ds BU5 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*5u)'
+.ds BU6 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*6u)'
+.ds BU7 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*7u)'
+.ds BU8 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*8u)'
+.ds BU9 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*9u)'
+.ds BU10 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*10u)'
+.ds BU11 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*11u)'
+.ds BU12 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*12u)'
+.ds BU13 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*13u)'
+.ds BU14 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*14u)'
+.ds BU15 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*15u)'
+.ds BU16 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*16u)'
+.ds BU17 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*17u)'
+.ds BU18 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*18u)'
+.ds BU19 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*19u)'
+.ds BU20 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*20u)'
+.ds BU21 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*21u)'
+.ds BU22 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*22u)'
+.ds BU23 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*23u)'
+.ds BU24 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*24u)'
+.ds BU25 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*25u)'
+.ds BU26 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*26u)'
+.ds BU27 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*27u)'
+.ds BU28 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*28u)'
+.ds BU29 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*29u)'
+.ds BU30 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*30u)'
+.ds BU31 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*31u)'
+.ds BU32 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*32u)'
+.ds BU33 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*33u)'
+.ds BU34 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*34u)'
+.ds BU35 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*35u)'
+.ds BU36 \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*36u)'
+\#
+.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 FU1 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*1u)'
+.ds FU2 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*2u)'
+.ds FU3 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*3u)'
+.ds FU4 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*4u)'
+.ds FU5 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*5u)'
+.ds FU6 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*6u)'
+.ds FU7 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*7u)'
+.ds FU8 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*8u)'
+.ds FU9 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*9u)'
+.ds FU10 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*10u)'
+.ds FU11 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*11u)'
+.ds FU12 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*12u)'
+.ds FU13 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*13u)'
+.ds FU14 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*14u)'
+.ds FU15 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*15u)'
+.ds FU16 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*16u)'
+.ds FU17 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*17u)'
+.ds FU18 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*18u)'
+.ds FU19 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*19u)'
+.ds FU20 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*20u)'
+.ds FU21 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*21u)'
+.ds FU22 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*22u)'
+.ds FU23 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*23u)'
+.ds FU24 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*24u)'
+.ds FU25 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*25u)'
+.ds FU26 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*26u)'
+.ds FU27 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*27u)'
+.ds FU28 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*28u)'
+.ds FU29 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*29u)'
+.ds FU30 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*30u)'
+.ds FU31 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*31u)'
+.ds FU32 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*32u)'
+.ds FU33 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*33u)'
+.ds FU34 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*34u)'
+.ds FU35 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*35u)'
+.ds FU36 \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*36u)'
+\#
+.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)
+\# -----------------------------
+\# 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:
+\# <amount of overall "kerning" (letter spacing) to apply to the line>
+\# *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.
+\#
+\# 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] \{ .br \}
+. tkf 1 1 -\\$1 1 -\\$1
+. tkf 2 1 -\\$1 1 -\\$1
+. tkf 3 1 -\\$1 1 -\\$1
+. tkf 4 1 -\\$1 1 -\\$1
+.END
+\#
+\#
+.MAC EW END
+. if \\n[#BR_AT_LINE_KERN] \{ .br \}
+. tkf 1 1 \\$1 1 \\$1
+. tkf 2 1 \\$1 1 \\$1
+. tkf 3 1 \\$1 1 \\$1
+. tkf 4 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:
+\# <none> | <anything> | 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 ON 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> | <size of margin> | <amount of interword space>
+\# *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:
+\# <user supplied lead (ipPc) to advance below current baseline>
+\# *Function:
+\# Creates or modifies register #ALD. Adds user supplied lead
+\# below current baseline.
+\# *Notes:
+\# Requires unit of measure ipPcmv.
+\#
+.MAC ALD END
+. nr #ALD (\\$1)
+. sp \\n[#ALD]u
+.END
+\#
+\#
+\# REVERSE LEAD
+\# ------------
+\# *Argument:
+\# <user supplied lead (ipPc) to reverse above current baseline>
+\# *Function:
+\# Creates or modifies register #RLD. Reverses user supplied
+\# lead above current baseline.
+\# *Notes:
+\# Requires unit of measure ipPcm.
+\#
+.MAC RLD END
+. nr #RLD (\\$1)
+. sp -\\n[#RLD]u
+.END
+\#
+\# ALD/RLD STRINGS
+\# ---------------
+\# *Notes:
+\# If user needs to ALD/RLD more than 12 points, \v'<distance>' must be used
+\# instead
+\#
+.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:
+\# <none> | <anything>
+\# *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:
+\# <none> | <anything>
+\# *Function:
+\# Turns smartquotes on or off.
+\# *Notes:
+\# The " character is read outside the macro when mymacs is
+\# processed. The strings for open/close ($QUOTE#) are then
+\# defined in the macro. \N'34' is the ASCII code for ". If
+\# incompatibilities arise, find the code for " that applies
+\# to your system and plug in that code instead.
+\#
+.char " \\*[$QUOTE\\n[#OPEN_CLOSE]]\R'#OPEN_CLOSE (1-\\n[#OPEN_CLOSE])'
+\#
+.MAC SMARTQUOTES END
+. ie '\\$1'' \{\
+. nr #OPEN_CLOSE 0
+. ds $QUOTE0 ``
+. ds $QUOTE1 ''
+. nr #SMART_QUOTES 1
+. \}
+. el \{\
+. ds $QUOTE0 \\N'34'
+. ds $QUOTE1 \\N'34'
+. nr #SMART_QUOTES 0
+. \}
+.END
+\#
+.ds FOOT \(fm
+.ds INCH \(fm\(fm
+\#
+\# =====================================================================
+\#
+\# +++LINE BREAKS+++
+\#
+\# NO-SPACE BREAK
+\# --------------
+\# *Argument:
+\# <none>
+\# *Function:
+\# Breaks a line without advancing.
+\# *Notes:
+\# EL is the mnemonic used on older, dedicated typesetting machines
+\# to indicate "process the line, then return to the left margin
+\# without advancing the galley medium." It stands for End Line.
+\#
+\# Sadly, EL is only a fake. It will work in all instances EXCEPT
+\# when the line to be EL'd is the last line before a footer trap.
+\#
+.MAC EL END
+. br
+. sp -1v
+.END
+\#
+\# =====================================================================
+\#
+\# +++FILLING/QUADDING/JUSTIFYING+++
+\#
+\# JUSTIFY
+\# -------
+\# *Argument:
+\# <none>
+\# *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 #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' \{ .ad l \}
+. if '\\*[$QUAD_VALUE]'LEFT' \{ .ad l \}
+. if '\\*[$QUAD_VALUE]'R' \{ .ad r \}
+. if '\\*[$QUAD_VALUE]'RIGHT' \{ .ad r \}
+. if '\\*[$QUAD_VALUE]'C' \{ .ad c \}
+. if '\\*[$QUAD_VALUE]'CENTER' \{ .ad c \}
+. if '\\*[$QUAD_VALUE]'CENTRE' \{ .ad c \}
+. if '\\*[$QUAD_VALUE]'J' \{ .ad b \}
+. if '\\*[$QUAD_VALUE]'JUSTIFY' \{ .ad b \}
+. nr #FILL 0
+.END
+\#
+\#
+\# LEFT, RIGHT, AND CENTER
+\# -----------------------
+\# The purpose of these macros is to allow the user to enter lines
+\# of text that will be quadded LRC *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:
+\# <none>
+\# *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, simply 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 #FILL 1
+.END
+\#
+\#
+\# RIGHT
+\# -----
+\# *Argument:
+\# <none>
+\# *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 #FILL 1
+.END
+\#
+\#
+\# CENTER
+\# ------
+\# *Argument:
+\# <none>
+\# *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 \{\
+. ds $RESTORE_QUAD_VALUE CENTER
+. \}
+. fi
+. ce 100000
+. nr #FILL 1
+.END
+\#
+\# =====================================================================
+\#
+\# +++TABS+++
+\#
+\# 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 TS, they are called with .TAB <#>, where <#>
+\# 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 <#>,
+\# 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 \*[ST<#>], where <#> is
+\# the desired number of the tab. The end of the the tab is marked
+\# with \*[ST<#>X]. All ST's must have a matching STX. String tabs
+\# may be nested.
+\#
+\# Next, the user invokes .ST <#> 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
+\# ------------------------------
+\#
+.ds ST1 \Ek[#ST1_OFFSET]
+.ds ST2 \Ek[#ST2_OFFSET]
+.ds ST3 \Ek[#ST3_OFFSET]
+.ds ST4 \Ek[#ST4_OFFSET]
+.ds ST5 \Ek[#ST5_OFFSET]
+.ds ST6 \Ek[#ST6_OFFSET]
+.ds ST7 \Ek[#ST7_OFFSET]
+.ds ST8 \Ek[#ST8_OFFSET]
+.ds ST9 \Ek[#ST9_OFFSET]
+.ds ST10 \Ek[#ST10_OFFSET]
+.ds ST11 \Ek[#ST11_OFFSET]
+.ds ST12 \Ek[#ST12_OFFSET]
+.ds ST13 \Ek[#ST13_OFFSET]
+.ds ST14 \Ek[#ST14_OFFSET]
+.ds ST15 \Ek[#ST15_OFFSET]
+.ds ST16 \Ek[#ST16_OFFSET]
+.ds ST17 \Ek[#ST17_OFFSET]
+.ds ST18 \Ek[#ST18_OFFSET]
+.ds ST19 \Ek[#ST19_OFFSET]
+.ds ST1X \Ek[#ST1_MARK]
+.ds ST2X \Ek[#ST2_MARK]
+.ds ST3X \Ek[#ST3_MARK]
+.ds ST4X \Ek[#ST4_MARK]
+.ds ST5X \Ek[#ST5_MARK]
+.ds ST6X \Ek[#ST6_MARK]
+.ds ST7X \Ek[#ST7_MARK]
+.ds ST8X \Ek[#ST8_MARK]
+.ds ST9X \Ek[#ST9_MARK]
+.ds ST10X \Ek[#ST10_MARK]
+.ds ST11X \Ek[#ST11_MARK]
+.ds ST12X \Ek[#ST12_MARK]
+.ds ST13X \Ek[#ST13_MARK]
+.ds ST14X \Ek[#ST14_MARK]
+.ds ST15X \Ek[#ST15_MARK]
+.ds ST16X \Ek[#ST16_MARK]
+.ds ST17X \Ek[#ST17_MARK]
+.ds ST18X \Ek[#ST18_MARK]
+.ds ST19X \Ek[#ST19_MARK]
+\#
+\#
+\# QUAD AND SET STRING TABS
+\# ------------------------
+\# *Arguments:
+\# <stringtab number> 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 TS, 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] \{\
+. TS \\$1 \\n[#ST\\$1_OFFSET]u+\\n[#ST_OFFSET]u \\n[#ST\\$1_LENGTH]u \\*[$ST\\$1_QUAD_DIR] \\*[$ST\\$1_FILL]
+. \}
+. el \{\
+. TS \\$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 TAB<#> and TAB <#>, where # is any arbitrary number.
+\# TAB# is a typesetting tab (i.e. a tab defined as an indent
+\# from the page left offset plus a line length.)
+\# *Notes:
+\# <#> = 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'<string>'u--if more than one word in string, surround
+\# with double quotes "\w'<three word string>'"
+\# 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
+\#
+\# Examples:
+\#
+\# .TS 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."
+\#
+\# .TS 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 <#> 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 .TS.
+\#
+\# 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
+. br
+. in 0
+. nr #TAB_ACTIVE 1
+. nr #CURRENT_TAB \\n[#TAB_NUMBER]
+. po \\n[#L_MARGIN]u+\\n[#TAB_OFFSET]u
+. nr #ST_OFFSET \\n[#TAB_OFFSET]
+. nr #TAB_OFFSET\\*[$CURRENT_TAB] \\n[#TAB_OFFSET]
+. 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 \}
+. \}
+.DONE
+. rr #TAB_ACTIVE
+.END
+\#
+\#
+\# TAB
+\# ---
+\# *Arguments:
+\# <tab number to tab into>
+\# *Function:
+\# Moves to tab number passed as an argument.
+\#
+.MAC TAB END
+. ds $TAB_NUMBER \\$1
+. TAB\\*[$TAB_NUMBER]
+. nr #IN_TAB 1
+. po \\n[#L_MARGIN]u+\\n[#TAB_OFFSET\\*[$TAB_NUMBER]]u
+.END
+\#
+\#
+\# TAB NEXT
+\# --------
+\# *Argument:
+\# <none>
+\# *Function:
+\# Automagically moves to TAB#+1 on the same line as the last
+\# line of the previous tab.
+\# *Notes:
+\# If the tabs being aligned fall too close to the footer
+\# trap, the line entered after .TN will appear on the next page.
+\#
+.MAC TN END
+. br
+. nr #NEXT_TAB \\n[#CURRENT_TAB]+1
+. TAB\\n[#NEXT_TAB]
+. sp -1v
+.END
+\#
+\#
+\# TAB QUIT
+\# --------
+\# *Argument:
+\# <none>
+\# *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
+\#
+\# =====================================================================
+\#
+\# +++MISCELLANEOUS USEFUL MACROS AND STRINGS+++
+\#
+\# UNDERLINE
+\# ---------
+\# *Arguments:
+\# <none> | <anything>
+\# *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 À _À
+. char  _Â
+. char Á _Á
+. char Ä _Ä
+. char Å _Å
+. char È _È
+. char Ê _Ê
+. char É _É
+. char Ë _Ë
+. char Ì _Ì
+. char Î _Î
+. char Í _Í
+. char Ï _Ï
+. char Ñ _Ñ
+. char Ò _Ò
+. char Ô _Ô
+. char Ó _Ó
+. char Ö _Ö
+. char Ø _Ø
+. char Ù _Ù
+. char Û _Û
+. char Ú _Ú
+. char Ü _Ü
+. 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 à _à
+. char â _â
+. char á _á
+. char ä _ä
+. char å _å
+. char è _è
+. char ê _ê
+. char é _é
+. char ë _ë
+. char ì _ì
+. char î _î
+. char í _í
+. char ï _ï
+. char ñ _ñ
+. char ò _ò
+. char ô _ô
+. char ó _ó
+. char ö _ö
+. char ø _ø
+. char ß _ß
+. char ù _ù
+. char û _û
+. char ú _ú
+. char ü _ü
+. 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 \
+ à â á ä å è ê é ë ì î í ï ñ ò ô ó ö ø ß ù û ú ü ' \
+ 1 2 3 4 5 6 7 8 9 0
+. \}
+.END
+\#
+\#
+\# UL/ULX
+\# ------
+\# *Arguments:
+\# <none>
+\# *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 À _À
+. char  _Â
+. char Á _Á
+. char Ä _Ä
+. char Å _Å
+. char È _È
+. char Ê _Ê
+. char É _É
+. char Ë _Ë
+. char Ì _Ì
+. char Î _Î
+. char Í _Í
+. char Ï _Ï
+. char Ñ _Ñ
+. char Ò _Ò
+. char Ô _Ô
+. char Ó _Ó
+. char Ö _Ö
+. char Ø _Ø
+. char Ù _Ù
+. char Û _Û
+. char Ú _Ú
+. char Ü _Ü
+. 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 à _à
+. char â _â
+. char á _á
+. char ä _ä
+. char å _å
+. char è _è
+. char ê _ê
+. char é _é
+. char ë _ë
+. char ì _ì
+. char î _î
+. char í _í
+. char ï _ï
+. char ñ _ñ
+. char ò _ò
+. char ô _ô
+. char ó _ó
+. char ö _ö
+. char ø _ø
+. char ß _ß
+. char ù _ù
+. char û _û
+. char ú _ú
+. char ü _ü
+. 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 \
+ à â á ä å è ê é ë ì î í ï ñ ò ô ó ö ø ß ù û ú ü ' \
+ 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'-.3m'\s[\En[#SUP_PT_SIZE]u]
+\#
+.ds SUPX \s[\En[#PT_SIZE_IN_UNITS]u]\v'.3m'
+\#
+.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:
+\# <number of degrees> | 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:
+\# <amount of emboldening> | 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:
+\# <percentage to condense/expand type size>
+\# *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:
+\# <character to use for marking pad points>
+\# *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:
+\# "<string of text with padding markers inserted>"
+\# *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 <IS>.
+\# *Notes:
+\# String tabs may be marked off during PAD.
+\#
+.MAC PAD END
+. if !d$PAD_MARKER \{ .ds $PAD_MARKER # \}
+. char \\*[$PAD_MARKER] \R'#PAD_COUNT \En[#PAD_COUNT]+1'
+. ds $PAD_STRING \\$1
+. as $PAD_STRING \Ekp
+. di PAD_STRING
+\\*[$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
+\\*[$PAD_STRING]
+. br
+. di
+. char \\*[$PAD_MARKER] \h'\En[#PAD_SPACE]u'
+. ie \\n[#SILENT] \{\
+. SILENT
+\\*[$PAD_STRING]
+. br
+. SILENT OFF
+. \}
+. el \{\
+\\*[$PAD_STRING]
+. br
+. \}
+. rr #PAD_COUNT
+. rr #SPACE_TO_END
+. rr #PAD_SPACE
+. rm $PAD_STRING
+. rm PAD_STRING
+. rchar #
+.END
+\#
+\#
+\# +++LEADERS+++
+\#
+\# The leader mechanism is primitive, but it works. Basically,
+\# every macro in this set that includes a line length also sets
+\# a single groff tab stop at the right hand end of the line.
+\# That way, whenever Ctrl-A is invoked (always at the end of
+\# an input line), leader of the correct length gets deposited.
+\# Ctrl-A is accessed by the string LEADER (i.e. inline, as
+\# \*[LEADER]). Leaders within tabs get their length from the
+\# tab line length.
+\#
+\# SET LEADER CHARACTER
+\# --------------------
+\# *Arguments:
+\# <character to use whenever \*[LEADER] is invoked>
+\# *Function:
+\# Set leader character.
+\#
+.MAC LEADER_CHARACTER END
+. lc \\$1
+.END
+\#
+.ds LEADER 
+\#
+\# +++DROP CAPS+++
+\#
+\# DROP CAP FAMILY
+\# ---------------
+\# *Argument:
+\# <family of drop cap>
+\# *Function:
+\# Creates or modifies string $DC_FAM.
+\#
+.MAC DROPCAP_FAMILY END
+. ds $DC_FAM \\$1
+.END
+\#
+\#
+\# DROP CAP FONT
+\# -------------
+\# *Argument:
+\# <font of drop cap>
+\# *Function:
+\# Creates or modifies string $DC_FT.
+\#
+.MAC DROPCAP_FONT END
+. ds $DC_FT \\$1
+.END
+\#
+\#
+\# DROP CAP GUTTER
+\# ---------------
+\# *Argument:
+\# <width of gutter between drop cap and indented text>
+\# *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:
+\# <dropcap letter> <# 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
+. ds $RESTORE_COND \\*[$COND_PERCENT]
+. ds $RESTORE_EXT \\*[$EXT_PERCENT]
+. if '\\$3'COND' \{ .CONDENSE \\$4 \}
+. if '\\$3'EXT' \{ .EXTEND \\$4 \}
+. if !r#DC_GUT \{ .nr #DC_GUT (3p) \}
+. ds $RESTORE_FAM \\n[.fam]
+. nr #RESTORE_FT \\n(.f
+. 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 \\n(.f \}
+. 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 '\\$3'COND' \{ .PRINT \\*[COND]\\*[$DROPCAP]\\*[CONDX] \}
+. el \{ .PRINT \\*[$DROPCAP] \}
+. 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 \\n[#RESTORE_FT]
+. ps \\n[#RESTORE_PT_SIZE]u
+. CONDENSE \\*[$RESTORE_COND]
+. EXTEND \\*[$RESTORE_EXT]
+. ie \\n(.u \{ .wh \\n(.du+\\n[#DC_HEIGHT]u-1v DROPCAP_OFF \}
+. el \{ .wh \\n(.du+\\n[#DC_HEIGHT]u DROPCAP_OFF \}
+. rm $DROPCAP
+. rr #DC_LINES
+. rm $RESTORE_COND
+. rm $RESTORE_EXT
+. rm $RESTORE_FAM
+. rr #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
+\#
+\#
+\# =====================================================================
+\#
+\# +++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+++
+\#
+\# 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 in ipPcm. The size may also
+\# be entered using the \w'#' function--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
+\# .I<LRB>X macros.
+\#
+\# Example
+\# -------
+\#
+\# .IL 2P
+\# ...some text...
+\# .IL 2P
+\# ...some text...
+\# .IX
+\# ...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.
+\# .IX 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 .IX (.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 IX. The ILX, IRX, IBX,
+\# and IX 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 I<LRB>X macros should be
+\# invoked with the single argument CLEAR. IX 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. 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
+. 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:
+\# <none>
+\# *Function:
+\# Marks the top of a column set
+\#
+.MAC MCO END
+.mk c
+.END
+\#
+\# MULTIPLE COLUMN RETURN
+\# ----------------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Returns to the top of a column set
+\#
+.MAC MCR END
+. sp |\\ncu
+.END
+\#
+\# MULTIPLE COLUMNS OFF
+\# --------------------
+\# *Arguments:
+\# <none> | <lead to advance beneath bottom of deepest column>
+\# *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 (\\$1)
+. \}
+.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:
+\# <none> | <anything>
+\# *Function:
+\# Diverts text so that it doesn't print, or turns to 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
+\# -----
+\# *Arguments:
+\# <anything>
+\# *Function:
+\# Prints anything. A macro that helps keep my code nicely indented.
+\#
+.MAC PRINT END
+\\$*
+.END
+\#
+\#
+\# CAPS
+\# ----
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Converts text to caps, or, if OFF, reverts to normal caps/lc.
+\#
+.MAC CAPS END
+. ie '\\$1'' \{\
+. tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
+. tr àÀâÂáÁäÄåÅèÈêÊéÉëËìÌîÎíÍïÏòÒôÔóÓöÖùÙûÛúÚüÜ
+. tr çÇñÑ
+. nr #CAPS_ON 1
+. \}
+. el \{\
+. tr aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz
+. tr ààââááääååèèêêééëëììîîííïïòòôôóóööùùûûúúüü
+. tr ççññ
+. rr #CAPS_ON
+. \}
+.END
+\#
+\# SIZESPECS
+\# ---------
+\# Argument:
+\# <none>
+\# 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 CENTRE CENTER
+.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 LIG LIGATURES
+.ALIAS PADMARKER PAD_MARKER
+.ALIAS TABSET TAB_SET
+.ALIAS TB TAB
+.ALIAS TS TAB_SET
+.ALIAS UNDERSCORE_2 UNDERSCORE2
+\#
+\#
+\# ====================================================================
+\#
+\# 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 margins 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 !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 \}
+. fam C
+. ft R
+. ps 12
+. ie '\\$2'SINGLESPACE' \{\
+. nr #SINGLE_SPACE 1
+. vs 12
+. \}
+. el \{ .vs 24 \}
+. 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
+. \}
+. if '\\$1'TYPESET' \{\
+. nr #PRINT_STYLE 2
+. if !\\n[#DOC_TYPE]=4 \{ .L_MARGIN 6P \}
+. if !\\n[#DOC_TYPE]=4 \{ .R_MARGIN 6P \}
+. FAMILY T
+. FT R
+. if !\\n[#DOC_TYPE]=4 \{ .PS 12.5 \}
+. if !\\n[#DOC_TYPE]=4 \{ .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
+\#
+\# ITALIC MEANS ITALIC
+\# -------------------
+\# *Argument:
+\# <none>
+\# *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:
+\# <none>
+\# *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:
+\# <none> | <anything>
+\# *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 !r#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 \{\
+. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\
+. ds $HDRFTR_CENTER \
+ \\*[$DRAFT_STRING] \\n[#DRAFT], \
+ \\*[$REVISION_STRING] \\n[#REVISION]
+. PAGENUM_STYLE roman
+. \}
+. \}
+. el \{\
+. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{ .ds $HDRFTR_CENTER \}
+. PAGENUM_STYLE DIGIT
+. \}
+. \}
+\# Chapter
+. if \\n[#DOC_TYPE]=2 \{\
+. ie \\n[#COPY_STYLE]=1 \{\
+. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\
+. ds $HDRFTR_CENTER \
+ \\*[$CHAPTER_STRING] \\*[$CHAPTER], \
+ \\*[$DRAFT_STRING] \\n[#DRAFT], \
+ \\*[$REVISION_STRING] \\n[#REVISION]
+. PAGENUM_STYLE roman
+. \}
+. \}
+. el \{\
+. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\
+. ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER]
+. PAGENUM_STYLE DIGIT
+. \}
+. \}
+. \}
+\# Named
+. if \\n[#DOC_TYPE]=3 \{\
+. ie \\n[#COPY_STYLE]=1 \{\
+. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\
+. ds $HDRFTR_CENTER \
+ \\*[$DOC_TYPE], \
+ \\*[$DRAFT_STRING] \\n[#DRAFT], \
+ \\*[$REVISION_STRING] \\n[#REVISION]
+. PAGENUM_STYLE roman
+. \}
+. \}
+. el \{\
+. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{
+. ds $HDRFTR_CENTER \\*[$DOC_TYPE]
+. PAGENUM_STYLE DIGIT
+. \}
+. \}
+. \}
+.END
+\#
+\# ====================================================================
+\#
+\# +++COLLECT DOC INFO -- STRINGS AND NUMBER REGISTERS+++
+\#
+\# *Arguments:
+\# various string/register arguments
+\# *Function:
+\# Collect information about documents.
+\#
+.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 DRAFT END \"Draft number
+. nr #DRAFT \\$1
+.END
+\#
+\#
+.MAC REVISION END \"Revision number
+. nr #REVISION \\$1
+.END
+\#
+\#
+.MAC AUTHOR END \"Author. Use "..." with this macro.
+. 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 PAGENUMBER END \"Page # that appears on page one.
+. nr #n%_AT_PAGENUM_SET \\n%
+. 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 "<whatever> | LETTER
+\# *Function:
+\# Creates strings and sets registers for document types.
+\# *Notes:
+\# Number registers: DEFAULT=1, CHAPTER=2, NAMED=3, LETTER=4
+\#
+.MAC DOCTYPE END
+. if '\\$1'DEFAULT' \{\
+. nr #DOC_TYPE 1
+. \}
+. if '\\$1'CHAPTER' \{\
+. nr #DOC_TYPE 2
+. \}
+. if '\\$1'NAMED' \{\
+. ds $DOC_TYPE \\$2
+. nr #DOC_TYPE 3
+. \}
+. if '\\$1'LETTER' \{\
+. nr #DOC_TYPE 4
+. L_MARGIN 1.125i
+. R_MARGIN 1.125i
+. PS 12
+. 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 ".../\E*[$SUITE]
+. FOOTER_ON_FIRST_PAGE
+. em ALL_DONE
+. \}
+.END
+\#
+\# +++LETTER MACROS+++
+\#
+\# DATE
+\# ----
+\# *Arguments:
+\# <date string>
+\# *Function:
+\# Stores date string in string $DATE.
+\#
+.MAC DATE END
+. nr #DATE 1
+. di DATE
+. RIGHT
+.END
+\#
+\#
+\# TO
+\# --
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Stores "to" info in diversion TO_ADDRESS.
+\#
+.MAC TO END
+. if !'\\n(.z'' \{ .di \}
+. nr #TO 1
+. di TO_ADDRESS
+. LEFT
+.END
+\#
+\#
+\# FROM
+\# ----
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Stores "from" info in diversion FROM_ADDRESS.
+\#
+.MAC FROM END
+. if !'\\n(.z'' \{ .di \}
+. nr #FROM 1
+. di FROM_ADDRESS
+. LEFT
+.END
+\#
+\#
+\# GREETING
+\# --------
+\# *Arguments:
+\# <greeting string>
+\# *Function:
+\# Stores greeting in string $GREETING.
+\#
+.MAC GREETING END
+. if !'\\n(.z'' \{ .di \}
+. nr #GREETING 1
+. di GREETING
+. LEFT
+.END
+\#
+\#
+\# CLOSING
+\# -------
+\# *Arguments:
+\# <closing string>
+\# *Function:
+\# Stores greeting in string $CLOSING.
+\#
+.MAC CLOSING END
+. br
+. nr #CLOSING 1
+. di CLOSING
+.END
+\#
+\#
+\# NO SUITE
+\# --------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Redefines $SUITE to blank so that a suite number doesn't
+\# appear at the bottom of letter pages.
+\#
+.MAC NO_SUITE END
+. FOOTER_RIGHT ""
+.END
+\#
+\# ====================================================================
+\#
+\# +++DEFAULTS+++
+\#
+\# DEFAULTS
+\# --------
+\# *Arguments:
+\# <none>
+\# *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 \}
+. if !\\n[#COPY_STYLE] \{ .COPYSTYLE FINAL \}
+. 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 \{ .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 !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 \}
+. ie r#ADJ_DOC_LEAD \{ . \}
+. el \{ .DOC_LEAD_ADJUST \}
+\# 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]
+. ds $DOC_QUAD \\*[$QUAD_VALUE]
+. ds $PP_FT \\*[$FONT]
+\# Counters
+. nr #PP 0
+. nr #FN_NUMBER 0 1
+. nr #FN_COUNT_FOR_COLS 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 !r#FN_MARKER_STYLE \{ .FOOTNOTE_MARKER_STYLE STAR \}
+\# String defaults for both PRINTSTYLEs
+. if !d$ATTRIBUTE_STRING \{ .ATTRIBUTE_STRING "by" \}
+. 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$FINIS_STRING \{ .FINIS_STRING "END" \}
+\# Defaults for printstyle TYPEWRITE
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#UNDERLINE_QUOTES]=1 \{ .UNDERLINE_QUOTES \}
+. if \\n[#UNDERLINE_QUOTES]=0 \{ .UNDERLINE_QUOTES OFF \}
+. if !r#Q_OFFSET_VALUE \{ .QUOTE_INDENT 2 \}
+. if !r#EPI_OFFSET_VALUE \{ .EPIGRAPH_INDENT 2 \}
+. if !d$LINEBREAK_CHAR \{ .LINEBREAK_CHAR * 3 2p \}
+. if !d$FN_SIZE_CHANGE \{ .FOOTNOTE_SIZE +0 \}
+. if !r#FN_RULE_LENGTH \{ .FOOTNOTE_RULE_LENGTH 2i \}
+. if !r#FN_RULE_ADJ \{ .FOOTNOTE_RULE_ADJ 6p \}
+. if !r#SLANT_MEANS_SLANT \{\
+. ie \\n[#UNDERLINE_SLANT]=1 \{ .UNDERLINE_SLANT \}
+. el \{ .UNDERLINE_SLANT OFF \}
+. \}
+. if !r#PH_INDENT \{ .PARAHEAD_INDENT \\n[#PP_INDENT]u/2u \}
+. \}
+\# Defaults for printstyle TYPESET
+. if \\n[#PRINT_STYLE]=2 \{\
+. if !#DOCHEADER_LEAD \{ .DOCHEADER_LEAD +0 \}
+. if !d$TITLE_FAM \{ .TITLE_FAMILY \\*[$DOC_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$SUBTITLE_FAM \{ .SUBTITLE_FAMILY \\*[$DOC_FAM] \}
+. if !d$SUBTITLE_FT \{ .SUBTITLE_FONT R \}
+. if !d$SUBTITLE_SIZE_CHANGE \{ .SUBTITLE_SIZE +0 \}
+. if !d$AUTHOR_FAM \{ .AUTHOR_FAMILY \\*[$DOC_FAM] \}
+. if !d$AUTHOR_FT \{ .AUTHOR_FONT I \}
+. if !d$AUTHOR_SIZE_CHANGE \{ .AUTHOR_SIZE +0 \}
+. if !d$DOCTYPE_FAM \{ .DOCTYPE_FAMILY \\*[$DOC_FAM] \}
+. if !d$DOCTYPE_FT \{ .DOCTYPE_FONT BI \}
+. if !d$DOCTYPE_SIZE_CHANGE \{ .DOCTYPE_SIZE +3 \}
+. 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 \}
+. if !r#FN_RULE_LENGTH \{ .FOOTNOTE_RULE_LENGTH 4P \}
+. if !r#FN_RULE_ADJ \{ .FOOTNOTE_RULE_ADJ 3p \}
+. 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 \}
+. if !d$SH_FAM \{ .SUBHEAD_FAMILY \\*[$DOC_FAM] \}
+. if !d$SH_FT \{ .SUBHEAD_FONT B \}
+. if !d$SH_SIZE_CHANGE \{ .SUBHEAD_SIZE +.5 \}
+. 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 \}
+. 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 \}
+. 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 \}
+. 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 \}
+. if !d$LINEBREAK_CHAR \{ .LINEBREAK_CHAR * 3 3p \}
+. if !d$FN_SIZE_CHANGE \{ .FOOTNOTE_SIZE -2 \}
+. if !r#FN_AUTOLEAD \{ .FOOTNOTE_AUTOLEAD 2 \}
+. \}
+. TRAPS
+. if \\n[#PRINT_STYLE]=1 \{ .nr #IGNORE 1 \}
+.END
+\#
+\# ====================================================================
+\#
+\# +++START THE DOCUMENT+++
+\#
+\# THE START MACRO
+\# ---------------
+\# *Arguments:
+\# <none>
+\# *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.
+\#
+.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
+. DEFAULTS
+. 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 \\n[#PRINT_PAGENUM_ON_PAGE_1] \{\
+. sp |\\n[#HEADER_MARGIN]u
+. PRINT_PAGE_NUMBER
+. \}
+. rr #COLLATE
+. rr #PAGINATION_STATE
+\#
+. ie \\n[#DOC_HEADER]=0 \{\
+. PRINT \&
+. if \\n[#DOC_TYPE]=4 \{\
+. if !'\\n(.z'' \{ .di \}
+. \}
+. ie r#ADVANCE_FROM_TOP \{ .sp |\\n[#ADVANCE_FROM_TOP]u-1v \}
+. el \{ .sp |\\n[#T_MARGIN]u-1v \}
+. PP
+. nr #PP 0
+. rr #DOC_HEADER
+. if r#ADVANCE_FROM_TOP \{ .rr #ADVANCE_FROM_TOP \}
+. \}
+. el \{\
+. nr #DOCHEADER_LINES 0 1
+. if \\n[#PRINT_STYLE]=2 \{ .LS \\n[#DOC_LEAD]u+\\n[#DOCHEADER_LEAD_ADJ]u \}
+. nr #DOCHEADER_LEAD \\n[#LEAD]
+\# Default
+. if \\n[#DOC_TYPE]=1 \{\
+. PRINT \&
+. sp |\\n[#DOCHEADER_ADVANCE]u-1v
+. ev TITLE
+. CENTER
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \}
+. el \{ .vs \\n[#DOC_LEAD]u \}
+. CAPS
+. if !'\\*[$TITLE]'' \{ .UNDERSCORE "\\*[$TITLE]\}
+. CAPS OFF
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$TITLE_FAM]
+. FT \\*[$TITLE_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$TITLE_SIZE_CHANGE]
+. LS \\n[#DOCHEADER_LEAD]u
+. PRINT \\*[$TITLE]
+. \\n+[#DOCHEADER_LINES]
+. CAPS OFF
+. \}
+. ev
+. ev SUBTITLE
+. CENTER
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. if !'\\*[$SUBTITLE]'' \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \}
+. el \{ .vs \\n[#DOC_LEAD]u \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$SUBTITLE_FAM]
+. FT \\*[$SUBTITLE_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$SUBTITLE_SIZE_CHANGE]
+. LS \\n[#DOCHEADER_LEAD]u
+. \}
+. PRINT \\*[$SUBTITLE]
+. \\n+[#DOCHEADER_LINES]
+. \}
+. if '\\*[$SUBTITLE]'' \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. ALD \\n[#DOC_LEAD]u
+. \}
+. \}
+. ev
+. ev AUTHOR
+. CENTER
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. if !'\\*[$AUTHOR_1]'' \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. 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 \}
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$AUTHOR_FAM]
+. FT \\*[$AUTHOR_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$AUTHOR_SIZE_CHANGE]
+. LS \\n[#DOCHEADER_LEAD]u
+. \}
+. PRINT \\*[$ATTRIBUTE_STRING]
+. \\n+[#DOCHEADER_LINES]
+. nr #AUTHORS \\n[#AUTHOR_NUM]
+. nr #NEXT_AUTHOR 0 1
+. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\
+. PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]
+. \\n+[#DOCHEADER_LINES]
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#AUTHOR_LINES]=1 \{
+. ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u \}
+. el \{ .RLD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. \}
+. ev
+. \}
+\# Chapter
+. if \\n[#DOC_TYPE]=2 \{\
+. PRINT \&
+. sp |\\n[#DOCHEADER_ADVANCE]u-1v
+. ev TITLE
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. CENTER
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \}
+. el \{ .vs \\n[#DOC_LEAD]u \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$TITLE_FAM]
+. FT \\*[$TITLE_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$TITLE_SIZE_CHANGE]
+. LS \\n[#DOC_LEAD]u
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. CAPS
+. PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER]
+. CAPS OFF
+. \}
+. if \\n[#PRINT_STYLE]=2 \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \}
+. ev
+. \}
+\# Named
+. if \\n[#DOC_TYPE]=3 \{\
+. PRINT \&
+. sp |\\n[#DOCHEADER_ADVANCE]u-1v
+. ev TITLE
+. CENTER
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \}
+. el \{ .vs \\n[#DOC_LEAD]u \}
+. CAPS
+. if !'\\*[$TITLE]'' \{ .UNDERSCORE "\\*[$TITLE]\}
+. CAPS OFF
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$TITLE_FAM]
+. FT \\*[$TITLE_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$TITLE_SIZE_CHANGE]
+. LS \\n[#DOCHEADER_LEAD]u
+. PRINT \\*[$TITLE]
+. \\n+[#DOCHEADER_LINES]
+. CAPS OFF
+. \}
+. ev
+. ev SUBTITLE
+. CENTER
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. if !'\\*[$SUBTITLE]'' \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \}
+. el \{ .vs \\n[#DOC_LEAD]u \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$SUBTITLE_FAM]
+. FT \\*[$SUBTITLE_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$SUBTITLE_SIZE_CHANGE]
+. LS \\n[#DOCHEADER_LEAD]u
+. \}
+. PRINT \\*[$SUBTITLE]
+. \\n+[#DOCHEADER_LINES]
+. \}
+. if '\\*[$SUBTITLE]'' \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. ALD \\n[#DOC_LEAD]u
+. \}
+. \}
+. ev
+. ev AUTHOR
+. CENTER
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. if !'\\*[$AUTHOR_1]'' \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. 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 \}
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$AUTHOR_FAM]
+. FT \\*[$AUTHOR_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$AUTHOR_SIZE_CHANGE]
+. LS \\n[#DOCHEADER_LEAD]u
+. \}
+. PRINT \\*[$ATTRIBUTE_STRING]
+. \\n+[#DOCHEADER_LINES]
+. nr #AUTHORS \\n[#AUTHOR_NUM]
+. nr #NEXT_AUTHOR 0 1
+. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\
+. PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]
+. \\n+[#DOCHEADER_LINES]
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#AUTHOR_LINES]=1 \{
+. ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u \}
+. el \{ .RLD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. \}
+. ev
+. ev DOCTYPE
+. CENTER
+. L_MARGIN \\n[#DOC_L_MARGIN]u
+. LL \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. vs \\n[#DOC_LEAD]u
+. if '\\*[$AUTHOR_1]'' \{\
+. 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 \{ .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 \{\
+. FAMILY \\*[$DOCTYPE_FAM]
+. FT \\*[$DOCTYPE_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$DOCTYPE_SIZE_CHANGE]
+. LS \\n[#DOCHEADER_LEAD]u
+. ALD \\n[#DOCHEADER_LEAD]u
+. \\n+[#DOCHEADER_LINES]
+. UNDERSCORE "\\*[$DOC_TYPE]
+. \\n+[#DOCHEADER_LINES]
+. \}
+. ev
+. \}
+. if !\\n[#DOC_TYPE]=4 \{\
+. if \\n[#PRINT_STYLE]=2 \{\
+. nr #DEPTH_1 \\n[#DOCHEADER_LINES]*\\n[#DOCHEADER_LEAD]
+. nr #DEPTH_2 \\n[#DOCHEADER_LINES]*\\n[#DOC_LEAD]
+. ie \\n[#DEPTH_1]<\\n[#DEPTH_2] \{\
+. nr #DOCHEADER_SPACE_ADJ \\n[#DEPTH_2]-\\n[#DEPTH_1]
+. \}
+. el \{\
+. nr #DOCHEADER_SPACE_ADJ \\n[#DEPTH_1]-\\n[#DEPTH_2]
+. \}
+. nr #DOCHEADER_EXTRA_SPACE \\n[#DOCHEADER_SPACE_ADJ] \\n[#DOC_LEAD]
+. while \\n[#DOCHEADER_EXTRA_SPACE]>\\n[#DOC_LEAD] \{\
+. \\n-[#DOCHEADER_EXTRA_SPACE]
+. \}
+. if \\n[#DOCHEADER_EXTRA_SPACE]>0 \{\
+. ie \\n[#DOCHEADER_LEAD_ADJ]<0 \{\
+. ALD \\n[#DOCHEADER_EXTRA_SPACE]u
+. \}
+. el \{ .ALD \\n[#DOC_LEAD]u-\\n[#DOCHEADER_EXTRA_SPACE]u \}
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=1 \{ .ALD \\n[#DOC_LEAD]u \}
+. if \\n[#PRINT_STYLE]=2 \{ .ALD \\n[#DOC_LEAD]u*2u \}
+. if \\n[#COLUMNS] \{\
+. nr #COL_NUM 0 1
+. nr #L_LENGTH_FOR_EPI \\n[#L_LENGTH]
+. po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u
+. LL \\n[#COL_L_LENGTH]u
+. ta \\n(.lu
+. mk dc
+. \}
+. \}
+. \}
+. rr #DOCHEADER_LEAD
+. rr #DOCHEADER_LEAD_ADJ
+. rr #DEPTH_1
+. rr #DEPTH_2
+. rr #DOCHEADER_ADVANCE
+. rr #ADVANCE_FROM_TOP
+. rr #DOCHEADER_SPACE_ADJ
+. rr #DOCHEADER_LINES
+. rr #DOCHEADER_EXTRA_SPACE
+. rr #AUTHORS
+. rr #NEXT_AUTHOR
+. rr #AUTHOR_NUM
+. rr #NUM_AUTHORS
+. nr #START 1
+. nr #START_FOR_FOOTERS 1
+.END
+\#
+\# ====================================================================
+\#
+\# +++MACROS TO CHANGE SOME DEFAULTS+++
+\#
+\# DOCUMENT HEADER
+\# ---------------
+\# *Argument:
+\# <none> | <anything> [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 <anything> (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 register #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
+. nr #DOCHEADER_LEAD_ADJ (\\$1)
+.END
+\#
+\#
+\# DOCHEADER ADVANCE
+\# -----------------
+\# *Arguments:
+\# <docheader start position>
+\# *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
+\#
+\#
+\# TITLE FAMILY
+\# ------------
+\# *Argument:
+\# <family to use for the document header title>
+\# *Function:
+\# Creates or modifies string $TITLE_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC TITLE_FAMILY END
+. ds $TITLE_FAM \\$1
+.END
+\#
+\#
+\# TITLE FONT
+\# ----------
+\# *Argument:
+\# <font to use for the document header title>
+\# *Function:
+\# Creates or modifies string $TITLE_FT.
+\# *Notes:
+\# Default is bold.
+\#
+.MAC TITLE_FONT END
+. ds $TITLE_FT \\$1
+.END
+\#
+\#
+\# TITLE SIZE
+\# ----------
+\# *Argument:
+\# <+|- number of points by which to in/decrease title at start
+\# of the document (relative to running text)>
+\# *Function:
+\# Creates string $TITLE_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign, with no space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is +3.5 for printstyle TYPESET DEFAULT | STORY | NAMED;
+\# 4 for TYPESET CHAPTER; +0 for TYPEWRITE.
+\#
+.MAC TITLE_SIZE END
+. ds $TITLE_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# SUBTITLE FAMILY
+\# ---------------
+\# *Argument:
+\# <family to use for the document header title>
+\# *Function:
+\# Creates or modifies string $SUBTITLE_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC SUBTITLE_FAMILY END
+. ds $SUBTITLE_FAM \\$1
+.END
+\#
+\#
+\# SUBTITLE FONT
+\# -------------
+\# *Argument:
+\# <font to use for the document header title>
+\# *Function:
+\# Creates or modifies string $SUBTITLE_FT.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC SUBTITLE_FONT END
+. ds $SUBTITLE_FT \\$1
+.END
+\#
+\#
+\# SUBTITLE SIZE
+\# -------------
+\# *Argument:
+\# <+|- number of points by which to in/decrease subtitle at start
+\# of the document (relative to running text)>
+\# *Function:
+\# Creates or modifies string $SUBTITLE_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign with no space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is +0.
+\#
+.MAC SUBTITLE_SIZE END
+. ds $SUBTITLE_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# AUTHOR FAMILY
+\# -------------
+\# *Argument:
+\# <family to use for author in document header>
+\# *Function:
+\# Creates or modifies string $AUTHOR_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC AUTHOR_FAMILY END
+. ds $AUTHOR_FAM \\$1
+.END
+\#
+\#
+\# AUTHOR FONT
+\# -----------
+\# *Argument:
+\# <font to use for author in document header>
+\# *Function:
+\# Creates or modifies string $AUTHOR_FT.
+\# *Notes:
+\# Default is italic.
+\#
+.MAC AUTHOR_FONT END
+. ds $AUTHOR_FT \\$1
+.END
+\#
+\#
+\# AUTHOR SIZE
+\# -----------
+\# *Argument:
+\# <+|- number of points by which to in/decrease author at start
+\# of the document>
+\# *Function:
+\# Creates or modifies string $AUTHOR_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign with no space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is same as running text.
+\#
+.MAC AUTHOR_SIZE END
+. ds $AUTHOR_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# DOCTYPE FAMILY
+\# --------------
+\# *Argument:
+\# <family to use for the document type string>
+\# *Function:
+\# Creates or modifies string $DOCTYPE_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC DOCTYPE_FAMILY END
+. ds $DOCTYPE_FAM \\$1
+.END
+\#
+\#
+\# DOCTYPE FONT
+\# ------------
+\# *Argument:
+\# <font to use for the document type string>
+\# *Function:
+\# Creates or modifies string $DOCTYPE_FT.
+\# *Notes:
+\# Default is bold italic.
+\#
+.MAC DOCTYPE_FONT END
+. ds $DOCTYPE_FT \\$1
+.END
+\#
+\#
+\# DOCTYPE SIZE
+\# -------------
+\# *Argument:
+\# <+|- number of points by which to in/decrease the document
+\# type string (relative to running text)>
+\# *Function:
+\# Creates or modifies string $DOCTYPE_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign with no space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is +3 for TYPESET; 0 for TYPEWRITE.
+\#
+.MAC DOCTYPE_SIZE END
+. ds $DOCTYPE_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# DOCUMENT LEFT MARGIN
+\# --------------------
+\# *Argument:
+\# <left margin of document>
+\# *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:
+\# <right margin of document>
+\# *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:
+\# <line length of document>
+\# *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:
+\# <family of running text>
+\# *Function:
+\# Creates or modifies string $DOC_FAM.
+\# *Notes:
+\# Affects everything EXCEPT headers and footers.
+\#
+.MAC DOC_FAMILY END
+. br
+. ds $DOC_FAM \\$1
+. 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]
+. PAGENUM_FAMILY \\*[$DOC_FAM]
+.END
+\#
+\#
+\# DOCUMENT POINT SIZE
+\# -------------------
+\# *Argument:
+\# <point size of running text>
+\# *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
+. PS \\$1
+. nr #DOC_PT_SIZE \\n[#PT_SIZE]
+.END
+\#
+\#
+\# DOCUMENT LEAD
+\# -------------
+\# *Argument:
+\# <lead (".vs") of running text> [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:
+\# <none> | <anything>
+\# *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 \}
+.END
+\#
+\#
+\# DOCUMENT QUAD
+\# -------------
+\# *Arguments:
+\# L | LEFT | R | RIGHT | C | CENTER | CENTRE | J | JUSTIFY
+\# *Function:
+\# Creates or modifies string $DOC_QUAD.
+\# *Notes:
+\# While QUAD (from the typesetting macros) can be used before START
+\# to change the default document quad, DOC_QUAD *must* be used after
+\# the START macro has been invoked.
+\#
+\# Default is LEFT for printstyle TYPEWRITE, JUSTIFY for printstyle
+\# TYPESET.
+\#
+.MAC DOC_QUAD END
+. ds $DOC_QUAD \\$1
+. QUAD \\*[$DOC_QUAD]
+.END
+\#
+\# ====================================================================
+\#
+\# +++INTERNATIONALIZATION+++
+\#
+\# ATTRIBUTE STRING
+\# ----------------
+\# *Argument:
+\# <what goes in the "by" slot before author in the document header>
+\# *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:
+\# <what to print any time the word "chapter" is required>
+\# *Function:
+\# Creates or modifies string $CHAPTER_STRING.
+\# *Notes:
+\# Default is "chapter".
+\#
+.MAC CHAPTER_STRING END
+. ds $CHAPTER_STRING \\$1
+.END
+\#
+\#
+\# DRAFT STRING
+\# ------------
+\# *Argument:
+\# <what to print any time the word "draft" is required>
+\# *Function:
+\# Creates or modifies string $DRAFT_STRING.
+\# *Notes:
+\# Default is "draft".
+\#
+.MAC DRAFT_STRING END
+. ds $DRAFT_STRING \\$1
+.END
+\#
+\#
+\# REVISION STRING
+\# ---------------
+\# *Argument:
+\# <what to print any time the word "revision" is required>
+\# *Function:
+\# Creates or modifies string $REVISION_STRING.
+\# *Notes:
+\# Default is "revision".
+\#
+.MAC REVISION_STRING END
+. ds $REVISION_STRING \\$1
+.END
+\#
+\#
+\# FINIS STRING
+\# ------------
+\# *Argument:
+\# <what to print with the finis macro>
+\# *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:
+\# <none> | <anything>
+\# *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 FAMILY
+\# ---------------
+\# *Argument:
+\# <family to use for epigraphs>
+\# *Function:
+\# Creates or modifies string $EPI_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC EPIGRAPH_FAMILY END
+. ds $EPI_FAM \\$1
+.END
+\#
+\#
+\# EPIGRAPH FONT
+\# -------------
+\# *Argument:
+\# <font to use for epigraphs>
+\# *Function:
+\# Creates or modifies string $EPI_FT.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC EPIGRAPH_FONT END
+. ds $EPI_FT \\$1
+.END
+\#
+\#
+\# EPIGRAPH SIZE
+\# -------------
+\# *Argument:
+\# <-|+ number of points by which to de/increase point size of epigraphs
+\# (relative to running text)>
+\# *Function:
+\# Creates or modifies string $EPI_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a - or + sign with no space afterwards.
+\# Fractional point sizes are allowed. Default -1.5 for printstyle
+\# TYPESET; +0 for TYPEWRITE.
+\#
+.MAC EPIGRAPH_SIZE END
+. ds $EPI_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# EPIGRAPH QUAD
+\# -------------
+\# *Arguments:
+\# L | LEFT | J | JUSTIFY
+\# *Function:
+\# Creates or modifies string $EPI_QUAD.
+\# *Notes:
+\# Default is $DOC_QUAD when BLOCK argument is passed to EPIGRAPH.
+\#
+.MAC EPIGRAPH_QUAD END
+. ds $EPI_QUAD \\$1
+.END
+\#
+\#
+\# EPIGRAPH INDENT
+\# ---------------
+\# *Argument:
+\# <value by which to multiply PP_INDENT for block epigraphs>
+\# *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:
+\# <amount of lead to add to the epigraph ps for epigraph leading>
+\# *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 | <anything>
+\# *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[#START] \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#AUTHOR_LINES]=1 \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. ie '\\$1'' \{\
+. nr #EPIGRAPH 1
+. ev EPIGRAPH
+. 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]
+. PS \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE]
+. AUTOLEAD \\n[#EPI_AUTOLEAD]
+. nr #EPI_LEAD \\n[#LEAD]
+. nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD]
+. \}
+. di EPI_TEXT
+. 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]
+. PS \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE]
+. AUTOLEAD \\n[#EPI_AUTOLEAD]
+. QUAD \\*[$EPI_QUAD]
+. HY
+. 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:
+\# <none>
+\# *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
+. REMOVE_INDENT
+. ev
+. nr #EPI_DEPTH \\n[#DIVER_DEPTH]-\\n[#EPI_LEAD]
+. nr #EPI_LINES \\n[#EPI_DEPTH]/\\n[#EPI_LEAD]
+. ie \\n[#START] \{\
+. 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] \}
+. RLD \\n[#DOC_LEAD]u
+. 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
+. \}
+. \}
+. \}
+. 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
+. \}
+. \}
+. \}
+. 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 \}
+. \}
+. 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[#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 \{\
+. 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 \}
+. if \\n[#START] \{\
+. if \\n[#COLUMNS] \{\
+. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u
+. mk dc
+. \}
+. \}
+.END
+\#
+\# ====================================================================
+\#
+\# +++FINIS MACRO+++
+\#
+\# FINIS
+\# -----
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Deposits --END-- at the end of a document.
+\#
+.MAC FINIS END
+. if \\n[#TAB_ACTIVE] \{ .TQ \}
+. if \\n[#INDENT_ACTIVE] \{ .IX CLEAR \}
+. FOOTERS OFF
+. PAGINATION OFF
+. nr #EM_ADJUST (1m/8)
+. if \\n[#COLUMNS] \{ .po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u \}
+. ALD \\n[#DOC_LEAD]u
+. CENTER
+. if \\n[#PRINT_STYLE]=1 \{ .PRINT "--\\*[$FINIS_STRING]--\}
+. if \\n[#PRINT_STYLE]=2 \{\
+. PRINT "\v'-\\n[#EM_ADJUST]u'\(em\v'+\\n[#EM_ADJUST]u'\\*[$FINIS_STRING]\v'-\\n[#EM_ADJUST]u'\*[FU1]\(em
+. \}
+.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 FAMILY
+\# -------------
+\# *Argument:
+\# <family to use in header/footers>
+\# *Function:
+\# Creates or modifies string $HDRFTR_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC HDRFTR_FAMILY END
+. ds $HDRFTR_FAM \\$1
+.END
+\#
+\#
+\# HDRFTR SIZE
+\# -----------
+\# *Argument:
+\# <+|-number of points by which to in/decrease point size of
+\# header/footers (relative to running text)>
+\# *Function:
+\# Creates or modifies string $HDRFTR_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign. No space afterwards.
+\# Fractional point sizes are allowed. Default is +0.
+\#
+\# By default, header/footers print the author .5 points smaller
+\# than the base point size of running text, center titles
+\# (Chapter, Draft, Revision, etc.) .5 points smaller
+\# than running text (in italics), and the document title 2 full
+\# points smaller than running text (in caps). The HDRFTR_SIZE
+\# macro changes the overall size for all three parts while
+\# maintaining the internal size changes.
+\#
+\# In other words, if the user likes the header/footers but wants
+\# them a bit bigger or a bit smaller, s/he should use HDRFTR_SIZE.
+\#
+.MAC HDRFTR_SIZE END
+. ds $HDRFTR_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# HDRFTR RULE GAP
+\# ---------------
+\# *Argument:
+\# <amount of space between header/footer and header/footer rule>
+\# *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:
+\# <what to put in the left position of page header/footers>
+\# *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 FAMILY
+\# ------------------
+\# *Argument:
+\# <family of header/footer left string>
+\# *Function:
+\# Creates or modifies string $HDRFTR_LEFT_FAM.
+\#
+.MAC HDRFTR_LEFT_FAMILY END
+. ds $HDRFTR_LEFT_FAM \\$1
+.END
+\#
+\#
+\# HDRFTR LEFT FONT
+\# ----------------
+\# *Argument:
+\# <font of header/footer left string>
+\# *Function:
+\# Creates or modifies string $HDRFTR_LEFT_FT.
+\#
+.MAC HDRFTR_LEFT_FONT END
+. ds $HDRFTR_LEFT_FT \\$1
+.END
+\#
+\#
+\# HDRFTR LEFT SIZE
+\# ----------------
+\# *Argument:
+\# <+|- number of points to in/decrease size of left string in
+\# header/footers (relative to running text)>
+\# *Function:
+\# Creates or modifies string HDRFTR_LEFT_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign. No space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is -.5 for printstyle TYPESET; if all caps, -2
+\# Has no effect in TYPEWRITE.
+\#
+.MAC HDRFTR_LEFT_SIZE END
+. ds $HDRFTR_LEFT_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# HDRFTR LEFT CAPS
+\# ----------------
+\# *Argument:
+\# <none> | <anything>
+\# *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_RIGHT_SIZE_CHANGE +0
+. \}
+.END
+\#
+\#
+\# HDRFTR CENTER
+\# -------------
+\# *Argument:
+\# <what to put in the centre position of page header/footers>
+\# *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
+. ds $HDRFTR_CENTER \\$1
+.END
+\#
+\#
+\# HDRFTR CENTER FAMILY
+\# --------------------
+\# *Argument:
+\# <family of header/footer center string>
+\# *Function:
+\# Creates or modifies string $HDRFTR_CENTER_FAM.
+\#
+.MAC HDRFTR_CENTER_FAMILY END
+. ds $HDRFTR_CENTER_FAM \\$1
+.END
+\#
+\#
+\# HDRFTR CENTER FONT
+\# ------------------
+\# *Argument:
+\# <font of header/footer center string>
+\# *Function:
+\# Creates or modifies string $HDRFTR_CENTER_FT.
+\#
+.MAC HDRFTR_CENTER_FONT END
+. ds $HDRFTR_CENTER_FT \\$1
+.END
+\#
+\#
+\# HDRFTR CENTER SIZE
+\# ------------------
+\# *Argument:
+\# <+|- number of points to in/decrease size of centre string in
+\# header/footers (relative to header/footer size)>
+\# *Function:
+\# Creates string HDRFTR_CENTER_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign. No space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is -.5 for printstyle TYPESET; if all caps, -2
+\# Has no effect in TYPEWRITE.
+\#
+.MAC HDRFTR_CENTER_SIZE END
+. ds $HDRFTR_CENTER_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# HDRFTR CENTER CAPS
+\# ------------------
+\# *Argument:
+\# <none> | <anything>
+\# *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 RIGHT
+\# ------------
+\# *Argument:
+\# <what to put in the right position of page header/footers>
+\# *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 FAMILY
+\# -------------------
+\# *Argument:
+\# <family of header/footer right string>
+\# *Function:
+\# Creates or modifies string $HDRFTR_RIGHT_FAM.
+\#
+.MAC HDRFTR_RIGHT_FAMILY END
+. ds $HDRFTR_RIGHT_FAM \\$1
+.END
+\#
+\#
+\# HDRFTR RIGHT FONT
+\# -----------------
+\# *Argument:
+\# <font of header/footer right string>
+\# *Function:
+\# Creates or modifies string $HDRFTR_RIGHT_FT.
+\#
+.MAC HDRFTR_RIGHT_FONT END
+. ds $HDRFTR_RIGHT_FT \\$1
+.END
+\#
+\#
+\# HDRFTR RIGHT SIZE
+\# -----------------
+\# *Argument:
+\# <+|- number of points to in/decrease size of right string in
+\# header/footers (relative to header/footer size)>
+\# *Function:
+\# Creates or modifies string HDRFTR_RIGHT_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign. No space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is -2 for printstyle TYPESET if all caps; otherwise -.5
+\# Has no effect in TYPEWRITE.
+\#
+.MAC HDRFTR_RIGHT_SIZE END
+. ds $HDRFTR_RIGHT_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# HDRFTR RIGHT CAPS
+\# -----------------
+\# *Argument:
+\# <none> | <anything>
+\# *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:
+\# <none> | <anything>
+\# *Function:
+\# If invoked via the alias HDRFTR_RULE_INTERNAL in HDRFTR, prints a rule
+\# under the header/footer. Otherwise, turns HDRFTR_RULE on or off.
+\#
+.MAC HDRFTR_RULE END \"To print rule under header/over footer.
+. ie '\\$0'HDRFTR_RULE_INTERNAL' \{\
+. 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] \{ .ALD \\n[#HDRFTR_RULE_GAP]u \}
+. if \\n[#FOOTERS_ON] \{\
+. RLD \\n[#LEAD]u*3u+\\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u
+. \}
+. 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:
+\# <none>
+\# *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:
+\# <none> | <anything>
+\# *Function:
+\# Creates or modifies register #SWITCH_HDRFTR, used to switch
+\# default location of HDRFTR_LEFT and HDRFTR_RIGHT.
+\# *Notes:
+\# 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
+\#
+\#
+\# PRINT FOOTER ON FIRST PAGE
+\# --------------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *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:
+\# <none> | <anything>
+\# *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:
+\# <none>
+\# *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[#HEADERS_ON] \{ .vs 0 \}
+. 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]
+. rr #HDRFTR_TMP_CAPS_SWITCH
+. rm $HDRFTR_TMP_SWITCH
+. rm $HDRFTR_TMP_SIZE_CHANGE_SWITCH
+. nr #SWITCH_HDRFTR 0
+. \}
+. nr #PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ]
+. 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 \}
+. ie '\\*[$HDRFTR_CENTER]'#' \{\
+. PRINT \\v'-(\\n[#LEAD]u*1u)'\\n[#PAGENUMBER]
+. \}
+. el \{\
+. ie !'\\*[$HDRFTR_CENTER]'' \{ .PRINT \\v'-(\\n[#LEAD]u*1u)'\\*[$HDRFTR_CENTER] \}
+. 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 \}
+. ie '\\*[$HDRFTR_RIGHT]'#' \{\
+. PRINT \\v'-(\\n[#LEAD]u*2u)'\\n[#PAGENUMBER]
+. \}
+. el \{\
+. ie !'\\*[$HDRFTR_RIGHT]'' \{ .PRINT \v'-(\\n[#LEAD]u*2u)'\\*[$HDRFTR_RIGHT] \}
+. el \{ .PRINT \& \}
+. \}
+. if \\n[#HDRFTR_RIGHT_CAPS] \{ .CAPS OFF \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$HDRFTR_LEFT_FAM]
+. FT \\*[$HDRFTR_LEFT_FT]
+. PS \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_LEFT_SIZE_CHANGE]
+. if \\n[#FOOTERS_ON] \{\
+. di NULL
+. SIZESPECS
+. nr #LEFT_CAP_HEIGHT \\n[#CAP_HEIGHT]
+. di
+. \}
+. if o \{ .LEFT \}
+. if e \{ .RIGHT \}
+. if \\n[#RECTO_VERSO]=0 \{ .LEFT \}
+. if \\n[#HDRFTR_LEFT_CAPS] \{ .CAPS \}
+. ie '\\*[$HDRFTR_LEFT]'#' \{ .PRINT \\n[#PAGENUMBER] \}
+. el \{\
+. ie !'\\*[$HDRFTR_LEFT]'' \{ . PRINT \\*[$HDRFTR_LEFT] \}
+. el \{ .PRINT \& \}
+. \}
+. if \\n[#HDRFTR_LEFT_CAPS] \{ .CAPS OFF \}
+. FAMILY \\*[$HDRFTR_CENTER_FAM]
+. FT \\*[$HDRFTR_CENTER_FT]
+. PS \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_CENTER_SIZE_CHANGE]
+. if \\n[#FOOTERS_ON] \{\
+. di NULL
+. SIZESPECS
+. nr #CENTER_CAP_HEIGHT \\n[#CAP_HEIGHT]
+. di
+. \}
+. CENTER
+. if \\n[#HDRFTR_CENTER_CAPS] \{ .CAPS \}
+. ie '\\*[$HDRFTR_CENTER]'#' \{\
+. PRINT \\v'-(\\n[#LEAD]u*1u)'\\n[#PAGENUMBER]
+. \}
+. el \{\
+. ie !'\\*[$HDRFTR_CENTER]'' \{ .PRINT \\v'-(\\n[#LEAD]u*1u)'\\*[$HDRFTR_CENTER] \}
+. el \{ .PRINT \& \}
+. \}
+. if \\n[#HDRFTR_CENTER_CAPS] \{ .CAPS OFF \}
+. FAMILY \\*[$HDRFTR_RIGHT_FAM]
+. FT \\*[$HDRFTR_RIGHT_FT]
+. PS \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_RIGHT_SIZE_CHANGE]
+. if \\n[#FOOTERS_ON] \{\
+. di NULL
+. SIZESPECS
+. nr #RIGHT_CAP_HEIGHT \\n[#CAP_HEIGHT]
+. di
+. \}
+. if o \{ .RIGHT \}
+. if e \{ .LEFT \}
+. if \\n[#RECTO_VERSO]=0 \{ .RIGHT \}
+. if \\n[#HDRFTR_RIGHT_CAPS] \{ .CAPS \}
+. ie '\\*[$HDRFTR_RIGHT]'#' \{\
+. PRINT \\v'-(\\n[#LEAD]u*2u)'\\n[#PAGENUMBER]
+. \}
+. el \{\
+. ie !'\\*[$HDRFTR_RIGHT]'' \{ .PRINT \v'-(\\n[#LEAD]u*2u)'\\*[$HDRFTR_RIGHT] \}
+. el \{ .PRINT \& \}
+. \}
+. if \\n[#HDRFTR_RIGHT_CAPS] \{ .CAPS OFF \}
+. \}
+. if \\n[#HDRFTR_RULE] \{\
+. HDRFTR_RULE_INTERNAL
+. \}
+.END
+\#
+\#
+\# +++HEADERS+++
+\#
+\# HEADERS (off or on)
+\# -------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *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:
+\# <amount of space between top of page and header>
+\# *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:
+\# <amount of space between header and running text>
+\# *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:
+\# <none>
+\# *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
+. PROCESS_FN_LEFTOVER
+. nr #FN_COUNT_FOR_COLS 0 1
+. if \\n[#RESET_FN_NUMBER] \{ .nr #FN_NUMBER 0 1 \}
+. po \\n[#DOC_L_MARGIN]u
+. if \\n[#RECTO_VERSO] \{\
+. nr #DOC_LR_MARGIN_TMP \\n[#DOC_L_MARGIN]
+. DOC_LEFT_MARGIN \\n[#DOC_R_MARGIN]u
+. DOC_RIGHT_MARGIN \\n[#DOC_LR_MARGIN_TMP]u
+. \}
+. ev HEADER
+. if \\n[#PRINT_STYLE]=1 \{ .vs 0 \}
+. if \\n[#PRINT_STYLE]=2 \{ .LS 0 \}
+. sp |\\n[#HEADER_MARGIN]u-1v
+. ll \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$HDRFTR_FAM]
+. FT R
+. PS \\n[#DOC_PT_SIZE]u\\*[$HDRFTR_SIZE_CHANGE]
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12\\*[$HDRFTR_SIZE_CHANGE]
+. \}
+. 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
+. \}
+. 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 \}
+. \}
+. nr #PAGE_TOP \\n(nl
+. ev
+. po \\n[#L_MARGIN]u
+. if \\n[#RECTO_VERSO] \{\
+. nr #L_MARGIN +\\n[#L_MARGIN_DIFF]
+. po \\n[#L_MARGIN]u
+. \}
+. 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
+. \}
+. \}
+. 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] \{\
+. 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
+. 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[#PRINT_STYLE]=1 \{\
+. if \\n[#SLANT_ON] \{\
+. if \\n[#UNDERLINE_SLANT] \{ .UNDERLINE \}
+. \}
+. \}
+.END
+\#
+\# ====================================================================
+\#
+\# +++FOOTERS+++
+\#
+\# FOOTERS (off or on)
+\# -------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *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:
+\# <footer margin>
+\# *Function:
+\# Creates or modifies register #FOOTER_MARGIN which holds the
+\# amount of space to leave between the page number and the bottom
+\# of the page.
+\# *Notes:
+\# Unit of measure required. Default is 3P.
+\#
+.MAC FOOTER_MARGIN END
+. ie \\n%>0 \{ .nr #FOOTER_MARGIN (\\$1) \}
+. el \{ . \}
+.END
+\#
+\#
+\# FOOTER GAP
+\# ----------
+\# *Argument:
+\# <distance from end of running text to page # or footer>
+\# *Function:
+\# Creates or modifies register #FOOTER_GAP which holds the
+\# amount of space to leave between running text and the page number.
+\# *Notes:
+\# Requires unit of measure. Default is 3P. Measured baseline to
+\# baseline.
+\#
+.MAC FOOTER_GAP END
+. ie \\n%>0 \{ .nr #FOOTER_GAP (\\$1) \}
+. el \{ . \}
+.END
+\#
+\#
+\# FOOTER
+\# ------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Places footer at bottom of page if #FOOTERS=1, otherwise
+\# places page number at bottom of page (if #PAGINATE=1).
+\# Page numbers are in arabic or roman according to COPYSTYLE.
+\# DRAFT starts the document at page 1 regardless of PAGENUMBER.
+\# FINAL respects PAGENUMBER.
+\#
+.MAC FOOTER END
+. ev PAGE_BOTTOM
+. nr #L_MARGIN_DIFF \\n[#L_MARGIN]-\\n[#DOC_L_MARGIN]
+. nr #RESTORE_OFFSET \\n(.o
+. if !\\n[#FN_DEFER] \{\ \"i.e. no defer (do not defer footnote processing to next page or column)
+. nr #DIVER_DEPTH 0
+. if \\n[#FN_COUNT] \{\
+. sp |\\n[#PAGE_LENGTH]u-(\\n[#B_MARGIN]u+\\n[#FN_DEPTH]u)
+. po \\n[#DOC_L_MARGIN]u
+. if \\n[#COLUMNS] \{ .po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u \}
+. nf
+. FOOTNOTES
+. rm FOOTNOTES
+. if '\\n(.z'FN_OVERFLOW' \{\
+. di
+. nr #FN_OVERFLOW_DEPTH \\n[#DIVER_DEPTH]
+. \}
+. nr #FN_COUNT 0
+. if \\n[#COL_NEXT] \{ .nr #COL_NUM \\n-[#COL_NUM] \}
+. \}
+. \}
+. ie \\n[#COLUMNS] \{\
+. ie \\n[#COL_NUM]=\\n[#NUM_COLS] \{ .DO_FOOTER \}
+. el \{\
+. sp |\\n(dcu
+. po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u
+. PROCESS_FN_LEFTOVER
+. if !\\n[#EPIGRAPH] \{ .rr #COL_NEXT \}
+. if !\\n[#QUOTE] \{ .rr #COL_NEXT \}
+. if \\n[#QUOTE] \{\
+. nr #Q_OFFSET \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE])
+. if \\n[#COLUMNS] \{ .nr #Q_OFFSET \\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE]) \}
+. po \\n[#Q_OFFSET]u
+. \}
+. if \\n[#EPIGRAPH] \{\
+. 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
+. \}
+. ie \\n[#EPIGRAPH] \{\
+. ie !\\n[#EPI_ACTIVE] \{\
+. ns
+. rr #EPI_ACTIVE
+. \}
+. el \{\
+. sp |\\n(dcu+(\\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u)
+. rr #EPI_ACTIVE
+. \}
+. \}
+. el \{ .ns \}
+. ev
+. \}
+. ns
+. \}
+. el \{ .DO_FOOTER \}
+.END
+\#
+\#
+\# PROCESS FOOTER
+\# --------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Prints footer (page number, or 3-part footer).
+\# Resets CAPS and UNDERLINE if they were on.
+\#
+.MAC DO_FOOTER END
+. sp |\\n[#PAGE_LENGTH]u-\\n[#FOOTER_MARGIN]u-1v
+. ev FOOTER
+. po \\n[#DOC_L_MARGIN]u
+. ll \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. FAMILY \\*[$HDRFTR_FAM]
+. FT R
+. PS \\n[#DOC_PT_SIZE]u\\*[$HDRFTR_SIZE_CHANGE]
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 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
+. \}
+. ie \\n[#FOOTERS_ON] \{\
+. PRINT_HDRFTR
+. \}
+. el \{\
+. if \\n[#PAGINATE] \{\
+. if \\n[#PAGE_NUM_V_POS]=2 \{ .PRINT_PAGE_NUMBER \}
+. \}
+. \}
+. if \\n[#CAPS_WAS_ON] \{\
+. CAPS
+. rr #CAPS_WAS_ON
+. \}
+. if \\n[#UNDERLINE_WAS_ON] \{\
+. UNDERLINE
+. rr #UNDERLINE_WAS_ON
+. \}
+. ev
+. bp
+. ev
+.END
+\#
+\# ====================================================================
+\#
+\# +++HEADS+++
+\#
+\# ---Head numbers---
+\#
+\# NUMBER HEADS
+\# ------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Toggles register #NUMBER_HEAD; sets incrementing register #HEAD_NUM.
+\# *Notes:
+\# Default is OFF.
+\#
+.MAC NUMBER_HEADS END
+. ie '\\$1'' \{\
+. nr #NUMBER_HEAD 1
+. if !\\n[#HEAD_NUM] \{ .nr #HEAD_NUM 0 1 \}
+. \}
+. el \{ .rr #NUMBER_HEAD \}
+.END
+\#
+\#
+\# RESET HEAD NUMBER
+\# -----------------
+\# *Arguments:
+\# <none> | <desired head number>
+\# *Function:
+\# Resets incrementing register #HEAD_NUM to 1 or, if there's
+\# an argument, to user supplied number.
+\# *Notes:
+\# Also resets subhead and parahead numbers. If this is not
+\# desired, subhead and parahead numbers may be reset individually.
+\#
+.MAC RESET_HEAD_NUMBER END
+. ie '\\$1'' \{\
+. nr #HEAD_NUM 0 1
+. nr #SH_NUM 0 1
+. nr #PH_NUM 0 1
+. \}
+. el \{\
+. nr #HEAD_NUM \\$1-1 1
+. nr #SH_NUM 0 1
+. nr #PH_NUM 0 1
+. \}
+.END
+\#
+\#
+\# NUMBER SUBHEADS
+\# ---------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Toggles register #NUMBER_SH; sets incrementing register #SH_NUM.
+\# *Notes:
+\# Default is OFF.
+\#
+.MAC NUMBER_SUBHEADS END
+. ie '\\$1'' \{\
+. nr #NUMBER_SH 1
+. if !\\n[#SH_NUM] \{ .nr #SH_NUM 0 1 \}
+. \}
+. el \{ .rr #NUMBER_SH \}
+.END
+\#
+\#
+\# RESET SUBHEAD NUMBER
+\# --------------------
+\# *Arguments:
+\# <none> | <desired subhead number>
+\# *Function:
+\# Resets incrementing register #SH_NUM to 1 or, if there's
+\# an argument, to user supplied number.
+\# *Notes:
+\# When the subhead number is reset, it resets the parahead number as
+\# well. If this behaviour is not what's wanted, RESET_SUBHEAD_NUMBER
+\# allows the user to set the parahead number to whatever s/he desires.
+\#
+.MAC RESET_SUBHEAD_NUMBER END
+. ie '\\$1'' \{ .nr #SH_NUM 0 1 \}
+. el \{\
+. nr #SH_NUM \\$1-1 1
+. nr #PH_NUM 0 1
+. \}
+.END
+\#
+\#
+\# NUMBER PARAHEADS
+\# ----------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Toggles register #NUMBER_PH; sets incrementing register #PH_NUM.
+\# *Notes:
+\# Default is OFF.
+\#
+.MAC NUMBER_PARAHEADS END
+. ie '\\$1'' \{\
+. nr #NUMBER_PH 1
+. if !\\n[#PH_NUM] \{ .nr #PH_NUM 0 1 \}
+. \}
+. el \{ .rr #NUMBER_PH \}
+.END
+\#
+\#
+\# RESET PARAHEAD NUMBER
+\# ---------------------
+\# *Arguments:
+\# <none> | <desired parahead number>
+\# *Function:
+\# Resets incrementing register #PH_NUM to 1 or, if there's
+\# an argument, to user supplied number.
+\# *Notes:
+\# Resetting the parahead number resets the parahead number
+\# only.
+\#
+.MAC RESET_PARAHEAD_NUMBER END
+. ie '\\$1'' \{ .nr #PH_NUM 0 1 \}
+. el \{ nr #SH_NUM \\$1-1 1 \}
+.END
+\#
+\#
+\# ---Main heads---
+\#
+\# HEAD FAMILY
+\# -----------
+\# *Argument:
+\# <family to use for section titles (main heads)>
+\# *Function:
+\# Creates or modifies string $HEAD_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC HEAD_FAMILY END
+. ds $HEAD_FAM \\$1
+.END
+\#
+\#
+\# HEAD FONT
+\# ---------
+\# *Argument:
+\# <font to use for section titles (main heads)>
+\# *Function:
+\# Creates or modifies string $HEAD_FT.
+\# *Notes:
+\# Default is bold.
+\#
+.MAC HEAD_FONT END
+. ds $HEAD_FT \\$1
+.END
+\#
+\#
+\# HEAD SIZE
+\# ---------
+\# *Argument:
+\# <+|- number of points by which to in/decrease point size of
+\# section titles (relative to running text)>
+\# *Function:
+\# Creates or modifies string $HEAD_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a - or + sign with no space afterwards.
+\# Fractional point sizes are allowed.
+\# Default +1 for printstyle TYPESET; +0 for TYPEWRITE.
+\#
+.MAC HEAD_SIZE END
+. ds $HEAD_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# HEAD QUAD
+\# ---------
+\# *Arguments:
+\# L | LEFT | R | RIGHT | C | CENTER | CENTRE
+\# *Function:
+\# Creates or modifies string $HEAD_QUAD.
+\# *Notes:
+\# Default is CENTER.
+\#
+.MAC HEAD_QUAD END
+. ds $HEAD_QUAD \\$1
+.END
+\#
+\#
+\# HEAD CAPS
+\# ---------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Creates or modifies register #HEAD_CAPS.
+\# *Notes:
+\# Default is on.
+\#
+.MAC HEAD_CAPS END
+. ie '\\$1'' \{ .nr #HEAD_CAPS 1 \}
+. el \{ .nr #HEAD_CAPS 0 \}
+.END
+\#
+\#
+\# HEAD SPACE
+\# ----------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Creates register #HEAD_SPACE, which toggles whether the space
+\# before heads is 1 extra line space ("off") or 2 ("on"). Used only
+\# in PRINTSTYLE TYPESET.
+\# *Notes:
+\# Default is on.
+\#
+.MAC HEAD_SPACE END
+. ie '\\$1'' \{ .nr #HEAD_SPACE 1 \}
+. el \{ .nr #HEAD_SPACE 0 \}
+.END
+\#
+\#
+\# HEAD UNDERLINE
+\# --------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Creates or modifies register #HEAD_UNDERLINE.
+\# *Notes:
+\# Default is on.
+\#
+.MAC HEAD_UNDERLINE END
+. ie '\\$1'' \{ .nr #HEAD_UNDERLINE 1 \}
+. el \{ .nr #HEAD_UNDERLINE 0 \}
+.END
+\#
+\#
+\# MAIN HEAD
+\# ---------
+\# *Arguments:
+\# "text of main head" ["text of main head"] ...
+\# *Function:
+\# In TYPEWRITE, prints main heads centered, all caps, underlined.
+\# In TYPESET, prints bold main heads 1 point larger than running
+\# text, all caps, underlined.
+\# *Notes:
+\# The HEAD macro requires that double-quotes (") surround
+\# each line of text.
+\#
+.MAC HEAD END
+. br
+. nr #ARG_NUM 0 1
+. nr #HEAD 1
+. ev HEAD
+. ll \\n[#L_LENGTH]u
+. ta \\n(.lu
+. if \\n[#COLUMNS] \{\
+. ll \\n[#COL_L_LENGTH]u
+. ta \\n(.lu
+. \}
+. CHECK_INDENT
+. QUAD \\*[$HEAD_QUAD]
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. vs \\n[#DOC_LEAD]u
+. UNDERLINE OFF
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$HEAD_FAM]
+. FT \\*[$HEAD_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$HEAD_SIZE_CHANGE]
+. LS \\n[#DOC_LEAD]u
+. \}
+. if r#QUOTE \{ .rr #QUOTE \}
+. if r#EPIGRAPH \{ .rr #EPIGRAPH \}
+. if \\n[#PRINT_STYLE]=1 \{ .ne 3 \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#HEAD_SPACE] \{ .ne 5 \}
+. el \{ .ne 3 \}
+. \}
+. ie \\n[#START] \{\
+. if \\n[#DOC_HEADER]=0 \{ . \}
+. \}
+. el \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. if !\\n[#LINEBREAK] \{\
+. ALD \\n[#DOC_LEAD]u
+. if \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#PP_SPACE] \{\
+. ie \\n[#END_QUOTE] \{ . \}
+. el \{\
+. if !\\n[#LINEBREAK] \{
+. if \\n[#HEAD_SPACE] \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. \}
+. el \{\
+. ie \\n[#HEAD_SPACE] \{ .ALD \\n[#DOC_LEAD]u*2u \}
+. el \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. if \\n[#END_QUOTE] \{\
+. if !\\n[#Q_FITS] \{\
+. RLD \\n[#DOC_LEAD]u
+. if \\n[#PP_ACTIVE] \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. if \\n[#Q_AT_TOP] \{\
+. RLD \\n[#DOC_LEAD]u
+. if \\n[#Q_AT_TOP] \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. if \\n[#LINEBREAK] \{\
+. if \\n[#HEAD_SPACE] \{ .RLD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. \}
+. if \\n[#HEAD_CAPS] \{ .CAPS \}
+. while \\n[#ARG_NUM]<\\n[#NUM_ARGS] \{\
+. ie \\n[#NUMBER_HEAD] \{\
+. ie \\n[#ARG_NUM]=0 \{\
+. br
+. ie \\n[#HEAD_UNDERLINE]=0 \{ .PRINT "\\n+[#HEAD_NUM].\0\\$[\\n+[#ARG_NUM]]\}
+. el \{ .UNDERSCORE "\\n+[#HEAD_NUM].\0\\$[\\n+[#ARG_NUM]]\}
+. br
+. \}
+. el \{\
+. br
+. ie \\n[#HEAD_UNDERLINE]=0 \{ .PRINT "\\$[\\n+[#ARG_NUM]]\}
+. el \{ .UNDERSCORE "\\$[\\n+[#ARG_NUM]]\}
+. br
+. \}
+. \}
+. el \{\
+. br
+. ie \\n[#HEAD_UNDERLINE]=0 \{ .PRINT "\\$[\\n+[#ARG_NUM]]\}
+. el \{ .UNDERSCORE "\\$[\\n+[#ARG_NUM]]\}
+. br
+. \}
+. \}
+. REMOVE_INDENT
+. CAPS OFF
+. ev
+. ALD \\n[#DOC_LEAD]u
+. RESET_SUBHEAD_NUMBER
+. RESET_PARAHEAD_NUMBER
+. if r#START \{ .rr #START \}
+. if r#EPIGRAPH \{ .rr #EPIGRAPH \}
+. if r#QUOTE \{ .rr #QUOTE \}
+. if r#Q_FITS \{ .rr #Q_FITS \}
+. if r#END_QUOTE \{ .rr #END_QUOTE \}
+. if r#LINEBREAK \{ .rr #LINEBREAK \}
+. if r#Q_AT_TOP \{ .rr #Q_AT_TOP \}
+. if r#PP_ACTIVE \{ .rr #PP_ACTIVE \}
+. rr #ARG_NUM
+. nr #PP 0
+.END
+\#
+\#
+\# ---Subheads---
+\#
+\# SUBHEAD FAMILY
+\# --------------
+\# *Argument:
+\# <family to use in subheads>
+\# *Function:
+\# Creates or modifies string $SH_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC SUBHEAD_FAMILY END
+. ds $SH_FAM \\$1
+.END
+\#
+\#
+\# SUBHEAD FONT
+\# --------------
+\# *Argument:
+\# <font to use in subheads>
+\# *Function:
+\# Creates or modifies string $SH_FT.
+\# *Notes:
+\# Default is bold.
+\#
+.MAC SUBHEAD_FONT END
+. ds $SH_FT \\$1
+.END
+\#
+\#
+\# SUBHEAD SIZE
+\# ------------
+\# *Argument:
+\# <+|- number of points by which to in/decrease point size of subheads
+\# (relative to running text)>
+\# *Function:
+\# Creates or modifies string $SH_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign. No space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is +.5 for printstyle TYPESET; +0 for TYPEWRITE.
+\#
+.MAC SUBHEAD_SIZE END
+. ds $SH_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# SUBHEAD QUAD
+\# ------------
+\# *Argument:
+\# L | LEFT | R | RIGHT | C | CENTER | CENTRE
+\# *Function:
+\# Creates or modifies string $SH_QUAD.
+\# *Notes:
+\# Default is LEFT for both TYPESET and TYPEWRITE.
+\#
+.MAC SUBHEAD_QUAD END
+. ds $SH_QUAD \\$1
+.END
+\#
+\#
+\# SUBHEAD
+\# -------
+\# *Arguments:
+\# "text of subhead" ["text of subhead"] ...
+\# *Function:
+\# In TYPEWRITE, prints subheads underlined.
+\# In TYPESET, prints subheads bold, .5 points larger than running
+\# text.
+\# In both styles, a line space precedes the subhead, and a small
+\# amount of lead comes after.
+\# *Notes:
+\# As with the HEAD macro, double-quotes (") must surround
+\# each line of text.
+\#
+.MAC SUBHEAD END
+. br
+. nr #ARG_NUM 0 1
+. if r#QUOTE \{ .rr #QUOTE \}
+. if r#Q_AT_TOP \{ .rr #Q_AT_TOP \}
+. ev SUBHEAD
+. ll \\n[#L_LENGTH]u
+. ta \\n(.lu
+. if \\n[#COLUMNS] \{\
+. ll \\n[#COL_L_LENGTH]u
+. ta \\n(.lu
+. \}
+. CHECK_INDENT
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. vs \\n[#DOC_LEAD]u
+. QUAD \\*[$SH_QUAD]
+. UNDERLINE OFF
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$SH_FAM]
+. FT \\*[$SH_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$SH_SIZE_CHANGE]
+. LS \\n[#DOC_LEAD]u
+. QUAD \\*[$SH_QUAD]
+. \}
+. if \\n[#PRINT_STYLE]=1 \{ .nr #SH_LEAD_ADJUST \\n[#LEAD]/5 \}
+. if \\n[#PRINT_STYLE]=2 \{ .nr #SH_LEAD_ADJUST \\n[#LEAD]/8 \}
+. ie \\n[#START] \{ . \}
+. el \{\
+. ie ( \\n[#TRAP_DISTANCE] < (\\n[#DOC_LEAD]u*2u) ) \{\
+. ie \\n[#COLUMNS] \{ .COL_NEXT \}
+. el \{ .bp \}
+. \}
+. el \{\
+. ie \\n[#HEAD]=1 \{ . \}
+. el \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. if !\\n[#LINEBREAK] \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#PP_SPACE]=1 \{\
+. ie !\\n[#LINEBREAK] \{ .ALD \\n[#DOC_LEAD]u \}
+. el \{ .RLD \\n[#DOC_LEAD]u \}
+. \}
+. el \{\
+. if !\\n[#LINEBREAK] \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. \}
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. while \\n[#ARG_NUM]<\\n[#NUM_ARGS] \{\
+. ie \\n[#NUMBER_SH] \{\
+. ie \\n[#ARG_NUM]=0 \{\
+. ie \\n[#NUMBER_HEAD] \{\
+. br
+. UNDERSCORE "\v'-\\n[#SH_LEAD_ADJUST]u'\\n[#HEAD_NUM].\\n+[#SH_NUM]\0\\$[\\n+[#ARG_NUM]]
+. br
+. \}
+. el \{\
+. br
+. UNDERSCORE "\v'-\\n[#SH_LEAD_ADJUST]u'\\n+[#SH_NUM].\0\\$[\\n+[#ARG_NUM]]
+. br
+. \}
+. \}
+. el \{\
+. br
+. ie \\n[#HEAD_UNDERLINE]=0 \{ .PRINT "\v'-\\n[#SH_LEAD_ADJUST]u'\\$[\\n+[#ARG_NUM]]\}
+. el \{ .UNDERSCORE "\v'-\\n[#SH_LEAD_ADJUST]u'\\$[\\n+[#ARG_NUM]]\}
+. br
+. \}
+. \}
+. el \{\
+. br
+. UNDERSCORE "\v'-\\n[#SH_LEAD_ADJUST]u'\\$[\\n+[#ARG_NUM]]
+. br
+. \}
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#PP_SPACE]=0 \{\
+. while \\n[#ARG_NUM]<\\n[#NUM_ARGS] \{\
+. ie \\n[#NUMBER_SH] \{\
+. ie \\n[#ARG_NUM]=0 \{\
+. ie \\n[#NUMBER_HEAD] \{\
+. br
+. PRINT "\v'-\\n[#SH_LEAD_ADJUST]u'\\n[#HEAD_NUM].\\n+[#SH_NUM]\0\\$[\\n+[#ARG_NUM]]
+. br
+. \}
+. el \{\
+. br
+. PRINT "\v'-\\n[#SH_LEAD_ADJUST]u'\\n+[#SH_NUM].\0\\$[\\n+[#ARG_NUM]]
+. br
+. \}
+. \}
+. el \{\
+. br
+. PRINT "\\v'-\\n[#SH_LEAD_ADJUST]u'\\$[\\n+[#ARG_NUM]]
+. br
+. \}
+. \}
+. el \{\
+. br
+. PRINT "\\v'-\\n[#SH_LEAD_ADJUST]u'\\$[\\n+[#ARG_NUM]]
+. br
+. \}
+. \}
+. \}
+. el \{\
+. ALD \\n[#DOC_LEAD]u
+. if \\n[#HEAD]=1 \{ .RLD \\n[#DOC_LEAD]u \}
+. if \\n[#END_QUOTE] \{ .RLD \\n[#DOC_LEAD]u \}
+. if \\n[#EPIGRAPH] \{ .RLD \\n[#DOC_LEAD]u \}
+. while \\n[#ARG_NUM]<\\n[#NUM_ARGS] \{\
+. PRINT "\\$[\\n+[#ARG_NUM]]
+. \}
+. ALD \\n[#DOC_LEAD]u
+. \}
+. \}
+. REMOVE_INDENT
+. ev
+. RESET_PARAHEAD_NUMBER
+. if r#START \{ .rr #START \}
+. if r#EPIGRAPH \{ .rr #EPIGRAPH \}
+. if r#Q_FITS \{ .rr #Q_FITS \}
+. if r#END_QUOTE \{ .rr #END_QUOTE \}
+. if r#LINEBREAK \{ .rr #LINEBREAK \}
+. nr #PP 0
+. nr #HEAD 2
+.END
+\#
+\# ---Paragraph heads---
+\#
+\# PARAHEAD FAMILY
+\# ---------------
+\# *Argument:
+\# <family to use in paraheads>
+\# *Function:
+\# Creates or modifies string $PH_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC PARAHEAD_FAMILY END
+. ds $PH_FAM \\$1
+.END
+\#
+\#
+\# PARAHEAD FONT
+\# -------------
+\# *Argument:
+\# <font to use in paraheads>
+\# *Function:
+\# Creates or modifies string $PH_FT.
+\# *Notes:
+\# Default is bold italic for TYPESET; underlined for TYPEWRITE.
+\#
+.MAC PARAHEAD_FONT END
+. ds $PH_FT \\$1
+.END
+\#
+\#
+\# PARAHEAD SIZE
+\# -------------
+\# *Argument:
+\# <+|- number of points by which to in/decrease point size of subheads
+\# (relative to running text)>
+\# *Function:
+\# Creates or modifies string $PH_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign. No space afterwards.
+\# Fractional point sizes are allowed. No unit of measure, please.
+\# Default is +.5 for printstyle TYPESET; +0 for TYPEWRITE.
+\#
+.MAC PARAHEAD_SIZE END
+. ds $PH_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# PARAHEAD INDENT
+\# ---------------
+\# *Argument:
+\# <size of indent>
+\# *Function:
+\# Creates or modifies register #PH_INDENT.
+\# *Notes:
+\# Default is 1/2 #PP_INDENT for TYPESET and TYPEWRITE.
+\#
+.MAC PARAHEAD_INDENT END
+. nr #PH_INDENT (\\$1)
+.END
+\#
+\#
+\# PARAHEAD
+\# --------
+\# *Arguments:
+\# "<para head>"
+\# *Function:
+\# Deposits a paragraph head at the start and into the body of a
+\# paragraph.
+\# *Notes:
+\# PARAHEAD *must* come after PP.
+\#
+.MAC PARAHEAD END
+. if \\n[#SLANT_ON] \{\
+. nr #SLANT_WAS_ON 1
+. \\*[SLANTX]\c
+. \}
+. ie \\n[#PP]=1 \{\
+. if \\n[#INDENT_FIRST_PARAS] \{\
+. ti \\n[#PH_INDENT]u
+. \}
+. \}
+. el \{ .ti \\n[#PH_INDENT]u \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. UNDERLINE OFF
+. ie \\n[#NUMBER_PH] \{\
+. if \\n[#NUMBER_HEAD] \{\
+. ie \\n[#NUMBER_SH] \{\
+. UNDERSCORE "\R'#NUMBERED 1'\\n[#HEAD_NUM].\\n[#SH_NUM].\\n+[#PH_NUM].\\ \\$1"
+\0
+. \}
+. el \{\
+. UNDERSCORE "\R'#NUMBERED 1'\\n[#HEAD_NUM].\\n+[#PH_NUM].\\ \\$1
+\0
+. \}
+. \}
+. ie \\n[#NUMBER_SH] \{\
+. if !\\n[#NUMBERED] \{\
+. UNDERSCORE "\\n[#SH_NUM].\\n+[#PH_NUM].\\ \\$1
+\0
+. \}
+. \}
+. el \{\
+. if !\\n[#NUMBERED] \{\
+. UNDERSCORE "\\n+[#PH_NUM].\\ \\$1
+\0
+. \}
+. \}
+. \}
+. el \{\
+. UNDERSCORE "\\$1
+\0
+. \}
+. if \\n[#SLANT_WAS_ON] \{\
+. if \\n[#UNDERLINE_SLANT] \{ .UNDERLINE \}
+. if \\n[#SLANT_MEANS_SLANT] \{\
+. \\*[SLANT]\c
+. \}
+. rr #SLANT_WAS_ON
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAM \\*[$PH_FAM]
+. FT \\*[$PH_FT]
+. PS \\*[$PH_SIZE_CHANGE]
+. ie \\n[#NUMBER_PH] \{\
+. if \\n[#NUMBER_HEAD] \{\
+. ie \\n[#NUMBER_SH] \{\
+. PRINT "\R'#NUMBERED 1'\\n[#HEAD_NUM].\\n[#SH_NUM].\\n+[#PH_NUM].\0\\$1\h'.6m'\c"
+. \}
+. el \{\
+. PRINT "\R'#NUMBERED 1'\\n[#HEAD_NUM].\\n+[#PH_NUM].\0\\$1\h'.6m'\c"
+. \}
+. \}
+. ie \\n[#NUMBER_SH] \{\
+. if !\\n[#NUMBERED] \{\
+. PRINT "\\n[#SH_NUM].\\n+[#PH_NUM].\0\\$1\h'.6m'\c"
+. \}
+. \}
+. el \{\
+. if !\\n[#NUMBERED] \{\
+. PRINT "\\n+[#PH_NUM].\0\\$1\h'.6m'\c"
+. \}
+. \}
+. \}
+. el \{\
+. PRINT "\\$1\h'.6m'\c"
+. \}
+. FAMILY \\*[$DOC_FAM]
+. FT \\*[$PP_FT]
+. PS \\n[#DOC_PT_SIZE]u
+. if \\n[#SLANT_WAS_ON] \{\
+. rr #SLANT_WAS_ON 1
+. \\*[SLANT]\c
+. \}
+. \}
+. rr #NUMBERED
+.END
+\#
+\#
+\# ====================================================================
+\#
+\# +++LINE BREAKS+++
+\#
+\# LINEBREAK CHARACTER
+\# -------------------
+\# *Arguments:
+\# [character] [iterations] [vertical adjustment]
+\# *Function:
+\# Allows user to specify a line break character and the number
+\# of times to repeat it horiontally.
+\# *Notes:
+\# Without an argument, LINEBREAK_CHAR will deposit a blank line.
+\#
+\# Vertical adjustment requires a unit of measure (most likely
+\# "p"), and has to be preceded by +|-
+\#
+.MAC LINEBREAK_CHAR END
+. nr #REPEAT 1
+. ds $LINEBREAK_CHAR \\$1
+. ds $LINEBREAK_CHAR_V_ADJ \\$3
+. if '\\*[$LINEBREAK_CHAR_V_ADJ]'' \{\
+. ds $LINEBREAK_CHAR_V_ADJ +0
+. \}
+. while \\$2>\\n[#REPEAT] \{\
+. as $LINEBREAK_CHAR "\\ \\$1
+. nr #REPEAT \\n[#REPEAT]+1
+. \}
+. rr #REPEAT
+.END
+\#
+\#
+\# LINE BREAK
+\# ----------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Deposits line break character.
+\# *Notes:
+\# If $LINEBREAK_CHAR is blank, simply advances 2 line spaces.
+\#
+.MAC LINEBREAK END
+. if r#Q_AT_TOP \{ .rr #Q_AT_TOP \}
+. po \\n[#DOC_L_MARGIN]u
+. ie '\\*[$LINEBREAK_CHAR]'' \{ .ALD \\n[#DOC_LEAD]u*2 \}
+. el \{\
+. if \\n[#PRINT_STYLE]=1 \{\
+. ie \\n[#END_QUOTE] \{ . \}
+. el \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#END_QUOTE] \{ . \}
+. el \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. CENTER
+. PRINT \\v'\\*[$LINEBREAK_CHAR_V_ADJ]'\\*[$LINEBREAK_CHAR]\\v'\\*[$LINEBREAK_CHAR_V_ADJ]'
+. if \\n[#PRINT_STYLE]=1 \{ .ALD \\n[#DOC_LEAD]u \}
+. if \\n[#PRINT_STYLE]=2 \{ .ALD \\n[#DOC_LEAD]u \}
+. QUAD \\*[$DOC_QUAD]
+. \}
+. nr #LINEBREAK 1
+. if r#QUOTE \{ .rr #QUOTE \}
+. if r#END_QUOTE \{ .rr #END_QUOTE \}
+. nr #PP 0
+.END
+\#
+\# ====================================================================
+\#
+\# +++PARAGRAPHS+++
+\#
+\# PARAGRAPH FONT
+\# --------------
+\# *Argument:
+\# <font of running text>
+\# *Function:
+\# Creates or modifies string $PP_FT.
+\# *Notes:
+\# Affects all paragraphs.
+\#
+.MAC PP_FONT END
+. if \\n[#IGNORE] \{ .return \}
+. br
+. ds $PP_FT \\$1
+. FT \\*[$PP_FT]
+.END
+\#
+\#
+\# PARAGRAPH INDENT
+\# ----------------
+\# *Argument:
+\# <amount to indent paragraphs in running text (ipPcm)>
+\# *Function:
+\# Allows user to change the default para indent. The change will
+\# affect the indent of QUOTEs and BLOCKQUOTEs as well.
+\# *Notes:
+\# Default for printstyle TYPEWRITE is 1/2-inch. Default for
+\# printstyle TYPESET is 2 ems. The defaults are set in
+\# ydocs_printstyle, not in ydocs_defaults.
+\#
+.MAC PARA_INDENT END
+. nr #PP_INDENT (\\$1)
+.END
+\#
+\#
+\# INDENT FIRST PARAGRAPHS
+\# -----------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# By default, the first para of a document, as well as the first
+\# paras of blockquotes and block-style epigraphs are not indented.
+\# When invoked, this macro will indent all paras.
+\# *Notes:
+\# Default is OFF.
+\#
+.MAC INDENT_FIRST_PARAS END
+. ie '\\$1'' \{ .nr #INDENT_FIRST_PARAS 1 \}
+. el \{ .rr #INDENT_FIRST_PARAS \}
+.END
+\#
+\#
+\# INTER-PARAGRAPH SPACING
+\# -----------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Adds a line space between paragraphs in body text. Block quotes
+\# are unaffected.
+\# *Notes:
+\# Default is OFF. PARA_SPACE ON is not recommended for use
+\# with PRINTSTYLE TYPEWRITE.
+\#
+.MAC PARA_SPACE END
+. ie '\\$1'' \{ .nr #PP_SPACE 1 \}
+. el \{ .rr #PP_SPACE \}
+.END
+\#
+\#
+\# PARAGRAPH
+\# ---------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Figures out what to do with paragraphs under differing conditions.
+\# *Notes:
+\# For the time being, there's no automatic widow/orphan control.
+\# Controlling them isn't just a matter of establishing an arbitrary
+\# number of lines needed for a para, since groff doesn't then
+\# handle single line paragraphs gracefully. Usually, the whole
+\# page needs to be tweaked.
+\#
+\# Note the use of transparent line break (\!.br) to get
+\# PP to work within blockquotes and epigraphs.
+\#
+\# PP_STYLE 1 = regular paras; 2 = blockquotes, epigraphs
+\#
+.MAC PP END
+. br
+. if \\n[#DOC_TYPE]=4 \{\
+. if !'\\n(.z'' \{ .di \}
+. if \\n[#DATE] \{\
+. nf
+. DATE
+. QUAD \\*[$DOC_QUAD]
+. ALD \\n[#DOC_LEAD]u*2u
+. rr #DATE
+. \}
+. if \\n[#TO] \{\
+. nf
+. TO_ADDRESS
+. ALD \\n[#DOC_LEAD]u
+. rr #TO
+. \}
+. if \\n[#FROM] \{\
+. nf
+. FROM_ADDRESS
+. ALD \\n[#DOC_LEAD]u
+. rr #FROM
+. \}
+. if \\n[#GREETING] \{\
+. nf
+. GREETING
+. ALD \\n[#DOC_LEAD]u
+. rr #GREETING
+. \}
+. \}
+. rr #PP_ACTIVE
+. if r#Q_AT_TOP \{ .rr #Q_AT_TOP \}
+. if \\n[#PP_STYLE]=1 \{\
+. br
+. po \\n[#L_MARGIN]u
+. if \\n[#COLUMNS] \{\
+. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u
+. \}
+. if \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \}
+. ie \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. vs \\n[#DOC_LEAD]u
+. QUAD \\*[$DOC_QUAD]
+. UNDERLINE OFF
+. if \\n[#SLANT_ON] \{\
+. if \\n[#UNDERLINE_SLANT] \{ .UNDERLINE \}
+. \}
+. \}
+. el \{\
+. FAMILY \\*[$DOC_FAM]
+. FT \\*[$PP_FT]
+. PS \\n[#DOC_PT_SIZE]u
+. LS \\n[#DOC_LEAD]u
+. QUAD \\*[$DOC_QUAD]
+. \}
+. ie \\n[#PP]=0 \{\
+. if \\n[#INDENT_FIRST_PARAS] \{\
+. ie \\n[#INDENT_ACTIVE] \{ .ti \\n[#INDENT]u+\\n[#PP_INDENT]u \}
+. el \{ .ti \\n[#PP_INDENT]u \}
+. \}
+. if r#END_QUOTE \{\
+. if \\n[#END_QUOTE] \{\
+. if !\\n[#LINEBREAK] \{\
+. ie \\n[#INDENT_ACTIVE] \{ .ti \\n[#INDENT]u+\\n[#PP_INDENT]u \}
+. el \{ .ti \\n[#PP_INDENT]u \}
+. \}
+. \}
+. \}
+. \}
+. el \{\
+. br
+. if \\n[#PP_SPACE] \{\
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#END_QUOTE] \{\
+. rr #END_QUOTE
+. \}
+. el \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. ie \\n[#INDENT_ACTIVE] \{ .ti \\n[#INDENT]u+\\n[#PP_INDENT]u \}
+. el \{ .ti \\n[#PP_INDENT]u \}
+. \}
+. if r#START \{ .rr #START \}
+. if r#QUOTE \{ .rr #QUOTE \}
+. if r#END_QUOTE \{ .rr #END_QUOTE \}
+. if r#HEAD \{ .rr #HEAD \}
+. if r#EPIGRAPH \{ .rr #EPIGRAPH \}
+. if r#Q_FITS \{ .rr #Q_FITS \}
+. if r#LINEBREAK \{ .rr #LINEBREAK \}
+. if \\n[#CONDENSE] \{\
+\E*[COND]\c
+. \}
+. if \\n[#EXTEND]=1 \{\
+\E*[EXT]\c
+. \}
+. nr #PP +1
+. \}
+. if \\n[#PP_STYLE]=2 \{\
+\!. br
+. if \\n[#BROKEN_QUOTE] \{\
+. ie \\n(nl=\\n[#PAGE_TOP] \{ .nr #Q_PP 1\}
+. el \{ .nr #Q_PP 0 \}
+. rr #BROKEN_QUOTE
+. \}
+. ie \\n[#Q_PP]=0 \{\
+. if \\n[#INDENT_FIRST_PARAS] \{\
+. ti \\n[#PP_INDENT]u/2u
+. \}
+. \}
+. el \{\
+. ti \\n[#PP_INDENT]u/2u
+. \}
+. if \\n[#CONDENSE] \{\
+\E*[COND]\c
+. \}
+. if \\n[#EXTEND]=1 \{\
+\E*[EXT]\c
+. \}
+. nr #Q_PP +1
+. \}
+. nr #PP_ACTIVE 1
+.END
+\#
+\# ====================================================================
+\#
+\# +++QUOTES+++
+\#
+\# ---Line for line (poetic) quotes---
+\#
+\# QUOTE FAMILY
+\# ------------
+\# *Argument:
+\# <family to use in line for line quotes>
+\# *Function:
+\# Creates or modifies string $QUOTE_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC QUOTE_FAMILY END
+. ds $QUOTE_FAM \\$1
+.END
+\#
+\#
+\# QUOTE FONT
+\# ----------
+\# *Argument:
+\# <font to use in line for line quotes>
+\# *Function:
+\# Creates or modifies string $QUOTE_FT.
+\# *Notes:
+\# Default is italic for TYPESET.
+\#
+.MAC QUOTE_FONT END
+. ds $QUOTE_FT \\$1
+.END
+\#
+\#
+\# QUOTE SIZE
+\# ----------
+\# *Argument:
+\# <-|+ number of points by which to de/increase point size of
+\# line for line quotes (relative to running text)>
+\# *Function:
+\# Creates or modifies string $QUOTE_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a - or + sign with no space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is +0.
+\#
+.MAC QUOTE_SIZE END
+. ds $QUOTE_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# UNDERLINE QUOTES
+\# ----------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Creates or modifies register #UNDERLINE_QUOTES (toggle).
+\# If on, line for line quotes are underlined when printstyle
+\# is TYPEWRITE.
+\# *Notes:
+\# Default is ON for printstyle TYPEWRITE.
+\#
+.MAC UNDERLINE_QUOTES END
+. ie '\\$1'' \{ .nr #UNDERLINE_QUOTES 1 \}
+. el \{ .rr #UNDERLINE_QUOTES \}
+.END
+\#
+\#
+\# QUOTE INDENT
+\# ------------
+\# *Argument:
+\# <value by which to multiply PP_INDENT for indented quoted text>
+\# *Function:
+\# Creates or modifies register #Q_OFFSET_VALUE.
+\# *Notes:
+\# Default is 3 for typeset; 2 for typewrite
+\#
+.MAC QUOTE_INDENT END
+. nr #Q_OFFSET_VALUE \\$1
+.END
+\#
+\#
+\# ALWAYS FULLSPACE QUOTES
+\# -----------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Toggles register #FULLSPACE_QUOTES.
+\# *Notes:
+\# If user doesn't like the default 1/2 line space above and below
+\# quotes, s/he can turn it off here. Has no effect in TYPEWRITE.
+\#
+.MAC ALWAYS_FULLSPACE_QUOTES END
+. if '\\$1'' \{ .nr #FULLSPACE_QUOTES 1 \}
+. el \{ .rr #FULLSPACE_QUOTES \}
+.END
+\#
+\#
+\# QUOTE
+\# -----
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Indents quoted text on a line for line basis, or turns QUOTE off.
+\# *Notes:
+\# Owing to the need to bottom align TYPESET pages, quoted text gets
+\# diverted so its depth can be measured (in DO_QUOTE) for determining
+\# how much space to put before and after.
+\#
+.MAC QUOTE END
+. br
+\# **Uncomment the next line to prevent orphaned quote lines.
+\#. ne 1
+. ie '\\$1'' \{\
+. ev QUOTE
+. nr #QUOTE 1
+. di P_QUOTE
+. ll \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*\\n[#Q_OFFSET_VALUE]u)
+. ta \\n(.lu
+. if \\n[#COLUMNS] \{\
+. ll \\n[#COL_L_LENGTH]u-(\\n[#PP_INDENT]u*\\n[#Q_OFFSET_VALUE]u)
+. ta \\n(.lu
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. vs \\n[#DOC_LEAD]u
+. LEFT
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$QUOTE_FAM]
+. FT \\*[$QUOTE_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$QUOTE_SIZE_CHANGE]
+. LS \\n[#DOC_LEAD]u
+. LEFT
+. \}
+. nr #Q_TOP \\n(nl
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#UNDERLINE_QUOTES] \{\
+\#. UNDERLINE
+. FT I
+. \}
+. \}
+. \}
+. el \{ .DO_QUOTE \}
+.END
+\#
+\#
+\# ---Blockquotes---
+\#
+\# BLOCKQUOTE FAMILY
+\# -----------------
+\# *Argument:
+\# <family to use in blockquotes>
+\# *Function:
+\# Creates or modifies string $BQUOTE_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC BLOCKQUOTE_FAMILY END
+. ds $BQUOTE_FAM \\$1
+.END
+\#
+\#
+\# BLOCKQUOTE FONT
+\# ---------------
+\# *Argument:
+\# <font to use in blockquotes>
+\# *Function:
+\# Creates or modifies string $BQUOTE_FT.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC BLOCKQUOTE_FONT END
+. ds $BQUOTE_FT \\$1
+.END
+\#
+\#
+\# BLOCKQUOTE SIZE
+\# ---------------
+\# *Argument:
+\# <-|+ number of points by which to de/increase point size of blockquotes
+\# (relative to running text)>
+\# *Function:
+\# Creates or modifies string $BQUOTE_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a - or + sign with no space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is -1 for printstyle TYPESET; +0 for TYPEWRITE.
+\#
+.MAC BLOCKQUOTE_SIZE END
+. ds $BQUOTE_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# BLOCKQUOTE QUAD
+\# ---------------
+\# *Arguments:
+\# <quad to use in blockquotes>
+\# *Function:
+\# Creates or modifies string $BQUOTE_QUAD.
+\# *Notes:
+\# Default is LEFT.
+\#
+.MAC BLOCKQUOTE_QUAD END
+. ds $BQUOTE_QUAD \\$1
+.END
+\#
+\#
+\# BLOCKQUOTE
+\# ----------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Indents quoted text in fill mode and shortens line length
+\# accordingly, or turns BLOCKQUOTE off.
+\# *Notes:
+\# Owing to the need to bottom align TYPESET pages, quoted text gets
+\# diverted so its depth can be measured (in DO_QUOTE) for determining
+\# how much space to put before and after.
+\#
+\# .PP after blockquote is optional if there's only one para,
+\# but REQUIRED if there's more than one.
+\#
+.MAC BLOCKQUOTE END
+. br
+. ie '\\$1'' \{\
+. ev BLOCKQUOTE
+. nr #QUOTE 2
+. nr #PP_STYLE 2
+. nr #Q_PP 0
+. di B_QUOTE
+. ll \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#Q_OFFSET_VALUE]u*2u))
+. ta \\n(.lu
+. CHECK_INDENT
+. if \\n[#COLUMNS] \{\
+. ll \\n[#COL_L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#Q_OFFSET_VALUE]u*2u))
+. ta \\n(.lu
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. vs \\n[#DOC_LEAD]u
+. QUAD LEFT
+. HY OFF
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. FAMILY \\*[$BQUOTE_FAM]
+. FT \\*[$BQUOTE_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$BQUOTE_SIZE_CHANGE]
+. LS \\n[#DOC_LEAD]u
+. QUAD \\*[$BQUOTE_QUAD]
+. HY
+. \}
+. nr #Q_TOP \\n(nl
+. if \\n[#INDENT_FIRST_PARAS] \{\
+. if \\n[#PRINT_STYLE]=1 \{ .ti \\n[#PP_INDENT]u/2u \}
+. if \\n[#PRINT_STYLE]=2 \{ .ti \\n[#PP_INDENT]u/2u \}
+. \}
+. \}
+. el \{ .DO_QUOTE \}
+.END
+\#
+\#
+\# DO QUOTE
+\# --------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Ends the diversion P_QUOTE or B_QUOTE. Spaces them according to
+\# PRINT_STYLE, whether there's inter-paragraph spacing, and page
+\# position. TYPEWRITE treats spacing the same way in all circumstance
+\# (viz. an extra line space). TYPESET puts in only half
+\# line spaces if the entire quote plus 1 line of body under the quote
+\# fits on the the page; otherwise it puts in a full extra blank
+\# line. (This is to ensure the page remains bottom aligned).
+\#
+.MAC DO_QUOTE END
+. di
+. REMOVE_INDENT
+. ev
+\# **Change *1 to *2 in next line to prevent orphans after quotes
+. nr #Q_DEPTH \\n[#DIVER_DEPTH]+(\\n[#LEAD]*1)
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#START]=1 \{ . \}
+. if \\n[#START]=0 \{\
+. if !\\n[#LINEBREAK] \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. if \\n[#HEAD] \{\
+. if \\n[#HEAD]=1 \{ .RLD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#PP_SPACE] \{\
+. ie \\n[#HEAD]=1 \{ . \}
+. el \{\
+. if !\\n[#LINEBREAK] \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. el \{\
+. ie \\n[#Q_DEPTH]<\\n[#TRAP_DISTANCE] \{\
+. nr #Q_FITS 1
+. ie \\n[#HEAD] \{\
+. if \\n[#HEAD]=1 \{ . \}
+. \}
+. el \{\
+. ie \\n[#START] \{ . \}
+. el \{\
+. ie \\n[#HEAD] \{\
+. if \\n[#HEAD]=1 \{ . \}
+. \}
+. el \{\
+. ie \\n[#FULLSPACE_QUOTES] \{ .ALD \\n[#LEAD]u \}
+. el \{ .ALD \\n[#LEAD]u/2u \}
+. \}
+. \}
+. \}
+. \}
+. el \{\
+. rr #Q_FITS
+. ie r#HEAD \{\
+. if \\n[#HEAD]=1 \{ . \}
+. \}
+. el \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. \}
+. nr #Q_OFFSET \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE])
+. if \\n[#COLUMNS] \{ .nr #Q_OFFSET \\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE]) \}
+. po \\n[#Q_OFFSET]u
+. if \\n[#QUOTE]=1 \{\
+. nf
+. P_QUOTE
+. if !\\n[#START] \{ .rr #QUOTE \}
+. \}
+. if \\n[#QUOTE]=2 \{\
+. nf
+. B_QUOTE
+. \}
+. if \\n[#PRINT_STYLE]=1 \{\
+. ALD \\n[#DOC_LEAD]u
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#START] \{\
+. ie \\n[#PP_SPACE] \{ .ALD \\n[#DOC_LEAD]u \}
+. el \{\
+. ie r#HEAD \{\
+. if \\n[#HEAD]=1 \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. el \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. el \{\
+. ie \\n[#PP_SPACE] \{ .ALD \\n[#DOC_LEAD]u \}
+. el \{\
+. ie \\n[#HEAD]=1 \{ .ALD \\n[#DOC_LEAD]u \}
+. el \{\
+. ie \\n[#Q_FITS] \{\
+. ie \\n[#Q_TOP]=\\n[#PAGE_TOP] \{\
+. nr #Q_AT_TOP 1
+. ALD \\n[#DOC_LEAD]u
+. \}
+. el \{\
+. ie \\n[#FULLSPACE_QUOTES] \{ .ALD \\n[#LEAD]u \}
+. el \{ .ALD \\n[#LEAD]u/2u \}
+. \}
+. \}
+. el \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. \}
+. \}
+. if r#HEAD \{ .rr #HEAD \}
+. if r#EPIGRAPH \{ .rr #EPIGRAPH \}
+. rr #Q_PP
+. rr #LINEBREAK
+. nr #PP_STYLE 1
+. nr #END_QUOTE 1
+\#. if \\n[#PRINT_STYLE]=1 \{\
+\#. if \\n[#UNDERLINE_QUOTES] \{\
+\#. UNDERLINE OFF
+\#. \}
+\#. \}
+. po \\n[#L_MARGIN]u
+. if \\n[#COLUMNS] \{ .po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u \}
+. nr #RESET_PP_INDENT \\n[#PP_INDENT]
+. PARA_INDENT 0
+. PP
+. PARA_INDENT \\n[#RESET_PP_INDENT]
+. QUAD \\*[$DOC_QUAD]
+.END
+\#
+\# ====================================================================
+\#
+\# BREAK QUOTE
+\# -----------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Ends the diversion P_QUOTE or B_QUOTE, breaks to a new
+\# page, and reinvokes BLOCKQUOTE.
+\# *Notes:
+\# Because quotes go into a diversion before they're output,
+\# footnotes in quotes that cross pages behave erratically. The footnote
+\# isn't processed until the diversion ends, hence the footnote
+\# marker in the quote isn't always correct for the new page (it's
+\# picked up from the old one). BREAK_QUOTE is a workaround for
+\# this problem.
+\#
+.MAC BREAK_QUOTE END
+. br
+. di
+. nr #BROKEN_QUOTE 1
+. REMOVE_INDENT
+. ev
+. nr #Q_DEPTH \\n[#DIVER_DEPTH]+(\\n[#LEAD]*1)
+. if \\n[#PRINT_STYLE]=1 \{\
+. if !\\n[#LINEBREAK] \{ .ALD \\n[#DOC_LEAD]u \}
+. if \\n[#HEAD] \{\
+. if \\n[#HEAD]=1 \{ .RLD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. if \\n[#PRINT_STYLE]=2 \{\
+. ie \\n[#PP_SPACE] \{\
+. ie \\n[#HEAD]=1 \{ . \}
+. el \{\
+. if !\\n[#LINEBREAK] \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. el \{\
+. rr #Q_FITS
+. ie r#HEAD \{\
+. if \\n[#HEAD]=1 \{ . \}
+. \}
+. el \{ .ALD \\n[#DOC_LEAD]u \}
+. \}
+. \}
+. nr #Q_OFFSET \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE])
+. if \\n[#COLUMNS] \{ .nr #Q_OFFSET \\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE]) \}
+. po \\n[#Q_OFFSET]u
+. if \\n[#QUOTE]=1 \{\
+. nf
+. P_QUOTE
+. if !\\n[#START] \{ .rr #QUOTE \}
+. \}
+. if \\n[#QUOTE]=2 \{\
+. nf
+. B_QUOTE
+. \}
+. if r#HEAD \{ .rr #HEAD \}
+. if r#EPIGRAPH \{ .rr #EPIGRAPH \}
+. rr #Q_PP
+. rr #LINEBREAK
+. nr #PP_STYLE 1
+. nr #END_QUOTE 1
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#UNDERLINE_QUOTES] \{\
+. UNDERLINE OFF
+. \}
+. \}
+. po \\n[#L_MARGIN]u
+. if \\n[#COLUMNS] \{ .po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u \}
+. QUAD \\*[$DOC_QUAD]
+. sp |\\n[#PAGE_LENGTH]u \" To trip footer/header
+. BLOCKQUOTE
+.END
+\#
+\# ====================================================================
+\#
+\# +++PAGINATION+++
+\#
+\# PAGINATE
+\# --------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Turns page numbering off or on.
+\# *Notes:
+\# Page numbering is on by default with .PAPER.
+\# Default is on.
+\#
+.MAC PAGINATE END
+. ie '\\$1'' \{ .nr #PAGINATE 1 \}
+. el \{ .nr #PAGINATE 0 \}
+.END
+\#
+\#
+\# PAGENUMBER FAMILY
+\# -----------------
+\# *Argument:
+\# <family to use for page numbers>
+\# *Function:
+\# Creates or modifies string $PAGE_NUM_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC PAGENUM_FAMILY END
+. ds $PAGE_NUM_FAM \\$1
+.END
+\#
+\#
+\# PAGE NUMBER FONT
+\# ----------------
+\# *Arguments:
+\# <font to use for page numbers>
+\# *Function:
+\# Creates or modifies string $PAGE_NUM_FT.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC PAGENUM_FONT END
+. ds $PAGE_NUM_FT \\$1
+.END
+\#
+\#
+\# PAGE NUMBER SIZE
+\# ----------------
+\# *Argument:
+\# <+|- number of points by which to in/decrease point size of
+\# page numbers (relative to running text)>
+\# *Function:
+\# Creates or modifies string $PAGE_NUM_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign with no space afterward.
+\# Fractional point sizes are allowed.
+\# Default is +0.
+\#
+.MAC PAGENUM_SIZE END
+. ds $PAGE_NUM_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# PAGE NUMBER FORMAT
+\# ------------------
+\# *Arguments:
+\# ARABIC | ROMAN | roman | ALPHA | alpha
+\# *Function:
+\# Assigns user entered format to #PAGENUMBER.
+\#
+.MAC PAGENUM_STYLE END
+. if '\\$1'DIGIT' \{ .af #PAGENUMBER 1 \}
+. if '\\$1'ROMAN' \{ .af #PAGENUMBER I \}
+. if '\\$1'roman' \{ .af #PAGENUMBER i \}
+. if '\\$1'ALPHA' \{ .af #PAGENUMBER A \}
+. if '\\$1'alpha' \{ .af #PAGENUMBER a \}
+.END
+\#
+\#
+\# HYPHENS AROUND PAGE NUMBERS
+\# ---------------------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Creates or modifies register #PAGE_NUM_HYPHENS.
+\# Used to dis/enable hyphens on either side of page numbers.
+\# *Notes:
+\# Default is on.
+\#
+.MAC PAGENUM_HYPHENS END
+. nr #PAGE_NUM_HYPHENS_SET 1
+. ie '\\$1'' \{ .nr #PAGE_NUM_HYPHENS 1 \}
+. el \{ .rr #PAGE_NUM_HYPHENS \}
+.END
+\#
+\#
+\# PAGENUMBER POSITION
+\# -------------------
+\# *Arguments:
+\# TOP | BOTTOM LEFT | CENTER | RIGHT
+\# *Function:
+\# Creates or modifies various PAGE_NUM_H | V_POS registers.
+\# Used to position page numbers.
+\# *Notes:
+\# Default is center/bottom.
+\#
+.MAC PAGENUM_POS END
+. nr #PAGE_NUM_POS_SET 1
+. if '\\$1'TOP' \{ .nr #PAGE_NUM_V_POS 1 \}
+. if '\\$1'BOTTOM' \{ .nr #PAGE_NUM_V_POS 2 \}
+. if '\\$2'LEFT' \{ .nr #PAGE_NUM_H_POS 1 \}
+. if '\\$2'CENTER' \{ .nr #PAGE_NUM_H_POS 2 \}
+. if '\\$2'CENTRE' \{ .nr #PAGE_NUM_H_POS 2 \}
+. if '\\$2'RIGHT' \{ .nr #PAGE_NUM_H_POS 3 \}
+.END
+\#
+\#
+\# PRINT PAGE NUMBER
+\# -----------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Prints page number if PAGEINATE=1.
+\#
+.MAC PRINT_PAGE_NUMBER END
+. ev PAGENUMBER
+. po \\n[#DOC_L_MARGIN]u
+. ll \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. FAMILY \\*[$PAGE_NUM_FAM]
+. FT \\*[$PAGE_NUM_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$PAGE_NUM_SIZE_CHANGE]
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. \}
+. if \\n[#PAGE_NUM_V_POS]=1 \{ .vs 0 \}
+. if o \{\
+. ie \\n[#PAGE_NUM_H_POS]=1 \{ .LEFT \}
+. el \{ .RIGHT \}
+. \}
+. if e \{\
+. ie \\n[#PAGE_NUM_H_POS]=1 \{ .RIGHT \}
+. el \{ .LEFT \}
+. \}
+. if \\n[#PAGE_NUM_H_POS]=2 \{.CENTER \}
+. if \\n[#RECTO_VERSO]=0 \{\
+. if \\n[#PAGE_NUM_H_POS]=1 \{ .LEFT \}
+. if \\n[#PAGE_NUM_H_POS]=2 \{ .CENTER \}
+. if \\n[#PAGE_NUM_H_POS]=3 \{ .RIGHT \}
+. \}
+. nr #PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ]
+. ie \\n[#PAGE_NUM_HYPHENS] \{ .PRINT "- \\n[#PAGENUMBER] -" \}
+. el \{ .PRINT "\\n[#PAGENUMBER]" \}
+. ev
+.END
+\#
+\# ====================================================================
+\#
+\# +++FOOTNOTES+++
+\#
+\# FOOTNOTE FAMILY
+\# --------------
+\# *Argument:
+\# <family to use in footnotes>
+\# *Function:
+\# Creates or modifies string $FN_FAM.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC FOOTNOTE_FAMILY END
+. ds $FN_FAM \\$1
+.END
+\#
+\#
+\# FOOTNOTE FONT
+\# --------------
+\# *Argument:
+\# <font to use in footnotes>
+\# *Function:
+\# Creates or modifies string $FN_FT.
+\# *Notes:
+\# Default is roman.
+\#
+.MAC FOOTNOTE_FONT END
+. ds $FN_FT \\$1
+.END
+\#
+\#
+\# FOOTNOTE SIZE
+\# ------------
+\# *Argument:
+\# <+|- number of points by which to in/decrease point size of footnotes
+\# (relative to running text)>
+\# *Function:
+\# Creates or modifies string $FN_SIZE_CHANGE.
+\# *Notes:
+\# Must be preceded by a +|- sign. No space afterwards.
+\# Fractional point sizes are allowed.
+\# Default is -2 for printstyle TYPESET; +0 for TYPEWRITE.
+\#
+.MAC FOOTNOTE_SIZE END
+. ds $FN_SIZE_CHANGE \\$1
+.END
+\#
+\#
+\# FOOTNOTE AUTOLEAD
+\# -----------------
+\# *Arguments:
+\# <autolead value for footnotes>
+\# *Function:
+\# Creates or modifies register #FN_AUTOLEAD.
+\# *Notes:
+\# Default is #DOC_LEAD/2 for TYPEWRITE; 2 for TYPESET
+\#
+.MAC FOOTNOTE_AUTOLEAD END
+. nr #FN_AUTOLEAD \\$1
+.END
+\#
+\#
+\# FOOTNOTE QUAD
+\# -------------
+\# *Arguments:
+\# <quad to use in footnotes>
+\# *Function:
+\# Creates or modifies string $FN_QUAD.
+\# *Notes:
+\# Default is same as running text.
+\#
+.MAC FOOTNOTE_QUAD END
+. ds $FN_QUAD \\$1
+.END
+\#
+\#
+\# FOOTNOTE MARKERS
+\# ----------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Turns generation of footnote markers on or off.
+\# *Notes:
+\# Default is on.
+\#
+.MAC FOOTNOTE_MARKERS END
+. ie '\\$1'' \{ .nr #FN_MARKERS 1 \}
+. el \{ .nr #FN_MARKERS 0 \}
+.END
+\#
+\#
+\# FOOTNOTE MARKER STYLE
+\# ---------------------
+\# *Arguments:
+\# STAR | NUMBER
+\# *Function:
+\# Sets register #FN_MARKER_STYLE, used in FOOTNOTE to determine
+\# the style of footnote markers.
+\# *Notes:
+\# 1=STAR; 2=NUMBER. Default is STAR.
+\#
+.MAC FOOTNOTE_MARKER_STYLE END
+. if '\\$1'STAR' \{\
+. nr #FN_MARKER_STYLE 1
+. \}
+. if '\\$1'NUMBER' \{\
+. nr #FN_MARKER_STYLE 2
+. \}
+.END
+\#
+\#
+\# RESET FOOTNOTE NUMBER
+\# ---------------------
+\# *Arguments:
+\# <none> | PAGE
+\# *Function:
+\# Resets register #FN_NUMBER to 1. If argument is PAGE, creates
+\# toggle #RESET_FN_NUMBER which is checked in HEADER. If 1,
+\# numbered footnotes on every page start at 1.
+\#
+.MAC RESET_FOOTNOTE_NUMBER END
+. ie '\\$1'' \{ .nr #FN_NUMBER 0 1 \}
+. el \{ .nr #RESET_FN_NUMBER 1 \}
+.END
+\#
+\#
+\# FOOTNOTE RULE LENGTH
+\# --------------------
+\# *Arguments:
+\# <length of rule used to separate footnotes from running text>
+\# *Function:
+\# Creates or modifies registers #FN_RULE_LENGTH.
+\# *Notes:
+\# Requires unit of measure (iPpcm).
+\# Default is 4P for both PRINTSTYLEs.
+\#
+.MAC FOOTNOTE_RULE_LENGTH END
+. nr #FN_RULE_LENGTH (\\$1)
+.END
+\#
+\#
+\# FOOTNOTE_RULE_ADJ
+\# -----------------
+\# *Arguments:
+\# <number of points to raise footnote rule from it's baseline position>
+\# *Function:
+\# Creates or modifies register #FN_RULE_ADJ.
+\# *Notes:
+\# Default is 3p for both TYPESTYLES.
+\#
+\# Requires unit of measure.
+\#
+.MAC FOOTNOTE_RULE_ADJ END
+. nr #FN_RULE_ADJ (\\$1)
+.END
+\#
+\#
+\# FOOTNOTE RULE
+\# -------------
+\# *Arguments:
+\# <none> | <anything>
+\# *Function:
+\# Turns printing of footnote separator rule on or off. If invoked as
+\# PRINT_FOOTNOTE_RULE, prints footnote separator rule.
+\# *Notes:
+\# Default is on.
+\#
+\# Invoked in FOOTNOTE (as PRINT_FOOTNOTE_RULE) as 1st line of a footnote
+\# if the footnote number (#FN_COUNT) is 1.
+\#
+.MAC FOOTNOTE_RULE END
+. ie '\\$0'PRINT_FOOTNOTE_RULE' \{\
+. if \\n[#FN_RULE]=0 \{ .RLD 1v \}
+\!. PS 12 \"Not sure why these have to be transparently embedded, but they do.
+. RLD 1v
+. LEFT
+. PRINT \\v'-\\n[#FN_RULE_ADJ]u'\\l'\\n[#FN_RULE_LENGTH]u'\\v'+\\n[#FN_RULE_ADJ]u'
+\!. PS \\n[#DOC_PT_SIZE]u\\*$[FN_SIZE_CHANGE]
+. QUAD \\*[$FN_QUAD]
+. \}
+. el \{\
+. ie '\\$1'' \{ .nr #FN_RULE 1 \}
+. el \{ .nr #FN_RULE 0 \}
+. \}
+.END
+\#
+\#
+\# FOOTNOTE
+\# --------
+\# *Arguments:
+\# <none> | INDENT L|LEFT|R|RIGHT|B|BOTH <indent value> > | <anything>
+\# *Function:
+\# Begins collecting and diverting footnote text if no argument
+\# given. Otherwise, ends diversion FOOTNOTES, measures footnote
+\# depth, and sets footnote trap.
+\# *Notes:
+\# The input line preceding a footnote call MUST terminate with \c
+\# or the footnote marker will be spaced away from the word it
+\# should be joined to.
+\#
+\# If FOOTNOTES is invoked with INDENT, the footnote will
+\# be indented. An indent style and an indent value must be given.
+\# Subsequent footnotes will NOT be indented; INDENT must be given
+\# for each footnote the user wants indented.
+\#
+.MAC FOOTNOTE END
+. ie '\\$1'' \{\
+. if \\n[#FN_MARKERS] \{\
+. if \\n[#CONDENSE] \{ \*[CONDX]\c \}
+. if \\n[#EXTEND] \{ \*[EXTX]\c \}
+. if !\\n[#NO_FN_MARKER] \{\
+. if \\n[#FN_MARKER_STYLE]=1 \{\
+. ie \\n[#FN_COUNT_FOR_COLS] \{\
+. if \\n[#FN_COUNT_FOR_COLS]=0 \{ .PRINT \*[BU3]* \}
+. if \\n[#FN_COUNT_FOR_COLS]=1 \{ .PRINT \*[BU3]\(dg \}
+. if \\n[#FN_COUNT_FOR_COLS]=2 \{ .PRINT \*[BU3]** \}
+. if \\n[#FN_COUNT_FOR_COLS]=3 \{ .PRINT \*[BU3]\(dg\(dg \}
+. if \\n[#FN_COUNT_FOR_COLS]=4 \{ .PRINT \*[BU3]*** \}
+. if \\n[#FN_COUNT_FOR_COLS]=5 \{ .PRINT \*[BU3]\(dg\(dg\(dg \}
+. if \\n[#FN_COUNT_FOR_COLS]=6 \{ .PRINT \*[BU3]**** \}
+. if \\n[#FN_COUNT_FOR_COLS]=7 \{ .PRINT \*[BU3]\(dg\(dg\(dg\(dg \}
+. if \\n[#FN_COUNT_FOR_COLS]=8 \{ .PRINT \*[BU3]***** \}
+. if \\n[#FN_COUNT_FOR_COLS]=9 \{ .PRINT \*[BU3]\(dg\(dg\(dg\(dg\(dg \}
+. \}
+. el \{\
+. if \\n[#FN_COUNT]=0 \{ .PRINT \*[BU3]* \}
+. if \\n[#FN_COUNT]=1 \{ .PRINT \*[BU3]\(dg \}
+. if \\n[#FN_COUNT]=2 \{ .PRINT \*[BU3]** \}
+. if \\n[#FN_COUNT]=3 \{ .PRINT \*[BU3]\(dg\(dg \}
+. if \\n[#FN_COUNT]=4 \{ .PRINT \*[BU3]*** \}
+. if \\n[#FN_COUNT]=5 \{ .PRINT \*[BU3]\(dg\(dg\(dg \}
+. if \\n[#FN_COUNT]=6 \{ .PRINT \*[BU3]**** \}
+. if \\n[#FN_COUNT]=7 \{ .PRINT \*[BU3]\(dg\(dg\(dg\(dg \}
+. if \\n[#FN_COUNT]=8 \{ .PRINT \*[BU3]***** \}
+. if \\n[#FN_COUNT]=9 \{ .PRINT \*[BU3]\(dg\(dg\(dg\(dg\(dg\(dg \}
+. \}
+. \}
+. if \\n[#FN_MARKER_STYLE]=2 \{\
+. if \\n[#PRINT_STYLE]=1 \{ .PRINT "\s-2\v'-\\n[#DOC_LEAD]u/5u'\\n+[#FN_NUMBER]\v'+\\n[#DOC_LEAD]u/5u'\s+2" \}
+. if \\n[#PRINT_STYLE]=2 \{ .PRINT "\*[SUP]\\n+[#FN_NUMBER]\*[SUPX]" \}
+. \}
+. \}
+. \}
+. nr #SPACE_REMAINING \\n[#PAGE_LENGTH]-\\n[#B_MARGIN]-(\\n(nl+1v)
+. nr #PP_STYLE_PREV \\n[#PP_STYLE]
+. nr #PP_STYLE 2
+. if \\n[#INDENT_FIRST_PARAS] \{ .nr #INDENT_FIRSTS 1 \}
+. INDENT_FIRST_PARAS
+. ev FOOTNOTES
+. ll \\n[#DOC_L_LENGTH]u
+. ta \\n(.lu
+. if \\n[#COLUMNS] \{\
+. ll \\n[#COL_L_LENGTH]u
+. ta \\n(.lu
+. \}
+. if \\n[#FN_R_INDENT] \{\
+. ll -\\n[#FN_R_INDENT]u
+. ta \\n(.lu
+. \}
+. if \\n[#FN_BR_INDENT] \{\
+. ll -\\n[#FN_BR_INDENT]u
+. ta \\n(.lu
+. \}
+. FAMILY \\*[$FN_FAM]
+. FT \\*[$FN_FT]
+. PS \\n[#DOC_PT_SIZE]u\\*[$FN_SIZE_CHANGE]
+. AUTOLEAD \\n[#FN_AUTOLEAD]
+. QUAD \\*[$FN_QUAD]
+. if \\n[#PRINT_STYLE]=1 \{\
+. fam C
+. ft R
+. ps 12
+. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u \}
+. el \{ .vs \\n[#DOC_LEAD]u/2u \}
+. QUAD LEFT
+. HY OFF
+. \}
+. nr #FN_LEAD \\n[#LEAD]
+. da FOOTNOTES
+. if \\n[#EPIGRAPH] \{ .nr #FN_FOR_EPI 1 \}
+. if \\n[#FN_DEFER_SPACE] \{\
+. if \\n[#FN_MARKER_STYLE]=1 \{ .ALD 1v \}
+. if \\n[#RESET_FN_NUMBER] \{ .ALD 1v \}
+. rr #FN_DEFER_SPACE
+. \}
+. if \\n+[#FN_COUNT]=1 \{\
+. if !\\n[#FN_DEPTH] \{\
+. if \\n[#PRINT_STYLE]=1 \{ .ALD \\n[#DOC_LEAD]u \}
+. ie \\n[#FN_RULE] \{ .PRINT_FOOTNOTE_RULE \}
+. el \{ .ALD 1v \}
+. \}
+. \}
+. if \\n[#FN_MARKERS] \{\
+. if !\\n[#NO_FN_MARKER] \{\
+. if \\n[#FN_MARKER_STYLE]=1 \{\
+. ie \\n+[#FN_COUNT_FOR_COLS] \{\
+. if \\n[#FN_COUNT_FOR_COLS]=1 \{ .PRINT *\c \}
+. if \\n[#FN_COUNT_FOR_COLS]=2 \{ .PRINT \(dg\c \}
+. if \\n[#FN_COUNT_FOR_COLS]=3 \{ .PRINT **\c \}
+. if \\n[#FN_COUNT_FOR_COLS]=4 \{ .PRINT \(dg\(dg\c \}
+. if \\n[#FN_COUNT_FOR_COLS]=5 \{ .PRINT ***\c \}
+. if \\n[#FN_COUNT_FOR_COLS]=6 \{ .PRINT \(dg\(dg\(dg\c \}
+. if \\n[#FN_COUNT_FOR_COLS]=7 \{ .PRINT ****\c \}
+. if \\n[#FN_COUNT_FOR_COLS]=8 \{ .PRINT \(dg\(dg\(dg\(dg\c \}
+. if \\n[#FN_COUNT_FOR_COLS]=9 \{ .PRINT *****\c \}
+. if \\n[#FN_COUNT_FOR_COLS]=10 \{ .PRINT \(dg\(dg\(dg\(dg\(dg\c \}
+. \}
+. el \{\
+. if \\n[#FN_COUNT]=1 \{ .PRINT *\c \}
+. if \\n[#FN_COUNT]=2 \{ .PRINT \(dg\c \}
+. if \\n[#FN_COUNT]=3 \{ .PRINT **\c \}
+. if \\n[#FN_COUNT]=4 \{ .PRINT \(dg\(dg\c \}
+. if \\n[#FN_COUNT]=5 \{ .PRINT ***\c \}
+. if \\n[#FN_COUNT]=6 \{ .PRINT \(dg\(dg\(dg\c \}
+. if \\n[#FN_COUNT]=7 \{ .PRINT ****\c \}
+. if \\n[#FN_COUNT]=8 \{ .PRINT \(dg\(dg\(dg\(dg\c \}
+. if \\n[#FN_COUNT]=9 \{ .PRINT *****\c \}
+. if \\n[#FN_COUNT]=10 \{ .PRINT \(dg\(dg\(dg\(dg\(dg\c \}
+. \}
+. \}
+. if \\n[#FN_MARKER_STYLE]=2 \{\
+. if \\n[#PRINT_STYLE]=1 \{ .PRINT "(\\n[#FN_NUMBER])\c" \}
+. if \\n[#PRINT_STYLE]=2 \{ .PRINT "\*[SUP]\\n[#FN_NUMBER]\*[SUPX]\c" \}
+. \}
+. \}
+. \}
+. \}
+. el \{\
+. ie '\\$1'INDENT' \{\
+. ev FOOTNOTES
+. if '\\$2'L' \{ .in (\\$3) \}
+. if '\\$2'LEFT' \{ .in (\\$3) \}
+. if '\\$2'R' \{ .nr #FN_R_INDENT (\\$3) \}
+. if '\\$2'RIGHT' \{ .nr #FN_R_INDENT (\\$3) \}
+. if '\\$2'B' \{\
+. nr #FN_BL_INDENT (\\$3)
+. ie '\\$4'' \{ .nr #FN_BR_INDENT \\n[#FN_BL_INDENT] \}
+. el \{ .nr #FN_BR_INDENT (\\$4) \}
+. in \\n[#FN_BL_INDENT]u
+. \}
+. if '\\$2'BOTH' \{\
+. nr #FN_BL_INDENT (\\$3)
+. ie '\\$4'' \{ .nr #FN_BR_INDENT \\n[#FN_BL_INDENT] \}
+. el \{ .nr #FN_BR_INDENT (\\$4) \}
+. in \\n[#FN_BL_INDENT]u
+. \}
+. ev
+. FOOTNOTE
+. \}
+. el \{\
+. br
+. di
+. in 0 \"Turn off indent possibly set by FOOTNOTE INDENT...
+. ev
+. rr #FN_R_INDENT
+. rr #FN_BR_INDENT
+. nr #PP_STYLE \\n[#PP_STYLE_PREV]
+. if !\\n[#INDENT_FIRSTS] \{ .INDENT_FIRST_PARAS OFF \}
+. rr #INDENT_FIRSTS
+. nr #FN_DEPTH +\\n[#DIVER_DEPTH]
+. if \\n[#FN_DEFER] \{\
+. nr #FN_DEFER_SPACE 1
+. rr #FN_DEFER
+. \}
+. if \\n[#FN_DEPTH]>\\n[#SPACE_REMAINING] \{\
+. ie \\n[#SPACE_REMAINING]<(\\n[#LEAD]*2) \{ .nr #FN_DEFER 1 \}
+. el \{\
+. nr #FN_LINES 0 1
+. while (\\n+[#FN_LINES]*\\n[#FN_LEAD])<\\n[#SPACE_REMAINING] \{\
+. nr #FN_DEPTH (\\n[#FN_LINES]*\\n[#FN_LEAD])
+. \}
+. \}
+. \}
+. nr #VARIABLE_FOOTER_POS -\\n[#DIVER_DEPTH]
+. if \\n[#FN_COUNT]=1 \{ .nr #VARIABLE_FOOTER_POS -1v \}
+. \}
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. if (\\n(nl+1v)>(\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS]) \{\
+. ch FOOTER \\n(nlu+1v
+. \}
+. if \\n[#FN_DEFER] \{\
+. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]u
+. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u
+. \}
+. \}
+. nr #NO_FN_MARKER 0
+. if \\n[#PRINT_STYLE]=1 \{\
+. if \\n[#SLANT_ON] \{\
+. if \\n[#UNDERLINE_SLANT] \{ .UNDERLINE \}
+. \}
+. \}
+.END
+\#
+\#
+.MAC FN_OVERFLOW_TRAP END
+. if \\n[#FN_COUNT] \{\
+. di FN_OVERFLOW
+. \}
+.END
+\#
+\#
+.MAC DIVERT_FN_LEFTOVER END
+. nr #NO_FN_MARKER 1
+. nr #OVERFLOW 1
+. FOOTNOTE
+. nf
+. FN_OVERFLOW
+. FOOTNOTE OFF
+. rr #FN_OVERFLOW_DEPTH
+.END
+\#
+\#
+.MAC PROCESS_FN_LEFTOVER END
+. if !\\n[#FN_DEFER] \{\
+. nr #FN_COUNT 0 1
+. nr #FN_DEPTH 0
+. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]
+. \}
+. if \\n[#FN_DEFER] \{\
+. nr #VARIABLE_FOOTER_POS -(\\n[#FN_DEPTH]+\\n[#DOC_LEAD])
+. \}
+. nr #SPACE_REMAINING 0
+. ch FOOTER -\\n[#B_MARGIN]u
+. if \\n[#FN_DEFER] \{\
+. nr #NO_FN_MARKER 1
+. da FOOTNOTES
+. di
+. FOOTNOTE
+. nf
+. FOOTNOTE OFF
+. \}
+. if !\\n[#FN_DEFER] \{\
+. if \\n[#FN_OVERFLOW_DEPTH] \{\
+. DIVERT_FN_LEFTOVER
+. \}
+. \}
+. nr #FN_COUNT 0 1
+.END
+\#
+\#
+\# ====================================================================
+\#
+\# +++COLUMNS+++
+\#
+\# COLUMNS
+\# -------
+\# *Arguments:
+\# <number of columns> <width of gutters>
+\# *Function:
+\# Creates registers associated with setting docs in columns.
+\# Calculates column line lengths and offsets
+\# *Notes:
+\# COLUMNS, if used, s/b the last macro invoked before START.
+\#
+.MAC COLUMNS END
+. if \\n[#IGNORE_COLUMNS]=1 \{ .return \}
+. nr #COLUMNS 1
+. nr #NUM_COLS \\$1
+. nr #GUTTER (\\$2)
+. nr #COL_L_LENGTH \\n[#L_LENGTH]-(\\n[#GUTTER]*(\\n[#NUM_COLS]-1))/\\n[#NUM_COLS]
+. nr #COL_TOTAL 0 \\n[#COL_L_LENGTH]+\\n[#GUTTER]
+. nr #COL_NUM 0 1
+. while !\\n[#COL_NUM]=\\n[#NUM_COLS] \{\
+. nr #COL_\\n+[#COL_NUM]_L_MARGIN \\n[#L_MARGIN]+\\n[#COL_TOTAL]
+. nr #COL_TOTAL \\n+[#COL_TOTAL]
+. \}
+. rr #COL_TOTAL
+. rr #COL_NUM
+.END
+\#
+\#
+\# NEXT COLUMN
+\# -----------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Breaks current column and moves to next column.
+\# If current column is the last on the page, breaks
+\# to a new page.
+\#
+.MAC COL_NEXT END
+. if \\n[#COLUMNS] \{\
+. nr #COL_NEXT 1
+. ie '\\$0'COL_NEXT' \{ .br \}
+. el \{\
+. brp
+. RLD 1v
+. \}
+. ie \\n[#COL_NUM]=\\n[#NUM_COLS] \{\
+. bp
+. \}
+. el \{ .FOOTER \}
+. \}
+.END
+\#
+\# ====================================================================
+\#
+\# +++DOCUMENT PROCESSING MISC AND SUPPORT MACROS+++
+\#
+\# COLLATE
+\# -------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Turns headers off (if on) and saves header state, sets register
+\# #COLLATE to 1 (toggle), and breaks to a new page.
+\# *Notes:
+\# COLLATE exists primarily to allow putting multiple chapters in
+\# a single file, although it can be used for any document type. After
+\# COLLATE, any of the macros that normally precede START may be
+\# used, and should behave as expected.
+\#
+\# N.B.--the START macro *must* be used after COLLATE (and any other
+\# macros that alter mom's behaviour).
+\#
+.MAC COLLATE END
+. nr #COLLATE 1
+. nr #HEADER_STATE \\n[#HEADERS_ON]
+. HEADERS OFF
+. if \\n[#PAGE_NUM_V_POS]=1 \{\
+. nr #PAGINATION_STATE \\n[#PAGINATE]
+. PAGINATION OFF
+. \}
+. IX CLEAR
+. TQ
+. LL \\n[#DOC_L_LENGTH]u
+. QUAD $DOC_QUAD
+. LS \\n[#DOC_LEAD]u
+. NEWPAGE
+.END
+\#
+\#
+\# SET TRAPS FOR HEADERS/FOOTERS/FOOTNOTES
+\# ---------------------------------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Sets header/footer/footnotes/etc... traps.
+\# Calculates the number of lines that actually fit on a
+\# page based on #B_MARGIN and resets page bottom trap to coincide
+\# with the depth of that number of lines , or, if #ADJ_DOC_LEAD=1,
+\# adjusts #DOC_LEAD so that the last line of text on a page falls
+\# exactly on #B_MARGIN.
+\#
+.MAC TRAPS END
+\# *Remove all header/footer traps
+. ch DO_T_MARGIN
+. ch DO_B_MARGIN
+. ch HEADER
+. ch FOOTER
+\# *Plant header trap
+. wh 0 HEADER
+\# *Adjust lead so last line of text falls on B_MARGIN,...
+. ie \\n[#ADJ_DOC_LEAD] \{\
+. nr #LINES_PER_PAGE 0 1
+. nr #DOC_LEAD_ADJ 0 1
+. nr #DEPTH_TO_B_MARGIN \\n[#PAGE_LENGTH]-\\n[#B_MARGIN]-1v
+. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]*\\n+[#LINES_PER_PAGE])<\\n[#DEPTH_TO_B_MARGIN] \{ . \}
+. nr #LINES_PER_PAGE -1
+. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]+\\n+[#DOC_LEAD_ADJ]*\\n[#LINES_PER_PAGE])<\\n[#DEPTH_TO_B_MARGIN] \{ . \}
+. DOC_LEAD \\n[#DOC_LEAD]u+\\n[#DOC_LEAD_ADJ]u
+. \}
+\# *...or calculate new B_MARGIN based on # of lines (at #DOC_LEAD) that fit
+\# *on the page.
+. el \{\
+. nr #LINES_PER_PAGE 0 1
+. nr #DEPTH_TO_B_MARGIN \\n[#PAGE_LENGTH]-\\n[#B_MARGIN]-1v
+. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]*\\n+[#LINES_PER_PAGE])<\\n[#DEPTH_TO_B_MARGIN] \{ . \}
+. nr #B_MARGIN \\n[#PAGE_LENGTH]-(\\n[#T_MARGIN]+(\\n[#DOC_LEAD]*\\n[#LINES_PER_PAGE]))
+. \}
+\# *Set footer and footnote overflow traps
+. nr #FN_COUNT 0 1
+. nr #SPACE_REMAINING 0
+. nr #FN_DEPTH 0
+. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]u
+. wh 12i FOOTER
+. wh -\\n[#B_MARGIN]u FN_OVERFLOW_TRAP
+. ch FOOTER -\\n[#B_MARGIN]u
+.END
+\#
+\#
+\# CHECK INDENT
+\# ------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Adds left, right, or both indent values to document elements
+\# like heads and subheads that are processed in environments.
+\#
+.MAC CHECK_INDENT END
+. if \\n[#INDENT_LEFT_ACTIVE] \{\
+. in \\n[#L_INDENT]u
+. if \\n[#QUOTE] \{\
+. in -\\n[#L_INDENT]u \"Because you added an indent in 2nd line of macro
+. ll -\\n[#L_INDENT]u
+. ta \\n(.lu
+. \}
+. if \\n[#EPIGRAPH] \{\
+. in -\\n[#L_INDENT]u
+. ll -\\n[#L_INDENT]u
+. ta \\n(.lu
+. \}
+. \}
+. if \\n[#INDENT_RIGHT_ACTIVE] \{\
+. ll -\\n[#R_INDENT]u
+. ta \\n(.lu
+. \}
+. if \\n[#INDENT_BOTH_ACTIVE] \{\
+. in \\n[#BL_INDENT]u
+. ll -\\n[#BR_INDENT]u
+. ta \\n(.lu
+. if \\n[#QUOTE] \{\
+. in -\\n[#BL_INDENT]u
+. ie \\n[#BR_INDENT]=\\n[#BL_INDENT] \{\
+. ll -\\n[#BR_INDENT]u
+. ta \\n(.lu
+. \}
+. el \{\
+. ll -(\\n[#BR_INDENT]u/2u)
+. ta \\n(.lu
+. \}
+. \}
+. if \\n[#EPIGRAPH] \{\
+. in -\\n[#BL_INDENT]u
+. ie \\n[#BR_INDENT]=\\n[#BL_INDENT] \{\
+. ll -\\n[#BR_INDENT]u
+. ta \\n(.lu
+. \}
+. el \{\
+. ll -(\\n[#BR_INDENT]u/2u)
+. ta \\n(.lu
+. \}
+. \}
+. \}
+.END
+\#
+\#
+\# REMOVE INDENT
+\# -------------
+\# *Arguments:
+\# <none>
+\# *Function:
+\# Removes left, right, or both indent values from document elements
+\# like heads and subheads that are processed in environments.
+\#
+.MAC REMOVE_INDENT END
+. in 0
+. ll \\n[#L_LENGTH]u
+. ta \\n(.lu
+.END
+\#
+\#
+\#
+\#
+\# ====================================================================
+\#
+\# +++DOCUMENT PROCESSING ALIASES+++
+\#
+\# Aliases to make life easier for users: synonyms, short forms
+\# and alternate spellings.
+\#
+\# Macros
+\# ------
+.ALIAS BREAK_BLOCKQUOTE BREAK_QUOTE
+.ALIAS BREAK_CITATION BREAK_QUOTE
+.ALIAS BREAK_CITE BREAK_QUOTE
+.ALIAS CITATION BLOCKQUOTE
+.ALIAS CITE BLOCKQUOTE
+.ALIAS DOC_R_MARGIN DOC_RIGHT_MARGIN
+.ALIAS DOC_L_MARGIN DOC_LEFT_MARGIN
+.ALIAS DOC_L_LENGTH DOC_LINE_LENGTH
+.ALIAS DOC_RMARGIN DOC_RIGHT_MARGIN
+.ALIAS DOC_LMARGIN DOC_LEFT_MARGIN
+.ALIAS DOC_LLENGTH DOC_LINE_LENGTH
+.ALIAS DOC_FAM DOC_FAMILY
+.ALIAS FILL QUAD
+.ALIAS PP_FT PP_FONT
+.ALIAS DOC_PS DOC_PT_SIZE
+.ALIAS DOC_LS DOC_LEAD
+.ALIAS PAGENUM PAGENUMBER
+.ALIAS PAGINATION PAGINATE
+\#
+\# HEADER and FOOTER aliases for HDRFTR macros.
+\#
+.ALIAS HEADER_FAMILY HDRFTR_FAMILY
+.ALIAS HEADER_FAM HDRFTR_FAMILY
+.ALIAS HEADER_SIZE HDRFTR_SIZE
+.ALIAS HEADER_PLAIN HDRFTR_PLAIN
+.ALIAS HEADER_RULE_GAP HDRFTR_RULE_GAP
+.ALIAS HEADER_RULE HDRFTR_RULE
+.ALIAS HEADER_LEFT HDRFTR_LEFT
+.ALIAS HEADER_LEFT_FAMILY HDRFTR_LEFT_FAMILY
+.ALIAS HEADER_LEFT_FAM HDRFTR_LEFT_FAMILY
+.ALIAS HEADER_LEFT_FONT HDRFTR_LEFT_FONT
+.ALIAS HEADER_LEFT_FT HDRFTR_LEFT_FONT
+.ALIAS HEADER_LEFT_SIZE HDRFTR_LEFT_SIZE
+.ALIAS HEADER_LEFT_PS HDRFTR_LEFT_SIZE
+.ALIAS HEADER_LEFT_CAPS HDRFTR_LEFT_CAPS
+.ALIAS HEADER_CENTER HDRFTR_CENTER
+.ALIAS HEADER_CENTRE HDRFTR_CENTER
+.ALIAS HEADER_CENTER_FAMILY HDRFTR_CENTER_FAMILY
+.ALIAS HEADER_CENTRE_FAMILY HDRFTR_CENTER_FAMILY
+.ALIAS HEADER_CENTER_FAM HDRFTR_CENTER_FAMILY
+.ALIAS HEADER_CENTRE_FAM HDRFTR_CENTER_FAMILY
+.ALIAS HEADER_CENTER_FONT HDRFTR_CENTER_FONT
+.ALIAS HEADER_CENTRE_FONT HDRFTR_CENTER_FONT
+.ALIAS HEADER_CENTER_FT HDRFTR_CENTER_FONT
+.ALIAS HEADER_CENTRE_FT HDRFTR_CENTER_FONT
+.ALIAS HEADER_CENTER_SIZE HDRFTR_CENTER_SIZE
+.ALIAS HEADER_CENTRE_SIZE HDRFTR_CENTER_SIZE
+.ALIAS HEADER_CENTER_PS HDRFTR_CENTER_SIZE
+.ALIAS HEADER_CENTRE_PS HDRFTR_CENTER_SIZE
+.ALIAS HEADER_CENTER_CAPS HDRFTR_CENTER_CAPS
+.ALIAS HEADER_CENTRE_CAPS HDRFTR_CENTER_CAPS
+.ALIAS HEADER_RIGHT HDRFTR_RIGHT
+.ALIAS HEADER_RIGHT_FAMILY HDRFTR_RIGHT_FAMILY
+.ALIAS HEADER_RIGHT_FAM HDRFTR_RIGHT_FAMILY
+.ALIAS HEADER_RIGHT_FONT HDRFTR_RIGHT_FONT
+.ALIAS HEADER_RIGHT_FT HDRFTR_RIGHT_FONT
+.ALIAS HEADER_RIGHT_SIZE HDRFTR_RIGHT_SIZE
+.ALIAS HEADER_RIGHT_PS HDRFTR_RIGHT_SIZE
+.ALIAS HEADER_RIGHT_CAPS HDRFTR_RIGHT_CAPS
+.ALIAS FOOTER_FAMILY HDRFTR_FAMILY
+.ALIAS FOOTER_FAM HDRFTR_FAMILY
+.ALIAS FOOTER_SIZE HDRFTR_SIZE
+.ALIAS FOOTER_PLAIN HDRFTR_PLAIN
+.ALIAS FOOTER_RULE_GAP HDRFTR_RULE_GAP
+.ALIAS FOOTER_RULE HDRFTR_RULE
+.ALIAS FOOTER_LEFT HDRFTR_LEFT
+.ALIAS FOOTER_LEFT_FAMILY HDRFTR_LEFT_FAMILY
+.ALIAS FOOTER_LEFT_FAM HDRFTR_LEFT_FAMILY
+.ALIAS FOOTER_LEFT_FONT HDRFTR_LEFT_FONT
+.ALIAS FOOTER_LEFT_FT HDRFTR_LEFT_FONT
+.ALIAS FOOTER_LEFT_SIZE HDRFTR_LEFT_SIZE
+.ALIAS FOOTER_LEFT_PS HDRFTR_LEFT_SIZE
+.ALIAS FOOTER_LEFT_CAPS HDRFTR_LEFT_CAPS
+.ALIAS FOOTER_CENTER HDRFTR_CENTER
+.ALIAS FOOTER_CENTRE HDRFTR_CENTER
+.ALIAS FOOTER_CENTER_FAMILY HDRFTR_CENTER_FAMILY
+.ALIAS FOOTER_CENTRE_FAMILY HDRFTR_CENTER_FAMILY
+.ALIAS FOOTER_CENTER_FAM HDRFTR_CENTER_FAMILY
+.ALIAS FOOTER_CENTRE_FAM HDRFTR_CENTER_FAMILY
+.ALIAS FOOTER_CENTER_FONT HDRFTR_CENTER_FONT
+.ALIAS FOOTER_CENTRE_FONT HDRFTR_CENTER_FONT
+.ALIAS FOOTER_CENTER_FT HDRFTR_CENTER_FONT
+.ALIAS FOOTER_CENTRE_FT HDRFTR_CENTER_FONT
+.ALIAS FOOTER_CENTER_SIZE HDRFTR_CENTER_SIZE
+.ALIAS FOOTER_CENTRE_SIZE HDRFTR_CENTER_SIZE
+.ALIAS FOOTER_CENTER_PS HDRFTR_CENTER_SIZE
+.ALIAS FOOTER_CENTRE_PS HDRFTR_CENTER_SIZE
+.ALIAS FOOTER_CENTER_CAPS HDRFTR_CENTER_CAPS
+.ALIAS FOOTER_CENTRE_CAPS HDRFTR_CENTER_CAPS
+.ALIAS FOOTER_RIGHT HDRFTR_RIGHT
+.ALIAS FOOTER_RIGHT_FAMILY HDRFTR_RIGHT_FAMILY
+.ALIAS FOOTER_RIGHT_FAM HDRFTR_RIGHT_FAMILY
+.ALIAS FOOTER_RIGHT_FONT HDRFTR_RIGHT_FONT
+.ALIAS FOOTER_RIGHT_FT HDRFTR_RIGHT_FONT
+.ALIAS FOOTER_RIGHT_SIZE HDRFTR_RIGHT_SIZE
+.ALIAS FOOTER_RIGHT_PS HDRFTR_RIGHT_SIZE
+.ALIAS FOOTER_RIGHT_CAPS HDRFTR_RIGHT_CAPS
+.ALIAS SWITCH_HEADERS SWITCH_HDRFTR
+.ALIAS SWITCH_FOOTERS SWITCH_HDRFTR
+\#
+\# SUPPORT ALIASES
+\#
+.ALIAS COL_BREAK COL_NEXT
+.ALIAS PRINT_FOOTNOTE_RULE FOOTNOTE_RULE
+\#
+\#