.ig Mom -- a typesetting/document-processing macro set for groff. Copyright (C) 2002-2020 Free Software Foundation, Inc. Written by Peter Schaffter PDF integration contributed by Deri James This file is part of groff. groff is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. groff is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Version 2.5_d ------------- Antoine de St-Exupéry asserted that elegance in engineering is achieved not when there is nothing left to add, but when there is nothing left to take away. By those standards, mom is a Rube Goldberg contraption. She was created over the years while groff, and my understanding of it, changed and evolved. However, I'm a firm believer in "if it ain't broke, don't fix it." Version 2.0 removed some of the redundancies and cruft, but mom still needs some nip and tuck. "" in the description of arguments that can be passed to a macro means that any argument turns the feature off. Thanks to everyone who has contributed suggestions and patches, and to those whose GPL'd work has been plundered. Special thanks to Werner Lemberg (margin notes), Tadziu Hoffman (underlining), Deri James (pdf integration), Robin Haberkorn (tbl integration, eqn extensions, and float management). .. \# \# ==================================================================== \# .if \n(.C \ . ab [mom]: The groff mom macros do not work in compatibility mode. \# Check that GNU troff is being run .if !\n[.g]=1 \ . ab [mom]: The mom macros require that you be running GNU troff. \# Check which version of groff is being run .if (\n[.x]\n[.y] < 118) \ . ab [mom]: You need GNU troff version 1.18 or higher to run this version of mom. \# Mom version .ds version 2.5_d .if dVERSION \{\ . ab [mom]: Version \*[version] .\} \# Groff revision .ds short_revision \n[.Y] .substring short_revision 0 0 \# \# Add supplementary styles .sty \n[.fp] UL \" Ultra Light .sty \n[.fp] ULI \" Ultra Light Italic .sty \n[.fp] ULCD \" Ultra Light Condensed .sty \n[.fp] ULCDI \" Ultra Light Condensed Italic .sty \n[.fp] ULEX \" Ultra Light Extended .sty \n[.fp] ULEXI \" Ultra Light Extended Italic \# .sty \n[.fp] XL \" Extra Light .sty \n[.fp] XLI \" Extra Light Italic .sty \n[.fp] XLCD \" Extra Light Condensed .sty \n[.fp] XLCDI \" Extra Light Condensed Italic .sty \n[.fp] XLEX \" Extra Light Extended .sty \n[.fp] XLEXI \" Extra Light Extended Italic \# .sty \n[.fp] TH \" Thin .sty \n[.fp] THI \" Thin Italic .sty \n[.fp] THCD \" Thin Condensed .sty \n[.fp] THCDI \" Thin Condensed Italic .sty \n[.fp] THEX \" Thin Extended .sty \n[.fp] THEXI \" Thin Extended Italic \# .sty \n[.fp] L \" Light Roman .sty \n[.fp] LI \" Light Italic .sty \n[.fp] LCD \" Light Condensed .sty \n[.fp] LCDI \" Light Condensed Italic .sty \n[.fp] LEX \" Light Extended .sty \n[.fp] LEXI \" Light Extended Italic \# .sty \n[.fp] BK \" Book Roman .sty \n[.fp] BKI \" Book Italic .sty \n[.fp] BKCD \" Book Condensed .sty \n[.fp] BKCDI \" Book Condensed Italic .sty \n[.fp] BKEX \" Book Extended .sty \n[.fp] BKEXI \" Book Extended Italic \# .sty \n[.fp] CD \" Medium Condensed .sty \n[.fp] CDI \" Medium Condensed Italic .sty \n[.fp] EX \" Medium Extended .sty \n[.fp] EXI \" Medium Extended Italic \# .sty \n[.fp] DB \" DemiBold Roman .sty \n[.fp] DBI \" DemiBold Italic .sty \n[.fp] DBCD \" DemiBold Condensed .sty \n[.fp] DBCDI \" DemiBold Condensed Italic .sty \n[.fp] DBEX \" DemiBold Extended .sty \n[.fp] DBEXI \" DemiBold Extended Italic \# .sty \n[.fp] SB \" SemiBold Roman .sty \n[.fp] SBI \" SemiBold Italic .sty \n[.fp] SBCD \" SemiBold Condensed .sty \n[.fp] SBCDI \" SemiBold Condensed Italic .sty \n[.fp] SBEX \" SemiBold Extended .sty \n[.fp] SBEXI \" SemiBold Extended Italic \# .sty \n[.fp] BCD \" Bold Condensed .sty \n[.fp] BCDI \" Bold Condensed Italic .sty \n[.fp] BEX \" Bold Extended .sty \n[.fp] BEXI \" Bold Extended Italic .sty \n[.fp] BO \" Bold Outline \# .sty \n[.fp] XB \" Extra Bold .sty \n[.fp] XBI \" Extra Bold Italic .sty \n[.fp] XBCD \" Extra Bold Condensed .sty \n[.fp] XBCDI \" Extra Bold Condensed Italic .sty \n[.fp] XBEX \" Extra Bold Extended .sty \n[.fp] XBEXI \" Extra Bold Extended Italic \# .sty \n[.fp] UB \" Ultra Bold .sty \n[.fp] UBI \" Ultra Bold Italic .sty \n[.fp] UBCD \" Ultra Bold Condensed .sty \n[.fp] UBCDI \" Ultra Bold Condensed Italic .sty \n[.fp] UBEX \" Ultra Bold Extended .sty \n[.fp] UBEXI \" Ultra Bold Extended Italic \# .sty \n[.fp] HV \" Heavy .sty \n[.fp] HVI \" Heavy Italic .sty \n[.fp] HVCD \" Heavy Condensed .sty \n[.fp] HVCDI \" Heavy Condensed Italic .sty \n[.fp] HVEX \" Heavy Extended .sty \n[.fp] HVEXI \" Heavy Extended Italic \# .sty \n[.fp] BL \" Black .sty \n[.fp] BLI \" Black Italic .sty \n[.fp] BLCD \" Black Condensed .sty \n[.fp] BLCDI \" Black Condensed Italic .sty \n[.fp] BLEX \" Black Extended .sty \n[.fp] BLEXI \" Black Extended Italic .sty \n[.fp] BLO \" Black Outline \# .sty \n[.fp] XBL \" Extra Black .sty \n[.fp] XBLI \" Extra Black Italic .sty \n[.fp] XBLCD \" Extra Black .sty \n[.fp] XBLCDI \" Extra Black .sty \n[.fp] XBLEX \" Extra Black Italic .sty \n[.fp] XBLEXI \" Extra Black Italic \# .sty \n[.fp] UBL \" Ultra Black .sty \n[.fp] UBLI \" Ultra Black Italic .sty \n[.fp] UBLCD \" Ultra Black Condensed .sty \n[.fp] UBLCDI \" Ultra Black Condensed Italic .sty \n[.fp] UBLEX \" Ultra Black Extended .sty \n[.fp] UBLEXI \" Ultra Black Extended Italic \# .sty \n[.fp] SC \" Small Caps Roman .sty \n[.fp] SCI \" Small Caps Italic .sty \n[.fp] SCDB \" Small Caps Demibold .sty \n[.fp] SCDBI \" Small Caps Demibold Italic .sty \n[.fp] SCSB \" Small Caps Semibold .sty \n[.fp] SCSBI \" Small Caps Semibold Italic \# \# Instruct grops to use square linecaps and joins. \# This instruction is also executed in DO_B_MARGIN, NEWPAGE, and HEADER \# .if !n \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap' \# \# The following PostScript, provided by Tadziu Hoffmann, permits \# no-fail underlining \# .de ul*ps ps: def grops begin /decornone { grops begin /X { } def /Y { } def /y2 -1 def end } def /decorline { grops begin u neg /uld exch def u /ulw exch def /X { currentpoint /y0 exch def /x0 exch def } def /Y { currentpoint /y1 exch def /x1 exch def drawline /x2 x1 def /y2 y1 def } def end } def /drawline { gsave ulw setlinewidth 0 setlinecap x1 y1 uld sub moveto y2 y0 eq { x2 y2 } { x0 y0 } ifelse uld sub lineto stroke grestore } def decornone /uld 0 def /ulw 0 def /A { X show Y } def /B { 0 SC 3 -1 roll X widthshow Y } def /C { 0 exch X ashow Y } def /D { 0 exch 0 SC 5 2 roll X awidthshow Y } def /E { 0 rmoveto X show Y } def /F { 0 rmoveto 0 SC 3 -1 roll X widthshow Y } def /G { 0 rmoveto 0 exch X ashow Y } def /H { 0 rmoveto 0 exch 0 SC 5 2 roll X awidthshow Y } def /I { 0 exch rmoveto X show Y } def /J { 0 exch rmoveto 0 SC 3 -1 roll X widthshow Y } def /K { 0 exch rmoveto 0 exch X ashow Y } def /L { 0 exch rmoveto 0 exch 0 SC 5 2 roll X awidthshow Y } def /M { rmoveto X show Y } def /N { rmoveto 0 SC 3 -1 roll X widthshow Y } def /O { rmoveto 0 exch X ashow Y } def /P { rmoveto 0 exch 0 SC 5 2 roll X awidthshow Y } def /Q { moveto X show Y } def /R { moveto 0 SC 3 -1 roll X widthshow Y } def /S { moveto 0 exch X ashow Y } def /T { moveto 0 exch 0 SC 5 2 roll X awidthshow Y } def end .. \# .if !n \Y[ul*ps] .if n .color 0 .nr TOC.RELOCATE 0 \" TOC.RELOCATE is off by default .ds PDFHREF.TEXTCOL.DEFAULT 0.0 0.3 0.9 .nr PDFHREF.VIEW.LEADING.C 3i .nr PDFHREF.VIEW.LEADING.T 1i .nr PDFHREF.VIEW.LEADING 0 .nr PDFHREF.VIEW.LEADING.H \n[PDFHREF.VIEW.LEADING] \# \# ==================================================================== \# \# TYPESETTING MACROS, STRINGS, AND ALIASES \# ======================================== \# \# +++ALIASES+++ \# \# Alias .als as ALIAS, and .aln (number registers) as ALIASN \# .als ALIAS als .als ALIASN aln \# \# ALIASES FOR GROFF REQUESTS \# -------------------------- \# .ALIAS MAC de .ALIAS BR br .ALIAS SPREAD brp .ALIAS ESC_CHAR ec .ALIAS STRING ds .ALIAS INCLUDE so \# \# ALIASES FOR NUMBER REGISTERS \# ---------------------------- \# .ALIASN #PT_SIZE .ps \"fractional point size in units .ALIASN #DIVER_DEPTH dn \"diversion depth .ALIASN #DIVER_WIDTH dl \"diversion width .ALIASN #TRAP_DISTANCE .t \"distance to next trap .ALIASN #LEAD .v \"line space .ALIASN #PAGE_LENGTH .p \"page length .ALIASN #NUM_ARGS .$ \"number of arguments passed to a macro .ALIASN #INDENT .i \"value of current indent \# \# ==================================================================== \# \# MISCELLANEOUS \# ============= .nr #L_MARGIN \n[.o] \" Tabs, etc require #L_MARGIN .cflags 4 /\[en] \" So slash and en-dashes get broken \# \# 'END' is used throughout as the 2nd arg to 'MAC' (alias of .de) \# Defining it as a macro here prevents groff from complaining \# that 'END' isn't defined. \# .de END .. \# \# ==================================================================== \# \# +++PAGE LAYOUT+++ \# \# Macros that control the physical layout of the page: paper size \# and margins. \# \# PAGE WIDTH \# ---------- \# *Argument: \# \# *Function: \# Stores user supplied page width in register #PAGE_WIDTH. \# *Notes: \# #PAGE_WIDTH is used to establish the default LL (and right margin). \# Requires unit of measure. \# .MAC PAGEWIDTH END . br . nr #PAGE_WIDTH \\$1 . if !r#L_MARGIN .L_MARGIN \\n[.o] . if !r#R_MARGIN .R_MARGIN 1i . if '\\*[.T]'pdf' \X'papersize=\\n[#PAGE_WIDTH]z,\\n[#PAGE_LENGTH]z'\c .END \# \# L_MARGIN \# -------- \# *Argument: \# \# *Function: \# Stores user supplied page offset in register #L_MARGIN. \# Sets .po to user supplied offset. \# *Notes: \# Requires unit of measure. \# .MAC L_MARGIN END . br . nr #L_MARGIN (\\$1) . po \\n[#L_MARGIN]u .END \# \# R_MARGIN \# -------- \# *Argument: \# \# *Function: \# Stores user supplied right margin in register #R_MARGIN. \# *Notes: \# This is a pseudo-margin. Right margin is actually a function of \# line length. The macro calculates line length from the page offset \# and the value plugged into #R_MARGIN. \# \# N.B. -- PAGEWIDTH and L_MARGIN have to be defined before R_MARGIN. \# \# Requires unit of measure. \# .MAC R_MARGIN END . br . nr #R_MARGIN (\\$1) . ll \\n[#PAGE_WIDTH]u-\\n[#L_MARGIN]u-\\n[#R_MARGIN]u . ta \\n[.l]u . nr #L_LENGTH \\n[.l] .END \# \# T_MARGIN \# -------- \# *Argument: \# \# *Function: \# Stores the user supplied top margin in register #T_MARGIN. \# Advances user supplied depth from the top of the page. \# *Notes: \# Requires unit of measure. \# .MAC T_MARGIN END . nr #T_MARGIN (\\$1) . if !\\n[#DOCS] .sp |\\n[#T_MARGIN]u-1v . wh 0i DO_T_MARGIN .END \# \# B_MARGIN \# -------- \# *Argument: \# \# *Function: \# Stores the user supplied bottom margin in register #B_MARGIN. \# *Notes: \# Requires unit of measure. \# .MAC B_MARGIN END . br . nr #B_MARGIN (\\$1) . nr #ORIGINAL_B_MARGIN \\n[#B_MARGIN] . nr #B_MARGIN_SET 1 . wh -\\n[#B_MARGIN]u DO_B_MARGIN .END \# \# PAGE \# ---- \# *Arguments: \# [pagelength [leftmargin [rightmargin [topmargin [bottommargin]]]]] \# *Function: \# Page set-up. Collects arguments and passes them to the appropriate \# macros. \# *Notes: \# All arguments after pagewidth are optional, but must appear \# in the order given above. (User can fill in as much or as \# little as desired.) \# \# All arguments require a unit of measure. \# .MAC PAGE END . br . PAGEWIDTH \\$1 . PAGELENGTH \\$2 . ie '\\$3'' .L_MARGIN \\n[.o] . el .L_MARGIN \\$3 . ie '\\$4'' .R_MARGIN 1i . el .R_MARGIN \\$4 . if !'\\$5'' .T_MARGIN \\$5 . if !'\\$6'' .B_MARGIN \\$6 .END \# \# gropdf: pass pagelength to postprocessor; no need for -P-p \# .MAC PAGELENGTH END . pl \\$* . if '\\*[.T]'pdf' \X'papersize=\\n[#PAGE_WIDTH]z,\\n[#PAGE_LENGTH]z'\c .END \# \# ===================================================================== \# \# +++PAGE CONTROL+++ \# \# Generic macros for breaking pages. \# \# DO_T_MARGIN \# ----------- \# *Argument: \# \# *Function: \# Plants the top margin at the top of each page. \# *Notes: \# The trap is set in .T_MARGIN or .PAGE \# .MAC DO_T_MARGIN END . ev T_MARGIN . sp |\\n[#T_MARGIN]u-1v . ev .END \# \# DO_B_MARGIN \# ----------- \# *Argument: \# \# *Function: \# Plants the bottom margin at the bottom of each page. \# *Notes: \# The trap is set in .B_MARGIN or .PAGE. \# .MAC DO_B_MARGIN END . nr #T_MARGIN_LEAD_ADJ \\n[#LEAD]-12000 . ev B_MARGIN . if !n .nop \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap' . ie \\n[#DOCS] \ . if !\\n[#NEWPAGE] .bp . el .bp . ev .END \# \# NEWPAGE \# ------- \# *Argument: \# \# *Function: \# Breaks to a new page. \# *Notes: \# If a B_MARGIN has been set, processes that, otherwise, just \# breaks to a new page. \# .MAC NEWPAGE END . br . if \\n[#DOC_TYPE]=5 \{\ . if \\n[#NUM_ARGS]>0 \ . pdftransition PAGE \\$1 . \} . if !\\n[defer] \{\ . nr #NEWPAGE 1 . rr tbl*no-print-header . \} . ie !\\n[#DOCS]=1 \ . if \\n[#B_MARGIN_SET]=1 .DO_B_MARGIN . el \{\ . if (\\n[#COLUMNS]=1):(\\n[#COLUMNS]=2) .nr #COL_NUM \\n[#NUM_COLS] . if !\\n[#FN_DEPTH] \{\ . ch FN_OVERFLOW_TRAP . nr #RESET_FN_OVERFLOW_TRAP 1 . \} . \} . if dPDF.EXPORT \ . if \\n[#FLEX_ACTIVE] \ . if !\\n[#NO_FLEX] \ . tm .ds pre-newpage-\\n% \\n%@\\n[#COL_NUM] . ie \\n[#DOCS]=1 \{\ . if (\\n[@TOP]=0):(\\n[#END_COVER]=1) .bp . rr #END_COVER . if \\n[#RESET_FN_OVERFLOW_TRAP] \{\ . wh -\\n[#FN_OVERFLOW_TRAP_POS]u FN_OVERFLOW_TRAP . rr #RESET_FN_OVERFLOW_TRAP_POS . \} . \} . el .if !\\n[#B_MARGIN_SET]=1 .bp .END \# .ALIAS NEWSLIDE NEWPAGE \# \# ===================================================================== \# \# +++GENERAL STYLE MACROS+++ \# \# LINE LENGTH \# ----------- \# *Argument: \# \# *Function: \# Stores user supplied line length in register #L_LENGTH. \# Sets .ll to #L_LENGTHu \# *Notes: \# Requires unit of measure. \# .MAC LL END . nr #USER_SET_L_LENGTH 1 . ll \\$1 . nr #L_LENGTH \\n[.l] . ta \\n[.l]u .END \# \# +++FAMILY AND FONT+++ \# \# FALLBACK FONT \# ------------- \# *Argument: \# [ ABORT | WARN ] | ABORT | WARN \# *Function: \# Sets register #ABORT_FT_ERRORS to 1, or defines a fallback font \# called "dummy" at font position 0. \# *Notes: \# Calls to non-existent families cause mom to continue processing \# files using the fallback font until a valid family is entered. \# \# Calls to non-existent fonts generate warnings. If ABORT is passed \# to FALLBACK_FONT, mom stops processing files after the warning. \# Otherwise, she continues to process files using the fallback font \# after the warning is issued. The default fallback font is CR; the \# default for font warnings is to abort. \# .MAC FALLBACK_FONT END . if \\n[#NUM_ARGS]=1 \{\ . if '\\$1'ABORT' .nr #ABORT_FT_ERRORS 1 . if '\\$1'WARN' \ . if r #ABORT_FT_ERRORS .nr #ABORT_FT_ERRORS 0 . if !'\\$1'ABORT' \ . if !'\\$1'WARN' .fp 0 dummy \\$1 . \} . if \\n[#NUM_ARGS]=2 \{\ . fp 0 dummy \\$1 . if '\\$2'ABORT' .nr #ABORT_FT_ERRORS 1 . if '\\$2'WARN' .nr #ABORT_FT_ERRORS 0 . \} .END \# .FALLBACK_FONT CR ABORT \# \# FAMILY \# ------ \# *Argument: \# \# *Function: \# Stores user supplied font family in string $FAMILY. Sets .fam \# to $FAMILY. \# .MAC FAMILY END . if '\\n[.ev]'COVER_TEXT' .ds $SAVED_DOC_FAM \\n[.fam] . if \\n[#COLLATE] .rm $SAVED_DOC_FAM . ds $FAMILY \\$1 . if \\n[#PRINT_STYLE]=1 \{\ . fam \\*[$TYPEWRITER_FAM] . return . \} . if \\n[#IGNORE] \{\ . fam \\*[$TYPEWRITER_FAM] . return . \} . if (\\n[.x]\\n[.y]\\*[short_revision] >= 1192) .ds $SAVED_STYLE \\n[.sty] . ft 0 . fam \\*[$FAMILY] . if (\\n[.x]\\n[.y]\\*[short_revision] >= 1192) \{\ . ft \\*[$SAVED_STYLE] . if !F\\n[.fn] .ft 0 . \} . ie \\n[#PRE_COLLATE]=1 . . el \{\ . if \\n[#COLLATE]=1 \ . if !r#START .ds $DOC_FAM \\*[$FAMILY] . \} .END \# \# FONT \# ---- \# *Argument: \# R | I | B | BI | \# *Function: \# Stores user supplied font in $FONT and sets .ft to $FONT. \# .MAC FT END . ds $FONT \\$1 . if \\n[#PRINT_STYLE]=1 \{\ . ie '\\$1'I' \{\ . if \\n[#UNDERLINE_ITALIC]=1 \{\ . UNDERLINE . return . \} . if \\n[#ITALIC_MEANS_ITALIC]=1 \{\ . ds $FONT \\$1 . ft \\*[$FONT] . return . \} . \} . el .UNDERLINE OFF . return . \} . ft 0 . ft \\*[$FONT] . if (\\n[.x]\\n[.y]\\*[short_revision] >= 1192) \{\ . if '\\n[.sty]'' \{\ . if !F\\n[.fn] \{\ . if !S\\*[$FONT] \{\ . tm1 "[mom]: Font style "\\*[$FONT]" at line \\n[.c] has not been registered. . ie \\n[#ABORT_FT_ERRORS]=0 \ . tm1 " Continuing to process using fallback font. . el .ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c]. . \} . if \\n[.f]=0 \{\ . tm1 "[mom]: Either font style "\\*[$FONT]" at line \\n[.c] does not exist in family "\\n[.fam]", . tm1 " or family "\\n[.fam]" has not been installed. . ie \\n[#ABORT_FT_ERRORS]=0 \ . tm1 " Continuing to process using fallback font. . el .ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c]. . \} . \} . \} . \} .END \# \# POINT SIZE \# ---------- \# *Arguments: \# \# *Function: \# Sets point size to user supplied value in scaled points. \# If #AUTO_LEAD is on, resets lead accordingly. \# *Notes: \# Must NOT use a unit of measure. \# .MAC PT_SIZE END . if \\n[#PRINT_STYLE]=1 .return . if \\n[#IGNORE] .return . ps \\$1 . nr #PT_SIZE_IN_UNITS \\n[.ps] . ie '\\$0'DOC_PT_SIZE' \{\ . if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0 . br . nr #NEW_DOC_PT_SIZE \\n[.ps] . if \\n[#DOC_AUTOLEAD] \{\ . ie !\\n[#DOC_AUTOLEAD_FACTOR] .nr #AUTOLEADING \\n[#DOC_AUTOLEAD] . el .nr #AUTOLEADING \\n[.ps]*\\n[#DOC_AUTOLEAD]/1000-\\n[.ps] . nr #DOC_LEAD \\n[.ps]+\\n[#AUTOLEADING] . nr #RESET_TRAPS 1 . \} . \} . el \{\ . if \\n[#AUTO_LEAD] \{\ . nr #SAVED_VS \\n[.v] . vs \\n[.ps]u+\\n[#AUTOLEADING]u . \} . \} . if \\n[pdfbx-running]=1 \{\ . nr #VS_DIFF \\n[#SAVED_VS]-\\n[.v] . ch FOOTER \\n[#VARIABLE_FOOTER_POS]u+\\n[#VS_DIFF]u . \} .END \# \# SIZE (inline) \# ------------- \# *Arguments: \# \# *Function: \# Sets point size to user supplied value in scaled points. \# Intended to be called inline with \*[SIZE ] \# *Notes: \# Can be used with a unit of measure or not. \# .MAC SIZE END \c .ps \\$1 .END \# \# LEADING \# ------- \# *Argument: \# \# *Function: \# Turns off #AUTOLEAD if it's on. \# Sets .vs to user supplied value. \# *Notes: \# Does not require unit of measure. LS automatically turns off AUTOLEAD. \# .MAC LS END . br . if \\n[#PRINT_STYLE]=1 .return . if \\n[#IGNORE] .return . if \\n[#AUTO_LEAD] \{\ . rr #AUTO_LEAD . rr #AUTOLEAD_VALUE . rr #AUTOLEADING . \} . nr #SAVED_VS \\n[.v] . vs \\$1 . if \\n[pdfbx-running]=1 \{\ . nr #VS_DIFF \\n[#SAVED_VS]-\\n[.v] . ch FOOTER \\n[#VARIABLE_FOOTER_POS]u+\\n[#VS_DIFF]u . \} . if !\\n[#START] \ . if \\n[.t]<\\n[.v] 'bp .END \# \# AUTOLEAD \# -------- \# *Argument: \# [FACTOR] \# *Function: \# Stores user supplied auto-lead value in register #AUTOLEAD_VALUE. \# Adds #AUT0LEAD_VALUE to #PT_SIZE when invoked to set leading. \# All subsequent PT_SIZE requests reset the leading in the same way until \# AUTOLEAD is turned off. \# *Notes: \# With the optional FACTOR argument, the current point size is \# multiplied by #AUTOLEAD_VALUE/1000 instead of the two being added \# together. \# .MAC AUTOLEAD END . if \\n[#PRINT_STYLE]=1 .return . if \\n[#IGNORE] .return . nr #AUTO_LEAD 1 \" autolead on or off . nr #AUTOLEAD_VALUE (p;\\$1) \" arg x 1000 . ie '\\$2'FACTOR' \{\ . if !\\n[#DOCS] .nr #DOC_AUTOLEAD_FACTOR \\n[#AUTOLEAD_VALUE] \" save for DOC_PT_SIZE . nr #AUTOLEADING \\n[.ps]*\\n[#AUTOLEAD_VALUE]/1000-\\n[.ps] . \} . el .nr #AUTOLEADING \\n[#AUTOLEAD_VALUE] . vs \\n[.ps]u+\\n[#AUTOLEADING]u .END \# \# STRINGS FOR INLINE CONTROL OF GENERAL TYPE STYLE \# ------------------------------------------------ .ds ROM \Ef[R] .ds IT \Ef[I] .ds BD \Ef[B] .ds BDI \Ef[BI] .ds PREV \Ef[] .ds S \Es \# \# ===================================================================== \# \# +++KERNING+++ \# \# AUTOMATIC PAIRWISE KERNING \# -------------------------- \# *Arguments: \# | \# *Function: \# Turns automatic pairwise kerning on or off. \# .MAC KERN END . ie '\\$1'' \{\ . kern . nr #KERN 1 . \} . el \{\ . kern 0 . nr #KERN 0 . \} .END \# \# INLINE KERNING AND HORIZONTAL MOVEMENT \# -------------------------------------- \# \# Inline kerning provides a simple way to adjust the amount of \# space between any two letters. It's predicated on a unit of \# measure "U", which, by default, 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. \# \# The default value for U may be changed or reset with the \# KERN_UNIT macro. \# .MAC KERN_UNIT END . ie '\\$1'DEFAULT' .ds $KERN_UNIT 36 . el .ds $KERN_UNIT \\$1 .END \# .ds $KERN_UNIT 36 .ds BU \h'-(\En[.ps]u/\E*[$KERN_UNIT]u*\\$1u)' .ds FU \h'(\En[.ps]u/\E*[$KERN_UNIT]u*\\$1u)' \# \# Initialize strings for pre-1.1.3c-style BU and FU \# .nr #LOOP 0 1 .while \n+[#LOOP]<37 \{\ . ds BU\n[#LOOP] \h'-(\En[.ps]u/\E*[$KERN_UNIT]u*\n[#LOOP]u)' . ds FU\n[#LOOP] \h'(\En[.ps]u/\E*[$KERN_UNIT]u*\n[#LOOP]u)' .\} \# \# Horizontal movements \# -------------------- \# BP1...12.75 and FP1...12.75 move backwards or forwards inline by the \# specified number of points. \# .ds BCK \h'-\\$1' .ds FWD \h'\\$1' \# .ds BP.25 \h'-.25' .ds BP.5 \h'-.5' .ds BP.75 \h'-.75' .ds BP1 \h'-1p' .ds BP1.25 \h'-1.25p' .ds BP1.5 \h'-1.5p' .ds BP1.75 \h'-1.75p' .ds BP2 \h'-2p' .ds BP2.25 \h'-2.25p' .ds BP2.5 \h'-2.5p' .ds BP2.75 \h'-2.75p' .ds BP3 \h'-3p' .ds BP3.25 \h'-3.25p' .ds BP3.5 \h'-3.5p' .ds BP3.75 \h'-3.75p' .ds BP4 \h'-4p' .ds BP4.25 \h'-4.25p' .ds BP4.5 \h'-4.5p' .ds BP4.75 \h'-4.75p' .ds BP5 \h'-5p' .ds BP5.25 \h'-5.25p' .ds BP5.5 \h'-5.5p' .ds BP5.75 \h'-5.75p' .ds BP6 \h'-6p' .ds BP6.25 \h'-6.25p' .ds BP6.5 \h'-6.5p' .ds BP6.75 \h'-6.75p' .ds BP7 \h'-7p' .ds BP7.25 \h'-7.25p' .ds BP7.5 \h'-7.5p' .ds BP7.75 \h'-7.75p' .ds BP8 \h'-8p' .ds BP8.25 \h'-8.25p' .ds BP8.5 \h'-8.5p' .ds BP8.75 \h'-8.75p' .ds BP9 \h'-9p' .ds BP9.25 \h'-9.25p' .ds BP9.5 \h'-9.5p' .ds BP9.75 \h'-9.75p' .ds BP10 \h'-10p' .ds BP10.25 \h'-10.25p' .ds BP10.5 \h'-10.5p' .ds BP10.75 \h'-10.75p' .ds BP11 \h'-11p' .ds BP11.25 \h'-11.25p' .ds BP11.5 \h'-11.5p' .ds BP11.75 \h'-11.75p' .ds BP12 \h'-12p' .ds BP12.25 \h'-12.25p' .ds BP12.5 \h'-12.5p' .ds BP12.75 \h'-12.75p' \# .ds FP.25 \h'.25' .ds FP.5 \h'.5' .ds FP.75 \h'.75' .ds FP1 \h'1p' .ds FP1.25 \h'1.25p' .ds FP1.5 \h'1.5p' .ds FP1.75 \h'1.75p' .ds FP2 \h'2p' .ds FP2.25 \h'2.25p' .ds FP2.5 \h'2.5p' .ds FP2.75 \h'2.75p' .ds FP3 \h'3p' .ds FP3.25 \h'3.25p' .ds FP3.5 \h'3.5p' .ds FP3.75 \h'3.75p' .ds FP4 \h'4p' .ds FP4.25 \h'4.25p' .ds FP4.5 \h'4.5p' .ds FP4.75 \h'4.75p' .ds FP5 \h'5p' .ds FP5.25 \h'5.25p' .ds FP5.5 \h'5.5p' .ds FP5.75 \h'5.75p' .ds FP6 \h'6p' .ds FP6.25 \h'6.25p' .ds FP6.5 \h'6.5p' .ds FP6.75 \h'6.75p' .ds FP7 \h'7p' .ds FP7.25 \h'7.25p' .ds FP7.5 \h'7.5p' .ds FP7.75 \h'7.75p' .ds FP8 \h'8p' .ds FP8.25 \h'8.25p' .ds FP8.5 \h'8.5p' .ds FP8.75 \h'8.75p' .ds FP9 \h'9p' .ds FP9.25 \h'9.25p' .ds FP9.5 \h'9.5p' .ds FP9.75 \h'9.75p' .ds FP10 \h'10p' .ds FP10.25 \h'10.25p' .ds FP10.5 \h'10.5p' .ds FP10.75 \h'10.75p' .ds FP11 \h'11p' .ds FP11.25 \h'11.25p' .ds FP11.5 \h'11.5p' .ds FP11.75 \h'11.75p' .ds FP12 \h'12p' .ds FP12.25 \h'12.25p' .ds FP12.5 \h'12.5p' .ds FP12.75 \h'12.75p' \# \# WHOLE LINE (TRACK) KERNING \# -------------------------- \# *Argument: \# \# *Function: \# Invokes .tkf (track kerning) for the current font with \# 1 as both the upper and lower point size limits, so that \# the value entered by the user applies regardless of point \# size. RW ("Reduce Whitespace") reduces the amount of space \# between all characters by an equal amount. EW ("Extra \# Whitespace") increases the amount of space. \# *Notes: \# Decimal values are acceptable. \# \# A value of 1 will produce an unacceptably tight or loose line \# at most text point sizes; therefore, effective use of RW and \# EW is in the fractional range below 1. \# \# \n[.f] holds the current font number, which is acceptable to .tkf. \# \# RW and EW must be reset to 0 to cancel their effect on subsequent \# output lines. \# .MAC RW END . if \\n[#BR_AT_LINE_KERN] \{\ . ie \\n[#JUSTIFY]=1 .brp . el .br . \} . rr #EW . rm $EW . nr #RW 1 . ds $RW \\$1 . tkf \\n[.f] 1 -\\$1 1 -\\$1 .END \# .MAC EW END . if \\n[#BR_AT_LINE_KERN] \{\ . ie \\n[#JUSTIFY]=1 .brp . el .br . \} . rr #RW . rm $RW . nr #EW 1 . ds $EW \\$1 . tkf \\n[.f] 1 \\$1 1 \\$1 .END \# \# BREAK AT LINE KERN \# ------------------ \# *Arguments: \# toggle \# *Function: \# Enables/disables .br's before .RW and .EW \# *Notes: \# Mostly, users will want .br's before any kind of line kerning, but \# there may be cases where they don't. BR_AT_LINE_KERN is off by \# default and must be invoked explicitly. \# .MAC BR_AT_LINE_KERN END . ie '\\$1'' .nr #BR_AT_LINE_KERN 1 . el .rr #BR_AT_LINE_KERN .END \# \# ===================================================================== \# \# +++HYPHENATION+++ \# \# AUTO HYPHENATION \# ---------------- \# *Arguments: \# | | DEFAULT \# or \# LINES | MARGIN | SPACE \# *Function: \# Turns auto hyphenation on or off, resets the hyphenation style \# to default, or permits the setting of various hyphenation \# parameters. \# *Notes: \# HY, by itself, defaults to .hy 14, i.e. no hyphens after the \# first two or before the last two characters of a word, and no \# hyphenation of the last line prior to a trap (e.g., at the \# bottom of a page). \# \# HY DEFAULT resets the hyphenation style to .hy 14 (see \# above) if that behaviour is desired after changes have been \# made to LINES, MARGIN, or SPACE. \# \# HY LINES sets the number of allowable consecutive hyphenated lines. \# \# HY MARGIN sets the amount of space (ipPcm) allowed at the end \# of a line in QUAD mode before hyphenation is tripped (e.g. if there's \# only 6 points left, groff won't try to hyphenate the next word). \# \# HY SPACE sets the amount of extra interword space (ipPcm) that can \# be added in JUSTIFY mode to prevent a line from being hyphenated. \# .MAC HY END . ie '\\$1'' \{\ . hy 14 . if \\n[#LINES] .hlm \\n[#LINES] . if \\n[#MARGIN] .hym \\n[#MARGIN]] . if \\n[#SPACE] .hys \\n[#SPACE] . 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 . nr #HY_LINES \\$2 . \} . if '\\$1'MARGIN' \{\ . hym \\$2 . nr #HY_MARGIN \\$2 . \} . if '\\$1'SPACE' \{\ . hys \\$2 . nr #HY_SPACE \\$2 . \} . if '\\$1'DEFAULT' \{\ . hlm -1 . hym 0 . hys 0 . rr #HY_LINES . rr #HY_SPACE . rr #HY_MARGIN . \} . \} .END \# \# HYPHENATION PARAMETERS \# ---------------------- \# *Arguments: \# <# of lines> | | \# *Function: \# Allows user to specify .HY LINES, MARGIN, and SPACE with a single command. \# .MAC HY_SET END . nr #HY_SET 1 . hlm \\$1 . hym \\$2 . hys \\$3 .END \# \# ===================================================================== \# \# +++VERTICAL SPACING+++ \# \# ADVANCE LEAD \# ------------ \# *Argument: \# \# *Function: \# Creates or modifies register #ALD. Adds user supplied lead \# below current baseline. \# *Notes: \# Requires a unit of measure. \# .MAC ALD END . if '\\$0'ALD' \{\ . nr #ALD (u;\\$1) . sp \\n[#ALD]u . \} . if '\\$0'ADD_SPACE' \{\ . vpt 0 . nr #ALD \\$1 . rs . nop \& . br . sp |\\n[#T_MARGIN]u-1v+\\n[#ALD]u . rr @TOP . nr #SPACE_ADDED 1 . vpt . \} . if '\\$0'SPACE' .sp \\$1 . if '\\$0'SP' .sp \\$1 .END \# \# REVERSE LEAD \# ------------ \# *Argument: \# \# *Function: \# Creates or modifies register #RLD. Reverses user supplied \# lead above current baseline. \# *Notes: \# Requires a unit of measure. \# .MAC RLD END . br . nr #RLD (u;\\$1) . sp -\\n[#RLD]u .END \# \# ALD/RLD STRINGS \# --------------- \# The strings \*[ALD.25]...\*[ALD12.75] and their corresponding \# \*[RLD] forms have been left in for backward compatibility with \# documents created using mom-1.1.3c or earlier. The preferred methods \# of advancing and reversing on the page inline are \*[UP ] \# and \*[DOWN ]. \# .ds DOWN \v'\\$1' .ds UP \v'-\\$1' \# .ds ALD.25 \v'.25p' .ds ALD.5 \v'.5p' .ds ALD.75 \v'.75p' .ds ALD1 \v'1p' .ds ALD1.25 \v'1.25p' .ds ALD1.5 \v'1.5p' .ds ALD1.75 \v'1.75p' .ds ALD2 \v'2p' .ds ALD2.25 \v'2.25p' .ds ALD2.5 \v'2.5p' .ds ALD2.75 \v'2.75p' .ds ALD3 \v'3p' .ds ALD3.25 \v'3.25p' .ds ALD3.5 \v'3.5p' .ds ALD3.75 \v'3.75p' .ds ALD4 \v'4p' .ds ALD4.25 \v'4.25p' .ds ALD4.5 \v'4.5p' .ds ALD4.75 \v'4.75p' .ds ALD5 \v'5p' .ds ALD5.25 \v'5.25p' .ds ALD5.5 \v'5.5p' .ds ALD5.75 \v'5.75p' .ds ALD6 \v'6p' .ds ALD6.25 \v'6.25p' .ds ALD6.5 \v'6.5p' .ds ALD6.75 \v'6.75p' .ds ALD7 \v'7p' .ds ALD7.25 \v'7.25p' .ds ALD7.5 \v'7.5p' .ds ALD7.75 \v'7.75p' .ds ALD8 \v'8p' .ds ALD8.25 \v'8.25p' .ds ALD8.5 \v'8.5p' .ds ALD8.75 \v'8.75p' .ds ALD9 \v'9p' .ds ALD9.25 \v'9.25p' .ds ALD9.5 \v'9.5p' .ds ALD9.75 \v'9.75p' .ds ALD10 \v'10p' .ds ALD10.25 \v'10.25p' .ds ALD10.5 \v'10.5p' .ds ALD10.75 \v'10.75p' .ds ALD11 \v'11p' .ds ALD11.25 \v'11.25p' .ds ALD11.5 \v'11.5p' .ds ALD11.75 \v'11.75p' .ds ALD12 \v'12p' .ds ALD12.25 \v'12.5p' .ds ALD12.5 \v'12.5p' .ds ALD12.75 \v'12.75p' \# .ds RLD.25 \v'-.25p' .ds RLD.5 \v'-.5p' .ds RLD.75 \v'-.75p' .ds RLD1 \v'-1p' .ds RLD1.25 \v'-1.25p' .ds RLD1.5 \v'-1.5p' .ds RLD1.75 \v'-1.75p' .ds RLD2 \v'-2p' .ds RLD2.25 \v'-2.25p' .ds RLD2.5 \v'-2.5p' .ds RLD2.75 \v'-2.75p' .ds RLD3 \v'-3p' .ds RLD3.25 \v'-3.25p' .ds RLD3.5 \v'-3.5p' .ds RLD3.75 \v'-3.75p' .ds RLD4 \v'-4p' .ds RLD4.25 \v'-4.25p' .ds RLD4.5 \v'-4.5p' .ds RLD4.75 \v'-4.75p' .ds RLD5 \v'-5p' .ds RLD5.25 \v'-5.25p' .ds RLD5.5 \v'-5.5p' .ds RLD5.75 \v'-5.75p' .ds RLD6 \v'-6p' .ds RLD6.25 \v'-6.25p' .ds RLD6.5 \v'-6.5p' .ds RLD6.75 \v'-6.75p' .ds RLD7 \v'-7p' .ds RLD7.25 \v'-7.25p' .ds RLD7.5 \v'-7.5p' .ds RLD7.75 \v'-7.75p' .ds RLD8 \v'-8p' .ds RLD8.25 \v'-8.25p' .ds RLD8.5 \v'-8.5p' .ds RLD8.75 \v'-8.75p' .ds RLD9 \v'-9p' .ds RLD9.25 \v'-9.25p' .ds RLD9.5 \v'-9.5p' .ds RLD9.75 \v'-9.75p' .ds RLD10 \v'-10p' .ds RLD10.25 \v'-10.25p' .ds RLD10.5 \v'-10.5p' .ds RLD10.75 \v'-10.75p' .ds RLD11 \v'-11p' .ds RLD11.25 \v'-11.25p' .ds RLD11.5 \v'-11.5p' .ds RLD11.75 \v'-11.75p' .ds RLD12 \v'-12p' .ds RLD12.25 \v'-12.5p' .ds RLD12.5 \v'-12.5p' .ds RLD12.75 \v'-12.75p' \# \# ===================================================================== \# \# +++REFINEMENTS+++ \# \# AUTOMATIC LIGATURES \# ------------------- \# *Arguments: \# | \# *Function: \# Turns automatic ligature generation on or off. \# *Notes: \# Ligatures may be supplied manually with \[fi], \[fl], etc. \# .MAC LIGATURES END . ie '\\$1'' \{\ . lg . nr #LIGATURES 1 . \} . el \{\ . lg 0 . nr #LIGATURES 0 . \} .END \# \# SMARTQUOTES \# ----------- \# *Arguments: \# [ ,, ] | [ << ] | [ >> ] | \# or \# [ DA | DE | EN | ES | FR | IT | NL | NO | PT | SV ] | \# *Function: \# Turns smartquotes on (optionally with a quoting style from the \# argument list, or off). \# If no quoting style is given, then EN (English) is used by default. \# If no quoting style is given and smart quotes have been turned off \# previously, the old quoting style will be restored. \# *Notes: \# The " character is read outside the macro when mom is \# processed. The strings for open/close ($QUOTE) are then \# defined in the macro. \# .char " \\*[$QUOTE\\n[#OPEN_CLOSE]]\R'#OPEN_CLOSE (1-\\n[#OPEN_CLOSE])' .nr #SQ_ON 0 \# .MAC SMARTQUOTES END .\" First " will be translated to $QUOTE0 . nr #OPEN_CLOSE 0 . if '\\$1'' \{\ . if !'\\*[$RESTORE_SQ]'' \{\ . SMARTQUOTES \\*[$RESTORE_SQ] . return . \} .\" Default smart quotes (English) . ds $QUOTE0 \[lq] . ds $QUOTE1 \[rq] . ds $RESTORE_SQ EN . nr #SQ_ON 1 . return . \} . if '\\$1',,' \{\ . ds $QUOTE0 \[Bq] . ds $QUOTE1 \[lq] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'<<' \{\ . ds $QUOTE0 \[Fo] . ds $QUOTE1 \[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'>>' \{\ . ds $QUOTE0 \[Fc] . ds $QUOTE1 \[Fo] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'DA' \{\ . ds $QUOTE0 \[Fc] . ds $QUOTE1 \[Fo] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'DE' \{\ . ds $QUOTE0 \[Bq] . ds $QUOTE1 \[lq] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'EN' \{\ . ds $QUOTE0 \[lq] . ds $QUOTE1 \[rq] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'ES' \{\ . ds $QUOTE0 \[lq] . ds $QUOTE1 \[rq] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'FR' \{\ . ds $QUOTE0 \[Fo]\| . ds $QUOTE1 \|\[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'IT' \{\ . ds $QUOTE0 \[Fo]\| . ds $QUOTE1 \|\[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'NL' \{\ . ds $QUOTE0 \[rq] . ds $QUOTE1 \[rq] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'NO' \{\ . ds $QUOTE0 \[Fo] . ds $QUOTE1 \[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'PT' \{\ . ds $QUOTE0 \[Fo] . ds $QUOTE1 \[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} . if '\\$1'SV' \{\ . ds $QUOTE0 \[Fc] . ds $QUOTE1 \[Fc] . ds $RESTORE_SQ \\$1 . nr #SQ_ON 1 . return . \} .\" None of the above -> turn smartquotes off . ds $QUOTE0 \[dq] . ds $QUOTE1 \[dq] . nr #SQ_ON 0 .END \# .ds $QUOTE0 \[lq] .ds $QUOTE1 \[rq] \# \# Strings for foot and inch marks \# .ds FOOT \[fm] .ds INCH \[fm]\[fm] \# \# ===================================================================== \# \# +++LINE BREAKS+++ \# \# NO-SPACE BREAK \# -------------- \# *Argument: \# \# *Function: \# Breaks a line without advancing. \# *Notes: \# EL is the mnemonic used on older, dedicated typesetting machines \# to indicate "process the line, without advancing the galley \# medium." It stands for End Line. \# \# The \c inline must be appended to the end of input lines when in \# nofill mode; in fill modes, the \c inline must not be used. \# .MAC EL END . TRAP OFF . if \\n[#PSEUDO_FILL]=1 \& . br . sp -1v . TRAP .END \# \# An inline escape to accomplish the same thing. \# Preferable, since it works with filled and non-filled copy and \# doesn't require the user to remember whether to use (or not use) \# \c. \# .ds B \h'|0'\R'#NO_ADVANCE 1'\c \# \# ===================================================================== \# \# +++FILLING/QUADDING/JUSTIFYING+++ \# \# JUSTIFY \# ------- \# *Argument: \# \# *Function: \# Turns fill on and sets .ad to b. \# *Notes: \# Justifies text left and right. \# .MAC JUSTIFY END \#. if r pdfbx-top 'sp -1 . if \\n[#TAB_ACTIVE]=0 \{\ . nr #QUAD 1 . ds $RESTORE_QUAD_VALUE \\*[$QUAD_VALUE] . \} ' ce 0 . QUAD J . if \\n[#PRINT_STYLE]=1 .QUAD L . nr #PSEUDO_FILL 0 .END \# \# QUAD \# ---- \# *Arguments: \# L | LEFT | R | RIGHT | C | CENTER/CENTRE \# *Function: \# Turns fill on and sets .ad to l, r, or c. \# *Notes: \# Terminology is a problem here. Some people call quad left \# left justified, flush left, or flush left/rag right (and the \# reverse for quad right). Quad center is sometimes called rag \# both. For our purposes, all "quad" modes mean that groff fill \# mode is enabled. \# .MAC QUAD END . if r pdfbx-top \{\ ' sp -1 . rr pdfbx-top . \} .\" The QUAD in PP adds an unwanted linespace after a HEADING at the .\" top of a pdf box because of this .br, so HEADING assigns the .\" tmp register "bx-top\n[stack]" to inhibit it. . ie !r pdfbx-top\\n[stack] .br . el .rr pdfbx-top\\n[stack] . if \\n[#COVERTEXT_PP] \ . ds $RESTORE_DOC_QUAD \\*[$QUAD_VALUE] . ds $QUAD_VALUE \\$1 . substring $QUAD_VALUE 0 0 . if \\n[#TAB_ACTIVE]=0 \{\ . nr #QUAD 1 . ds $RESTORE_QUAD_VALUE \\*[$QUAD_VALUE] . \} ' ce 0 ' fi . if '\\*[$QUAD_VALUE]'L' \{\ . nr #JUSTIFY 0 . ad l . \} . if '\\*[$QUAD_VALUE]'R' \{\ . nr #JUSTIFY 0 . ad r . \} . if '\\*[$QUAD_VALUE]'C' \{\ . nr #JUSTIFY 0 . ad c . \} . if '\\*[$QUAD_VALUE]'J' \{\ . nr #JUSTIFY 1 . ad b . \} . nr #PSEUDO_FILL 0 .END \# \# LEFT, RIGHT, AND CENTER \# ----------------------- \# The purpose of these macros is to allow the user to enter lines \# of text that will be quadded LRC without having to stick .BR \# or .br between lines. For the sake of consistency, all three \# appear to behave similarly (from the point of view of the user), \# although the underlying primitives don't. For this reason, LEFT, \# RIGHT, and CENTER must be followed by .QUAD [L R C J] or .JUSTIFY \# to restore text to fill mode. \# \# LEFT \# ---- \# *Argument: \# \# *Function: \# Turns fill mode off. Allows user to quad lines left without \# requiring the .BR or .br macro. \# *Notes: \# LEFT simply turns fill off. Lines that exceed the current LL \# will not be broken. Note that this behaviour differs from the \# RIGHT and CENTER macros. \# .MAC LEFT END . if \\n[#TAB_ACTIVE]=0 \{\ . rr #QUAD . ds $RESTORE_QUAD_VALUE LEFT . \} . ce 0 . nf . nr #PSEUDO_FILL 1 .\" Fix for a little conflict with DOCTYPE LETTER . if '\\n[.z]'LETTERHEAD1' .rr #DATE_FIRST .END \# \# RIGHT \# ----- \# *Argument: \# \# *Function: \# Turns fill on. Allows user to quad lines right without \# requiring the .BR or .br macro. \# *Notes: \# Lines that exceed the current LL will be broken, with the excess \# text quadded right. \# .MAC RIGHT END . if \\n[#TAB_ACTIVE]=0 \{\ . rr #QUAD . ds $RESTORE_QUAD_VALUE RIGHT . \} . nf . rj 100000 . nr #PSEUDO_FILL 1 .END \# \# CENTER \# ------ \# *Argument: \# \# *Function: \# Turns fill off. Allows user to center lines without \# requiring the .BR or .br macro. \# *Notes: \# Lines that exceed the current LL will be broken, with the excess \# text centered. \# .MAC CENTER END . if \\n[#TAB_ACTIVE]=0 \{\ . rr #QUAD . ds $RESTORE_QUAD_VALUE CENTER . \} . nf . ce 100000 . nr #PSEUDO_FILL 1 .END \# \# CENTER BLOCKS OF TYPE \# --------------------- \# *Arguments: \# | \# *Function: \# Allows users to centre blocks of type on the page without \# altering their quad. \# .MAC CENTER_BLOCK END . br . ie !\\n[.$] .di CENTER*BLOCK . el \{\ . di . in \\n[.l]u-\\n[dl]u/2u . if \\n[.u] .nr #FILLED 1 . nf . CENTER*BLOCK . if \\n[#FILLED] .fi . rr #FILLED . in . \} .END \# .ALIAS CENTRE_BLOCK CENTER_BLOCK \# \# ===================================================================== \# \# +++TABS+++ \# \# There are two different kinds of tabs: typesetting tabs and \# string tabs. \# \# Typesetting tabs are set with TAB_SET, which requires a tab number, \# an indent (offset) from the left margin and a length (optionally \# with a quad direction and an instruction to fill lines). After tabs \# are set with TAB_SET, they are called with .TAB n, where "n" \# corresponds to the number passed to TAB_SET as a valid tab number. \# \# String tabs allow the user to mark off tab positions inline. Tab \# indents and lengths are calculated from the beginning and end \# positions of the marks. Up to 19 string tabs may be created, \# numbered 1-19. Once created, they are called with .TAB n, \# just like typesetting tabs. \# \# Setting up string tabs is a two-step procedure. First, the user \# enters an input line in which s/he wants to mark off string tabs. \# The beginning of a tab is marked with \*[STn], where "n" is \# the desired number of the tab. The end of the tab is marked \# with \*[STnX]. All ST's must have a matching STX. String tabs \# may be nested. \# \# Next, the user invokes .ST n for every string tab defined, and \# optionally passes quad information to it. That done, string tabs \# can be called just like typesetting tabs. \# \# Strings for string tab inlines \# ------------------------------ \# Initialize string tab markers numbered 1 to 19. \# .nr #LOOP 0 1 .while \n+[#LOOP]<20 \{\ . ds ST\n[#LOOP] \Ek[#ST\n[#LOOP]_OFFSET] .\} \# .nr #LOOP 0 1 .while \n+[#LOOP]<20 \{\ . ds ST\n[#LOOP]X \Ek[#ST\n[#LOOP]_MARK] .\} .rr #LOOP \# \# These are reserved ST numbers for internal use .ds ST100 \Ek[#ST100_OFFSET] .ds ST100X \Ek[#ST100_MARK] .ds ST101 \Ek[#ST101_OFFSET] .ds ST101X \Ek[#ST101_MARK] .ds ST102 \Ek[#ST102_OFFSET] .ds ST102X \Ek[#ST102_MARK] .ds ST103 \Ek[#ST103_OFFSET] .ds ST103X \Ek[#ST103_MARK] \# \# QUAD AND SET STRING TABS \# ------------------------ \# *Arguments: \# L | R | C | J [QUAD] \# *Function: \# Creates strings $ST<#>_QUAD_DIR and $ST<#>_FILL, then sets up a \# tab based on the collected information. \# *Notes: \# Like TAB_SET, ST invoked without a quad direction will default to LEFT. \# If lines should be filled and quadded, use the optional argument QUAD. \# N.B. -- indents *must* be turned off before setting string tabs \# inside .PAD \# .MAC ST END . ds $ST\\$1_QUAD_DIR \\$2 . if \\n[#NUM_ARGS]=3 .ds $ST\\$1_FILL QUAD . nr #ST\\$1_LENGTH \\n[#ST\\$1_MARK]-\\n[#ST\\$1_OFFSET] . ie \\n[#IN_TAB] \ . TAB_SET \\$1 \\n[#ST\\$1_OFFSET]u+\\n[#ST_OFFSET]u \ \\n[#ST\\$1_LENGTH]u \\*[$ST\\$1_QUAD_DIR] \\*[$ST\\$1_FILL] . el \ . TAB_SET \\$1 \\n[#ST\\$1_OFFSET]u \\n[#ST\\$1_LENGTH]u \ \\*[$ST\\$1_QUAD_DIR] \\*[$ST\\$1_FILL] .END \# \# TAB SET \# ------- \# *Arguments: \# ident(ipPcm) length(ipPcm) [L | R | C | J [QUAD]] \# *Function: \# Creates macros TABn and TAB n, where "n" is any arbitrary number. \# TABn is a typesetting tab (i.e. a tab defined as an indent \# from the page left offset plus a line length.) \# *Notes: \# n = arbitrary digit to identify the tab \# indent = indent from left margin; unit of measure required \# length = length of tab (unit of measure required; can be \# \w''u--if more than one word in string, surround \# with double quotes "\w''" \# LRCJ = quad for tab (left, right, center, justified) \# If option QUAD afterwards is not given, quad is line for line \# (no fill mode), meaning that there's no need for .BR or .br \# between lines. \# QUAD = fill tab (so it behaves as if .QUAD LRC or .JUSTIFY \# had been given). \# \# N.B. -- indents *must* be turned off before setting tabs \# \# Tabs are not columnar in behaviour. .TN and \*[TB+] permit \# bottom-line to bottom-line tab movement. \# \# When resetting tabs, .TQ must be invoked before .TAB_SET. \# \# Indents are turned off automatically whenever a new tab is called \# with TAB . \# \# Generally, it's a good idea to make sure all indents are off \# before setting tabs. \# .MAC TAB_SET END . br . nr #TAB_NUMBER \\$1 . ds $CURRENT_TAB \\n[#TAB_NUMBER] . nr #TAB_OFFSET (\\$2) . nr #TAB_LENGTH (\\$3) . MAC TAB\\n[#TAB_NUMBER] . if !\\\\n[#TB+]=1 .br . if \\\\n[#TB+]=1 \{\ . EL . vpt 0 . rr #TB+ . \} . in 0 . nr #TAB_ACTIVE 1 . nr #CURRENT_TAB \\n[#TAB_NUMBER] . ds $CURRENT_TAB \\*[$CURRENT_TAB] . nr #TAB_OFFSET\\*[$CURRENT_TAB] \\n[#TAB_OFFSET] . nr #ST_OFFSET \\n[#TAB_OFFSET] . ie !'\\\\n[.z]'' \ \!. po \\\\\\\\n[#L_MARGIN]u+\\\\n[#TAB_OFFSET\\\\*[$CURRENT_TAB]]u . el \ . po \\\\n[#L_MARGIN]u+\\\\n[#TAB_OFFSET\\\\*[$CURRENT_TAB]]u . ll \\n[#TAB_LENGTH]u . ta \En[.l]u . ie '\\$5'QUAD' \{\ . if '\\$4'L' .QUAD L . if '\\$4'R' .QUAD R . if '\\$4'C' .QUAD C . if '\\$4'J' .JUSTIFY . \} . el \{\ . if '\\$4'' .LEFT . if '\\$4'L' .LEFT . if '\\$4'R' .RIGHT . if '\\$4'C' .CENTER . if '\\$4'J' .JUSTIFY . \} . if \\\\n[#TN]=1 \{\ . TRAP . rr #TN . \} .. . rr #TAB_ACTIVE .END \# \# TAB \# --- \# *Arguments: \# \# *Function: \# Moves to tab number passed as an argument. \# .MAC TAB END . ds $TAB_NUMBER \\$1 . TAB\\*[$TAB_NUMBER] . nr #IN_TAB 1 .END \# \# TAB NEXT \# -------- \# *Argument: \# \# *Function: \# Automatically moves to TAB on the same line as the last \# line of the previous tab. \# *Notes: \# The \c inline must be appended to the end of input lines when in \# nofill mode; in fill modes, the \c inline must not be used. \# .MAC TN END . nr #TN 1 . vpt 0 . sp -1v . nr #NEXT_TAB \\n[#CURRENT_TAB]+1 . TAB\\n[#NEXT_TAB] . vpt .END \# \# An inline escape to accomplish the same thing. Preferable, since \# it works with filled and non-filled copy and doesn't require the \# user to remember to use (or not use) the \c. \# .ds TB+ \ "\c\R'#TB+ 1'\R'#TN 1'\R'#NEXT_TAB \\n[#CURRENT_TAB]+1'\\*[TAB\\n[#NEXT_TAB]]\c \# \# TAB QUIT \# -------- \# *Argument: \# \# *Function: \# Sets #TAB_ACTIVE to "0" (off). \# Resets left margin to value in effect prior to tabs. \# Resets line length to value in effect prior to tabs. \# Checks #QUAD to see if we were in flush or quad mode \# prior to tabs (0=off, 1=on). \# Resets QUAD [ L|R|C ], LEFT, RIGHT, CENTER, or JUSTIFY \# in effect prior to tabs. \# *Notes: \# TQ must precede setting new tabs to get the tabs' indents \# measured from page left. Otherwise, the tabs' indents are \# measured from the left margin of the currently active tab. \# .MAC TQ END . br . rr #TAB_ACTIVE . rr #IN_TAB . nr #LOOP 0 1 . while \\n+[#LOOP]<20 \{\ . rm $ST\\n[#LOOP]_FILL . \} . rr #LOOP . ie !'\\n[.z]'' \{\ \!. po \\n[#L_MARGIN]u \!. ll \\n[#L_LENGTH]u . \} . el \{\ . po \\n[#L_MARGIN]u . ll \\n[#L_LENGTH]u . \} . ll \\n[#L_LENGTH]u . ta \\n[.l]u . ie \\n[#QUAD] \{\ . ie '\\*[$RESTORE_QUAD_VALUE]'J' .JUSTIFY . el .QUAD \\*[$RESTORE_QUAD_VALUE] . \} . el \{\ . if '\\*[$RESTORE_QUAD_VALUE]'LEFT' .LEFT . if '\\*[$RESTORE_QUAD_VALUE]'RIGHT' .RIGHT . if '\\*[$RESTORE_QUAD_VALUE]'CENTER' .CENTER . \} .END \# \# ==================================================================== \# \# COLOR HANDLING \# ============== \# \# COLOR \# ----- \# *Arguments: \# \# *Function: \# Allows the inline escape for setting color to be called \# as a macro. \# .MAC COLOR END . ie \\n[.u]=1 \{\ \c \\*[\\$1]\c . \} . el \\*[\\$1] .END \# \# NEWCOLOR \# -------- \# *Arguments: \# [] \# *Function: \# Based on .defcolor, allows users to name and define colors using \# one of the four color schemes rgb, cmy, cmyk and grey. The new \# color is then defined as a string so that it can be called inline \# with \*[COLORNAME] or with .COLOR. \# *Notes: \# With only two args, the default color scheme is rgb. \# \# It is highly recommended that users define new colors as \# all-cap strings, to differentiate them from x colors, which must \# be in lower case. \# .MAC NEWCOLOR END . if \\n[#NUM_ARGS]=2 .defcolor \\$1 rgb \\$2 . if \\n[#NUM_ARGS]=3 \{\ . if '\\$2'RGB' .ds $COLOR_SCHEME rgb . if '\\$2'CYM' .ds $COLOR_SCHEME cym . if '\\$2'CMYK' .ds $COLOR_SCHEME cmyk . if '\\$2'GRAY' .ds $COLOR_SCHEME gray . if '\\$2'GREY' .ds $COLOR_SCHEME gray . defcolor \\$1 \\*[$COLOR_SCHEME] \\$3 . \} . ds \\$1 \\m[\\$1] .END \# \# XCOLOR \# ------ \# *Arguments: \# [] \# *Function: \# Defines a string of x color name (i.e. a predefined x \# color). If is given, creates a string of \# that references the x color name of the first argument. \# *Notes: \# The color name must be a valid color name from rgb.txt, and \# must be given entirely in lower case, all one word. \# .MAC XCOLOR END . ds \\$1 \m[\\$1] . if \\n[#NUM_ARGS]=2 \{\ . ds \\$2 \m[\\$1] . ds $\\$2_FILL \\$1 . ds COLAL_\\$2 \\$1 . \} .END \# \# Pre-define xcolors black and white \# .ds black \m[black] .ds BLACK \m[black] .ds white \m[white] .ds WHITE \m[white] .ds default black \# \# ===================================================================== \# \# +++MISCELLANEOUS USEFUL MACROS AND STRINGS+++ \# .nr _w 500 .nr _d 1250 \# \# These string are used for creating aliases within loops that set \# style for doc-cover, cover, and docheader items. They're defined \# here because underscoring needs them. \# .ds TITLE_TYPE_1 ATTRIBUTE .ds TITLE_TYPE_2 AUTHOR .ds TITLE_TYPE_3 CHAPTER .ds TITLE_TYPE_4 CHAPTER_TITLE .ds TITLE_TYPE_5 COVERTITLE .ds TITLE_TYPE_6 DOCTITLE .ds TITLE_TYPE_7 DOCTYPE .ds TITLE_TYPE_8 DOC_COVERTITLE .ds TITLE_TYPE_9 SUBTITLE .ds TITLE_TYPE_10 TITLE .ds TITLE_TYPE_11 MISC .ds TITLE_TYPE_12 COPYRIGHT .ds TITLE_TYPE_13 DOC_COVER_TITLE .ds TITLE_TYPE_14 COVER_TITLE \# \# UNDERLINE \# --------- \# *Arguments: \# | \# *Function: \# Simulates typewriter-style underlining of italic passages. \# *Notes: \# Defaults for rule weight and distance from baseline are below. \# UNDERLINE_SPECS lets user change them \# .MAC UNDERLINE_SPECS END . ie \B'\\$1' .nr _w (u;\\$1) . el \{\ . ie '\\$1'DEFAULT' .nr _w 500 . el \{\ . nr _w 500 . tm1 "[mom]: The first argument to \\$0 must be a numeric . tm1 " argument with a unit of measure appended, or DEFAULT. . tm1 " Setting underline weight to DEFAULT. . \} . \} . shift . ie \B'\\$1' .nr _d (u;\\$1) . el \{\ . ie '\\$1'DEFAULT' .nr _d 1250 . el \{\ . nr _d 1250 . tm1 "[mom]: The second argument to \\$0 must be a numeric . tm1 " argument with a unit of measure appended, or DEFAULT. . tm1 " Setting underline distance from baseline to DEFAULT. . \} . \} .END \# .MAC UNDERLINE END . ds $SAVED_SS_VAR \\*[$SS_VAR] . ie '\\$1'' \{\ . nr #UNDERLINE_ON 1 . ss \\n[.ss] 0 . ie !n .nop \X'ps: exec \\n[_w] \\n[_d] decorline'\c . el .cu 1000 . \} . el \{\ . nr #UNDERLINE_ON 0 . if !'\\*[$SAVED_SS_VAR]'' .SS \\*[$SAVED_SS_VAR] . ie !n .nop \X'ps: exec decornone'\c . el .cu 0 . \} .END \# \# UL/ULX \# ------ \# *Arguments: \# \# *Function: \# Simulates typewriter-style underlining of italic passages. \# *Notes: \# Intended to be called with inline escapes \*[UL] (underline \# on) and \*[ULX] (underline off). \# .MAC UL END \c . ds $SAVED_SS_VAR \\*[$SS_VAR] . ss \\n[.ss] 0 . ie !'\\n[.z]'' \{\ \c . ie !n \{\ . if !\\n[.k]=0 \?\h'-\w'\\n[.ss]'u'\? \?\R'#UNDERLINE_ON 1'\X'ps: exec \\n[_w] \\n[_d] decorline'\?\c . \} . el \{\ \?\R'#UNDERLINE_ON 1'\?\c . cu 1000 . \} . \} . el \{\ . ie !n \{\ . nr #UNDERLINE_ON 1 . nop \X'ps: exec \\n[_w] \\n[_d] decorline'\c . \} . el \{\ \R'#UNDERLINE_ON 1'\c . cu 1000 . \} . \} .END \# .MAC ULX END \c . SS \\*[$SAVED_SS_VAR] . rm $SAVED_SS_VAR . ie !'\\n[.z]'' \{\ \c . ie !n \{\ \?\R'#UNDERLINE_ON 0'\X'ps: exec decornone'\?\c . \} . el \{\ \?\R'#UNDERLINE_ON 0'\?\c . cu 0 . \} . \} . el \{\ . ie !n \{\ . nr #UNDERLINE_ON 0 . nop \X'ps: exec decornone'\c . \} . el \{\ . nr #UNDERLINE_ON 0 . cu 0 . \} . \} .END \# \# UNDERSCORE \# ---------- \# *Arguments: \# [] "text" \# *Function: \# Places an underscore 2 points under the string if no lead given, \# otherwise places underscore under string by user specified amount. \# *Notes: \# When using this macro, the string to be underscored must begin \# with double-quotes ("), regardless of whether it's the sole \# argument or the second. \# E.g.: \# .UNDERSCORE "Text to be underscored \# or \# .UNDERSCORE 2p "Text to be underscored \# \# UNDERSCORE does not work across line breaks. Each line of text \# must be entered separately. If the UNDERSCORE begins in the \# middle of a line and crosses over a break, the portion before \# the break and the portion afterwards must be entered \# separately. \# .MAC UNDERSCORE END . nr #SAVED_UNDERSCORE_WEIGHT \\n[#UNDERSCORE_WEIGHT] . nr #SAVED_UNDERSCORE_WEIGHT_ADJ \\n[#UNDERSCORE_WEIGHT_ADJ] . ds $SAVED_UNDERSCORE_GAP \\*[$UNDERSCORE_GAP] . if \\n[#NUM_ARGS]>=2 \{\ . if \B'\\$1' \{\ . ds $UNDERSCORE_GAP \\$1 . shift . \} . if '\\$1'PREFIX' \{\ . ds $PREFIX \\$2 . shift 2 . \} . if '\\$1'SUFFIX' \{\ . ds $SUFFIX \\$2 . shift 2 . \} . \} . if !'\\*[$TITLE_TYPE]'' \{\ . nr #UNDERSCORE_WEIGHT \\n[#\\*[$TITLE_TYPE]_UNDERLINE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#\\*[$TITLE_TYPE]_UNDERLINE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$\\*[$TITLE_TYPE]_UNDERLINE_GAP] . \} . nr #TEXT_WIDTH \w'\\$1' . ie \\n[.u]=1 \{\ \\*[$PREFIX]\Z'\\$1'\ \Z'\D't \\n[#UNDERSCORE_WEIGHT]''\ \v'\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \Z'\D't \\n[#RULE_WEIGHT]''\ \v'-(\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u)'\\*[$SUFFIX]\c . nop . \} . el \{\ \\*[$PREFIX]\Z'\\$1'\ \Z'\D't \\n[#UNDERSCORE_WEIGHT]''\ \v'\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \Z'\D't \\n[#RULE_WEIGHT]''\ \v'-(\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u)'\\*[$SUFFIX] . \} . nr #UNDERSCORE_WEIGHT \\n[#SAVED_UNDERSCORE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#SAVED_UNDERSCORE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$SAVED_UNDERSCORE_GAP] . rr #SAVED_UNDERSCORE_WEIGHT . rr #SAVED_UNDERSCORE_WEIGHT_ADJ . rm $SAVED_UNDERSCORE_GAP . rm $PREFIX . rm $SUFFIX . rm $TITLE_TYPE .END \# \# DOUBLE UNDERSCORE \# ----------------- \# *Arguments: \# [points below baseline] [points distance between rules] "text" \# *Function: \# Same as UNDERSCORE, except it produces a double underscore. The default \# distance between the rules is 2 points. \# *Notes: \# The same double-quote requirement as UNDERSCORE. \# .MAC UNDERSCORE2 END . nr #SAVED_UNDERSCORE_WEIGHT \\n[#UNDERSCORE_WEIGHT] . nr #SAVED_UNDERSCORE_WEIGHT_ADJ \\n[#UNDERSCORE_WEIGHT_ADJ] . ds $SAVED_UNDERSCORE_GAP \\*[$UNDERSCORE_GAP] . ds $SAVED_RULE_GAP \\*[$RULE_GAP] . if \\n[#NUM_ARGS]>=2 \{\ . if \B'\\$1' \{\ . ds $UNDERSCORE_GAP \\$1 . shift . \} . if \B'\\$1' \{\ . ds $RULE_GAP \\$1 . shift . \} . if '\\$1'PREFIX' \{\ . ds $PREFIX \\$2 . shift 2 . \} . if '\\$1'SUFFIX' \{\ . ds $SUFFIX \\$2 . shift 2 . \} . if \\n[#NUM_ARGS]=3 \{\ . ds $UNDERSCORE_GAP \\$1 . ds $RULE_GAP \\$2 . shift 2 . \} . if !'\\*[$TITLE_TYPE]'' \{\ . nr #UNDERSCORE_WEIGHT \\n[#\\*[$TITLE_TYPE]_UNDERLINE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#\\*[$TITLE_TYPE]_UNDERLINE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$\\*[$TITLE_TYPE]_UNDERLINE_GAP] . ds $RULE_GAP \\*[$\\*[$TITLE_TYPE]_RULE_GAP] . \} . nr #TEXT_WIDTH \w'\\$1' . ie \\n[.u]=1 \{\ \\*[$PREFIX]\Z'\\$1'\ \Z'\D't \\n[#UNDERSCORE_WEIGHT]''\ \v'\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\ \Z'\D'l \\n[#TEXT_WIDTH]u 0''\ \v'\\*[$RULE_GAP]+\\n[#UNDERSCORE_WEIGHT]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \Z'\D't \\n[#RULE_WEIGHT]''\ \v'-(\\*[$UNDERSCORE_GAP]+\\*[$RULE_GAP])-(\\n[#UNDERSCORE_WEIGHT]u*2u)'\\*[$SUFFIX]\c . \} . el \{\ \\*[$PREFIX]\Z'\\$1'\ \Z'\D't \\n[#UNDERSCORE_WEIGHT]''\ \v'\\*[$UNDERSCORE_GAP]+\\n[#UNDERSCORE_WEIGHT_ADJ]u'\ \Z'\D'l \\n[#TEXT_WIDTH]u 0''\ \v'\\*[$RULE_GAP]+\\n[#UNDERSCORE_WEIGHT]u'\ \D'l \\n[#TEXT_WIDTH]u 0'\ \Z'\D't \\n[#RULE_WEIGHT]''\ \v'-(\\*[$UNDERSCORE_GAP]+\\*[$RULE_GAP])-(\\n[#UNDERSCORE_WEIGHT]u*2u)'\\*[$SUFFIX] . \} . nr #UNDERSCORE_WEIGHT \\n[#SAVED_UNDERSCORE_WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#SAVED_UNDERSCORE_WEIGHT_ADJ] . ds $UNDERSCORE_GAP \\*[$SAVED_UNDERSCORE_GAP] . rr #SAVED_UNDERSCORE_WEIGHT . rr #SAVED_UNDERSCORE_WEIGHT_ADJ . rm $PREFIX . rm $SUFFIX . rm $SAVED_UNDERSCORE_GAP . rm $SAVED_RULE_GAP . rm $TITLE_TYPE .END \# \# Default underscoring underline and rule gaps \# .ds $BIB_STRING_RULE_GAP 2p .ds $BIB_STRING_UNDERLINE_GAP 2p .ds $EN_STRING_RULE_GAP 2p .ds $EN_STRING_UNDERLINE_GAP 2p .ds $EN_TITLE_UNDERLINE_GAP 2p .ds $RULE_GAP 2p .ds $TOC_HEADER_RULE_GAP 2p .ds $TOC_HEADER_UNDERLINE_GAP 2p .ds $UNDERSCORE_GAP 2p \# .nr #LOOP 0 1 .while \n+[#LOOP]<=14 \{\ . ds $\*[TITLE_TYPE_\n[#LOOP]]_RULE_GAP 2p . ds $COVER_\*[TITLE_TYPE_\n[#LOOP]]_RULE_GAP 2p . ds $DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_RULE_GAP 2p . ds $\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_GAP 2p . ds $COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_GAP 2p . ds $DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_GAP 2p .\} \# \# SUPERSCRIPT \# ----------- \# *Function: \# Prints everything after inline invocation as superscript. \# *Notes: \# \*[SUP] and \*[SUPX] turn superscript on and off respectively. \# If running type is pseudo-condensed/expanded, invoke the superscript \# strings as \*[CONDSUP] or \*[EXTSUP] and turn off with \*[CONDSUPX] \# and \*[EXTSUPX] respectively. \# \# Default raise/lower amount .ds $SUP_RAISE \v'-.3m' .ds $SUP_LOWER \v'.3m' \# \# SUPERSCRIPT RAISE \# ----------------- \# *Argument: \# \# *Function: \# Defines strings $SUP_RAISE and $SUP_LOWER for use with \*[SUP], \# \*[CONDSUP] and \*[EXTSUP]. \# .MAC SUPERSCRIPT_RAISE_AMOUNT END . ds $SUP_RAISE_AMOUNT \\$1 . ds $SUP_RAISE \v'-\\*[$SUP_RAISE_AMOUNT]' . ds $SUP_LOWER \v'\\*[$SUP_RAISE_AMOUNT]' .END \# .ds SUP \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#SUP_PT_SIZE \En[#PT_SIZE_IN_UNITS]u*6u/10u'\ \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_RAISE]\s[\En[#SUP_PT_SIZE]u] \# .ds SUPX \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_LOWER] \# .ds CONDSUP \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#SUP_PT_SIZE \En[#PT_SIZE_IN_UNITS]u*6u/10u'\ \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_RAISE]\s[\En[#SUP_PT_SIZE]u]\E*[COND_FOR_SUP] \# .ds CONDSUPX \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_LOWER]\E*[COND] \# .ds EXTSUP \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#SUP_PT_SIZE \En[#PT_SIZE_IN_UNITS]u*6u/10u'\ \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_RAISE]\s[\En[#SUP_PT_SIZE]u]\E*[EXT_FOR_SUP] \# .ds EXTSUPX \s[\En[#PT_SIZE_IN_UNITS]u]\E*[$SUP_LOWER]\E*[EXT] \# \# SLANT \# ----- \# \# SETSLANT \# -------- \# *Arguments: \# | RESET \# *Function: \# Modifies register #DEGREES for use with \*[SLANT], or resets \# it to the default. Defines string \*[SLANTX] \# *Notes: \# \*[SLANT] permits pseudo-italicizing of a font in cases where \# no italic font exists in a particular family. \# \# Default # of degrees is 15. \# \# Do not use unit of measure with arg to SETSLANT. \# \# It may be necessary to adjust the spacing on either side of \# [SLANT] and [SLANTX]. \# \# In docs, SLANT carries over from para to para. \# .nr #DEGREES 15 .ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' .ds SLANTX \ER'#SLANT_ON 0'\ES'0' \# .MAC SETSLANT END . ie '\\$1'RESET' \{\ . nr #DEGREES 15 . if \\n[#PRINT_STYLE]=1 \ . if \\n[#UNDERLINE_SLANT] .return . ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' . \} . el \{\ . nr #DEGREES \\$1 . if \\n[#PRINT_STYLE]=1 \ . if \\n[#UNDERLINE_SLANT] .return . ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' . \} . ds SLANTX \ER'#SLANT_ON 0'\ES'0' .END \# \# BOLDER \# ------ \# \# SETBOLDER \# --------- \# *Arguments: \# | RESET \# *Function: \# Modifies register #BOLDER_UNITS for use with \*[BOLDER], or resets \# it to the default 700 units. \# *Notes: \# \*[BOLDER] allows pseudo-emboldening of a font where no bold \# font exists in a particular family. \# \# Default for SETBOLDER is 700 units. Do not use unit of measure \# with arg to SETBOLDER. \# .nr #BOLDER_UNITS 700 \# .MAC SETBOLDER END . if \\n[#IGNORE]=1 .return . ie '\\$1'RESET' .nr #BOLDER_UNITS 700 . el .nr #BOLDER_UNITS \\$1 .END \# .MAC BOLDER END \c .bd \\n[.f] \\n[#BOLDER_UNITS] .END \# .MAC BOLDERX END \c .bd \\n[.f] .END \# \# +++CONDENSE/EXTEND+++ \# \# CONDENSE/EXTEND \# --------------- \# *Arguments: \# \# *Function: \# Stores current point size in z's in #PT_SIZE_IN_UNITS, figures out \# new point size (for character width) from arg, and defines string \# COND or EXT, which set the type size to the new character width, \# and sets the height of type to the value stored in CURRENT_PT_SIZE \# *Notes: \# CONDENSE_OR_EXTEND is invoked from the aliases \# CONDENSE and EXTEND. CONDENSE implies <100, EXTEND \# implies >100. Do not use a percent sign in the argument. \# \# There is no default setting for CONDENSE or EXTEND. \# 80 is a good approximation of condensed type, 120 is okay \# for extended. \# \# The value set by CONDENSE or EXTEND applies to all \# subsequent \*[COND] or \*[EXT] escapes until a new value is set. \# \# \*[COND] or \*[EXT] must be turned off before all changes of point \# size, and reinvoked afterwards (if so desired). This refers to \# changes of point size via control lines AND via inlines. \# .MAC CONDENSE_OR_EXTEND END . if '\\$0'CONDENSE' \{\ . ds $COND_PERCENT \\$1 . if \\n[#PRINT_STYLE]=1 \{\ . rm $COND_PERCENT . ds $COND_PERCENT 100 . \} . ds COND \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#CONDENSE 1'\ \R'#COND_WIDTH (\En[#PT_SIZE_IN_UNITS]u*\E*[$COND_PERCENT]u)/100'\ \Es[\En[#COND_WIDTH]u]\EH'\En[#PT_SIZE_IN_UNITS]u' . ds COND_FOR_SUP \ \R'#COND_WIDTH (\En[#SUP_PT_SIZE]u*\E*[$COND_PERCENT]u)/100'\ \Es[\En[#COND_WIDTH]u]\H'\En[#SUP_PT_SIZE]u' . \} . if '\\$0'EXTEND' \{\ . ds $EXT_PERCENT \\$1 . if \\n[#PRINT_STYLE]=1 \{\ . rm $EXT_PERCENT . ds $EXT_PERCENT 100 . \} . ds EXT \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#EXTEND 1'\ \R'#EXT_WIDTH (\En[#PT_SIZE_IN_UNITS]u*\E*[$EXT_PERCENT]u)/100'\ \Es[\En[#EXT_WIDTH]u]\EH'\En[#PT_SIZE_IN_UNITS]u' . ds EXT_FOR_SUP \ \R'#EXT_WIDTH (\En[#SUP_PT_SIZE]u*\E*[$EXT_PERCENT]u)/100'\ \Es[\En[#EXT_WIDTH]u]\H'\En[#EXT_PT_SIZE]u' . \} .END \# .ds CONDX \ \ER'#CONDENSE 0'\Es[0]\R'#PT_SIZE_IN_UNITS \En[.ps]'\H'\En[#PT_SIZE_IN_UNITS]u' .ds EXTX \ \ER'#EXTEND 0'\Es[0]\R'#PT_SIZE_IN_UNITS \En[.ps]'\H'\En[#PT_SIZE_IN_UNITS]u' \# \# +++PAD LINES+++ (insert space) \# \# PAD MARKER \# ---------- \# *Arguments: \# \# *Function: \# Defines string $PAD_MARKER, used in PAD \# *Notes: \# $PAD_MARKER is normally # (the pound sign). \# .MAC PAD_MARKER END . ds $PAD_MARKER \\$1 .END \# \# PAD \# --- \# *Arguments: \# "" \# "" \# *Function: \# Defines and redefines padding character (default=pound sign \# unless padding character has been set with PAD_MARKER) \# several times so that when the string is output at the end \# of the macro, every # has been converted to an equal-sized \# amount of padding (blank space) on a line. \# *Notes: \# String tabs may be marked off during PAD. \# .MAC PAD END . if \\n[.u]=1 .nr fill 1 . nf . if !d$PAD_MARKER .ds $PAD_MARKER # . char \\*[$PAD_MARKER] \R'#PAD_COUNT \En[#PAD_COUNT]+1' . ds $FAMILY_FOR_PAD \\n[.fam] .\" .if !n .fp \\n[.fp] \\n[.sty] . ds $FONT_FOR_PAD \\n[.sty] . nr #SIZE_FOR_PAD \\n[.ps] . ds $PAD_STRING \\$1 . as $PAD_STRING \Ekp . di PAD_STRING . fam \\*[$FAMILY_FOR_PAD] \f[\\*[$FONT_FOR_PAD]]\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] . br . di . if \\n[#INDENT_ACTIVE] \{\ . if \\n[#INDENT_LEFT_ACTIVE] .ll -\\n[#L_INDENT]u . if \\n[#INDENT_RIGHT_ACTIVE] .ll -\\n[#R_INDENT]u . if \\n[#INDENT_BOTH_ACTIVE] .ll -\\n[#BR_INDENT]u . \} . char \\*[$PAD_MARKER] \ \R'#SPACE_TO_END \En[.l]-\En[p]'\R'#PAD_SPACE \En[#SPACE_TO_END]/\En[#PAD_COUNT]' . di PAD_STRING . fam \\*[$FAMILY_FOR_PAD] \f[\\*[$FONT_FOR_PAD]]\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] . br . di . if \\n[#INDENT_ACTIVE] \ . if (\\n[#INDENT_LEFT_ACTIVE]=1):(\\n[#INDENT_BOTH_ACTIVE]) .ll . char \\*[$PAD_MARKER] \h'\En[#PAD_SPACE]u' . if \\n[#SILENT] .SILENT . fam \\*[$FAMILY_FOR_PAD] \f[\\*[$FONT_FOR_PAD]]\s[\\n[#SIZE_FOR_PAD]u] . ie '\\$2'' .nop \\*[$PAD_STRING] . el \{\ . ie !'\\$2'NOBREAK' .pdfhref L -D "\\$2" -E -- \&\\*[$PAD_STRING] . el .nop \\*[$PAD_STRING] . \} . if \\n[#SILENT] .SILENT OFF . br . if \\n[fill] \{\ . fi . rr fill . \} . rr #PAD_COUNT . rr #SPACE_TO_END . rr #PAD_SPACE . rm $PAD_STRING . rm PAD_STRING . rchar \\*[$PAD_MARKER] . if '\\$2'NOBREAK' \{\ . TRAP OFF . EOL . TRAP . \} .END \# \# +++LEADERS+++ \# \# The leader mechanism is primitive, but it works. Basically, every \# macro in this set that includes a line length also sets a single \# groff tab stop at the right hand end of the line. That way, \# whenever Ctrl-A is invoked (always at the end of an input line), \# leader of the correct length gets deposited. Ctrl-A is accessed by \# the string LEADER (i.e. inline, as \*[LEADER]). Leaders within tabs \# get their length from the tab line length. \# \# SET LEADER CHARACTER \# -------------------- \# *Arguments: \# \# *Function: \# Set leader character. \# .MAC LEADER_CHARACTER END . lc \\$1 .END \# .ds LEADER  \# \# +++DROP CAPS+++ \# \# DROP CAP FAMILY \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies string $DC_FAM. \# .MAC DROPCAP_FAMILY END . ds $DC_FAM \\$1 .END \# \# DROP CAP FONT \# ------------- \# *Argument: \# \# *Function: \# Creates or modifies string $DC_FT. \# .MAC DROPCAP_FONT END . ds $DC_FT \\$1 .END \# \# DROPCAP COLOR \# ------------- \# *Arguments: \# \# *Function: \# Defines string $DC_COLOR to argument. \# *Notes: \# User must define an XCOLOR or NEWCOLOR before using \# DC_COLOR. \# .MAC DROPCAP_COLOR END . if \\n[#PRINT_STYLE]=1 .return . nr #DC_COLOR 1 . ds $DC_COLOR \\$1 .END \# \# DROP CAP GUTTER \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies register #DC_GUT. \# *Notes: \# Requires unit of measure. Default is 3p. \# .MAC DROPCAP_GUTTER END . nr #DC_GUT (\\$1) .END \# \# DROP CAP ADJUST \# --------------- \# *Argument: \# <+|- # of points to in/decrease point size of drop cap letter> \# *Function: \# Creates or modifies string $DC_ADJUST. \# *Notes: \# Despite its best efforts, DROPCAP doesn't always get the point \# size of the drop cap critically perfect. DROPCAP_ADJUST lets \# the user add or subtract points (or fractions of points) to \# get the size right. \# \# Requires the + or - sign. \# .MAC DROPCAP_ADJUST END . ds $DC_ADJUST \\$1 .END \# \# DROP CAP \# -------- \# *Arguments: \# <# of lines> [COND <% to condense> | EXT <% to extend>] \# *Function: \# Calculates point size of dropcap based on # of lines passed as \# arg 2. Sets indent for text based on dropcap width+gutter. \# Advances and prints dropcap; reverses and prints indented text \# to bottom of dropcap, then resets indent to left margin (plus \# any indent that was in effect prior to invoking DROPCAP). \# *Notes: \# Drop caps when using the doc processing macro PP only work with \# initial paragraphs (i.e. at doc start, or after heads), only when \# DROPCAPS comes immediately after PP, and only when the PRINTSTYLE \# is TYPESET. If these conditions aren't met, DROPCAPS is silently \# ignored. \# \# The COND or EXT argument are processed separately from all \# other COND or EXT inlines or macros, hence passing COND or \# EXT has no effect on running type. \# .MAC DROPCAP END . if \\n[#IGNORE]=1 \{\ . PRINT \\$1\c . return . \} . br . if n \{\ . PRINT \\$1\c . return . \} . if \\n[#DOCS] \{\ . if \\n[#PRINT_STYLE]=1 \{\ . PRINT \\$1\c . return . \} . if \\n[#PRINT_STYLE]=2 \{\ . sp -1 . if \\n[#PP_STYLE]=2 \{\ . PRINT \\$1\c . return . \} . if \\n[#PP]>1 \{\ . if \\n[#PP_INDENT] .ti \\n[#PP_INDENT]u . PRINT \\$1\c . return . \} . ti 0 . \} . \} . ds $DROPCAP \\$1 . nr #DC_LINES \\$2-1 . if \\n[#CONDENSE]=1 \{\ . ds $RESTORE_COND \\*[$COND_PERCENT] \\*[CONDX] . nr #CONDENSE_WAS_ON 1 . \} . if \\n[#EXTEND]=1 \{\ . ds $RESTORE_EXT \\*[$EXT_PERCENT] \\*[EXTX] . nr #EXTEND_WAS_ON 1 . \} . if '\\$3'COND' .CONDENSE \\$4 . if '\\$3'EXT' .EXTEND \\$4 . if !r#DC_GUT .nr #DC_GUT 3p . ie \\n[#DOCS] .ds $RESTORE_FAM \\*[$DOC_FAM] . el .ds $RESTORE_FAM \\n[.fam] . ie \\n[#DOCS] .ds $RESTORE_FT \\*[$PP_FT] . el .ds $RESTORE_FT \\*[$FONT] . nr #RESTORE_PT_SIZE \\n[#PT_SIZE] . nr #RESTORE_INDENT \\n[.i] . SIZESPECS . nr #DC_HEIGHT \\n[#DC_LINES]*\\n[#LEAD]+\\n[#CAP_HEIGHT] . ie !d$DC_FAM .FAM \\n[.fam] . el .FAM \\*[$DC_FAM] . ie !d$DC_FT .FT \\*[$FONT] . el .FT \\*[$DC_FT] . while \\n[#GET_DC_HEIGHT]<\\n[#DC_HEIGHT] \{\ . ps \\n[#PT_SIZE]u+100u . SIZESPECS . nr #GET_DC_HEIGHT \\n[#CAP_HEIGHT] . \} . if d$DC_ADJUST .ps \\*[$DC_ADJUST]p . nr #DC_LINES +1 . if (\\n[#DC_LINES]v-1v)>(\\n[.t]-1) \{\ . nr pgnum \\n%+\\n[#PAGE_NUM_ADJ] 1 . if \\n[#COLUMNS]=1 .ds col-num ", column \\n[#COL_NUM] . tm1 \ "[mom]: Dropcap at line \\n[.c] does not fit on page \\n[pgnum]\\*[col-num]. . tm1 \ " Shifting paragraph to next page or column. . ie \\n[#COLUMNS] .COL_NEXT . el .NEWPAGE . \} . ie \\n[#DC_COLOR]=1 \{\ . ie !'\\$3'' \{\ . ie '\\$3'COND' \ . PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \m[\\*[$DC_COLOR]]\\*[COND]\\*[$DROPCAP]\\*[CONDX]\m[]\\*[UP \\n[#DC_LINES]v] . el \ . PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \m[\\*[$DC_COLOR]]\\*[EXT]\\*[$DROPCAP]\\*[EXTX]\m[]\\*[UP \\n[#DC_LINES]v] . \} . el .PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \m[\\*[$DC_COLOR]]\\*[$DROPCAP]\m[]\\*[UP \\n[#DC_LINES]v] . \} . el \{\ . ie !'\\$3'' \{\ . ie '\\$3'COND' \ . PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \\*[COND]\\*[$DROPCAP]\\*[CONDX]\\*[UP \\n[#DC_LINES]v] . el \ . PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \\*[EXT]\\*[$DROPCAP]\\*[EXTX]\\*[UP \\n[#DC_LINES]v] . \} . el .PRINT \ \\*[DOWN \\n[#DC_LINES]v]\ \\*[$DROPCAP]\\*[UP \\n[#DC_LINES]v] . \} . if '\\$3'COND' \E*[COND] . if '\\$3'EXT' \E*[EXT] . ie \\n[.i] \{\ . vs 0 . br . in +\w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u . vs . \} . el \{\ . vs 0 . br . in \w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u . vs . \} . if '\\$3'COND' \E*[CONDX]\c . if '\\$3'EXT' \E*[EXTX]\c . FAM \\*[$RESTORE_FAM] . FT \\*[$RESTORE_FT] . ps \\n[#RESTORE_PT_SIZE]u . if \\n[#CONDENSE_WAS_ON] \{\ . CONDENSE \\*[$RESTORE_COND] \\*[COND]\c . \} . if \\n[#EXTEND_WAS_ON] \{\ . EXTEND \\*[$RESTORE_EXT] \\*[EXT]\c . \} . ie \\n[.u] .wh \\n[.d]u+\\n[#DC_HEIGHT]u-1v DROPCAP_OFF . el .wh \\n[.d]u+\\n[#DC_HEIGHT]u DROPCAP_OFF . rr #CONDENSE_WAS_ON . rr #EXTEND_WAS_ON . rm $DROPCAP . rr #DC_LINES . rm $RESTORE_COND . rm $RESTORE_EXT . rm $RESTORE_FAM . rm $RESTORE_FT . rr #RESTORE_PT_SIZE . rr #RESTORE_INDENT . rr #DC_HEIGHT . rr #GET_DC_HEIGHT . rr x .END \# .MAC DROPCAP_OFF END ' in \\n[#RESTORE_INDENT]u . ch DROPCAP_OFF .END \# \# ===================================================================== \# \# +++GRAPHICAL OBJECTS+++ \# \# Set params for graphical objects. \# .MAC GRAPHICAL_OBJ END . rr #FILLED . rr #FILL_MODE . rr #NOFILL . rr #NOFILL_MODE . if \\n[.vpt]=1 \{\ . vpt 0 . nr #RESTORE_TRAP 1 . \} . ie !\\n[#NO_ADVANCE]=1 .br . el \{\ . sp -1v . rr #NO_ADVANCE . \} . ie \\n[.u]=1 \{\ . nr #FILLED 1 . nr #FILL_MODE \\n[.j] . \} . el \{\ . nr #NOFILL 1 . if \\n[.ce]>0 .nr #NOFILL_MODE 3 . if \\n[.rj]>0 .nr #NOFILL_MODE 5 . ce 0 . rj 0 . \} . nf .END \# \# HORIZONTAL RULE - DRH \# --------------------- \# *Arguments: \# | [ ] \# *Function: \# With no arg, draws a full measure rule. With args, draws \# described horizontal rule. \# *Notes: \# Rules are drawn left-to-right, from the baseline down, and \# return to their point of origin. If no arg given (full measure \# rule), the rule weight is the one set by RULE_WEIGHT. \# .MAC DRH END . GRAPHICAL_OBJ . ds $RL_WEIGHT \\$1 . ds $RL_INDENT \\$2 . ds $RL_LENGTH \\$3 . ie !'\\$4'' .ds $RL_COLOR \\$4 . el \{\ . ie '\\n[.m]'' .ds $RL_COLOR \\*[default] . el .ds $RL_COLOR \\n[.m] . \} . nr #SAVED_WEIGHT \\n[#RULE_WEIGHT] . nr #SAVED_WEIGHT_ADJ \\n[#RULE_WEIGHT_ADJ] . di NULL . if \\n[#NUM_ARGS]>=1 .RULE_WEIGHT \\*[$RL_WEIGHT] . di . COLOR \\*[$RL_COLOR] . ie \\n[#NUM_ARGS]=0 \{\ . ie \\n[#INDENT_ACTIVE] \{\ . nr #RESTORE_L_LENGTH \\n[.l] . if \\n[#INDENT_BOTH_ACTIVE] .ll \\n[.l]u-\\n[#BL_INDENT]u . if \\n[#INDENT_LEFT_ACTIVE] .ll \\n[.l]u-\\n[#L_INDENT]u \Z'\D't \\n[#RULE_WEIGHT]''\ \h'\\*[$RL_INDENT]+\\n[#RULE_WEIGHT_ADJ]u'\ \v'\\n[#RULE_WEIGHT_ADJ]u'\ \D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\ \v'-\\n[#RULE_WEIGHT_ADJ]u'\ \Z'\D't \\n[#SAVED_RULE_WEIGHT]'' . ll \\n[#RESTORE_L_LENGTH]u . rr #RESTORE_L_LENGTH . \} . el \{\ \Z'\D't \\n[#RULE_WEIGHT]''\ \h'\\*[$RL_INDENT]+\\n[#RULE_WEIGHT_ADJ]u'\ \v'\\n[#RULE_WEIGHT_ADJ]u'\ \D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\ \v'-\\n[#RULE_WEIGHT_ADJ]u'\ \Z'\D't \\n[#SAVED_RULE_WEIGHT]'' . \} . \} . el \{\ \Z'\D't \\n[#RULE_WEIGHT]''\ \h'\\*[$RL_INDENT]+\\n[#RULE_WEIGHT_ADJ]u'\ \v'\\n[#RULE_WEIGHT_ADJ]u'\ \D'l \\*[$RL_LENGTH] 0'\ \v'-\\n[#RULE_WEIGHT_ADJ]u'\ \Z'\D't \\n[#SAVED_RULE_WEIGHT]'' . rr #RESTORE_L_LENGTH . \} . if \\n[#FILLED]=1 \{\ . if \\n[#FILL_MODE]=0 .QUAD LEFT . if \\n[#FILL_MODE]=1 .JUSTIFY . if \\n[#FILL_MODE]=3 .QUAD CENTER . if \\n[#FILL_MODE]=5 .QUAD RIGHT . rr #FILLED . \} . sp -1v . if \\n[#NOFILL]=1 \{\ . if \\n[#NOFILL_MODE]=3 .CENTER . if \\n[#NOFILL_MODE]=5 .RIGHT . \} . gcolor . nr #RULE_WEIGHT \\n[#SAVED_WEIGHT] . nr #RULE_WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ] . rr #SAVED_WEIGHT . rr #SAVED_WEIGHT_ADJ . if \\n[#RESTORE_TRAP]=1 \{\ . vpt . rr #RESTORE_TRAP . \} . if '\\n[.z]'FLOAT*DIV' \ . if !(\\n[.d]+\\n[#WEIGHT])<\\n[D-float] .nr D-float \\n[.d]+\\n[#WEIGHT] .END \# \# RULE \# ---- \# *Argument: \# \# *Function: \# Draws a rule the length of the current measure. \# *Notes: \# A convenience macro. DRH with no argument does the same thing. \# Kept in for backward compatibility. \# .MAC RULE END . if \\n[.u]=1 \{\ . nr fill 1 . ds $CURRENT_QUAD \\*[$QUAD_VALUE] . nf . \} . ie \\n[#INDENT_ACTIVE] \{\ . if \\n[#INDENT_BOTH_ACTIVE] .ll \\n[.l]u-\\n[#BL_INDENT]u . if \\n[#INDENT_LEFT_ACTIVE] .ll \\n[.l]u-\\n[#L_INDENT]u . PRINT \ \Z'\D't \\n[#RULE_WEIGHT]''\ \v'\\n[#RULE_WEIGHT_ADJ]u'\ \h'\\n[#RULE_WEIGHT_ADJ]u'\ \D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\h'|0'\c . ll . rr #RESTORE_L_LENGTH . \} . el \{\ . PRINT \ \Z'\D't \\n[#RULE_WEIGHT]''\ \v'\\n[#RULE_WEIGHT_ADJ]u'\ \h'\\n[#RULE_WEIGHT_ADJ]u'\ \D'l \En[.l]u 0'\v'-\\n[#RULE_WEIGHT_ADJ]u'\h'|0'\c . \} . if \\n[fill] \{\ . fi . rr fill . QUAD \\*[$CURRENT_QUAD] . rm $CURRENT_QUAD . \} . EOL .END \# \# VERTICAL RULE - DRV \# ------------------- \# *Arguments: \# [ ] \# *Function: \# Draws described vertical rule. \# *Notes: \# Rules are drawn left-to-right, from the baseline down, and \# return to their point of origin. .MAC DRV END . GRAPHICAL_OBJ . ds $RL_WEIGHT \\$1 . ds $RL_INDENT \\$2 . ds $RL_DEPTH \\$3 . ie !'\\$4'' \ . ds $RL_COLOR \\$4 . el \{\ . ie '\\n[.m]'' .ds $RL_COLOR \\*[default] . el .ds $RL_COLOR \\n[.m] . \} . nr #SAVED_WEIGHT \\n[#RULE_WEIGHT] . nr #SAVED_WEIGHT_ADJ \\n[#RULE_WEIGHT_ADJ] . RULE_WEIGHT \\*[$RL_WEIGHT] . COLOR \\*[$RL_COLOR] \Z'\D't \\n[#RULE_WEIGHT]''\ \h'\\*[$RL_INDENT]+\\n[#RULE_WEIGHT]u+\\n[#RULE_WEIGHT_ADJ]u'\ \D'l 0 \\*[$RL_DEPTH]'\ \D't \\n[#SAVED_RULE_WEIGHT]' . if \\n[#FILLED]=1 \{\ . if \\n[#FILL_MODE]=0 .QUAD LEFT . if \\n[#FILL_MODE]=1 .JUSTIFY . if \\n[#FILL_MODE]=3 .QUAD CENTER . if \\n[#FILL_MODE]=5 .QUAD RIGHT . rr #FILLED . \} . sp -1v . if \\n[#NOFILL]=1 \{\ . if \\n[#NOFILL_MODE]=3 .CENTER . if \\n[#NOFILL_MODE]=5 .RIGHT . \} . gcolor . nr #RULE_WEIGHT \\n[#SAVED_WEIGHT] . nr #RULE_WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ] . if \\n[#RESTORE_TRAP]=1 \{\ . vpt . rr #RESTORE_TRAP . \} . if '\\n[.z]'FLOAT*DIV' \ . if !(\\n[.d]+\\*[$RL_DEPTH])<\\n[D-float] .nr D-float \\n[.d]+\\*[$RL_DEPTH] .END \# \# BOXES - DBX \# ----------- \# *Arguments: \# |SOLID |FULL_MEASURE [ ] \# *Function: \# Draws described box. \# *Notes: \# Boxes are drawn left-to-right, from the baseline down, and \# return to their point of origin. Box rules are drawn from the \# perimeter inwards. \# .MAC DBX END . GRAPHICAL_OBJ . ie '\\$1'SOLID' .nr #BX_SOLID 1 . el .ds $BX_WEIGHT \\$1 . ds $BX_INDENT \\$2 . ie '\\$3'FULL_MEASURE' \{\ . ie (\\n[#INDENT_LEFT_ACTIVE]+\\n[#INDENT_RIGHT_ACTIVE]+\\n[#INDENT_BOTH_ACTIVE])=0 \{\ . nr #WIDTH \\n[.l] . ds $BX_WIDTH \\n[#WIDTH]u . \} . el \{\ . if \\n[#INDENT_LEFT_ACTIVE] \{\ . nr #WIDTH \\n[.l]-\\n[#L_INDENT] . ds $BX_WIDTH \\n[#WIDTH]u . \} . if \\n[#INDENT_RIGHT_ACTIVE] \{\ . nr #WIDTH \\n[.l] . ds $BX_WIDTH \\n[#WIDTH]u . \} . if \\n[#INDENT_BOTH_ACTIVE] \{\ . nr #WIDTH \\n[.l]-(\\n[#BL_INDENT]) . ds $BX_WIDTH \\n[#WIDTH]u . \} . \} . \} . el .ds $BX_WIDTH \\$3 . ds $BX_DEPTH \\$4 . ie !'\\$5'' \{\ . ie d$\\$5_FILL .ds $BX_COLOR \\*[$\\$5_FILL] . el .ds $BX_COLOR \\$5 . \} . el \{\ . ie '\\n[.m]'' .ds $BX_COLOR \\*[default] . el .ds $BX_COLOR \\n[.m] . \} . nr #SAVED_WEIGHT \\n[#RULE_WEIGHT] . nr #SAVED_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . if !'\\$1'SOLID' .RULE_WEIGHT \\*[$BX_WEIGHT] . ds $BX_INDENT \\*[$BX_INDENT]-\\n[#WEIGHT_ADJ]u . ie \\n[#BX_SOLID]=1 \{\ . fcolor \\*[$BX_COLOR] \h'\\*[$BX_INDENT]+\\n[#BOX_WEIGHT_ADJ]u+\\n[#RULE_WEIGHT]u'\ \D'P \\*[$BX_WIDTH] 0 0 \\*[$BX_DEPTH] -\\*[$BX_WIDTH] 0 0 -\\*[$BX_DEPTH]' . fcolor . rr #BX_SOLID . \} . el \{\ . COLOR \\*[$BX_COLOR] \Z'\D't \\n[#RULE_WEIGHT]''\ \h'\\*[$BX_INDENT]+\\n[#RULE_WEIGHT]u+\\n[#RULE_WEIGHT_ADJ]u'\ \v'\\n[#WEIGHT_ADJ]u'\ \D'p \\*[$BX_WIDTH]-\\n[#RULE_WEIGHT]u 0 0 \\*[$BX_DEPTH]-\\n[#RULE_WEIGHT]u -\\*[$BX_WIDTH]+\\n[#RULE_WEIGHT]u 0 0 -\\*[$BX_DEPTH]+\\n[#RULE_WEIGHT]u'\ \v'-\\n[#WEIGHT_ADJ]u'\ \Z'\D't \\n[#SAVED_RULE_WEIGHT]'' . gcolor . \} . sp -1v . if \\n[#FILLED]=1 \{\ . if \\n[#FILL_MODE]=0 .QUAD LEFT . if \\n[#FILL_MODE]=1 .JUSTIFY . if \\n[#FILL_MODE]=3 .QUAD CENTER . if \\n[#FILL_MODE]=5 .QUAD RIGHT . \} . if \\n[#NOFILL]=1 \{\ . if \\n[#NOFILL_MODE]=3 .CENTER . if \\n[#NOFILL_MODE]=5 .RIGHT . \} . nr #RULE_WEIGHT \\n[#SAVED_WEIGHT] . nr #WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ] . rr #SAVED_WEIGHT . rr #SAVED_WEIGHT_ADJ . if \\n[#RESTORE_TRAP]=1 \{\ . vpt . rr #RESTORE_TRAP . \} . if '\\n[.z]'FLOAT*DIV' \ . if !(\\n[.d]+\\*[$BX_DEPTH])<\\n[D-float] .nr D-float \\n[.d]+\\*[$BX_DEPTH] .END \# \# ELLIPSES - DCL \# -------------- \# *Arguments: \# |SOLID |FULL_MEASURE [ ] \# *Function: \# Draws described ellipses. \# *Notes: \# Ellipses (circles) are drawn left-to-right, from the baseline \# down, and return to their point of origin. Ellipse rules are \# drawn from the perimeter inwards. \# .MAC DCL END . GRAPHICAL_OBJ . ie '\\$1'SOLID' .nr #CL_SOLID 1 . el .ds $CL_WEIGHT \\$1 . ds $CL_INDENT \\$2 . ds $CL_WIDTH \\$3 . ie '\\$3'FULL_MEASURE' \{\ . ie (\\n[#INDENT_LEFT_ACTIVE]+\\n[#INDENT_RIGHT_ACTIVE]+\\n[#INDENT_BOTH_ACTIVE])=0 \ . nr #WIDTH \\n[.l] . ds $CL_WIDTH \\n[#WIDTH]u . el \{\ . if \\n[#INDENT_LEFT_ACTIVE] \{\ . nr #WIDTH \\n[.l]-\\n[#L_INDENT] . ds $CL_WIDTH \\n[#WIDTH]u . \} . if \\n[#INDENT_RIGHT_ACTIVE] \{\ . nr #WIDTH \\n[.l] . ds $CL_WIDTH \\n[#WIDTH]u . \} . if \\n[#INDENT_BOTH_ACTIVE] \{\ . nr #WIDTH \\n[.l]-(\\n[#BL_INDENT]) . ds $CL_WIDTH \\n[#WIDTH]u . \} . \} . \} . el .ds $CL_WIDTH \\$3 . ds $CL_DEPTH \\$4 . ie !'\\$5'' \{\ . ie d$\\$5_FILL .ds $CL_COLOR \\*[$\\$5_FILL] . el .ds $CL_COLOR \\$5 . \} . el \{\ . ie '\\n[.m]'' .ds $CL_COLOR \\*[default] . el .ds $CL_COLOR \\n[.m] . \} . nr #SAVED_WEIGHT \\n[#RULE_WEIGHT] . nr #SAVED_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . if !'\\$1'SOLID' .RULE_WEIGHT \\*[$CL_WEIGHT] . ds $CL_INDENT \\*[$CL_INDENT]-\\n[#WEIGHT_ADJ]u . ie \\n[#CL_SOLID]=1 \{\ . fcolor \\*[$CL_COLOR] \h'\\*[$CL_INDENT]+\\n[#RULE_WEIGHT]u'\ \v'\\*[$CL_DEPTH]/2u'\ \D'E \\*[$CL_WIDTH]-\\n[#RULE_WEIGHT]u \\*[$CL_DEPTH]-\\n[#RULE_WEIGHT]u'\ \v'-\\*[$CL_DEPTH]/2u' . fcolor . rr #CL_SOLID . \} . el \{\ . COLOR \\*[$CL_COLOR] \Z'\D't \\n[#RULE_WEIGHT]''\ \h'\\*[$CL_INDENT]+\\n[#RULE_WEIGHT]u+\\n[#RULE_WEIGHT_ADJ]u'\ \v'\\*[$CL_DEPTH]/2u'\ \D'e \\*[$CL_WIDTH]-\\n[#RULE_WEIGHT]u \\*[$CL_DEPTH]-\\n[#RULE_WEIGHT]u'\ \v'-(\\*[$CL_DEPTH]/2u)'\ \Z'\D't \\n[#SAVED_RULE_WEIGHT]'' . gcolor . \} . sp -1v . if \\n[#FILLED]=1 \{\ . if \\n[#FILL_MODE]=0 .QUAD LEFT . if \\n[#FILL_MODE]=1 .JUSTIFY . if \\n[#FILL_MODE]=3 .QUAD CENTER . if \\n[#FILL_MODE]=5 .QUAD RIGHT . rr #FILLED . \} . if \\n[#NOFILL]=1 \{\ . if \\n[#NOFILL_MODE]=3 .CENTER . if \\n[#NOFILL_MODE]=5 .RIGHT . \} . nr #RULE_WEIGHT \\n[#SAVED_WEIGHT] . nr #WEIGHT_ADJ \\n[#SAVED_WEIGHT_ADJ] . rr #SAVED_WEIGHT . rr #SAVED_WEIGHT_ADJ . if \\n[#RESTORE_TRAP]=1 \{\ . vpt . rr #RESTORE_TRAP . \} . if '\\n[.z]'FLOAT*DIV' \ . if !(\\n[.d]+\\*[$CL_DEPTH])<\\n[D-float] .nr D-float \\n[.d]+\\*[$CL_DEPTH] .END \# \# RULE WEIGHT \# ----------- \# *Argument: \# \# *Function: \# Sets \D't ' to the correct number of machine units for the \# argument given in points. \# *Notes: \# Decimal fractions are allowed. Rule weight must be < 100. \# .MAC RULE_WEIGHT END . di NULL \" Diverted so there's no problem with breaks, spacing, etc. . ds $ARG \\$1 . substring $ARG -1 . if !\B'\\*[$ARG]' \{\ . tm1 "[mom]: The argument to \\$0 must not have a unit of measure appended. . ab [mom]: Aborting '\\n[.F]' at \\$0, line \\n[.c]. . \} . length #STR_LENGTH \\$1 . ds $ARG \\$1 . substring $ARG 0 0 . ie '\\*[$ARG]'.' \{\ . ds $ARG \\$1 . substring $ARG 1 \\n[#STR_LENGTH]-1 . nr #WEIGHT \\*[$ARG]*100 . if (\\n[#WEIGHT]>=1000) \{\ . while (\\n[#WEIGHT]>=1000) \{\ . nr #WEIGHT \\n[#WEIGHT]/10 . \} . \} . \} . el \{\ . ds $ARG \\$1 . length #ARG_LENGTH \\*[$ARG] . if \\n[#ARG_LENGTH]>1 .substring $ARG 1 1 . ie '\\*[$ARG]'.' \{\ . ds $LHS \\$1 . substring $LHS 0 0 . ds $RHS \\$1 . substring $RHS 2 . nr #WEIGHT \\*[$LHS]\\*[$RHS]*100 . if (\\n[#WEIGHT]>=10000) \{\ . while (\\n[#WEIGHT]>=10000) \{\ . nr #WEIGHT \\n[#WEIGHT]/10 . \} . \} . \} . el \{\ . ie \\n[#STR_LENGTH]<=2 .nr #WEIGHT \\$1*1000 . el \{\ . ds $ARG \\$1 . substring $ARG 2 2 . ie !'\\*[$ARG]'.' \{\ . tm1 "[mom]: Invalid argument given to macro \\$0 at line \\n[.c]. . tm1 " Rule weight must be < 100 points. . tm1 " Falling back to default weight .5 points. . nr #WEIGHT 500 . \} . el \{\ . ds $LHS \\$1 . substring $LHS 0 1 . ds $RHS \\$1 . substring $RHS 3 . nr #WEIGHT \\*[$LHS]\\*[$RHS]*1000 . if (\\n[#WEIGHT]>=100000) \{\ . while (\\n[#WEIGHT]>=100000) \{\ . nr #WEIGHT \\n[#WEIGHT]/10 . \} . \} . \} . \} . \} . \} . nr #WEIGHT_ADJ \\n[#WEIGHT]/2 . if '\\$0'BIBLIOGRAPHY_STRING_UNDERLINE_WEIGHT' \ . ds $TITLE_TYPE BIB_STRING_ . if '\\$0'ENDNOTE_TITLE_UNDERLINE_WEIGHT' \ . ds $TITLE_TYPE EN_TITLE_ . if '\\$0'EN_HEADER_UNDERLINE_WEIGHT' \ . ds $TITLE_TYPE EN_STRING_ . if !'\\*[$TITLE_TYPE]'BIB_STRING' \ . if !'\\*[$TITLE_TYPE]'EN_TITLE' \ . if !'\\*[$TITLE_TYPE]'EN_STRING' \ . ds _TYPE \\$0 . length type-len _TYPE . if \\n[type-len]>17 \{\ . substring _TYPE 0 -17 . ds $TITLE_TYPE \\*[_TYPE] . \} . if !'\\*[$TITLE_TYPE]'' \{\ . nr #\\*[$TITLE_TYPE]UNDERLINE_WEIGHT \\n[#WEIGHT] . nr #\\*[$TITLE_TYPE]UNDERLINE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'RULE_WEIGHT' \{\ . nr #RULE_WEIGHT \\n[#WEIGHT] . nr #RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'UNDERSCORE_WEIGHT' \{\ . nr #UNDERSCORE_WEIGHT \\n[#WEIGHT] . nr #UNDERSCORE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'FOOTER_RULE_WEIGHT' \{\ . nr #FOOTER_RULE_WEIGHT \\n[#WEIGHT] . nr #FOOTER_RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'FOOTNOTE_RULE_WEIGHT' \{\ . nr #FN_RULE_WEIGHT \\n[#WEIGHT] . nr #FN_RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . if '\\$0'HEADER_RULE_WEIGHT' \{\ . nr #HEADER_RULE_WEIGHT \\n[#WEIGHT] . nr #HEADER_RULE_WEIGHT_ADJ \\n[#WEIGHT_ADJ] . \} . di .END \# \# Aliases for RULE_WEIGHT \# .ALIAS BIB_STRING_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS DOCTYPE_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS EN_STRING_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS EN_TITLE_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS FN_RULE_WEIGHT RULE_WEIGHT .ALIAS FOOTER_RULE_WEIGHT RULE_WEIGHT .ALIAS FOOTNOTE_RULE_WEIGHT RULE_WEIGHT .ALIAS HEADER_RULE_WEIGHT RULE_WEIGHT .ALIAS RULE_WEIGHT RULE_WEIGHT .ALIAS TOC_HEADER_UNDERLINE_WEIGHT RULE_WEIGHT .ALIAS UNDERSCORE_WEIGHT RULE_WEIGHT \# \# Default rule weights \# .nr #BIB_STRING_UNDERLINE_WEIGHT 500 .nr #DOCTYPE_UNDERLINE_WEIGHT 500 .nr #EN_STRING_UNDERLINE_WEIGHT 500 .nr #EN_TITLE_UNDERLINE_WEIGHT 500 .nr #FN_RULE_WEIGHT 500 .nr #FOOTER_RULE_WEIGHT 500 .nr #HEADER_RULE_WEIGHT 500 .nr #RULE_WEIGHT 500 .nr #TOC_HEADER_UNDERLINE_WEIGHT 500 .nr #UNDERSCORE_WEIGHT 500 \# .nr #BIB_STRING_UNDERLINE_WEIGHT_ADJ \n[#BIB_STRING_UNDERLINE_WEIGHT]/2 .nr #DOCTYPE_UNDERLINE_WEIGHT_ADJ \n[#DOCTYPE_UNDERLINE_WEIGHT]/2 .nr #EN_STRING_UNDERLINE_WEIGHT_ADJ \n[#EN_STRING_UNDERLINE_WEIGHT]/2 .nr #EN_TITLE_UNDERLINE_WEIGHT_ADJ \n[#EN_TITLE_UNDERLINE_WEIGHT]/2 .nr #FN_RULE_WEIGHT_ADJ \n[#FN_RULE_WEIGHT]/2 .nr #FOOTER_RULE_WEIGHT_ADJ \n[#FOOTER_RULE_WEIGHT]/2 .nr #HEADER_RULE_WEIGHT_ADJ \n[#HEADER_RULE_WEIGHT]/2 .nr #RULE_WEIGHT_ADJ \n[#RULE_WEIGHT]/2 .nr #TOC_HEADER_UNDERLINE_WEIGHT_ADJ \n[#TOC_HEADER_UNDERLINE_WEIGHT]/2 .nr #UNDERSCORE_WEIGHT_ADJ \n[#UNDERSCORE_WEIGHT]/2 \# \# Read in remaining aliases and default rule weights \# .nr #LOOP 0 1 .while \n+[#LOOP]<=14 \{\ . ALIAS \*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT RULE_WEIGHT . ALIAS COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT RULE_WEIGHT . ALIAS DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT RULE_WEIGHT . nr #\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT 500 . nr #COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT 500 . nr #DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT 500 . nr #\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT_ADJ \ \n[#\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT]/2 . nr #COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT_ADJ \ \n[#COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT]/2 . nr #DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT_ADJ \ \n[#DOC_COVER_\*[TITLE_TYPE_\n[#LOOP]]_UNDERLINE_WEIGHT]/2 .\} \# \# Set default rule weight \# .di NULL \D't 500' .di \# \# ===================================================================== \# \# +++WORD AND SENTENCE SPACING+++ \# \# WORD SPACE CONTROL \# ------------------ \# *Argument: \# <+|->wordspace | DEFAULT \# *Function: \# Increases or decreases interword space by user supplied amount. \# If DEFAULT, value is set to 12 (groff default). \# *Notes: \# $WS_CONSTANT is the groff default word space. \# $WS_VAR is the user supplied amount by which to in/decrease word space. \# $WS is a concatenation of WS_CONSTANT and WS_VAR. \# \# \n[.sss] holds the current sentence space value. \# .MAC WS END . ds $WS_CURR \\n[.ss] . ds $WS_VAR \\$1 . ie '\\$1'DEFAULT' .ss 12 \\n[.sss] . el \{\ . ds $WS (\\*[$WS_CURR]+\\*[$WS_VAR]) . ie \\n[.sss]=12 .ss \\*[$WS] 12 . el \{\ . ss \\*[$WS] (\\*[$WS]+\\*[$SS_VAR]) . SS \\*[$SS_VAR] . \} . \} .END \# \# SENTENCE SPACE CONTROL \# ---------------------- \# *Argument: \# <+-sentencespace> | 0 | DEFAULT \# *Function: \# Increases or decreases sentence space by user supplied amount. \# If 0, sentence spaces are ignored. If DEFAULT, value is \# set to 12 (groff default). \# *Notes: \# Because the user supplied value requires a literal + or - sign, \# the macro argument is stored in a string. \# \# Sentence space applies only to input where sentences are separated \# by two spaces (and/or, in fill mode [FLUSH L|R|C or JUSTIFY], an EOL). \# Changing .SS when sentences are separated by only one space has \# no effect on the space between sentences. \# \# \n[.ss] holds the current wordspace value. \# \n[.sss] holds the current sentence space value. \# .MAC SS END . ds $SS_VAR \\$1 . ie '\\$1'0' .ss \\n[.ss] 0 . el \{\ . ie '\\$1'DEFAULT' .ss \\n[.ss] . el .ss \\n[.ss] \\*[$SS_VAR] . \} .END \# \# ===================================================================== \# \# INDENTS \# ------- \# \# +++INDENT LEFT+++ \# .MAC IL END . if \\n[#INDENT_STYLE_BOTH] .IBX . nr #INDENT_STYLE_LEFT 1 . nr #INDENT_ACTIVE 1 . nr #INDENT_LEFT_ACTIVE 1 . ie '\\$1'' \{\ . br . in \\n[#L_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . if \\n[#IN_ITEM] .nr #IN_ITEM_L_INDENT 0 . \} . el \{\ . br . nr #L_INDENT +(u;\\$1) . in \\n[#L_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . if \\n[#IN_ITEM] .nr #IN_ITEM_L_INDENT +(u;\\$1) . \} .END \# \# +++INDENT RIGHT+++ \# .MAC IR END . if \\n[#INDENT_STYLE_BOTH] .IBX . nr #INDENT_STYLE_RIGHT 1 . nr #INDENT_ACTIVE 1 . nr #INDENT_RIGHT_ACTIVE 1 . ie '\\$1'' \{\ . br . ie \\n[#TAB_ACTIVE] \{\ . ll \\n[.l]u-\\n[#R_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . \} . el \{\ . ll \\n[.l]u-\\n[#R_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . \} . \} . el \{\ . br . nr #R_INDENT (u;\\$1) . ie \\n[#TAB_ACTIVE] \{\ . ll \\n[.l]u-\\n[#R_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . \} . el \{\ . ll \\n[.l]u-\\n[#R_INDENT]u . ta \\n[.l]u-\\n[#L_INDENT]u . \} . \} .END \# \# +++INDENT BOTH+++ \# .MAC IB END . br . 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'' \{\ . ie \\n[#DOCS] \ . ll \\n[#DOC_L_LENGTH]u-\\n[#BR_INDENT]u . el .ll \\n[.l]u-\\n[#BR_INDENT]u . in \\n[#BL_INDENT]u . ta \\n[.l]u . \} . el \{\ . nr #BL_INDENT (\\n[#INDENT]+\\$1) . ie \\n[#NUM_ARGS]=2 .nr #BR_INDENT +(\\$2) . el .nr #BR_INDENT \\n[#BL_INDENT] . if '\\n[.z]'' .ll . ll \\n[.l]u-\\n[#BR_INDENT]u . in \\n[#BL_INDENT]u . ta \\n[.l]u-\\n[#BR_INDENT]u . \} .END \# \# +++TEMPORARY INDENT+++ \# .MAC TI END . br . ie '\\$1'' \{\ . ti \\n[#T_INDENT]u . if \\n[#INDENT_LEFT_ACTIVE] .ti \\n[#T_INDENT]u+\\n[#L_INDENT]u . if \\n[#INDENT_BOTH_ACTIVE] .ti \\n[#T_INDENT]u+\\n[#BL_INDENT]u . \} . el \{\ . nr #T_INDENT (\\$1) . ti \\n[#T_INDENT]u . \} .END \# \# +++HANGING INDENT+++ \# .MAC HI END . ie '\\$1'' .ti -\\n[#HL_INDENT]u . el \{\ . nr #HL_INDENT (\\$1) . ti -\\n[#HL_INDENT]u . \} .END \# \# +++INDENTS OFF+++ \# .MAC ILX END . ie \\n[#IN_ITEM] .nr #L_INDENT -\\n[#IN_ITEM_L_INDENT] . el \{\ . br . ie \\n[pdfbx-running]=1 \ . ie !r pdfbx-clear \{\ . in \\*[wt\\n[stack]]+\\*[gap\\n[stack]]u+\\n[#IL_ACTIVE]u . el .in \\*[wt\\n[stack]]+\\*[gap\\n[stack]]u . \} . el .in 0 . rr #INDENT_LEFT_ACTIVE . nr #L_INDENT_ILX \\n[#L_INDENT] . \} . if '\\$1'CLEAR' \{\ . if \\n[pdfbx-running]=1 \ . if !r pdfbx-clear \ . in \\*[wt\\n[stack]]+\\*[gap\\n[stack]]u . rr #L_INDENT . rr #INDENT_STYLE_LEFT . rr #L_INDENT_ILX . rr #INDENT_ACTIVE . \} .END \# .MAC IRX END . br . rr #INDENT_RIGHT_ACTIVE . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ie \\n[pdfbx-running]=1 \{\ . if !r pdfbx-clear \ . ll \\n[pdfbx-ll]u . \} . el .ll \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . \} . \} . if '\\$1'CLEAR' \{\ . if \\n[pdfbx-running]=1 \{\ . if !r pdfbx-clear \ . ll \\n[#L_LENGTH]u-(\\*[wt\\n[stack]]+\\*[gap\\n[stack]]u) . \} . rr #R_INDENT . rr #INDENT_STYLE_RIGHT . \} .END \# .MAC IBX END . br . in 0 . rr #INDENT_ACTIVE . rr #INDENT_BOTH_ACTIVE . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . if '\\$1'CLEAR' \{\ . rr #BL_INDENT . rr #BR_INDENT . rr #INDENT_STYLE_BOTH . \} .END \# .MAC IX END . if '\\$0'IX' \{\ . if !\\n[#IX_WARN] \{\ . tm1 "[mom]: Use of .IX is deprecated. Use .IQ instead. . tm1 " .IX will continue to behave as before, but to . tm1 " avoid this message, please update your document. . nr #IX_WARN 1 . \} . \} . br . in 0 . rr #INDENT_LEFT_ACTIVE . rr #INDENT_RIGHT_ACTIVE . rr #INDENT_BOTH_ACTIVE . rr #INDENT_ACTIVE . if \\n[#INDENT_STYLE_RIGHT] \{\ . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . \} . if \\n[#INDENT_STYLE_BOTH] \{\ . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . \} . if '\\$1'CLEAR' \{\ . if \\n[#INDENT_STYLE_RIGHT] \{\ . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . \} . if \\n[#INDENT_STYLE_BOTH] \{\ . ie \\n[#TAB_ACTIVE] .TAB\\n[#CURRENT_TAB] . el \{\ . ie \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#L_LENGTH]u . ta \\n[.l]u . \} . \} . \} . rr #L_INDENT . rr #R_INDENT . rr #BL_INDENT . rr #BR_INDENT . rr #T_INDENT . rr #H_INDENT . rr #INDENT_STYLE_LEFT . rr #INDENT_STYLE_RIGHT . rr #INDENT_STYLE_BOTH . \} .END \# \# ===================================================================== \# \# +++HANGING CHARACTERS+++ \# \# LEFT_HANG hangs its argument to the left of the left margin. \# If enclosed in double-quotes, the argument may contain local \# horizontal motions. Input text after LEFT_HANG must begin \# by repeating the text of the argument including horizontal \# motions. If the hung character is a left double-quote, \# \[lq] must be used in the argument and the usual keyboard \# double-quote (") used for the input text (so as not to confuse \# SMARTQUOTES). \# \# HANG is called inline with \*[HANG ]. Hangs its \# single-character argument, typically a punctuation mark, to the \# right of the right margin in justified copy. Unlike LEFT_HANG, \# does not require repeating the character as part of input text. \# \# Except for hung hyphens, HANG may be used mid-line in input \# text. Hung hyphens must come at the end of input lines. If \# the hung character is a right double-quote, "\[rq]" must be \# used as the argument (that is, the rq character surrounded by \# double-quotes). The double-quotes are required for all special \# characters that have the form \[c]. \# .MAC LEFT_HANG END . nr hang-char-width \w'\\$1' . ds hang-char-gutter \\$2 . ie '\\*[hang-char-gutter]'' \ . nr hang-char \\n[hang-char-width] . el \ . nr hang-char \\n[hang-char-width]+\\*[hang-char-gutter] \h'-\\n[hang-char]u'\c .END \# .MAC HANG END \c .if '\\$1'\[rq]' .nr #OPEN_CLOSE 0 \c \&\\$1\c \h'-\w'\\$1'u'\c .END \# \# ===================================================================== \# \# +++MULTIPLE COLUMNS+++ \# \# MULTIPLE COLUMNS ON \# ------------------- \# *Arguments: \# \# *Function: \# Marks the top of a column set \# .MAC MCO END . mk c .END \# \# MULTIPLE COLUMN RETURN \# ---------------------- \# *Arguments: \# \# *Function: \# Returns to the top of a column set \# .MAC MCR END . vpt 0 . sp |\\n[c]u . vpt .END \# \# MULTIPLE COLUMNS OFF \# -------------------- \# *Arguments: \# | \# *Function: \# Advances to the end of a column set \# *Notes: \# With no argument, advances to the next baseline (at the current \# leading value) beneath the longest column. With an argument \# (which requires a unit of measure), advances arg distance \# beneath the baseline of the deepest column. If the argument \# is zero, advances to the baseline of the deepest column. \# .MAC MCX END . vpt 0 . ie '\\$1'' \{\ . if '\\n[.z]'FLOAT*DIV' \!.TQ . TQ . sp |\\n[.h]u . \} . el \{\ . nr #MCX_ALD (\\$1) . TQ . ie \\n[#MCX_ALD]=0 .sp |\\n[.h]u-1v . el .sp |\\n[.h]u+\\n[#MCX_ALD]u . rr #MCX_ALD . \} . vpt .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 encloses the offending lines in TRAP OFF/TRAP. \# .MAC TRAP END . ie '\\$1'' .vpt . el .vpt 0 .END \# \# SILENT \# ------ \# *Arguments: \# | \# *Function: \# Diverts text so that it doesn't print, or turns the function off. \# *Notes: \# Useful for setting up autotabs where you don't want the line with \# the tab marks to print. \# \# Also aliased as COMMENT, in case user wants to input a batch of \# text that doesn't print. \# .MAC SILENT END . nr #SILENT 1 . if \\n[#QUAD] .br . ie '\\$1'' .di NO_FLASH . el \{\ . br . di . rm NO_FLASH . rr #SILENT . \} .END \# \# PRINT \# ----- \# *Function: \# Prints anything. A macro that helps keep my code nicely indented. \# .MAC PRINT END . nop \\$* .END \# \# Numbered strings for while loop in SMALLCAPS. \# .ds $c1 a .ds $c2 b .ds $c3 c .ds $c4 d .ds $c5 e .ds $c6 f .ds $c7 g .ds $c8 h .ds $c9 i .ds $c10 j .ds $c11 k .ds $c12 l .ds $c13 m .ds $c14 n .ds $c15 o .ds $c16 p .ds $c17 q .ds $c18 r .ds $c19 s .ds $c20 t .ds $c21 u .ds $c22 v .ds $c23 w .ds $c24 x .ds $c25 y .ds $c26 z .ds $c27 \[`a] .ds $c28 \[^a] .ds $c29 \['a] .ds $c30 \[:a] .ds $c31 \[oa] .ds $c32 \[~a] .ds $c33 \[ae] .ds $c34 \[`e] .ds $c35 \[^e] .ds $c36 \['e] .ds $c37 \[:e] .ds $c38 \[`i] .ds $c39 \[^i] .ds $c40 \['i] .ds $c41 \[:i] .ds $c42 \[`o] .ds $c43 \[^o] .ds $c44 \['o] .ds $c45 \[:o] .ds $c46 \[~o] .ds $c47 \[/o] .ds $c48 \[`u] .ds $c49 \[^u] .ds $c50 \['u] .ds $c51 \[:u] .ds $c52 \[,c] .ds $c53 \[Sd] .ds $c54 \[~n] .ds $c55 \[Sd] .ds $c56 \[Tp] .ds $c57 \['y] .ds $c58 \[:y] \# .ds $C1 A .ds $C2 B .ds $C3 C .ds $C4 D .ds $C5 E .ds $C6 F .ds $C7 G .ds $C8 H .ds $C9 I .ds $C10 J .ds $C11 K .ds $C12 L .ds $C13 M .ds $C14 N .ds $C15 O .ds $C16 P .ds $C17 Q .ds $C18 R .ds $C19 S .ds $C20 T .ds $C21 U .ds $C22 V .ds $C23 W .ds $C24 X .ds $C25 Y .ds $C26 Z .ds $C27 \[`A] .ds $C28 \[^A] .ds $C29 \['A] .ds $C30 \[:A] .ds $C31 \[oA] .ds $C32 \[~A] .ds $C33 \[AE] .ds $C34 \[`E] .ds $C35 \[^E] .ds $C36 \['E] .ds $C37 \[:E] .ds $C38 \[`I] .ds $C39 \[^I] .ds $C40 \['I] .ds $C41 \[:I] .ds $C42 \[`O] .ds $C43 \[^O] .ds $C44 \['O] .ds $C45 \[:O] .ds $C46 \[~O] .ds $C47 \[/O] .ds $C48 \[`U] .ds $C49 \[^U] .ds $C50 \['U] .ds $C51 \[:U] .ds $C52 \[,C] .ds $C53 \[-D] .ds $C54 \[~N] .ds $C55 \[-D] .ds $C56 \[TP] .ds $C57 \['Y] .ds $C58 \[:Y] \# \# CAPS \# ---- \# *Arguments: \# | \# *Function: \# Converts text to caps, or, if OFF, reverts to normal caps/lc. \# *Notes: \# For inline control of capitalization style, use \*[UC] and \# \*[LC]. \# .MAC CAPS END . ie '\\$1'' \{\ . LC_TO_CAPS . nr #CAPS_ON 1 . \} . el \{\ . CAPS_TO_LC . rr #CAPS_ON . \} .END \# .MAC UC END \c . LC_TO_CAPS . nr #CAPS_ON 1 .END \# .MAC LC END \c . CAPS_TO_LC . rr #CAPS_ON .END \# \# Perform lowercase conversion to caps or revert to lowercase \# .MAC CONVERT_CASE END . if '\\$0'LC_TO_CAPS' \{\ . nr #LOOP 0 1 . while \\n+[#LOOP]<=58 \{\ . tr \\*[$c\\n[#LOOP]]\\*[$C\\n[#LOOP]] . \} . \} . if '\\$0'CAPS_TO_LC' \{\ . nr #LOOP 0 1 . while \\n+[#LOOP]<=58 \{\ . tr \\*[$c\\n[#LOOP]]\\*[$c\\n[#LOOP]] . \} . \} .END . .ALIAS LC_TO_CAPS CONVERT_CASE .ALIAS CAPS_TO_LC CONVERT_CASE . \# \# SMALLCAPS \# --------- \# *Arguments: \# | \# *Function: \# Converts text to smallcaps, or, if , reverts to normal \# caps/lc. \# *Notes: \# SMALLCAPS has no inline escape eqiv. to \*[UC]. \# .MAC SMALLCAPS END . if \\n[#PRINT_STYLE]=2 \{\ . if !\\n[.u] \ . if \\n[.int] .nop \& \c . nr sc*size \\n[.ps]*\\n[sc*factor]/1000 . if \\n[sc*wt-adj] .nr sc*wt-adj-factor \\n[sc*size]*\\n[sc*wt-adj]/1000 . if \\n[sc*extend] .nr sc*extend-factor \\n[sc*size]*\\n[sc*extend]/1000 . ie '\\$1'' \{\ . nr #SMALLCAPS_ON 1 . nr #LOOP 0 1 . while \\n+[#LOOP]<=58 \{\ . char \\*[$c\\n[#LOOP]] \ \Z'\s[\\n[sc*size]u+\\n[sc*extend-factor]u]\H'-\\n[sc*extend-factor]u'\ \\*[$C\\n[#LOOP]]'\ \h'\\n[sc*wt-adj-factor]u'\\*[$C\\n[#LOOP]]\s[0] . \} . \} . el \{\ . nr #LOOP 0 1 . while \\n+[#LOOP]<=58 \{\ . rchar \\*[$c\\n[#LOOP]] . \} . rr sc*wt-adj-factor . rr sc*extend-factor . rr #SMALLCAPS_ON . \} . \} .END \# \# SMALLCAPS_SIZE \# -------------- \# *Arguments: \# [ \# *Function: \# Sets registers 'sc*factor', 'sc*wt-adj', and sc*extend. \# *Notes: \# Weight adjustment pseudo-emboldens small caps to visually match the \# weight of the larger real caps. \# \# Both sc*factor (size) and sc*wt-adj (weight adjustment) args are \# expressed as percentages of type size. \# .MAC SMALLCAPS_STYLE END . nr #LOOP 0 1 . while \\n+[#LOOP]<=\\n[#NUM_ARGS] \{\ . if '\\$1'SIZE' \{\ . shift . nr sc*factor (z;\\$1)/100 . shift . \} . if '\\$1'WEIGHT_ADJ' \{\ . shift . nr sc*wt-adj (z;\\$1)/100 . shift . \} . if '\\$1'EXTEND' \{\ . shift . nr sc*extend (z;\\$1)/100 . shift . \} . \} . if \\n[sc*wt-adj]=0 .rr sc*wt-adj . if \\n[sc*extend]=0 .rr sc*extend .END . .SMALLCAPS_STYLE \ SIZE 74 \ WEIGHT_ADJ .3 \ EXTEND 5 \# \# SIZESPECS \# --------- \# Argument: \# \# Function: \# Gets cap-height, x-height, and descender depth of the \# current font at the current point size. \# *Notes: \# The routine is diverted so it remains invisible to output. \# .MAC SIZESPECS END . if !'\\n[.z]'' \ . if \\n[dn] .nr saved-dn \\n[dn] . di TYPESIZE E\R'#CAP_HEIGHT \\n[.cht]' e\R'#X_HEIGHT \\n[.cht]' y\R'#DESCENDER \\n[.cdp]' . br . ds $CAP_HEIGHT \\n[#CAP_HEIGHT]u . ds $X_HEIGHT \\n[#X_HEIGHT]u . ds $DESCENDER \\n[#DESCENDER]u . di . if !'\\n[.z]'' \ . nr dn \\n[saved-dn] .END \# \# ===================================================================== \# \# +++TYPESETTING ALIASES+++ \# .ALIAS ADD_SPACE ALD .ALIAS CENTRE CENTER .ALIAS COLOUR COLOR .ALIAS COMMENT SILENT .ALIAS CONDENSE CONDENSE_OR_EXTEND .ALIAS EXTEND CONDENSE_OR_EXTEND .ALIAS FAM FAMILY .ALIAS FONT FT .ALIAS HYPHENATE HY .ALIAS HYPHENATION HY .ALIAS HYSET HY_SET .ALIAS IBQ IBX .ALIAS ILQ ILX .ALIAS IQ IX .ALIAS IRQ IRX .ALIAS LIG LIGATURES .ALIAS NEWCOLOUR NEWCOLOR .ALIAS PADMARKER PAD_MARKER .ALIAS SP ALD .ALIAS SPACE ALD .ALIAS TABSET TAB_SET .ALIAS TB TAB .ALIAS UNDERSCORE_2 UNDERSCORE2 .ALIAS XCOLOUR XCOLOR \# \# ==================================================================== \# \# DOCUMENT PROCESSING MACROS, STRINGS AND ALIASES \# =============================================== \# \# DOC_MACRO_ERROR \# --------------- \# *Arguments: \# None. \# *Function: \# Warning message if DOC_ called before START. \# .MAC DOC_MACRO_ERROR END . if '\\$1'DOC_L_MARGIN' .ds $REPLACEMENT L_MARGIN . if '\\$1'DOC_R_MARGIN' .ds $REPLACEMENT R_MARGIN . if '\\$1'DOC_LINE_LENGTH' .ds $REPLACEMENT LL . if '\\$1'DOC_FAMILY' .ds $REPLACEMENT "FAMILY or FAM . if '\\$1'DOC_PT_SIZE' .ds $REPLACEMENT PT_SIZE . if '\\$1'DOC_LEAD' .ds $REPLACEMENT LS . if '\\$1'DOC_QUAD' .ds $REPLACEMENT QUAD . tm1 "[mom]: \\$1 at line \\n[.c] of '\\n[.F]' should not be used before START. . tm1 " Use \\*[$REPLACEMENT] instead. . ab [mom]: Aborting. .END \# \# +++PAGE DIMENSIONS+++ \# \# PAPER SIZE \# ---------- \# *Arguments: \# LETTER | LEGAL | STATEMENT | TABLOID | LEDGER | FOLIO | QUARTO | 10x14 | EXECUTIVE | A3 | A4 | A5 | B4 | B5 \# *Function: \# Sets up dimensions for different paper sizes. \# *Notes: \# LANDSCAPE may be given after papersize arg. \# .MAC PAPER END . vs 0 . 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 '\\$2'LANDSCAPE' \{\ . nr #PAGE_WIDTH_TMP \\n[#PAGE_WIDTH] . PAGEWIDTH \\n[#PAGE_LENGTH]u . PAGELENGTH \\n[#PAGE_WIDTH_TMP]u . as $PAPER " LANDSCAPE\" . \} . if !r#L_MARGIN .L_MARGIN \\n[.o] . if !r#R_MARGIN .R_MARGIN \\n[#PAGE_WIDTH]u-\\n[#L_MARGIN]u-1i . if '\\*[.T]'pdf' .br . vs .END \# \# ==================================================================== \# \# +++PRINTSTYLE -- TYPEWRITE OR TYPESET+++ \# \# PRINTSTYLE \# ---------- \# *Arguments: \# TYPESET | TYPEWRITE [SINGLESPACE] \# *Function: \# Sets type specs for typewriter-style or typeset output. \# *Notes: \# Number registers: TYPEWRITE=1, TYPESET=2. \# .MAC PRINTSTYLE END . if n \{\ . if '\\$1'TYPESET' \{\ . pl 1 . ab [mom]: Terminal output requires PRINTSTYLE TYPEWRITE. Aborting. . \} . \} . if !\\n[#COLLATE]=1 \{\ . if !d$PAPER \{\ . PAGELENGTH 11i . PAGEWIDTH 8.5i . \} . if '\\$1'TYPEWRITE' \{\ . nr #PRINT_STYLE 1 . if !\\n[#DOC_TYPE]=4 \{\ . L_MARGIN 6P . R_MARGIN 6P . \} . ds $TYPEWRITER_FAM C . ds $TYPEWRITER_PS 12 . TYPEWRITER . color 0 . ie '\\$2'SINGLESPACE' \{\ . nr #SINGLE_SPACE 1 . vs 12 . ie \\n[#DOC_TYPE]=4 .nr #FOOTER_ADJ \\n[.v] . el .nr #FOOTER_ADJ \\n[.v] . nr #ORIGINAL_DOC_LEAD \\n[.v] . \} . el \{\ . if !\\n[#DOC_TYPE]=4 \{\ . vs 24 . nr #FOOTER_ADJ \\n[.v]/2 . nr #ORIGINAL_DOC_LEAD \\n[.v] . \} . \} . QUAD L . HY OFF . SMARTQUOTES OFF . if !\\n[#PP_INDENT] .nr #PP_INDENT 3P . HDRFTR_RIGHT_CAPS . nr #BOLDER_UNITS 0 . nr #CONDENSE 0 . nr #EXTEND 0 . if !\\n[#ITALIC_MEANS_ITALIC] \{\ . rm IT . rm PREV . UNDERLINE_ITALIC . \} . rm BD . rm BDI . if !\\n[#SLANT_MEANS_SLANT] .UNDERLINE_SLANT . if !\\n[#UNDERLINE_QUOTES] .UNDERLINE_QUOTES . nr #IGNORE_COLUMNS 1 . nr #RULE_WEIGHT 500 . char \[em] -- . tr `' . tr \[lq]" . tr \[rq]" . \} . if '\\$1'TYPESET' \{\ . nr #PRINT_STYLE 2 . if !\\n[#DOC_TYPE]=5 \{\ . if !\\n[#DOC_TYPE]=4 \{\ . L_MARGIN 6P . R_MARGIN 6P . \} . \} . FAMILY T . FT R . if !\\n[#DOC_TYPE]=4 .ps 12.5 . if !\\n[#DOC_TYPE]=4 .vs 16 .\" In DEFAULTS, TRAPS is run with this leading, so we need a register to .\" hold it for use with the .sp in FOOTER . nr #FOOTER_ADJ 12000 . JUSTIFY . HY . HY_SET 2 36p 1p . KERN . LIG . SS 0 . SMARTQUOTES . if !\\n[#PP_INDENT] \{\ . in 2m \"Set indent . nr #PP_INDENT \\n[.i] \"Read into #PP_INDENT . in 0 \"Remove indent . \} . HDRFTR_RIGHT_CAPS . rr #IGNORE_COLUMNS . \} .\" Set up default style for nine levels of headings . nr #HD_LEVEL 0 1 \" loop step . nr #LOOP 9 \" loop count . while \\n+[#HD_LEVEL]<=\\n[#LOOP] \{\ . HEADING_STYLE \\n[#HD_LEVEL] \ FONT B \ SIZE +0 \ QUAD L \ NEEDS 1 \ COLOR black .\" Set up default style for nine levels of TOC headings . TOC_ENTRY_STYLE \\n[#HD_LEVEL] \ FONT R \ SIZE +0 \ COLOR black . \} .\" Set up decreasing sizes for headings levels 1 - 3, starting at +3 . nr #HD_LEVEL 0 1 \" loop step . nr #LOOP 3 \" loop count . nr #HD_SIZE 4 1 . while \\n+[#HD_LEVEL]<=\\n[#LOOP] \{\ . nr #HD_SIZE_CHANGE \\n-[#HD_SIZE] . ds $HEAD_\\n[#HD_LEVEL]_SIZE +\\n[#HD_SIZE_CHANGE] . \} .\" Set up TOC title style . TOC_TITLE_STYLE FONT R SIZE +0 INDENT 0 .\" Set up captions, labels, sources . LABELS ALL FONT B AUTOLEAD 2 . LABELS EQN FONT R QUAD RIGHT . CAPTIONS ALL AUTOLEAD 2 . CAPTIONS EQN QUAD CENTER . SOURCES TBL AUTOLEAD 2 . \} .END \# \# Set limited parameters to TYPEWRITE. \# .MAC TYPEWRITER_FAMILY END . ds $TYPEWRITER_FAM \\$1 .END \# .ALIAS TYPEWRITER_FAM TYPEWRITER_FAMILY \# .MAC TYPEWRITER_SIZE END . ds $TYPEWRITER_PS \\$1 .END \# .MAC TYPEWRITER END . fam \\*[$TYPEWRITER_FAM] . ft R . ps \\*[$TYPEWRITER_PS] .END \# \# ITALIC MEANS ITALIC \# ------------------- \# *Argument: \# \# *Function: \# Instructs TYPEWRITE to treat italics as italics, whether \# invoked via control lines or inline. \# *Notes: \# ITALIC_MEANS_ITALIC and UNDERLINE_ITALIC are mutually exclusive, \# hence invoking the one automatically turns off the other. \# .MAC ITALIC_MEANS_ITALIC END . if \\n[#PRINT_STYLE]=1 \{\ . nr #ITALIC_MEANS_ITALIC 1 . rr #UNDERLINE_ITALIC . rm ROM . rm IT . rm PREV . ds ROM \Ef[R] . ds IT \Ef[I] . ds PREV \Ef[] . \} .END \# \# UNDERLINE ITALIC \# ---------------- \# *Argument: \# \# *Function: \# Instructs TYPEWRITE to underline italics, whether invoked \# via control lines or inline. \# *Notes: \# UNDERLINE_ITALIC and ITALIC_MEANS_ITALIC are mutually 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 \f[P]\E*[ULX] . \} .END \# \# UNDERLINE SLANT \# --------------- \# *Arguments: \# | \# *Function: \# Instructs TYPEWRITE to underline occurrences of \*[SLANT], or \# turns feature off. \# *Notes: \# Users may want \*[SLANT] to mean slant in TYPEWRITE, although \# most of the time, \*[SLANT] most likely means the user wanted \# italic but didn't have it, ergo the need to tell TYPEWRITE to \# treat \*[SLANT] as italic (i.e. underlined). \# \# UNDERLINE_SLANT and SLANT_MEANS_SLANT are mutually exclusive, \# hence invoking the one automatically turns off the other. \# \# UNDERLINE_SLANT is the default for TYPEWRITE. \# .MAC UNDERLINE_SLANT END . if \\n[#PRINT_STYLE]=1 \{\ . rr #SLANT_MEANS_SLANT . nr #UNDERLINE_SLANT 1 . rm SLANT . rm SLANTX . ds SLANT \ER'#SLANT_ON 1'\E*[UL] . ds SLANTX \ER'#SLANT_ON 0'\E*[ULX] . \} .END \# .MAC SLANT_MEANS_SLANT END . if \\n[#PRINT_STYLE]=1 \{\ . rr #UNDERLINE_SLANT . nr #SLANT_MEANS_SLANT 1 . rm SLANT . rm SLANTX . ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' . ds SLANTX \ER'#SLANT_ON 0'\ES'0' . \} .END \# .MAC IGNORE_COLUMNS END . if \\n[#PRINT_STYLE]=1 .nr #NO_COLUMNS 1 .END \# \# ==================================================================== \# \# +++COPY STYLE -- DRAFT OR FINAL+++ \# \# COPY STYLE \# ---------- \# *Arguments: \# DRAFT | FINAL \# *Function: \# Sets registers that are used to determine what to put \# in the default header, and how to number pages. \# *Notes: \# DOCTYPE must come before COPYSTYLE. \# .MAC COPYSTYLE END . ds $COPY_STYLE \\$1 . if '\\*[$COPY_STYLE]'DRAFT' \{\ . nr #COPY_STYLE 1 . if !d$DRAFT .DRAFT 1 . \} . if '\\*[$COPY_STYLE]'FINAL' .nr #COPY_STYLE 2 . if '\\*[$CHAPTER_STRING]'' .CHAPTER_STRING "Chapter" . if '\\*[$DRAFT_STRING]'' .DRAFT_STRING "Draft" . if '\\*[$REVISION_STRING]'' .REVISION_STRING "Rev." .\" Default . if \\n[#DOC_TYPE]=1 \{\ . ie \\n[#COPY_STYLE]=1 \{\ . ie \\n[#PAGENUM_STYLE_SET] .PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el .PAGENUM_STYLE roman . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie \\n[#DRAFT_WITH_PAGENUM] .ds $HDRFTR_CENTER . el \{\ . ie '\\*[$REVISION]'' \{\ . ds $HDRFTR_CENTER \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . \} . \} . el \{\ . ie \\n[#PAGENUM_STYLE_SET] .PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el .PAGENUM_STYLE DIGIT . if \\n[#DRAFT_WITH_PAGENUM] .rr #DRAFT_WITH_PAGENUM . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ds $HDRFTR_CENTER . rr #USER_DEF_HDRFTR_CENTER . \} . \} . \} .\" Chapter . if \\n[#DOC_TYPE]=2 \{\ .\" Copystyle DRAFT . ie \\n[#COPY_STYLE]=1 \{\ . ie \\n[#PAGENUM_STYLE_SET] \ . PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el \ . PAGENUM_STYLE roman . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie \\n[#DRAFT_WITH_PAGENUM] \{\ . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . \} . el \{\ . ie '\\*[$REVISION]'' \{\ . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie '\\*[$DRAFT]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . \} . el \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING], \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . \} . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie '\\*[$DRAFT]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE_1], \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . \} . el \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING] \\*[$CHAPTER], \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . \} . \} . \} . el \{\ . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . el \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING], \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_TITLE], \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . el \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING] \\*[$CHAPTER], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$CHAPTER_STRING] \\*[$CHAPTER], \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . \} . \} . \} . \} . \} .\" Copystyle FINAL . el \{\ . if \\n[#DRAFT_WITH_PAGENUM] .rr #DRAFT_WITH_PAGENUM . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie \\n[#PAGENUM_STYLE_SET] \ . PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el .PAGENUM_STYLE DIGIT . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el \ . ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . el \ . ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . \} . \} . \} .\" Named . if \\n[#DOC_TYPE]=3 \{\ . ie \\n[#COPY_STYLE]=1 \{\ . ie \\n[#PAGENUM_STYLE_SET] .PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el .PAGENUM_STYLE roman . ie \\n[#DRAFT_WITH_PAGENUM] \ . ds $HDRFTR_CENTER \\*[$DOC_TYPE] . el \{\ . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie '\\*[$REVISION]'' \{\ . ie '\\*[$DRAFT]'' \ . ds $HDRFTR_CENTER \\*[$DOC_TYPE] . el \{\ . ds $HDRFTR_CENTER \ \\*[$DOC_TYPE], \ \\*[$DRAFT_STRING]\\*[$DRAFT] . \} . \} . el \{\ . ie '\\*[$DRAFT]'' \{\ . ds $HDRFTR_CENTER \ \\*[$DOC_TYPE], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . el \{\ . ds $HDRFTR_CENTER \ \\*[$DOC_TYPE], \ \\*[$DRAFT_STRING]\\*[$DRAFT], \ \\*[$REVISION_STRING] \\*[$REVISION] . \} . \} . \} . \} . \} . el \{\ . if \\n[#DRAFT_WITH_PAGENUM] .rr #DRAFT_WITH_PAGENUM . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie \\n[#PAGENUM_STYLE_SET] .PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el .PAGENUM_STYLE DIGIT . ds $HDRFTR_CENTER \\*[$DOC_TYPE] . \} . \} . \} .END \# \# ==================================================================== \# \# +++COLLECT DOC INFO (reference macros, metadata)+++ \# \# *Arguments: \# various string/register arguments \# *Function: \# Set strings and registers for covers, docheaders, page headers. \# .MAC DOCTITLE END . rr #DOCTITLE_NUM . nr #DOCTITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#DOCTITLE_NUM] \{\ . ds $DOCTITLE_\\n+[#DOCTITLE_NUM] \\$\\n[#DOCTITLE_NUM] . \} . ds $DOCTITLE \\$* . PDF_TITLE \\*[$DOCTITLE] .END \# .MAC TITLE END \"Document title . if '\\$1'DOC_COVER' \{\ . shift . DOC_COVERTITLE \\$@ . return . \} . if '\\$1'COVER' \{\ . shift . COVERTITLE \\$@ . return . \} . ie \\n[#NUM_ARGS]=0 \{\ . if \\n[#TITLE_NUM] \{\ . nr #ITEM 0 1 . while \\n[#TITLE_NUM]>\\n[#ITEM] \{\ . rm $TITLE_\\n+[#ITEM] . \} . rr #TITLE_NUM . \} . \} . el \{\ . nr #TITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#TITLE_NUM] \{\ . ds $TITLE_\\n+[#TITLE_NUM] \\$\\n[#TITLE_NUM] . \} . ds $TITLE \\$* . \} .END \# .MAC SUBTITLE END \"Document sub-title . ie \\n[#NUM_ARGS]=0 \{\ . if \\n[#DOC_COVER_SUBTITLE_NUM] \ . ds COVER_ DOC_COVER_ . if \\n[#COVER_SUBTITLE_NUM] \ . ds COVER_ COVER_ . if \\n[#\\*[COVER_]SUBTITLE_NUM] \{\ . nr #ITEM 0 1 . while \\n[#\\*[COVER_]SUBTITLE_NUM]>\\n[#ITEM] \{\ . rm $\\*[COVER_]SUBTITLE_\\n+[#ITEM] . \} . rr #\\*[COVER_]SUBTITLE_NUM . rm $SUBTITLE . \} . \} . el \{\ . if '\\$1'DOC_COVER' \{\ . ds COVER_ DOC_COVER_ . shift . \} . if '\\$1'COVER' \{\ . ds COVER_ COVER_ . shift . \} . nr #\\*[COVER_]SUBTITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#\\*[COVER_]SUBTITLE_NUM] \{\ . ds $\\*[COVER_]SUBTITLE_\\n+[#\\*[COVER_]SUBTITLE_NUM] \ \\$\\n[#\\*[COVER_]SUBTITLE_NUM] . \} . rm COVER_ . ds $SUBTITLE \\$* . \} .END \# .MAC CHAPTER END \"If document is a chapter, the chapter number . nr #CHAPTER_CALLED 1 . ds $CHAPTER \\$1 . if \B'\\*[$CHAPTER]' .nr #CH_NUM \\*[$CHAPTER] . if !r #CH_NUM .nr #CH_NUM 1 .END . .MAC CHAPTER_NUMBER END . nr #CH_NUM \\$1 .END \# .MAC CHAPTER_TITLE END \" This defines what comes after Chapter # . ie \\n[#NUM_ARGS]=0 \{\ . if \\n[#CHAPTER_TITLE_NUM] \{\ . nr #ITEM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>\\n[#ITEM] \{\ . rm $CHAPTER_TITLE_\\n+[#ITEM] . \} . rr #CHAPTER_TITLE_NUM . rm $CHAPTER_TITLE . \} . \} . el \{\ . rr #CHAPTER_TITLE_NUM . nr #CHAPTER_TITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#CHAPTER_TITLE_NUM] \{\ . ds $CHAPTER_TITLE_\\n+[#CHAPTER_TITLE_NUM] \ \\$\\n[#CHAPTER_TITLE_NUM] . \} . ds $CHAPTER_TITLE \\$* . \} .END \# .MAC DRAFT END \"Draft number . ie '\\$1'' .ds $DRAFT . el .ds $DRAFT " \\$1 .END \# .MAC REVISION END \"Revision number . ds $REVISION \\$1 .END \# .MAC DRAFT_WITH_PAGENUMBER END \"Attach draft/revision strings to page number . nr #DRAFT_WITH_PAGENUM 1 .END \# .MAC AUTHOR END \"Author. Enclose all args fully in double quotes. . rr #NO_PRINT_AUTHOR . if '\\$1'DOC_COVER' \{\ . ds COVER_ DOC_COVER_ . shift . \} . if '\\$1'COVER' \{\ . ds COVER_ COVER_ . shift . \} . nr #\\*[COVER_]AUTHOR_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#\\*[COVER_]AUTHOR_NUM] \{\ . ds $\\*[COVER_]AUTHOR_\\n+[#\\*[COVER_]AUTHOR_NUM] \ \\$\\n[#\\*[COVER_]AUTHOR_NUM] . if !'\\*[$\\*[COVER_]AUTHOR_\\n[#\\*[COVER_]AUTHOR_NUM]]'' \ . as $AUTHORS \ "\\*[$\\*[COVER_]AUTHOR_\\n[#\\*[COVER_]AUTHOR_NUM]], \" . \} . ds $AUTHOR \\*[$AUTHOR_1] . substring $AUTHORS 0 -2 . ds PDF_AUTHORS \\*[$AUTHORS] . pdfmomclean PDF_AUTHORS . nop \!x X ps:exec [/Author (\\*[PDF_AUTHORS]) /DOCINFO pdfmark .END . .ALIAS EDITOR AUTHOR \# .MAC COPYRIGHT END \"For use on cover pages only . ie \\n[#NUM_ARGS]=1 \ . ds $COVER_COPYRIGHT \[co]\\$1 . el \{\ . if '\\$1'COVER' .ds $COVER_COPYRIGHT \[co]\\$2 . if '\\$1'DOC_COVER' .ds $DOC_COVER_COPYRIGHT \[co]\\$2 . \} .END \# .MAC COPYRIGHT_V_ADJUST END . ds $COPYRIGHT_V_ADJ \\$1 .END \# .MAC MISC END \"Doc cover and cover pages only; enclose all args in double quotes . rm COVER_ . ie \\n[#NUM_ARGS]=0 \{\ . if \\n[#DOC_COVER_MISC_LINES] \ . ds COVER_ DOC_COVER_ . if \\n[#COVER_MISC_LINES] \ . ds COVER_ COVER_ . if \\n[#\\*[COVER_]MISC_LINES] \{\ . nr #LINE 0 1 . while \\n[#\\*[COVER_]MISC_LINES]>\\n[#LINE] \{\ . rm $\\*[COVER_]MISC_\\n+[#LINE] . \} . rr #\\*[COVER_]MISC_LINES . \} . \} . el \{\ . if '\\$1'DOC_COVER' \{\ . ds COVER_ DOC_COVER_ . shift . \} . if '\\$1'COVER' \{\ . ds COVER_ COVER_ . shift . \} . nr #\\*[COVER_]MISC_LINE 0 1 . while \\n[#NUM_ARGS]>\\n[#\\*[COVER_]MISC_LINE] \{\ . ds $\\*[COVER_]MISC_\\n+[#\\*[COVER_]MISC_LINE] \ \\$[\\n[#\\*[COVER_]MISC_LINE]] . \} . nr #\\*[COVER_]MISC_LINES \\n[#NUM_ARGS] . rm COVER_ . \} .END \# \# Page number that appears on page one. .MAC PAGENUMBER END . 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 \# \# Replacement string for pagenumber. .MAC PAGENUMBER_STRING END . ds $PAGENUM_STRING \\$1 .END \# \# ==================================================================== \# \# +++TYPE OF DOCUMENT+++ \# \# DOCUMENT TYPE \# ------------- \# *Argument: \# DEFAULT | CHAPTER | NAMED " | LETTER \# *Function: \# Creates strings and sets registers for document types. \# *Notes: \# Number registers: DEFAULT=1, CHAPTER=2, NAMED=3, LETTER=4, \# SLIDES=5 \# .MAC DOCTYPE END . if '\\$1'DEFAULT' .nr #DOC_TYPE 1 . if '\\$1'CHAPTER' .nr #DOC_TYPE 2 . if '\\$1'NAMED' \{\ . rr #NO_PRINT_DOCTYPE . ds $DOC_TYPE \\$2 . nr #DOC_TYPE 3 . \} . if '\\$1'LETTER' \{\ . nr #DOC_TYPE 4 . L_MARGIN 1.125i . R_MARGIN 1.125i . ps 12 . vs 13.5 . nr #FOOTER_ADJ \\n[.v] . DOCHEADER OFF . PARA_INDENT 3m . INDENT_FIRST_PARAS . PARA_SPACE . ds $SUITE \En[#SUITE] . HEADER_MARGIN 3P+6p . HEADER_GAP 3P . FOOTERS . FOOTER_RULE OFF . FOOTER_LEFT "" . FOOTER_CENTER "" . FOOTER_RIGHT_SIZE +0 . FOOTER_RIGHT "\&.../\E*[$SUITE] . FOOTER_ON_FIRST_PAGE . em ALL_DONE . \} . if '\\$1'SLIDES' \{\ . shift . nr #DOC_TYPE 5 . PRINTSTYLE TYPESET . FAMILY H . QUAD CENTER . QUOTE_STYLE QUAD CENTER . BLOCKQUOTE_STYLE \ QUAD J \ INDENT \\n[.l]u/5u . PARA_INDENT 0 . NO_SHIM . NO_FLEX . HEADING_STYLE 1 \ SIZE +8 \ QUAD CENTER . HEADING_STYLE 2 \ SIZE +4 \ QUAD CENTER . HEADING_STYLE 3 \ SIZE +2 \ QUAD CENTER . DOCHEADER off . PAGINATION off . PAGENUM_HYPHENS off . HEADERS off . FOOTERS off . HEADERS_PLAIN . FOOTERS_PLAIN . nr loop-count 0 1 . nr loop-counter \\n[#NUM_ARGS] .\" Default 16:9 setup if no ASPECT . PAGE 11i 6.1875i 36p 36p 80p 72p . PT_SIZE 14 . AUTOLEAD 4 . HEADER_SIZE -2 . while \\n+[loop-count]<=\\n[loop-counter] \{\ . if '\\$1'ASPECT' \{\ . if '\\$2'4:3' \{\ . PAGE 11i 8.25i 36p 36p 90p 84p . PT_SIZE 16 . AUTOLEAD 6 . HEADER_SIZE -3 . \} . if '\\$2'16:9' \{\ . PAGE 11i 6.1875i 36p 36p 80p 72p . PT_SIZE 14 . AUTOLEAD 4 . HEADER_SIZE -2 . \} . shift 2 . \} . if '\\$1'HEADER' \{\ . shift 1 . nr #SLIDE_HEADERS 1 . ds $SLIDE_HDR_L \\$1 . ds $SLIDE_HDR_C \\$2 . ds $SLIDE_HDR_R \\$3 . HEADER_MARGIN 45p . shift 3 . \} . if '\\$1'FOOTER' \{\ . shift 1 . nr #SLIDE_FOOTERS 1 . ds $SLIDE_FTR_L \\$1 . ds $SLIDE_FTR_C \\$2 . ds $SLIDE_FTR_R \\$3 . shift 3 . \} . if '\\$1'TRANSITION' \{\ . shift 1 . ds $TRANS_TYPE \\$1 . shift 1 . \} . if '\\$1'PAUSE' \{\ . shift 1 . ds $PAUSE_TYPE \\$1 . shift 1 . \} . \} . if d $TRANS_TYPE \ . pdftransition PAGE \\*[$TRANS_TYPE] . if d $PAUSE_TYPE \ . pdftransition BLOCK \\*[$PAUSE_TYPE] . \} . ie \\n[#SLIDE_HEADERS]+\\n[#SLIDE_FOOTERS]=2 \{\ . HEADERS_AND_FOOTERS L "^\\*[$SLIDE_HDR_L]#\\*[$SLIDE_HDR_C]#\\*[$SLIDE_HDR_R]^" \ L "^\\*[$SLIDE_FTR_L]#\\*[$SLIDE_FTR_C]#\\*[$SLIDE_FTR_R]^" . \} . el \{\ . if \\n[#SLIDE_HEADERS] \{\ . HEADERS . HEADER_RECTO L "^\\*[$SLIDE_HDR_L]#\\*[$SLIDE_HDR_C]#\\*[$SLIDE_HDR_R]^" \ . \} . if \\n[#SLIDE_FOOTERS] \{\ . FOOTERS . FOOTER_RECTO L "^\\*[$SLIDE_FTR_L]#\\*[$SLIDE_FTR_C]#\\*[$SLIDE_FTR_R]^" . \} . \} .END \# \# +++LETTER MACROS+++ \# \# First, create a register to hold incrementing numbers to be \# appended to LETTERHEAD. \# .nr #FIELD 0 1 \# \# DATE \# ---- \# *Arguments: \# \# *Function: \# Stores date (entered on the line after .DATE) in diversion \# LETTERHEAD \# .MAC DATE END . if !'\\n[.z]'' .di . di LETTERHEAD\\n+[#FIELD] . ie \\n[#FIELD]=1 \{\ . nr #DATE_FIRST 1 . RIGHT . \} . el .LEFT .END \# \# TO \# -- \# *Arguments: \# \# *Function: \# Stores addressee address (entered on the line after .TO) in \# diversion LETTERHEAD \# .MAC TO END . if !'\\n[.z]'' .di . di LETTERHEAD\\n+[#FIELD] . LEFT .END \# \# FROM \# ---- \# *Arguments: \# \# *Function: \# Stores addresser address (entered on the line after .FROM) in \# diversion LETTERHEAD \# .MAC FROM END . if !'\\n[.z]'' .di . di LETTERHEAD\\n+[#FIELD] . LEFT .END \# \# GREETING \# -------- \# *Arguments: \# \# *Function: \# Stores greeting (entered on the line after .GREETING) in \# diversion LETTERHEAD \# .MAC GREETING END . if !'\\n[.z]'' .di . di LETTERHEAD\\n+[#FIELD] . LEFT .END \# \# CLOSING \# ------- \# *Arguments: \# \# *Function: \# Stores greeting in diversion CLOSING. \# .MAC CLOSING END . if '\\*[$SIG_SPACE]'' .ds $SIG_SPACE 3v . ie ( (2v+\\*[$SIG_SPACE]) > \\n[.t] ) \{\ . ie !\\n[@TOP] \{\ . ch HEADER . ch FOOTER . br . tm1 "[mom]: Insufficient room for \\$0 and signature line. . ab [mom]: Terminating '\\n[.F]' before closing. . \} . el .sp . \} . el .br . nr #CLOSING 1 . di CLOSING_TEXT .END \# \# CLOSING INDENT \# -------------- \# *Argument: \# \# *Function: \# Defines string $CLOSE_INDENT for use in macro, ALL_DONE. \# .MAC CLOSING_INDENT END . ds $CLOSE_INDENT \\$1 .END \# \# SIGNATURE_SPACE \# --------------- \# *Argument: \# \# *Function: \# Defines string $SIG_SPACE for use in macro, ALL_DONE. \# .MAC SIGNATURE_SPACE END . ds $SIG_SPACE \\$1 .END \# \# NO SUITE \# -------- \# *Arguments: \# \# *Function: \# Redefines $FOOTER_RIGHT to blank so that a suite number doesn't \# appear at the bottom of letter pages. \# .MAC NO_SUITE END . FOOTER_RIGHT "" .END \# \# ==================================================================== \# \# +++DEFAULTS FOR DOCUMENT PROCESSING+++ \# \# TYPE-STYLE CONTROL MACROS \# ------------------------- \# The control macros for family, font, size, color and quad are \# here grouped together. Each (e.g., _FAMILY) uses the calling alias \# to determine the document element to which the style parameter \# applies. Defaults for all these guys are set in DEFAULTS, and \# listed in the "Control Macros" section of the documentation \# pertinent to the element whose style is to be changed. \# .MAC _FAMILY END . ds PARAM FAM . ds ELEMENT \\$0 . if '\\$0'COPYRIGHT_FAMILY' \ . ds ELEMENT COVER_COPYRIGHT_FAMILY . ds FROM_ALIAS \\$0 . substring ELEMENT 0 -4 \" Strip 'ILY' from FAMILY . ASSIGN_ELEMENT \\$1 .END \# .MAC _FONT END . ds PARAM FT . ds ELEMENT \\$0 . ds FROM_ALIAS \\$0 . if '\\$0'COPYRIGHT_FONT' \ . ds ELEMENT COVER_COPYRIGHT_FONT . substring ELEMENT 0 -5 . ds ELEMENT \\*[ELEMENT]FT \" ELEMENT is now \\$0_FT . ASSIGN_ELEMENT \\$1 .END \# .MAC _SIZE END . ds PARAM SIZE_CHANGE . ds ELEMENT \\$0_CHANGE . if '\\$0'CODE_SIZE' \{\ . ds PARAM SIZE_ADJ . ds ELEMENT \\$0_ADJ . \} . if '\\$0'COPYRIGHT_SIZE' \ . ds ELEMENT COVER_COPYRIGHT_SIZE_CHANGE . ds FROM_ALIAS \\$0 . ASSIGN_ELEMENT \\$1 .END \# .MAC _COLOR END . if \\n[#PRINT_STYLE]=1 .return . ds PARAM COLOR . ds ELEMENT \\$0 . if '\\$0'COPYRIGHT_COLOR' \ . ds ELEMENT COVER_COPYRIGHT_COLOR . ds FROM_ALIAS \\$0 . ASSIGN_ELEMENT \\$1 .END \# .MAC _CAPS END . ds CAPS_TYPE \\$0 . substring CAPS_TYPE 0 7 . ds CALLED_AS \\$0 . substring CALLED_AS -7 . ie '\\*[CALLED_AS]'NO_CAPS' \{\ . ie '\\*[CAPS_TYPE]'BIBLIOGR' \{\ . if '\\$0'BIBLIOGRAPHY_HEADER_NO_CAPS' .rr #BIB_STRING_CAPS . if '\\$0'BIBLIOGRAPHY_STRING_NO_CAPS' .rr #BIB_STRING_CAPS . \} . el \{\ . ie '\\*[CAPS_TYPE]'ENDNOTES' \{\ . if '\\$0'ENDNOTES_HEADER_NO_CAPS' .rr #EN_STRING_CAPS . if '\\$0'ENDNOTES_STRING_NO_CAPS' .rr #EN_STRING_CAPS . \} . el \{\ . ie '\\$0'TOC_HEADER_NO_CAPS' .rr #TOC_STRING_CAPS . el \{\ . ds REGISTER_TYPE \\$0 . substring REGISTER_TYPE 0 -8 . as REGISTER_TYPE CAPS . rr #\\*[REGISTER_TYPE] . \} . \} . \} . \} . el \{\ . ie '\\*[CAPS_TYPE]'BIBLIOGR' \{\ . if '\\$0'BIBLIOGRAPHY_HEADER_CAPS' .nr #BIB_STRING_CAPS 1 . if '\\$0'BIBLIOGRAPHY_STRING_CAPS' .nr #BIB_STRING_CAPS 1 . \} . el .nr #\\$0 1 . \} .END . .ALIAS _NO_CAPS _CAPS \# .MAC _SMALLCAPS END . ds SMALLCAPS_TYPE \\$0 . substring SMALLCAPS_TYPE 0 7 . ds CALLED_AS \\$0 . substring CALLED_AS -12 . ie '\\*[CALLED_AS]'NO_SMALLCAPS' \{\ . ie '\\*[SMALLCAPS_TYPE]'BIBLIOGR' \{\ . if '\\$0'BIBLIOGRAPHY_HEADER_NO_SMALLCAPS' .rr #BIB_STRING_SMALLCAPS . if '\\$0'BIBLIOGRAPHY_STRING_NO_SMALLCAPS' .rr #BIB_STRING_SMALLCAPS . \} . el \{\ . ie '\\*[SMALLCAPS_TYPE]'ENDNOTES' \{\ . if '\\$0'ENDNOTES_HEADER_NO_SMALLCAPS' .rr #EN_STRING_SMALLCAPS . if '\\$0'ENDNOTES_STRING_NO_SMALLCAPS' .rr #EN_STRING_SMALLCAPS . \} . el \{\ . ie '\\$0'TOC_HEADER_NO_SMALLCAPS' .rr #TOC_STRING_SMALLCAPS . el \{\ . ds REGISTER_TYPE \\$0 . substring REGISTER_TYPE 0 -13 . as REGISTER_TYPE SMALLCAPS . rr #\\*[REGISTER_TYPE] . \} . \} . \} . \} . el \{\ . ie '\\*[SMALLCAPS_TYPE]'BIBLIOGR' \{\ . if '\\$0'BIBLIOGRAPHY_HEADER_SMALLCAPS' .nr #BIB_STRING_SMALLCAPS 1 . if '\\$0'BIBLIOGRAPHY_STRING_SMALLCAPS' .nr #BIB_STRING_SMALLCAPS 1 . \} . el .nr #\\$0 1 . \} .END . .ALIAS _NO_SMALLCAPS _SMALLCAPS \# .MAC _QUAD END . if '\\$0'BIBLIOGRAPHY_QUAD' \{\ . if '\\$1'R' .QUAD-ERROR \\$0 . if '\\$1'C' .QUAD-ERROR \\$0 . \} . if '\\$0'ENDNOTE_QUAD' \{\ . if '\\$1'R' .QUAD-ERROR \\$0 . if '\\$1'C' .QUAD-ERROR \\$0 . \} . if '\\$0'DOC_QUAD' \ . if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0 . ds PARAM QUAD . ds ELEMENT \\$0 . if '\\$0'COPYRIGHT_QUAD' \ . ds ELEMENT COVER_COPYRIGHT_QUAD . ds FROM_ALIAS \\$0 . ASSIGN_ELEMENT \\$1 .END \# \# Special handling for QUOTE quadding \# .MAC QUOTE_QUAD END . ds $Q_QUAD \\$0 . substring $Q_QUAD 6 .END . .ALIAS QUOTE_LEFT QUOTE_QUAD .ALIAS QUOTE_CENTER QUOTE_QUAD .ALIAS QUOTE_RIGHT QUOTE_QUAD \# .MAC QUAD-ERROR END . tm1 "[mom]: \\$1 at line \\n[.c] of '\\n[.F]' must be set to either L or J. . ab [mom]: Aborting. .END \# .MAC ASSIGN_ELEMENT END . rm $\\*[ELEMENT] \" Clear this first .\" HDRFTR__ need special handling. . ds hdrftr \\*[FROM_ALIAS] . substring hdrftr 0 5 . if '\\*[hdrftr]'HDRFTR' \{\ . ds hdrftr-pos-element \\*[ELEMENT] .\" See if ELEMENT is of the form HDRFTR__ . substring hdrftr-pos-element 0 7 . substring hdrftr-pos-element -1 . if !'\\*[ELEMENT]'HDRFTR_COLOR' \{\ . if '\\*[hdrftr-pos-element]'L' .nr hdrftr-pos-element 1 . if '\\*[hdrftr-pos-element]'C' .nr hdrftr-pos-element 1 . if '\\*[hdrftr-pos-element]'R' .nr hdrftr-pos-element 1 . \} . \} . if !\\n[hdrftr-pos-element] \{\ . ds c1-c5 \\*[ELEMENT] . substring c1-c5 0 4 \" Grab first five letters of the alias . \} .\" If none of the following, convert the substring of the .\" calling alias, ie \*[ELEMENT], into the parameter string, e.g., .\" $TITLE_FAM, assign arg, and set register. . if !'\\*[c1-c5]'BIBLI' \ . if !'\\*[c1-c5]'BLOCK' \ . if !'\\*[c1-c5]'CITAT' \ . if !'\\*[c1-c5]'ENDNO' \ . if !'\\*[c1-c5]'EPIGR' \ . if !'\\*[c1-c5]'FOOTN' \ . if !'\\*[c1-c5]'HDRFT' \ . if !'\\*[c1-c5]'LINEN' \ . if !'\\*[c1-c5]'PAGEN' \{\ . ie '\\*[ELEMENT]'CODE_SIZE_ADJ' .nr #\\*[ELEMENT] \\$1 . el \{\ . ds $\\*[ELEMENT] \\$1 . nr #\\*[ELEMENT] 1 . \} . \} . if '\\*[$\\*[ELEMENT]]'' \{\ . if '\\*[c1-c5]'BIBLI' .ASSIGN_PARAM BIB \\$1 . if '\\*[c1-c5]'BLOCK' .ASSIGN_PARAM BQUOTE_ \\$1 . if '\\*[c1-c5]'CITAT' .ASSIGN_PARAM BQUOTE_ \\$1 . if '\\*[c1-c5]'ENDNO' .ASSIGN_PARAM EN \\$1 . if '\\*[c1-c5]'EPIGR' .ASSIGN_PARAM EPI_ \\$1 . if '\\*[c1-c5]'FOOTN' .ASSIGN_PARAM FN_ \\$1 . if '\\*[c1-c5]'HDRFT' .ASSIGN_PARAM HDRFTR_ \\$1 . if '\\*[c1-c5]'LINEN' .ASSIGN_PARAM LN_ \\$1 . if '\\*[c1-c5]'PAGEN' .ASSIGN_PARAM PAGE_NUM_ \\$1 . \} . if \\n[hdrftr-pos-element] \{\ . if '\\*[hdrftr-pos-element]'L' .ds hdrftr-pos-element LEFT . if '\\*[hdrftr-pos-element]'C' .ds hdrftr-pos-element CENTER . if '\\*[hdrftr-pos-element]'R' .ds hdrftr-pos-element RIGHT . if '\\*[ELEMENT]'HDRFTR_\\*[hdrftr-pos-element]_FAM' \ . ds $HDRFTR_\\*[hdrftr-pos-element]_FAM \\$1 . \} . rr hdrftr-pos-element . rm hdrftr-pos-element .END \# .MAC ASSIGN_PARAM END . if '\\*[PARAM]'FAM' .nr substr-index -7 . if '\\*[PARAM]'FT' .nr substr-index -5 . if '\\*[PARAM]'SIZE_CHANGE' .nr substr-index -5 . if '\\*[PARAM]'COLOR' .nr substr-index -6 . if '\\*[PARAM]'QUAD' .nr substr-index -5 . if '\\$1'BIB' \{\ . ds ELEMENT \\*[FROM_ALIAS] . substring ELEMENT 12 \\n[substr-index] . if '\\*[ELEMENT]'_HEADER_' \ . ds ELEMENT _STRING_ . \} . if '\\$1'BQUOTE_' .rm ELEMENT . if '\\$1'EN' \{\ . ds ELEMENT \\*[FROM_ALIAS] . substring ELEMENT 7 \\n[substr-index] . if '\\*[ELEMENT]'S_HEADER_' \ . ds ELEMENT _STRING_ . if '\\*[ELEMENT]'_LINENUMBER_' \ . ds ELEMENT _LN_ . \} . if '\\$1'EPI_' .rm ELEMENT . if '\\$1'FN_' .rm ELEMENT . if '\\$1'HDRFTR_' \{\ . if '\\*[ELEMENT]'HDRFTR_FAM' \{\ . nr #HDRFTR 1 . ds $HDRFTR_FAM \\$2 . ds $HDRFTR_LEFT_FAM \\$2 . ds $HDRFTR_CENTER_FAM \\$2 . ds $HDRFTR_RIGHT_FAM \\$2 . \} . if '\\*[ELEMENT]'HDRFTR_COLOR' \{\ . nr #HDRFTR 1 . nr #HDRFTR_COLOR 1 . ds $HDRFTR_COLOR \\$2 . \} . if '\\*[ELEMENT]'HDRFTR_SIZE_CHANGE' \{\ . nr #HDRFTR 1 . ds $HDRFTR_SIZE_CHANGE \\$2 . \} . if '\\*[PARAM]'SIZE_CHANGE' \{\ . nr #HDRFTR 1 . if '\\*[hdrftr-pos-element]'L' \ . ds $HDRFTR_LEFT_SIZE_CHANGE \\$2 . if '\\*[hdrftr-pos-element]'C' \ . ds $HDRFTR_CENTER_SIZE_CHANGE \\$2 . if '\\*[hdrftr-pos-element]'R' \ . ds $HDRFTR_RIGHT_SIZE_CHANGE \\$2 . \} . if !r #HDRFTR \{\ . substring ELEMENT 7 \\n[substr-index] . if '\\*[ELEMENT]'_LEFT' .ds ELEMENT _STRING_ . \} . \} . if '\\$1'LN_' .rm ELEMENT . if '\\$1'PAGE_NUM_' .rm ELEMENT . if !r #HDRFTR \{\ . ds $\\$1\\*[ELEMENT]\\*[PARAM] \\$2 . nr #\\$1\\*[ELEMENT]\\*[PARAM] 1 . \} . rr #HDRFTR . rm hdrftr-pos-element . rr substr-index . rm FROM_ALIAS . rm ELEMENT .END \# .MAC TITLE_LEAD END . ds $TYPE \\$0 . substring $TYPE 0 2 . if '\\*[$TYPE]'DOC' .nr DOC_ 1 . ds $TYPE \\$0 . ie '\\*[$TYPE]'MISC_LEAD' .ds $TYPE COVER_MISC . el .substring $TYPE -6 0 . ds $\\*[$TYPE]_LEAD \\$1 . nr #\\*[$TYPE]_LEAD 1 . rm $TYPE .END \# \# The _STYLE macro, called by various aliases, allows grouping \# style parameters for most document elements in a single macro \# using 'KEYWORD value' pairs. \# .MAC _STYLE END . SILENT \" Some of the invoked macros cause unwanted breaks . ds $STYLE_TYPE \\$0 . substring $STYLE_TYPE 0 -7 . ds $HDR_FTR \\*[$STYLE_TYPE] . length #HDR_FTR_STRING $HDR_FTR . if \\n[#HDR_FTR_STRING]<=5 .substring $HDR_FTR 0 5 \" HEADER or FOOTER . if '\\*[$HDR_FTR]'HEADER' .ds $HDR_FTR HEADER . if '\\*[$HDR_FTR]'FOOTER' .ds $HDR_FTR FOOTER . ds $POS \\$0 . substring $POS 7 7 . if '\\*[$POS]'L' .ds $POS LEFT . if '\\*[$POS]'C' .ds $POS CENTER . if '\\*[$POS]'R' .ds $POS RIGHT . if '\\*[$STYLE_TYPE]'\\*[$HDR_FTR]_\\*[$POS]' \{\ . ds $\\*[$HDR_FTR]_\\*[$POS] \\*[$HDR_FTR]_\\*[$POS] . ds $STYLE_TYPE HDRFTR_\\*[$POS] . \} . if '\\*[$STYLE_TYPE]'ENDNOTES_HEADER' \ . ds $BIB-EN-TOC EN_STRING . if '\\*[$STYLE_TYPE]'ENDNOTE_STRING' \ . ds $BIB-EN-TOC EN_STRING . if '\\*[$STYLE_TYPE]'BIBLIOGRAPHY_HEADER' \ . ds $BIB-EN-TOC BIB_STRING . if '\\*[$STYLE_TYPE]'BIBLIOGRAPHY_STRING' \ . ds $BIB-EN-TOC BIB_STRING . if '\\*[$STYLE_TYPE]'TOC_HEADER' \ . ds $BIB-EN-TOC TOC_STRING . if '\\*[$STYLE_TYPE]'PAGENUMBER' \ . ds $STYLE_TYPE PAGENUM . nr #LOOP 0 1 . nr #STYLE_PARAMS \\n[#NUM_ARGS] . while \\n+[#LOOP]<=\\n[#STYLE_PARAMS] \{\ . if '\\$1'FAMILY' \{\ . shift . \\*[$STYLE_TYPE]_FAMILY \\$1 . shift . \} . if '\\$1'FONT' \{\ . shift . \\*[$STYLE_TYPE]_FONT \\$1 . shift . \} . if '\\$1'SIZE' \{\ . shift . \\*[$STYLE_TYPE]_SIZE \\$1 . shift . \} . if '\\$1'COLOR' \{\ . shift . \\*[$STYLE_TYPE]_COLOR \\$1 . shift . \} . if '\\$1'CAPS' \{\ . if \\n[#\\*[$STYLE_TYPE]_SMALLCAPS] \{\ . tm1 \ "[mom]: '\\*[$STYLE_TYPE]_STYLE' contains CAPS and SMALLCAPS. \ CAPS takes precedence. . rr #\\*[$STYLE_TYPE]_SMALLCAPS . \} . \\*[$STYLE_TYPE]_CAPS . if d $\\*[$HDR_FTR]_LEFT .HEADER_LEFT_CAPS . if d $\\*[$HDR_FTR]_CENTER .HEADER_CENTER_CAPS . if d $\\*[$HDR_FTR]_CENTRE .HEADER_CENTER_CAPS . if d $\\*[$HDR_FTR]_RIGHT .HEADER_RIGHT_CAPS . shift . \} . if '\\$1'NO_CAPS' \{\ . nr #\\*[$STYLE_TYPE]_CAPS 0 . if !'\\*[$BIB-EN-TOC]'' \ . rr #\\*[$BIB-EN-TOC]_CAPS . shift . \} . if '\\$1'SMALLCAPS' \{\ . if \\n[#\\*[$STYLE_TYPE]_CAPS] \{\ . tm1 \ "[mom]: '\\*[$STYLE_TYPE]_STYLE' contains CAPS and SMALLCAPS. \ SMALLCAPS takes precedence. . rr #\\*[$STYLE_TYPE]_CAPS . \} . \\*[$STYLE_TYPE]_SMALLCAPS . shift . \} . if '\\$1'NO_SMALLCAPS' \{\ . rr #\\*[$STYLE_TYPE]_SMALLCAPS . if !'\\*[$BIB-EN-TOC]'' \ . rr #\\*[$BIB-EN-TOC]_SMALLCAPS . shift . \} . if '\\$1'LEAD' \{\ . shift . \\*[$STYLE_TYPE]_LEAD \\$1 . shift . \} . if '\\$1'AUTOLEAD' \{\ . shift . \\*[$STYLE_TYPE]_AUTOLEAD \\$1 . shift . \} . if '\\$1'SPACE' \{\ . shift . \\*[$STYLE_TYPE]_SPACE \\$1 . shift . \} . if '\\$1'QUAD' \{\ . shift . ie '\\*[$STYLE_TYPE]'QUOTE' \{\ . ds $QUAD_TYPE \\$1 . substring $QUAD_TYPE 0 0 . if '\\*[$QUAD_TYPE]'L' .QUOTE_LEFT . if '\\*[$QUAD_TYPE]'C' .QUOTE_CENTER . if '\\*[$QUAD_TYPE]'R' .QUOTE_RIGHT . \} . el .\\*[$STYLE_TYPE]_QUAD \\$1 . shift . \} . if '\\$1'INDENT' \{\ . shift . \\*[$STYLE_TYPE]_INDENT \\$1 . shift . \} .\" UNDERLINE and UNDERSCORE are identical but we can't use : or & .\" in string comparisons. . if '\\$1'UNDERLINE' \{\ . shift . if '\\$1'DOUBLE' \{\ . as ul-args \\$1 \" . shift . \} . nr #COUNT 0 1 . while \\n+[#COUNT]<=3 \{\ . if \B'\\$1' \{\ . as ul-args \\$1 \" . shift . \} . \} . \\*[$STYLE_TYPE]_UNDERSCORE \\*[ul-args] . \} . if '\\$1'UNDERSCORE' \{\ . shift . if '\\$1'DOUBLE' \{\ . as ul-args \\$1 \" . shift . \} . nr #COUNT 0 1 . while \\n+[#COUNT]<=3 \{\ . if \B'\\$1' \{\ . as ul-args \\$1 \" . shift . \} . \} . \\*[$STYLE_TYPE]_UNDERSCORE \\*[ul-args] . \} . if '\\$1'NO_UNDERSCORE' \{\ . rr #\\*[$STYLE_TYPE]_UNDERLINE . if !'\\*[$BIB-EN-TOC]'' \ . rr #\\*[$BIB-EN-TOC]_UNDERLINE . shift . \} . if '\\$1'NO_UNDERLINE' \{\ . rr #\\*[$STYLE_TYPE]_UNDERLINE . if !'\\*[$BIB-EN-TOC]'' \ . rr #\\*[$BIB-EN-TOC]_UNDERLINE . shift . \} . if '\\$1'V_ADJUST' \{\ . shift . COPYRIGHT_V_ADJUST \\$1 . shift . \} . \} . rm $STYLE_TYPE . rm $HDR_FTR . rm $POS . rm $HEADER_LEFT . rm $HEADER_CENTER . rm $HEADER_RIGHT . rm $BIB-EN-TOC . rm ul-args . SILENT off .END . .ds STYLE_TYPE_1 ATTRIBUTE .ds STYLE_TYPE_2 AUTHOR .ds STYLE_TYPE_3 BIBLIOGRAPHY_HEADER .ds STYLE_TYPE_4 BIBLIOGRAPHY_STRING .ds STYLE_TYPE_5 BLOCKQUOTE .ds STYLE_TYPE_6 CHAPTER .ds STYLE_TYPE_7 CHAPTER_TITLE .ds STYLE_TYPE_8 CODE .ds STYLE_TYPE_9 COPYRIGHT .ds STYLE_TYPE_10 COVER .ds STYLE_TYPE_11 COVERTITLE .ds STYLE_TYPE_12 DOC_COVERTITLE .ds STYLE_TYPE_13 DOCHEADER .ds STYLE_TYPE_14 DOCTITLE .ds STYLE_TYPE_15 DOCTYPE .ds STYLE_TYPE_16 ENDNOTE_TITLE .ds STYLE_TYPE_17 ENDNOTES_HEADER .ds STYLE_TYPE_18 ENDNOTE_STRING .ds STYLE_TYPE_19 EPIGRAPH .ds STYLE_TYPE_20 FINIS .ds STYLE_TYPE_21 FOOTER_LEFT .ds STYLE_TYPE_22 FOOTER_CENTER .ds STYLE_TYPE_23 FOOTER_CENTRE .ds STYLE_TYPE_24 FOOTER_RIGHT .ds STYLE_TYPE_25 FOOTNOTE .ds STYLE_TYPE_26 HEADER_LEFT .ds STYLE_TYPE_27 HEADER_CENTER .ds STYLE_TYPE_28 HEADER_CENTRE .ds STYLE_TYPE_29 HEADER_RIGHT .ds STYLE_TYPE_30 LEAD .ds STYLE_TYPE_31 LINENUMBER .ds STYLE_TYPE_32 MISC .ds STYLE_TYPE_33 QUOTE .ds STYLE_TYPE_34 PAGENUMBER .ds STYLE_TYPE_35 SUBTITLE .ds STYLE_TYPE_36 TITLE .ds STYLE_TYPE_37 TOC_HEADER . .nr #LOOP 0 1 .while \n+[#LOOP]<=37 \{\ . ALIAS \*[STYLE_TYPE_\n[#LOOP]]_STYLE _STYLE . ALIAS COVER_\*[STYLE_TYPE_\n[#LOOP]]_STYLE _STYLE . ALIAS DOC_COVER_\*[STYLE_TYPE_\n[#LOOP]]_STYLE _STYLE .\} \# \# UNDERLINE CONTROL \# ----------------- \# *Arguments: \# [ DOUBLE ] [ [] ] | | \# *Function: \# Toggles underlining of the element indicated by the calling alias \# on or off. Uses #_UNDERLINE_WEIGHT to set the weight, \# and defines string $_UNDERLINE_GAP. \# .MAC _UNDERLINE END . ds $GET_TITLE_TYPE \\$0 . substring $GET_TITLE_TYPE -2 . ie '\\*[$GET_TITLE_TYPE]'NE' \{\ .\" Called as _UNDERLINE . ds $GET_TITLE_TYPE \\$0 . substring $GET_TITLE_TYPE 0 -10 . ds $TITLE_TYPE \\*[$GET_TITLE_TYPE] . \} . el \{\ .\" Called as _UNDERSCORE . ds $GET_TITLE_TYPE \\$0 . substring $GET_TITLE_TYPE 0 -11 . ds $TITLE_TYPE \\*[$GET_TITLE_TYPE] . \} . ds $GET_TITLE_TYPE \\$0 . substring $GET_TITLE_TYPE 0 2 . if '\\*[$GET_TITLE_TYPE]'BIB' .ds $TITLE_TYPE BIB_STRING_ . if '\\*[$GET_TITLE_TYPE]'SUB' .ds $TITLE_TYPE SUBTITLE_ . ds $GET_TITLE_TYPE \\$0 . substring $GET_TITLE_TYPE 0 7 . if '\\*[$GET_TITLE_TYPE]'ENDNOTES' .ds $TITLE_TYPE EN_STRING_ . ds $GET_TITLE_TYPE \\$0 . substring $GET_TITLE_TYPE 0 10 . if '\\*[$GET_TITLE_TYPE]'ENDNOTE_STR' .ds $TITLE_TYPE EN_STRING_ . if '\\*[$GET_TITLE_TYPE]'ENDNOTE_TIT' .ds $TITLE_TYPE EN_TITLE_ . ie '\\$1'' .nr #\\*[$TITLE_TYPE]UNDERLINE 1 . el \{\ . ie \\n[#NUM_ARGS]=1 \{\ . ie \B'\\$1' \{\ . if !\\n[#PRINT_STYLE]=1 \{\ . \\*[$TITLE_TYPE]UNDERLINE_WEIGHT \\$1 . nr #\\*[$TITLE_TYPE]UNDERLINE 1 . \} . \} . el \{\ . ie '\\$1'DOUBLE' .nr #\\*[$TITLE_TYPE]UNDERLINE 2 . el .nr #\\*[$TITLE_TYPE]UNDERLINE 0 . \} . \} . el \{\ . if !\\n[#PRINT_STYLE]=1 \{\ . nr #\\*[$TITLE_TYPE]UNDERLINE 1 . if '\\$1'DOUBLE' \{\ . nr #\\*[$TITLE_TYPE]UNDERLINE 2 . shift . \} . \\*[$TITLE_TYPE]UNDERLINE_WEIGHT \\$1 . if !'\\$2'' \ . ds $\\*[$TITLE_TYPE]UNDERLINE_GAP \\$2 . if !'\\$3'' \ . ds $\\*[$TITLE_TYPE]RULE_GAP \\$3 . \} . \} . \} . rm $TITLE_TYPE .END . .ALIAS ENDNOTE_STRING_UNDERLINE _UNDERLINE .ALIAS ENDNOTE_STRING_UNDERSCORE _UNDERLINE \# \# DEFAULTS \# -------- \# *Arguments: \# \# *Function: \# Sets up defaults if no values are entered prior to START. \# *Notes: \# The defaults for $CHAPTER_STRING, $DRAFT_STRING, and \# $REVISION_STRING are in the COPYSTYLE macro. \# .MAC DEFAULTS END . if !\\n[#DOC_TYPE]=5 \{\ . ie !d $PAPER \{\ . PAGEWIDTH \\n[#PAGE_WIDTH]u . PAGELENGTH \\n[.p]u . \} . el .PAPER \\*[$PAPER] . \} . if !\\n[#DOC_TYPE] .DOCTYPE DEFAULT . if !r #CH_NUM .nr #CH_NUM 1 . ie \\n[#PAGENUM_STYLE_SET] .PAGENUM_STYLE \\*[$PAGENUM_STYLE] . el \ . if !\\n[#COPY_STYLE]=1 .PAGENUM_STYLE DIGIT . if !\\n[#COPY_STYLE] .COPYSTYLE FINAL . if \\n[#DRAFT_WITH_PAGENUM] .COPYSTYLE \\*[$COPY_STYLE] . if \\n[#DOC_TYPE]=4 \{\ . if !\\n[#USER_SET_L_LENGTH] \{\ . R_MARGIN \\n[#R_MARGIN]u . rr #USER_SET_L_LENGTH . \} . if \\n[#PRINT_STYLE]=1 .PRINTSTYLE TYPEWRITE SINGLESPACE . \} . if \\n[#COPY_STYLE]=1 \{\ . COPYSTYLE DRAFT . PAGENUMBER 1 . \} . if !r #DOC_HEADER .DOCHEADER . if !r #HEADERS_ON .HEADERS . if !r #PAGINATE .PAGINATE . if !r #HEADER_MARGIN .HEADER_MARGIN 4P+6p . if !r #HEADER_GAP .HEADER_GAP 3P . if \\n[#FOOTERS_ON] \{\ . HEADERS OFF . ie \\n[#PAGINATE] \ . if \\n[#PAGE_NUM_POS_SET]=0 .PAGENUM_POS TOP CENTER . el \ . if !\\n[#T_MARGIN] .T_MARGIN 6P . \} . if !\\n[#HEADERS_ON] \{\ . if !\\n[#FOOTERS_ON] \{\ . ie \\n[#PAGE_NUM_V_POS]=1 \{\ . HEADER_MARGIN \\n[#HEADER_MARGIN] . HEADER_GAP \\n[#HEADER_GAP] . \} . el .if !r #T_MARGIN .T_MARGIN 6P . \} . \} . if !r #T_MARGIN \ . T_MARGIN \\n[#HEADER_MARGIN]+\\n[#HEADER_GAP] . if !r #DOCHEADER_ADVANCE \ . nr #DOCHEADER_ADVANCE \\n[#T_MARGIN] . if !r #FOOTER_MARGIN .FOOTER_MARGIN 3P . if !r #FOOTER_GAP .FOOTER_GAP 3P . if !r #B_MARGIN \ . B_MARGIN \\n[#FOOTER_MARGIN]u+\\n[#FOOTER_GAP]u . if !\\n[#HEADER_RULE_GAP] .HEADER_RULE_GAP 4p . if !\\n[#FOOTER_RULE_GAP] .FOOTER_RULE_GAP 4p . if !r #HDRFTR_RULE .HDRFTR_RULE . if !r #PAGE_NUM_SET .PAGENUMBER 1 .\" Read in number registers and strings for type parameters . nr #DOC_L_MARGIN \\n[#L_MARGIN] . nr #DOC_L_LENGTH \\n[#L_LENGTH] . nr #DOC_R_MARGIN \\n[#PAGE_WIDTH]-(\\n[#DOC_L_MARGIN]+\\n[#L_LENGTH]) . ie !'\\*[$SAVED_DOC_FAM]'' \{\ . ds $DOC_FAM \\*[$SAVED_DOC_FAM] . rm $SAVED_DOC_FAM . \} . el .ds $DOC_FAM \\*[$FAMILY] . ie !r #DOC_PT_SIZE .nr #DOC_PT_SIZE \\n[#PT_SIZE] . el \ . if !\\n[#DOC_PT_SIZE]=\\n[#PT_SIZE] \ . nr #DOC_PT_SIZE \\n[#PT_SIZE] . if \\n[#TOC] .nr #DOC_PT_SIZE \\n[#TOC_PS] . if \\n[#ENDNOTES] .nr #DOC_PT_SIZE \\n[#EN_PS] . if \\n[#BIBLIOGRAPHY] .nr #DOC_PT_SIZE \\n[#BIB_PS] . if \ (\\n[#TOC]=0)&\ (\\n[#LIST_OF_FIGURES]=0)&\ (\\n[#LIST_OF_TABLES]=0)&\ (\\n[#LIST_OF_EQUATIONS]=0) \ . nr #DOC_LEAD \\n[.v] . nr #DOC@LEAD \\n[#DOC_LEAD] . if \\n[#AUTO_LEAD] .nr #DOC_AUTOLEAD \\n[#AUTOLEAD_VALUE] .\" #SAVED_DOC_LEAD is set in COLLATE . if \\n[#SAVED_DOC_LEAD] \{\ . if \ (\\n[#TOC]=0)&\ (\\n[#LIST_OF_FIGURES]=0)&\ (\\n[#LIST_OF_TABLES]=0)&\ (\\n[#LIST_OF_EQUATIONS]=0) \{\ . ie !\\n[#DOC_LEAD]=\\n[#SAVED_DOC_LEAD] .nr #RERUN_TRAPS 1 . el .nr #SKIP_TRAPS 1 . \} . \} . ie \\n[#ADJ_DOC_LEAD]=1 . . el \ . if !\\n[#DOC_LEAD_ADJUST_OFF] .DOC_LEAD_ADJUST . ie d$RESTORE_DOC_QUAD \{\ . ds $DOC_QUAD \\*[$RESTORE_DOC_QUAD] . rm $RESTORE_DOC_QUAD . \} . el .ds $DOC_QUAD \\*[$QUAD_VALUE] . if '\\*[$FONT]'' .FT R . if '\\*[$PP_FT]'' .ds $PP_FT \\*[$FONT] . FT \\*[$PP_FT] .\" Counters . nr #PP 0 . nr #FN_NUMBER 0 1 . nr #EN_NUMBER 0 1 . nr #FN_COUNT_FOR_COLS 0 1 . nr #DONE_ONCE 0 1 .\" Enable shimming if user hasn't turned it off . if \\n[#NO_SHIM]=2 \{\ . rr #NO_SHIM . nr #NO_FLEX 1 . \} .\" General style defaults for both PRINTSTYLEs . nr #PP_STYLE 1 . PARA_INDENT \\n[#PP_INDENT]u . if !d $HDRFTR_FAM .ds $HDRFTR_FAM \\*[$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 \ . if !d$PAGENUM_STRING .PAGENUM_HYPHENS . if !d $FN_FAM .FOOTNOTE_FAMILY \\*[$DOC_FAM] . if !d $FN_FT .FOOTNOTE_FONT R . if !d $FN_QUAD .FOOTNOTE_QUAD \\*[$DOC_QUAD] . if !r #FN_RULE .FOOTNOTE_RULE . if !r #FN_MARKERS .FOOTNOTE_MARKERS . if \\n[#FN_MARKERS]=1 \{\ . if \\n[#FN_REF]=1 \ . if !\\n[#FN_MARKER_STYLE] .FOOTNOTE_MARKER_STYLE NUMBER . if !\\n[#FN_MARKER_STYLE] .FOOTNOTE_MARKER_STYLE STAR . \} . if !r #EN_MARKER_STYLE .ENDNOTE_MARKER_STYLE SUPERSCRIPT . if !d $EN_PN_STYLE .ENDNOTES_PAGENUM_STYLE digit . if !d $EN_FAM .ENDNOTE_FAMILY \\*[$DOC_FAM] . if !d $EN_FT .ENDNOTE_FONT R . if !d $EN_QUAD \{\ . ds quad-check \\*[$DOC_QUAD] . substring quad-check 0 0 . if '\\*[$DOC_QUAD]'C' .nr quad-check 1 . if '\\*[$DOC_QUAD]'R' .nr quad-check 1 . ie \\n[quad-check] .ENDNOTE_QUAD J . el .ENDNOTE_QUAD \\*[$DOC_QUAD] . rr quad-check . \} . if !d $EN_STRING .ENDNOTES_HEADER_STRING "Endnotes" . if !d $EN_STRING_FAM .ENDNOTES_HEADER_FAMILY \\*[$EN_FAM] . if !d $EN_STRING_QUAD .ENDNOTES_HEADER_QUAD CENTER . if !d $EN_TITLE \{\ . ie \\n[#DOC_TYPE]=2 \{\ . ie !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie '\\*[$CHAPTER]'' .ENDNOTE_TITLE "\\*[$CHAPTER_TITLE]" . el .ENDNOTE_TITLE \ "\\*[$CHAPTER_STRING] \\*[$CHAPTER]: \\*[$CHAPTER_TITLE]" . \} . el \{\ . ie '\\*[$CHAPTER]'' .ENDNOTE_TITLE "\\*[$CHAPTER_STRING]" . el .ENDNOTE_TITLE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . \} . \} . el .ENDNOTE_TITLE "\\*[$TITLE]" . \} . if !d $EN_TITLE_FAM .ENDNOTE_TITLE_FAMILY \\*[$EN_FAM] . if !d $EN_TITLE_QUAD .ENDNOTE_TITLE_QUAD LEFT . if !d $EN_NUMBER_FAM .ENDNOTE_NUMBER_FAMILY \\*[$EN_FAM] . if !d $EN_LN_FAM .ENDNOTE_LINENUMBER_FAMILY \\*[$EN_FAM] . if !r #EN_NUMBERS_ALIGN_LEFT \{\ . if !r #EN_NUMBERS_ALIGN_RIGHT \{\ . ie !\\n[#EN_MARKER_STYLE]=2 .ENDNOTE_NUMBERS_ALIGN RIGHT 2 . el .ENDNOTE_NUMBERS_ALIGN RIGHT 4 . \} . \} . if !r #EN_LN_GAP .ENDNOTE_LINENUMBER_GAP 1m . if !r #EN_ALLOWS_HEADERS .ENDNOTES_ALLOWS_HEADERS . if !d $BIB_PN_STYLE .BIBLIOGRAPHY_PAGENUM_STYLE digit . if !d $BIB_FAM .BIBLIOGRAPHY_FAMILY \\*[$DOC_FAM] . if !d $BIB_FT .BIBLIOGRAPHY_FONT R . if !d $BIB_QUAD \{\ . ds quad-check \\*[$DOC_QUAD] . substring quad-check 0 0 . if '\\*[$DOC_QUAD]'C' .nr quad-check 1 . if '\\*[$DOC_QUAD]'R' .nr quad-check 1 . ie \\n[quad-check] .BIBLIOGRAPHY_QUAD J . el .BIBLIOGRAPHY_QUAD \\*[$DOC_QUAD] . rr quad-check . \} . if !d $BIB_STRING .BIBLIOGRAPHY_STRING "Bibliography" . if !d $BIB_STRING_FAM .BIBLIOGRAPHY_STRING_FAMILY \\*[$BIB_FAM] . if !d $BIB_STRING_QUAD .BIBLIOGRAPHY_STRING_QUAD CENTER . if !d $TOC_HEADER_STRING .TOC_HEADER_STRING "Contents" . if !d $TOC_HEADER_QUAD .TOC_HEADER_QUAD LEFT . if !d $TOC_PN_STYLE .TOC_PAGENUM_STYLE roman . if !r #TOC_PN_PADDING .TOC_PADDING 3 .\" Line numbering . if !r #LN_GUTTER .nr #LN_GUTTER 2 . if !r #Q_LN_GUTTER .nr #Q_LN_GUTTER 2 . if !r #BQ_LN_GUTTER .nr #BQ_LN_GUTTER 2 . if !d $LN_FAM .ds $LN_FAM \\*[$DOC_FAM] . if !d $LN_FT .ds $LN_FT R . if !d $LN_SIZE_CHANGE .ds $LN_SIZE_CHANGE +0 . if !d $LN_COLOR .ds $LN_COLOR black .\" PDF link colour . if !\\n[PDFHREF_COLOR_SET] .PDF_LINK_COLOR 0.0 0.3 0.9 .\" PDF frame . if !d pdf-img:frame-weight .ds pdf-img:frame-weight .5 . if !d pdf-img:frame-color .ds pdf-img:frame-color black .\" Captions, labels, sources .\" All at default doc specs except leading, which is autolead 2 . nr label-type-counter 0 1 . while \\n+[label-type-counter]<=5 \{\ . if \\n[label-type-counter]=1 .ds label-type eqn . if \\n[label-type-counter]=2 .ds label-type pdf-img . if \\n[label-type-counter]=3 .ds label-type pic . if \\n[label-type-counter]=4 .ds label-type tbl . if \\n[label-type-counter]=5 .ds label-type floating . nr spec-type-counter 0 1 . while \\n+[spec-type-counter]<=3 \{\ . if \\n[spec-type-counter]=1 .ds spec-type label . if \\n[spec-type-counter]=2 .ds spec-type caption . if \\n[spec-type-counter]=3 .ds spec-type source . set-defaults . set-inline-specs . \} . rm label-type . rm spec-type . \} .\" String defaults for both PRINTSTYLEs . ie \\n[#DOC_TYPE]=1 \{\ . ie '\\*[$DOCTITLE]'' \{\ . if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE] . \} . el \{\ . if \\n[#COPY_STYLE]=1 .DRAFT_WITH_PAGENUMBER . if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . if \\n[#USER_DEF_HDRFTR_CENTER]=0 .ds $HDRFTR_CENTER \\*[$TITLE] . if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$DOCTITLE] . \} . \} . el \{\ . if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE] . \} . if !d $ATTRIBUTE_STRING .ds $ATTRIBUTE_STRING by . if !d $FINIS_STRING .FINIS_STRING "End" . if !r #FINIS_STRING_CAPS .nr #FINIS_STRING_CAPS 1 .\" Covers . if !r #DOC_COVERS_OFF .nr #DOC_COVERS 1 . if !r #COVERS_OFF .nr #COVERS 1 . if !d $COVER_COPYRIGHT_QUAD .COVER_COPYRIGHT_QUAD R . if !d $COVER_MISC_QUAD .COVER_MISC_QUAD L . if !d $MISC_QUAD .MISC_QUAD L . if !d $DOC_COVER_COPYRIGHT_QUAD .DOC_COVER_COPYRIGHT_QUAD R . if !d $DOC_COVER_MISC_QUAD .DOC_COVER_MISC_QUAD L .\" Defaults for printstyle TYPEWRITE . if \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . SS DEFAULT . if \\n[#UNDERLINE_QUOTES]=1 .UNDERLINE_QUOTES . if \\n[#UNDERLINE_QUOTES]=0 .UNDERLINE_QUOTES OFF . if !\\n[#HDRFTR_PLAIN] \{\ . if !r #HDRFTR_RIGHT_CAPS .nr #HDRFTR_RIGHT_CAPS 1 . if \\n[#HDRFTR_RIGHT_CAPS]=0 \ . if !d $HDRFTR_RIGHT_SIZE_CHANGE .HDRFTR_RIGHT_SIZE +0 . \} .\" +Doctype underlining (if NAMED) . if !r #DOCTYPE_UNDERLINE .nr #DOCTYPE_UNDERLINE 1 .\" +Quotes and blockquotes . if !r #Q_OFFSET_VALUE \ . if '\\*[$Q_OFFSET_VALUE]'' \ . QUOTE_INDENT \\n[#PP_INDENT]u+(\\n[#PP_INDENT]u/2u) . if !d $Q_QUAD .QUOTE_LEFT . if !d $BQUOTE_QUAD .BLOCKQUOTE_QUAD LEFT . if !r #BQ_OFFSET_VALUE \ . if '\\*[$BQ_OFFSET_VALUE]'' \ . BLOCKQUOTE_INDENT \\n[#PP_INDENT]u+(\\n[#PP_INDENT]u/2u) .\" +Epigraphs . if !r #EPI_OFFSET_VALUE \ . if '\\*[$EPI_OFFSET_VALUE]'' .EPIGRAPH_INDENT 2 .\" +Linebreaks . if !d $LINEBREAK_CHAR .LINEBREAK_CHAR * 3 2p .\" +Footnotes . if !d $FN_SIZE_CHANGE .FOOTNOTE_SIZE +0 . if !r #FN_RULE_LENGTH .FOOTNOTE_RULE_LENGTH 2i .\" +Endnotes . if !r #EN_PP_INDENT .ENDNOTE_PARA_INDENT \\n[#PP_INDENT] . if !r #EN_STRING_CAPS .ENDNOTES_HEADER_CAPS . if !r #EN_STRING_UNDERLINE .nr #EN_STRING_UNDERLINE 2 .\" +Footnotes . if !r #FN_RULE_ADJ .FOOTNOTE_RULE_ADJ 6p .\" +Slant stuff . if !r #SLANT_MEANS_SLANT \{\ . ie \\n[#UNDERLINE_SLANT]=1 .UNDERLINE_SLANT . el .UNDERLINE_SLANT OFF . \} .\" +Bibliography . if !r #BIB_STRING_UNDERLINE .nr #BIB_STRING_UNDERLINE 2 . if !r #BIB_STRING_CAPS .BIBLIOGRAPHY_STRING_CAPS . \} .\" Defaults for printstyle TYPESET . if \\n[#PRINT_STYLE]=2 \{\ . if !d $DOCHEADER_LEAD_ADJ .DOCHEADER_LEAD +0 .\" +Cover . if !d $COVER_LEAD_ADJ .COVER_LEAD +0 . if !d $COVER_FAM .COVER_FAMILY \\*[$DOC_FAM] .\" (title) . if !d $COVER_TITLE_FAM \{\ . ie !d $COVER_FAM .COVER_TITLE_FAMILY \\*[$DOC_FAM] . el .COVER_TITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_TITLE_FT .COVER_TITLE_FONT B . if !d $COVER_TITLE_SIZE_CHANGE .COVER_TITLE_SIZE +3.5 .\" (doctitle) . if !d $COVER_DOCTITLE_FAM \{\ . ie !d $DOC_COVER_FAM .COVER_DOCTITLE_FAMILY \\*[$DOC_FAM] . el .COVER_DOCTITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_DOCTITLE_FT .COVER_DOCTITLE_FONT B . if !d $COVER_DOCTITLE_SIZE_CHANGE .COVER_DOCTITLE_SIZE +3.5 .\" (covertitle) . if !d $COVER_COVERTITLE_FAM \{\ . ie !d $COVER_FAM .COVER_COVERTITLE_FAMILY \\*[$DOC_FAM] . el .COVER_COVERTITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_COVERTITLE_FT .COVER_COVERTITLE_FONT B . if !d $COVER_COVERTITLE_SIZE_CHANGE .COVER_COVERTITLE_SIZE +3.5 .\" (doc_covertitle) . if !d $COVER_DOC_COVERTITLE_FAM \{\ . ie !d $COVER_FAM .COVER_DOC_COVERTITLE_FAMILY \\*[$DOC_FAM] . el .COVER_DOC_COVERTITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_DOC_COVERTITLE_FT .COVER_DOC_COVERTITLE_FONT B . if !d $COVER_DOC_COVERTITLE_SIZE_CHANGE .COVER_DOC_COVERTITLE_SIZE +3.5 .\" (chapter) . if !d $COVER_CHAPTER_FAM \{\ . ie !d $COVER_FAM .COVER_CHAPTER_FAMILY \\*[$DOC_FAM] . el .COVER_CHAPTER_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_CHAPTER_FT .COVER_CHAPTER_FONT B . if !d $COVER_CHAPTER_SIZE_CHANGE .COVER_CHAPTER_SIZE +3.5 .\" (chapter title) . if !d $COVER_CHAPTER_TITLE_FAM \{\ . ie !d $COVER_FAM .COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] . el .COVER_CHAPTER_TITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_CHAPTER_TITLE_FT .COVER_CHAPTER_TITLE_FONT BI . if !d $COVER_CHAPTER_TITLE_SIZE_CHANGE .COVER_CHAPTER_TITLE_SIZE +4 .\" (subtitle) . if !d $COVER_SUBTITLE_FAM \{\ . ie !d $COVER_FAM .COVER_SUBTITLE_FAMILY \\*[$DOC_FAM] . el .COVER_SUBTITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_SUBTITLE_FT .COVER_SUBTITLE_FONT R . if !d $COVER_SUBTITLE_SIZE_CHANGE .COVER_SUBTITLE_SIZE +0 .\" (attribution and author[s]) . if !d $COVER_ATTRIBUTE_FAM \{\ . ie !d $COVER_FAM .COVER_ATTRIBUTE_FAMILY \\*[$DOC_FAM] . el .COVER_ATTRIBUTE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_ATTRIBUTE_FT .COVER_ATTRIBUTE_FONT I . if !d $COVER_ATTRIBUTE_SIZE_CHANGE .COVER_ATTRIBUTE_SIZE +0 . if !d $COVER_AUTHOR_FAM \{\ . ie !d $COVER_FAM .COVER_AUTHOR_FAMILY \\*[$DOC_FAM] . el .COVER_AUTHOR_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_AUTHOR_FT .COVER_AUTHOR_FONT I . if !d $COVER_AUTHOR_SIZE_CHANGE .COVER_AUTHOR_SIZE +0 .\" (doctype if "named") . if !d $COVER_DOCTYPE_FAM \{\ . ie !d $COVER_FAM .COVER_DOCTYPE_FAMILY \\*[$DOC_FAM] . el .COVER_DOCTYPE_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_DOCTYPE_FT .COVER_DOCTYPE_FONT BI . if !d $COVER_DOCTYPE_SIZE_CHANGE .COVER_DOCTYPE_SIZE +3 .\" (copyright) . if !d $COVER_COPYRIGHT_FAM \{\ . ie !d $COVER_FAM .COVER_COPYRIGHT_FAMILY \\*[$DOC_FAM] . el .COVER_COPYRIGHT_FAMILY \\*[$COVER_FAM] . \} . if !d $COVER_COPYRIGHT_FT .COVER_COPYRIGHT_FONT R . if !d $COVER_COPYRIGHT_SIZE_CHANGE .COVER_COPYRIGHT_SIZE -2 .\" (misc) . if !d $COVER_MISC_FAM .COVER_MISC_FAMILY \\*[$DOC_FAM] . if !d $COVER_MISC_FT .COVER_MISC_FONT R . if !d $COVER_MISC_SIZE_CHANGE .COVER_MISC_SIZE -2 . if !r #COVER_MISC_LEAD .COVER_MISC_LEAD 14.5 .\" +Doc cover . if !d $DOC_COVER_LEAD_ADJ .DOC_COVER_LEAD +0 . if !d $DOC_COVER_FAM .DOC_COVER_FAMILY \\*[$DOC_FAM] .\" (title) . if !d $DOC_COVER_TITLE_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_TITLE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_TITLE_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_TITLE_FT .DOC_COVER_TITLE_FONT B . if !d $DOC_COVER_TITLE_SIZE_CHANGE .DOC_COVER_TITLE_SIZE +3.5 .\" (doctitle) . if !d $DOC_COVER_DOCTITLE_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_DOCTITLE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_DOCTITLE_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_DOCTITLE_FT .DOC_COVER_DOCTITLE_FONT B . if !d $DOC_COVER_DOCTITLE_SIZE_CHANGE .DOC_COVER_DOCTITLE_SIZE +3.5 .\" (covertitle) . if !d $DOC_COVER_COVERTITLE_FAM \{\ . ie !d $COVER_FAM .DOC_COVER_COVERTITLE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_COVERTITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $DOC_COVER_COVERTITLE_FT .DOC_COVER_COVERTITLE_FONT B . if !d $DOC_COVER_COVERTITLE_SIZE_CHANGE .DOC_COVER_COVERTITLE_SIZE +3.5 .\" (doc_covertitle) . if !d $DOC_COVER_DOC_COVERTITLE_FAM \{\ . ie !d $COVER_FAM .DOC_COVER_DOC_COVERTITLE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_DOC_COVERTITLE_FAMILY \\*[$COVER_FAM] . \} . if !d $DOC_COVER_DOC_COVERTITLE_FT .DOC_COVER_DOC_COVERTITLE_FONT B . if !d $DOC_COVER_DOC_COVERTITLE_SIZE_CHANGE .DOC_COVER_DOC_COVERTITLE_SIZE +3.5 .\" (chapter) . if !d $DOC_COVER_CHAPTER_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_CHAPTER_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_CHAPTER_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_CHAPTER_FT .DOC_COVER_CHAPTER_FONT B . if !d $DOC_COVER_CHAPTER_SIZE_CHANGE .DOC_COVER_CHAPTER_SIZE +3.5 .\" (chapter title) . if !d $DOC_COVER_CHAPTER_TITLE_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_CHAPTER_TITLE_FT .DOC_COVER_CHAPTER_TITLE_FONT BI . if !d $DOC_COVER_CHAPTER_TITLE_SIZE_CHANGE .DOC_COVER_CHAPTER_TITLE_SIZE +4 .\" (subtitle) . if !d $DOC_COVER_SUBTITLE_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_SUBTITLE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_SUBTITLE_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_SUBTITLE_FT .DOC_COVER_SUBTITLE_FONT R . if !d $DOC_COVER_SUBTITLE_SIZE_CHANGE .DOC_COVER_SUBTITLE_SIZE +0 .\" (attribution and author[s]) . if !d $DOC_COVER_ATTRIBUTE_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_ATTRIBUTE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_ATTRIBUTE_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_ATTRIBUTE_FT .DOC_COVER_ATTRIBUTE_FONT I . if !d $DOC_COVER_ATTRIBUTE_SIZE_CHANGE .DOC_COVER_ATTRIBUTE_SIZE +0 . if !d $DOC_COVER_AUTHOR_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_AUTHOR_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_AUTHOR_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_AUTHOR_FT .DOC_COVER_AUTHOR_FONT I . if !d $DOC_COVER_AUTHOR_SIZE_CHANGE .DOC_COVER_AUTHOR_SIZE +0 .\" (doctype if "named") . if !d $DOC_COVER_DOCTYPE_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_DOCTYPE_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_DOCTYPE_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_DOCTYPE_FT .DOC_COVER_DOCTYPE_FONT BI . if !d $DOC_COVER_DOCTYPE_SIZE_CHANGE .DOC_COVER_DOCTYPE_SIZE +3 .\" (copyright) . if !d $DOC_COVER_COPYRIGHT_FAM \{\ . ie !d $DOC_COVER_FAM .DOC_COVER_COPYRIGHT_FAMILY \\*[$DOC_FAM] . el .DOC_COVER_COPYRIGHT_FAMILY \\*[$DOC_COVER_FAM] . \} . if !d $DOC_COVER_COPYRIGHT_FT .DOC_COVER_COPYRIGHT_FONT R . if !d $DOC_COVER_COPYRIGHT_SIZE_CHANGE .DOC_COVER_COPYRIGHT_SIZE -2 .\" (misc) . if !d $DOC_COVER_MISC_FAM .DOC_COVER_MISC_FAMILY \\*[$DOC_FAM] . if !d $DOC_COVER_MISC_FT .DOC_COVER_MISC_FONT R . if !d $DOC_COVER_MISC_SIZE_CHANGE .DOC_COVER_MISC_SIZE -2 . if !r #DOC_COVER_MISC_LEAD .DOC_COVER_MISC_LEAD 14.5 .\" +Docheader . if !d $DOCHEADER_FAM .DOCHEADER_FAMILY \\*[$DOC_FAM] . if !d $TITLE_FAM \{\ . ie !d $DOCHEADER_FAM .TITLE_FAMILY \\*[$DOC_FAM] . el .TITLE_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $TITLE_FT .TITLE_FONT B .\" Title size change . if !d $TITLE_SIZE_CHANGE \{\ . ie \\n[#DOC_TYPE]=2 .TITLE_SIZE +4 . el .TITLE_SIZE +3.5 . \} . if !d $CHAPTER_FAM \{\ . ie !d $DOCHEADER_FAM .CHAPTER_FAMILY \\*[$DOC_FAM] . el .CHAPTER_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $CHAPTER_FT .CHAPTER_FONT B . if !d $CHAPTER_SIZE_CHANGE .CHAPTER_SIZE +4 . if !d $CHAPTER_TITLE_FAM \{\ . ie !d $DOCHEADER_FAM .CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] . el .CHAPTER_TITLE_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $CHAPTER_TITLE_FT .CHAPTER_TITLE_FONT BI . if !d $CHAPTER_TITLE_SIZE_CHANGE .CHAPTER_TITLE_SIZE +4 . if !d $SUBTITLE_FAM \{\ . ie !d $DOCHEADER_FAM .SUBTITLE_FAMILY \\*[$DOC_FAM] . el .SUBTITLE_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $SUBTITLE_FT .SUBTITLE_FONT R . if !d $SUBTITLE_SIZE_CHANGE .SUBTITLE_SIZE +0 . if !d $ATTRIBUTE_FAM \{\ . ie !d $DOCHEADER_FAM .ATTRIBUTE_FAMILY \\*[$DOC_FAM] . el .ATTRIBUTE_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $ATTRIBUTE_FT .ATTRIBUTE_FONT I . if !d $ATTRIBUTE_SIZE_CHANGE .ATTRIBUTE_SIZE +0 . if !d $AUTHOR_FAM \{\ . ie !d $DOCHEADER_FAM .AUTHOR_FAMILY \\*[$DOC_FAM] . el .AUTHOR_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $AUTHOR_FT .AUTHOR_FONT I . if !d $AUTHOR_SIZE_CHANGE .AUTHOR_SIZE +0 . if !d $DOCTYPE_FAM \{\ . ie !d $DOCHEADER_FAM .DOCTYPE_FAMILY \\*[$DOC_FAM] . el .DOCTYPE_FAMILY \\*[$DOCHEADER_FAM] . \} . if !d $DOCTYPE_FT .DOCTYPE_FONT BI . if !d $DOCTYPE_SIZE_CHANGE .DOCTYPE_SIZE +3 .\" +Headers and footers . if !\\n[#HDRFTR_PLAIN] \{\ . 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 . ie !r #HDRFTR_RIGHT_CAPS \{\ . nr #HDRFTR_RIGHT_CAPS 1 . if !d $HDRFTR_RIGHT_SIZE_CHANGE \ . HDRFTR_RIGHT_SIZE -2 . \} . el \{\ . if \\n[#HDRFTR_RIGHT_CAPS]=0 \ . if !d $HDRFTR_RIGHT_SIZE_CHANGE \ . HDRFTR_RIGHT_SIZE -.5 . \} . ie !\\n[#HDRFTR_RIGHT_SMALLCAPS] \{\ . if \\n[#HDRFTR_RIGHT_CAPS] \ . if !d $HDRFTR_RIGHT_SIZE_CHANGE \ . HDRFTR_RIGHT_SIZE -2 . \} . el \{\ . nr #SKIP_CAPS_SMALLCAPS_WARNING 1 . if \\n[#HDRFTR_RIGHT_CAPS] .HDRFTR_RIGHT_CAPS OFF . \} . if !d $HDRFTR_RIGHT_SIZE_CHANGE .HDRFTR_RIGHT_SIZE -.5 . \} .\" +Quotes . if !d $QUOTE_FAM .QUOTE_FAMILY \\*[$DOC_FAM] . if !d $QUOTE_FT .QUOTE_FONT I . if !d $QUOTE_SIZE_CHANGE .QUOTE_SIZE +0 . if !r #Q_OFFSET_VALUE \ . if '\\*[$Q_OFFSET_VALUE]'' .QUOTE_INDENT 3 . if !d $Q_QUAD .QUOTE_LEFT .\" +Blockquotes .\" Note: the leading for quotes and blockquotes is set after .DEFAULTS in START . if !d $BQUOTE_FAM .BLOCKQUOTE_FAMILY \\*[$DOC_FAM] . if !d $BQUOTE_FT .BLOCKQUOTE_FONT R . if !d $BQUOTE_SIZE_CHANGE .BLOCKQUOTE_SIZE -1 . if !d $BQUOTE_QUAD .BLOCKQUOTE_QUAD LEFT . if !r #BQ_OFFSET_VALUE \ . if '\\*[$BQ_OFFSET_VALUE]'' .BLOCKQUOTE_INDENT 3 .\" +Epigraphs . if !d $EPI_FAM .EPIGRAPH_FAMILY \\*[$DOC_FAM] . if !d $EPI_FT .EPIGRAPH_FONT R . if !d $EPI_SIZE_CHANGE .EPIGRAPH_SIZE -1.5 . if !r #EPI_AUTOLEAD .EPIGRAPH_AUTOLEAD 2 . if !d $EPI_QUAD .EPIGRAPH_QUAD \\*[$DOC_QUAD] . if !r #EPI_OFFSET_VALUE \ . if '\\*[$EPI_OFFSET_VALUE]'' .EPIGRAPH_INDENT 3 .\" +Linebreaks . if !d $LINEBREAK_CHAR .LINEBREAK_CHAR * 3 3p . if !d $LINEBREAK_COLOR .LINEBREAK_COLOR black .\" +Footnotes . if !r #FN_RULE_LENGTH .FOOTNOTE_RULE_LENGTH 4P . if !r #FN_RULE_ADJ .FOOTNOTE_RULE_ADJ 3p . if !d $FN_SIZE_CHANGE .FOOTNOTE_SIZE -2 . if !r #FN_AUTOLEAD .FOOTNOTE_AUTOLEAD 2 .\" +Endnotes . if !r #EN_PS .ENDNOTE_PT_SIZE (\\n[#DOC_PT_SIZE]u) . if !d $EN_STRING_FT .ENDNOTES_HEADER_FONT B . if !d $EN_STRING_SIZE_CHANGE .ENDNOTES_HEADER_SIZE +3.5 . if !d $EN_TITLE_FT .ENDNOTE_TITLE_FONT B . if !d $EN_TITLE_SIZE_CHANGE .ENDNOTE_TITLE_SIZE +0 . if !d $EN_NUMBER_FT .ENDNOTE_NUMBER_FONT B . if !d $EN_LN_FT .ENDNOTE_LINENUMBER_FONT R . if !d $EN_NUMBER_SIZE_CHANGE .ENDNOTE_NUMBER_SIZE +0 . if !d $EN_LN_SIZE_CHANGE .ENDNOTE_LINENUMBER_SIZE +0 . if !r #EN_PP_INDENT .ENDNOTE_PARA_INDENT 1.5m . if !d $EN_SPACE .ENDNOTE_SPACING 0 .\" +Bibliography . if !r #BIB_LIST .BIBLIOGRAPHY_TYPE PLAIN . if !r #BIB_PS .BIBLIOGRAPHY_PT_SIZE (\\n[#DOC_PT_SIZE]u) . if !d $BIB_STRING_FT .BIBLIOGRAPHY_STRING_FONT B . if !d $BIB_STRING_SIZE_CHANGE .BIBLIOGRAPHY_STRING_SIZE +3.5 .\" +Table of contents . if !d $TOC_FAM .TOC_FAMILY \\*[$DOC_FAM] . if !r #TOC_PS .TOC_PT_SIZE (\\n[#DOC_PT_SIZE]u) . if '\\*[$TOC_LEAD]'' .TOC_LEAD \\n[#DOC@LEAD]u ADJUST . if !d $TOC_HEADER_FAM .TOC_HEADER_FAMILY \\*[$TOC_FAM] . if !d $TOC_HEADER_SIZE_CHANGE .TOC_HEADER_SIZE +3.5 . if !d $TOC_HEADER_FT .TOC_HEADER_FONT B . if !d $TOC_PN_FAM .TOC_PN_FAMILY \\*[$TOC_FAM] . if !d $TOC_PN_FT .TOC_PN_FONT R . if !d $TOC_PN_SIZE_CHANGE .TOC_PN_SIZE +0 . if !d $TOC_TITLE_FAM .TOC_TITLE_FAMILY \\*[$TOC_FAM] . \} .\" +Refer support . if !r #EN_REF .nr #FN_REF 1 . if !d $REF_FN_INDENT \{\ . if \\n[#PRINT_STYLE]=1 .INDENT_REFS FOOTNOTE .5i . if \\n[#PRINT_STYLE]=2 .INDENT_REFS FOOTNOTE 2m . \} . if !d $REF_EN_INDENT \{\ . if \\n[#PRINT_STYLE]=1 .INDENT_REFS ENDNOTE .5i . if \\n[#PRINT_STYLE]=2 .INDENT_REFS ENDNOTE 2m . \} . if !d $REF_BIB_INDENT \{\ . if \\n[#PRINT_STYLE]=1 .INDENT_REFS BIBLIO .5i . if \\n[#PRINT_STYLE]=2 .INDENT_REFS BIBLIO 2m . \} .\" Define strings for idem entries . if \\n[#PRINT_STYLE]=1 .char \[idem] \[hy]\[hy]\[hy] . if \\n[#PRINT_STYLE]=2 .char \[idem] \v'-.3m'\l'3m'\v'.3m' .\" Adjust doc leading for PRINTSTYLE TYPESET . if \\n[#PRINT_STYLE]=2 \ . if \\n[#ADJ_DOC_LEAD]=1 .DOC_LEAD_ADJUST .\" This diversion is to get a value for #FN_AUTOLEAD . di NULL . if \\n[#AUTO_LEAD] \{\ . nr #RESTORE_AUTO_LEAD 1 . nr #SAVED_AUTOLEAD_VALUE \\n[#AUTOLEAD_VALUE] . \} . ev NULL . if \\n[#PRINT_STYLE]=1 \{\ . ps \\*[$TYPEWRITER_PS] . ie \\n[#SINGLE_SPACE]=1 .vs \\n[#ORIGINAL_DOC_LEAD]u . el .vs \\n[#ORIGINAL_DOC_LEAD]u/2u . \} . if \\n[#PRINT_STYLE]=2 \{\ . ps \\n[#DOC_PT_SIZE]u\\*[$FN_SIZE_CHANGE] . vs \\n[.ps]u+\\n[#FN_AUTOLEAD]u . \} . nr #FN_LEAD \\n[#LEAD] . ev . di . if \\n[#RESTORE_AUTO_LEAD] \{\ . nr #AUTO_LEAD 1 . nr #AUTOLEAD_VALUE \\n[#SAVED_AUTOLEAD_VALUE] . \} . if !\\n[#SKIP_TRAPS] .TRAPS . rr #SKIP_TRAPS . if \\n[#REMOVE_ADJ] .DOC_LEAD \\n[#DOC_LEAD]u-\\n[#DOC_LEAD_ADJ]u . if (\\n[#FOOTER_MARGIN]+\\n[.v]>=\\n[#B_MARGIN]) \{\ . tm1 "[mom]: Your chosen bottom margin for running text is too close to the footer margin. . tm1 " No footers or bottom-of-page page numbers will be printed. . tm1 " Please reset B_MARGIN or FOOTER_MARGIN to allow enough space. . tm1 " If no footers or bottom-of-page page numbers are required, . tm1 " invoke .FOOTER_MARGIN 0 before .START . nr #SKIP_FOOTER 1 . \} .\" Endnote, bibliography and toc leading . nr #OK_PROCESS_LEAD 1 . nr #RESTORE_DOC_LEAD \\n[.v] . nr #RESTORE_B_MARGIN \\n[#B_MARGIN] . if \\n[#PRINT_STYLE]=1 \{\ . ie \\n[#SINGLE_SPACE] \{\ . ENDNOTE_LEAD 12 ADJUST . BIBLIOGRAPHY_LEAD 12 ADJUST . \} . el \{\ . ie \\n[#EN_SINGLESPACE] .ENDNOTE_LEAD 12 ADJUST . el .ENDNOTE_LEAD 24 ADJUST . ie \\n[#BIB_SINGLESPACE] .BIBLIOGRAPHY_LEAD 12 ADJUST . el .BIBLIOGRAPHY_LEAD 24 ADJUST . \} . \} . if \\n[#PRINT_STYLE]=2 \{\ . ie !d $EN_LEAD .ENDNOTE_LEAD \\n[#UNADJUSTED_DOC_LEAD]u ADJUST . el .ENDNOTE_LEAD \\*[$EN_LEAD] \\*[$ADJUST_EN_LEAD] . ie !d $BIB_LEAD .BIBLIOGRAPHY_LEAD \\n[#UNADJUSTED_DOC_LEAD]u ADJUST . el .BIBLIOGRAPHY_LEAD \\*[$BIB_LEAD] \\*[$ADJUST_BIB_LEAD] . ie !d $TOC_LEAD .TOC_LEAD \\n[#UNADJUSTED_DOC_LEAD]u \\*[$ADJUST_TOC_LEAD] . el .TOC_LEAD \\*[$TOC_LEAD] \\*[$ADJUST_TOC_LEAD] . \} . ie !d $BIB_SPACE .BIBLIOGRAPHY_SPACING 0 . el \{\ . if \\n[#DEFER_BIB_SPACING]=1 \{\ . BIBLIOGRAPHY_SPACING \\*[$BIB_SPACE] . rr #DEFER_BIB_SPACING . \} . \} . nr #DOC_LEAD \\n[#RESTORE_DOC_LEAD]u . nr #B_MARGIN \\n[#RESTORE_B_MARGIN] . vs \\n[#DOC_LEAD]u . if !\\n[#PRINT_STYLE]=1 \{\ . if \\n[#RERUN_TRAPS] \{\ . TRAPS . rr #RERUN_TRAPS . \} . \} .\" Set default heading and toc-entry family if not done already . nr #HD_LEVEL 0 1 \" loop step . nr #LOOP 9 \" loop count . while \\n+[#HD_LEVEL]<=\\n[#LOOP] \{\ . if '\\*[$HEAD_\\n[#HD_LEVEL]_FAM]'' \ . ds $HEAD_\\n[#HD_LEVEL]_FAM \\*[$DOC_FAM] . if '\\*[$HEAD_\\n[#HD_LEVEL]_BASELINE_ADJ]'' \ . ds $HEAD_\\n[#HD_LEVEL]_BASELINE_ADJ \\n[.v]/10 . if '\\*[$TOC_HEAD_\\n[#HD_LEVEL]_FAM]'' \ . ds $TOC_HEAD_\\n[#HD_LEVEL]_FAM \\*[$TOC_FAM] . \} . if '\\*[$TOC_TITLE_FAM]'' .TOC_TITLE_FAMILY \\*[$DOC_FAM] .\" TOC heading (single, non-pagenumbered line insertion) . if !d $TOC_HEADING_FAM .ds $TOC_HEADING_FAM \\*[$DOC_FAM] . if !d $TOC_HEADING_FT .ds $TOC_HEADING_FT R . if !d $TOC_HEADING_SIZE .ds $TOC_HEADING_SIZE +0 . if !d $TOC_HEADING_COLOR .ds $TOC_HEADING_COLOR black . if !d $TOC_HEADING_QUAD .ds $TOC_HEADING_QUAD L . if !d $SPACE_ABOVE .ds $SPACE_ABOVE .75v . if !d $SPACE_BENEATH .ds $SPACE_BENEATH .25v .\" Re-run MNinit to capture strings and registers set in DEFAULTS. . if !'\\*[$MN-arg1]'' \{\ . MNinit \ \\*[$MN-arg1] \\*[$MN-arg2] \ \\*[$MN-arg3] \\*[$MN-arg4] \ \\*[$MN-arg5] \\*[$MN-arg6] \ \\*[$MN-arg7] \\*[$MN-arg8] \ \\*[$MN-arg9] . \} . if \\n[#PRINT_STYLE]=1 .nr #IGNORE 1 . if \\n[#AUTO_LEAD] \{\ . rr #AUTO_LEAD . rr #AUTOLEAD_VALUE . \} .END \# \# ================================================================= \# \# Macros and aliases needed for doccover, cover, and docheader in \# START. \# .MAC DOC_HEADER_QUAD END . if '\\$0'DOC_HEADER_QUAD' .ds $CALLING_MACRO DOCHEADER . if '\\$0'COVER_H_POS' .ds $CALLING_MACRO COVER . if '\\$0'DOC_COVER_H_POS' .ds $CALLING_MACRO DOC_COVER . ie !'\\*[$\\*[$CALLING_MACRO]_QUAD]'' \{\ . substring $\\*[$CALLING_MACRO]_QUAD 0 0 . if '\\*[$\\*[$CALLING_MACRO]_QUAD]'L' .LEFT . if '\\*[$\\*[$CALLING_MACRO]_QUAD]'C' .CENTER . if '\\*[$\\*[$CALLING_MACRO]_QUAD]'C' .RIGHT . \} . el .CENTER .END . .ALIAS COVER_H_POS DOC_HEADER_QUAD .ALIAS DOC_COVER_H_POS DOC_HEADER_QUAD \# .MAC DO_TITLE_OR_AUTHOR END . ie '\\$0'DO_AUTHORS' .ds $TTL_AUTH AUTHOR . el .ds $TTL_AUTH TITLE . if '\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_1]'' \{\ . if !'\\*[$\\*[$PRFX]DOC\\*[$TTL_AUTH]_1]'' \ . ds $\\*[$PRFX]\\*[$TTL_AUTH]_1 "\&" . if !'\\*[$AUTHOR_1]'' .rm $PRFX . \} . if !'\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_1]'' \{\ . if '\\$0'DO_SUBTITLE' \{\ . if '\\*[$PRFX]'\\*[DOC_]COVER_SUB' \{\ . ds $PRFX SUB . nr #\\*[DOC_]COVER_SUB 1 . \} . \} . if !\\n[#PRINT_STYLE]=1 \{\ . if (\\n[#COVER]=1):(\\n[#DOC_COVER]=1) \ . if !'\\*[$PRFX]'SUB' \ . rn $PRFX $PRFX_SAVED . fam \\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_FAM] . ft \\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_FT] . ps \ \\n[#DOC_PT_SIZE]u\\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_SIZE_CHANGE] . if '\\*[$COVER_TYPE]'' .vs \\n[#DOCHEADER_LEAD]u . if !'\\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_LEAD]'' \{\ . vs \\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_LEAD] . if \\n[#DOCHEADER] .sp |\\n[#T_MARGIN]u-1v . \} . if \\n[#CHAPTER+TITLE]=1 .ALD \\n[.v]u/4u \" A little space before the chapter title . if \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_COLOR]=1 \ . COLOR \\*[$\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_COLOR] . if \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_CAPS]=1 .CAPS . if \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_SMALLCAPS]=1 .SMALLCAPS . if (\\n[#COVER]=1):(\\n[#DOC_COVER]=1) \ . rn $PRFX_SAVED $PRFX . if \\n[#\\*[DOC_]COVER_TITLE]=2 \ . ds $PRFX DOC . \} . if \\n[#\\*[DOC_]COVER_SUB] \{\ . rr #\\*[DOC_]COVER_SUB . ds $PRFX \\*[DOC_]COVER_SUB . ds $SAVED_COVER_TYPE \\*[$COVER_TYPE] . rm $COVER_TYPE . \} . nr #ARG_NUM 0 1 . while \\n[#\\*[$PRFX]\\*[$TTL_AUTH]_NUM]>=\\n+[#ARG_NUM] \{\ . ie \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_UNDERLINE] \{\ . ds $TITLE_TYPE \\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH] . ie \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_UNDERLINE]=2 \{\ . ie !\\n[#PRINT_STYLE]=1 \ . UNDERSCORE2 \\*[$\\*[$PRFX]\\*[$TTL_AUTH]_UNDERLINE_GAP] \ \\*[$\\*[$PRFX]\\*[$TTL_AUTH]_RULE_GAP] \ "\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]] . el .UNDERSCORE "\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]] . \} . el \{\ . ie !\\n[#PRINT_STYLE]=1 \ . UNDERSCORE "\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]] . el .PRINT "\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]] . \} . \} . el \{\ . PRINT "\\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]] . \} . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$\\*[$PRFX]\\*[$TTL_AUTH]_\\n[#ARG_NUM]] . \} . rm $TITLE_TYPE . if \\n[#PRINT_STYLE]=2 .vs . if \\n[#\\*[$COVER_TYPE]\\*[$PRFX]\\*[$TTL_AUTH]_COLOR]=1 \ . gcolor . SMALLCAPS off . CAPS off . \} . if !'\\*[$SAVED_COVER_TYPE]'' \{\ . ds $COVER_TYPE \\*[$SAVED_COVER_TYPE] . rm $SAVED_COVER_TYPE . \} .END . .ALIAS DO_TITLE DO_TITLE_OR_AUTHOR .ALIAS DO_SUBTITLE DO_TITLE_OR_AUTHOR .ALIAS DO_AUTHORS DO_TITLE_OR_AUTHOR \# .MAC DO_CHAPTER END . fam \\*[$\\*[DOC_]COVER_CHAPTER_FAM] . ft \\*[$\\*[DOC_]COVER_CHAPTER_FT] . ps \\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_CHAPTER_SIZE_CHANGE] . if \\n[#\\*[DOC_]COVER_CHAPTER_COLOR]=1 \ . COLOR \\*[$\\*[DOC_]COVER_CHAPTER_COLOR] . if \\n[#\\*[DOC_]COVER_CHAPTER_CAPS]=1 .CAPS . if \\n[#\\*[DOC_]COVER_CHAPTER_SMALLCAPS]=1 .SMALLCAPS . ie \\n[#\\*[DOC_]COVER_CHAPTER_UNDERLINE] \{\ . ds $TITLE_TYPE \\*[$COVER_TYPE]CHAPTER . ie \\n[#\\*[DOC_]COVER_CHAPTER_UNDERLINE]=2 \ . UNDERSCORE2 \\*[$\\*[DOC_]COVER_CHAPTER_UNDERLINE_GAP] \ \\*[$\\*[DOC_]COVER_CHAPTER_RULE_GAP] "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . el .UNDERSCORE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . \} . el .PRINT "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . gcolor . SMALLCAPS off . CAPS off .END . .ALIAS DO_TITLE DO_TITLE_OR_AUTHOR .ALIAS DO_SUBTITLE DO_TITLE_OR_AUTHOR .ALIAS DO_AUTHORS DO_TITLE_OR_AUTHOR \# .MAC DO_CHAPTER END . fam \\*[$\\*[DOC_]COVER_CHAPTER_FAM] . ft \\*[$\\*[DOC_]COVER_CHAPTER_FT] . ps \\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_CHAPTER_SIZE_CHANGE] . if \\n[#\\*[DOC_]COVER_CHAPTER_COLOR]=1 \ . COLOR \\*[$\\*[DOC_]COVER_CHAPTER_COLOR] . if \\n[#\\*[DOC_]COVER_CHAPTER_CAPS]=1 .CAPS . if \\n[#\\*[DOC_]COVER_CHAPTER_SMALLCAPS]=1 .SMALLCAPS . ie \\n[#\\*[DOC_]COVER_CHAPTER_UNDERLINE] \{\ . ds $TITLE_TYPE \\*[$COVER_TYPE]CHAPTER . ie \\n[#\\*[DOC_]COVER_CHAPTER_UNDERLINE]=2 \ . UNDERSCORE2 \\*[$\\*[DOC_]COVER_CHAPTER_UNDERLINE_GAP] \ \\*[$\\*[DOC_]COVER_CHAPTER_RULE_GAP] "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . el .UNDERSCORE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . \} . el .PRINT "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . gcolor . SMALLCAPS off . CAPS off .END \# \# Spacing adjustments for (doc)cover and docheader elements \# .MAC _SPACE END . ds $\\$0R \\$1 .END . .ds SPACER_TYPE_1 SUBTITLE .ds SPACER_TYPE_2 ATTRIBUTE .ds SPACER_TYPE_3 AUTHOR .ds SPACER_TYPE_4 CHAPTER_TITLE .ds SPACER_TYPE_5 DOCTYPE . .nr #LOOP 0 1 .while \n+[#LOOP]<=5 \{\ . ALIAS \*[SPACER_TYPE_\n[#LOOP]]_SPACE _SPACE . ALIAS COVER_\*[SPACER_TYPE_\n[#LOOP]]_SPACE _SPACE . ALIAS DOC_COVER_\*[SPACER_TYPE_\n[#LOOP]]_SPACE _SPACE .\} \# .MAC DEFAULT_DOCHEADER END . nr #DOCHEADER 1 . DOC_HEADER_QUAD . vs \\n[#DOCHEADER_LEAD]u . if \\n[#PRINT_STYLE]=2 \ . if \\n[#DOCHEADER_COLOR]=1 \ . COLOR \\*[$DOCHEADER_COLOR] . DO_TITLE . rr #DOCHEADER . if !'\\*[$SUBTITLE_1]'' \{\ . ds $PRFX SUB . if !'\\*[$SUBTITLE_SPACER]'' .sp \\*[$SUBTITLE_SPACER] . if \\n[#PRINT_STYLE]=2 \ . if \\n[#DOCHEADER_COLOR]=1 \ . COLOR \\*[$DOCHEADER_COLOR] . DO_SUBTITLE . rm $PRFX . \} . if !\\n[#NO_PRINT_AUTHOR] \{\ . if !'\\*[$AUTHOR_1]'' \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . ie \\n[#SINGLE_SPACE]=1 .vs \\n[#DOC_LEAD]u . el .vs \\n[#DOC_LEAD]u/2u . sp . \} . el .vs \\n[#DOC_LEAD]u\\*[$DOCHEADER_LEAD_ADJ] . if d$ATTRIBUTE_STRING \{\ . FAMILY \\*[$ATTRIBUTE_FAM] . FT \\*[$ATTRIBUTE_FT] . ps \ \\n[#DOC_PT_SIZE]u\\*[$ATTRIBUTE_SIZE_CHANGE] . if \\n[#DOCHEADER_COLOR]=1 \ . COLOR \\*[$DOCHEADER_COLOR] . if \\n[#ATTRIBUTE_COLOR]=1 \ . COLOR \\*[$ATTRIBUTE_COLOR] . if \\n[#ATTRIBUTE_CAPS]=1 .CAPS . if !'\\*[$ATTRIBUTE_SPACER]'' \ . sp \\*[$ATTRIBUTE_SPACER] . ie \\n[#ATTRIBUTE_UNDERLINE] \{\ . ds $TITLE_TYPE ATTRIBUTE . ie \\n[#ATTRIBUTE_UNDERLINE]=2 \ . UNDERSCORE2 \\*[$ATTRIBUTE_UNDERLINE_GAP] \ \\*[$ATTRIBUTE_RULE_GAP] "\\*[$ATTRIBUTE_STRING]" . el .UNDERSCORE "\\*[$ATTRIBUTE_STRING]" . \} . el .PRINT "\\*[$ATTRIBUTE_STRING]" . if \\n[#ATTRIBUTE_COLOR]=1 .gcolor . CAPS off . \} . if !'\\*[$AUTHOR_SPACER]'' .sp \\*[$AUTHOR_SPACER] . if \\n[#DOCHEADER_COLOR]=1 \ . COLOR \\*[$DOCHEADER_COLOR] . DO_AUTHORS . \} . \} . FAMILY \\*[$DOC_FAM] . FT R .END \# .MAC DEFAULT_DOCHEADER_TYPEWRITE END . CENTER . TYPEWRITER . if !\\n[#SINGLE_SPACE] \{\ . vs \\n[#DOC_LEAD]u/2u . sp |\\n[#T_MARGIN]u-1v . \} . if !'\\*[$TITLE_1]'' \{\ . ie \\n[#SINGLE_SPACE] \ . vs \\n[#DOC_LEAD]u+(\\n[#DOC_LEAD]u/4u) . el .vs (\\n[#DOC_LEAD]u/2u)+(\\n[#DOC_LEAD]u/4u) . CAPS . DO_TITLE . CAPS OFF . vs . \} . if !'\\*[$SUBTITLE]'' \{\ . ds $PRFX SUB . sp . DO_SUBTITLE . rm $PRFX . \} . if !\\n[#NO_PRINT_AUTHOR] \{\ . if !'\\*[$AUTHOR_1]'' \{\ . sp . if d$ATTRIBUTE_STRING .PRINT "\\*[$ATTRIBUTE_STRING] . sp . DO_AUTHORS . \} . \} .END \# .MAC CHAPTER_DOCHEADER END . DOC_HEADER_QUAD . FAMILY \\*[$CHAPTER_FAM] . FT \\*[$CHAPTER_FT] . ps \\n[#DOC_PT_SIZE]u\\*[$CHAPTER_SIZE_CHANGE] . vs \\n[#DOCHEADER_LEAD]u .\" Chapter title only . ie '\\*[$CHAPTER]'' \{\ . if \\n[#PRINT_STYLE]=2 \ . if \\n[#DOCHEADER_COLOR]=1 \ . COLOR \\*[$DOCHEADER_COLOR] . if !'\\*[$CHAPTER_TITLE_1]'' \{\ . ds $PRFX CHAPTER_ . nr #DOCHEADER 1 . DO_TITLE . rr #DOCHEADER . rm $PRFX . \} . \} .\" Chapter string, possibly with a chapter title . el \{\ . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#DOCHEADER_COLOR]=1 \ . COLOR \\*[$DOCHEADER_COLOR] . if \\n[#CHAPTER_COLOR]=1 \ . COLOR \\*[$CHAPTER_COLOR] . \} . if \\n[#CHAPTER_CAPS]=1 .CAPS . ie \\n[#CHAPTER_UNDERLINE] \{\ . ds $TITLE_TYPE CHAPTER . ie \\n[#CHAPTER_UNDERLINE]=2 \ . UNDERSCORE2 \\*[$CHAPTER_UNDERLINE_GAP] \ \\*[$CHAPTER_RULE_GAP] "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . el .UNDERSCORE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . \} . el .PRINT "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" . rm $TITLE_TYPE . if \\n[#PRINT_STYLE]=2 \ . if \\n[#CHAPTER_COLOR]=1 .gcolor . CAPS off . if !'\\*[$CHAPTER_TITLE_1]'' \{\ . ds $PRFX CHAPTER_ . if \\n[#PRINT_STYLE]=2 \{\ . nr #CHAPTER+TITLE 1 . if \\n[#DOCHEADER_COLOR]=1 \ . COLOR \\*[$DOCHEADER_COLOR] . \} . if !'\\*[$CHAPTER_TITLE_SPACER]'' \ . sp \\*[$CHAPTER_TITLE_SPACER] . DO_TITLE . rm $PRFX . rr #CHAPTER+TITLE . \} . \} . FAMILY \\*[$DOC_FAM] . FT R .END \# .MAC CHAPTER_DOCHEADER_TYPEWRITE END . CENTER . TYPEWRITER . if !\\n[#SINGLE_SPACE] \{\ . vs \\n[#DOC_LEAD]u/2u . sp |\\n[#T_MARGIN]u-1v . \} . ie '\\*[$CHAPTER]'' \{\ . CAPS . ie !'\\*[$CHAPTER_TITLE]'' \{\ . vs \\n[.v]u+(\\n[.v]u/3u) . nr #ARG_NUM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE 3p "\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]" . \} . vs . \} . el \{\ . CAPS . UNDERSCORE 3p "\\*[$CHAPTER_STRING]" . \} . CAPS OFF . RLD 1v . \} . el \{\ . CAPS . UNDERSCORE 3p "\\*[$CHAPTER_STRING] \\*[$CHAPTER] . CAPS OFF . if !'\\*[$CHAPTER_TITLE]'' \{\ . sp . nr #ARG_NUM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . PRINT "\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . \} . \} . sp -1 . \} . vs \\n[#DOC_LEAD]u . if \\n[#SINGLE_SPACE] .sp 2 .END \# .MAC NAMED_DOCHEADER END . DEFAULT_DOCHEADER . if !\\n[#NO_PRINT_DOCTYPE] \{\ . FAMILY \\*[$DOCTYPE_FAM] . FT \\*[$DOCTYPE_FT] . ps \\n[#DOC_PT_SIZE]u\\*[$DOCTYPE_SIZE_CHANGE] . vs \\n[#DOCHEADER_LEAD]u . ALD \\n[#DOCHEADER_LEAD]u . if \\n[#DOCHEADER_COLOR]=1 \ . COLOR \\*[$DOCHEADER_COLOR] . if \\n[#DOCTYPE_COLOR]=1 \ . COLOR \\*[$DOCTYPE_COLOR] . if \\n[#DOCTYPE_CAPS]=1 .CAPS . if !'\\*[$DOCTYPE_SPACER]'' .sp \\*[$DOCTYPE_SPACER] . ie \\n[#DOCTYPE_UNDERLINE] \{\ . ds $TITLE_TYPE DOCTYPE . ie \\n[#DOCTYPE_UNDERLINE]=2 \ . UNDERSCORE2 \\*[$DOCTYPE_UNDERLINE_GAP] \ \\*[$DOCTYPE_RULE_GAP] "\\*[$DOC_TYPE] . el .UNDERSCORE "\\*[$DOC_TYPE] . \} . el .PRINT "\\*[$DOC_TYPE] . gcolor . CAPS off . \} . FAMILY \\*[$DOC_FAM] . FT R .END \# \# COVER PAGE \# ---------- \# *Arguments: \# TITLE | DOCTITLE | CHAPTER | CHAPTER_TITLE | CHAPTER+TITLE | COVERTITLE \ \# [ SUBTITLE AUTHOR DOCTYPE COPYRIGHT MISC BLANKPAGE PDF_OUTLINE_LABEL ] \# *Function: \# Toggles the number register for each cover page element \# passed as an argument. \# *Notes: \# TITLE, DOCTITLE, CHAPTER, CHAPTER_TITLE or CHAPTER+TITLE must \# be supplied. After that, users may enter as many or as few of \# the arguments as they like. BLANKPAGE inserts a blank page \# after the cover. \# \# If called as DOC_COVER, performs the same operations, but \# applies everything to a doc cover. \# .MAC COVER END . rm DOC_ . ie '\\$0'DOC_COVER' \{\ . nr #DOC_COVER 1 . ds DOC_ DOC_ . \} . el .nr #COVER 1 . if \\n[#NUM_ARGS]=1 \{\ . if '\\$1'\\*[DOC_]COVERTEXT' \ . nr #\\*[DOC_]COVERTEXT_ONLY 1 . \} . if \\n[#NUM_ARGS]=3 \{\ . if '\\$1'\\*[DOC_]COVERTEXT' \ . if '\\$2'PDF_OUTLINE_LABEL' \ . nr #\\*[DOC_]COVERTEXT_ONLY 1 . if '\\$1'PDF_OUTLINE_LABEL' \ . if '\\$2'\\*[DOC_]COVERTEXT' \ . nr #\\*[DOC_]COVERTEXT_ONLY 1 . \} . nr #ARG_NUM 0 1 . nr #COVER_ITEM \\n[#NUM_ARGS] \"loop count . while \\n+[#ARG_NUM]<=\\n[#COVER_ITEM] \{\ . if '\\$1'DOCTITLE' \{\ . nr #\\*[DOC_]COVER_TITLE 2 . shift . \} . if '\\$1'TITLE' \{\ . nr #\\*[DOC_]COVER_TITLE 1 . if \\n[#FROM_\\*[DOC_]COVERTITLE] \{\ . nr #\\*[DOC_]COVER_TITLE 7 . rr #FROM_\\*[DOC_]COVERTITLE . \} . shift . \} . if '\\$1'CHAPTER' \{\ . nr #\\*[DOC_]COVER_TITLE 3 . shift . \} . if '\\$1'CHAPTER_TITLE' \{\ . nr #\\*[DOC_]COVER_TITLE 4 . shift . \} . if '\\$1'CHAPTER+TITLE' \{\ . nr #\\*[DOC_]COVER_TITLE 5 . shift . \} . if '\\$1'COVERTITLE' \{\ . nr #COVERTITLE 1 . nr #\\*[DOC_]COVER_TITLE 6 . shift . \} . if '\\$1'DOC_COVERTITLE' \{\ . nr #DOC_COVERTITLE 1 . nr #\\*[DOC_]COVER_TITLE 7 . shift . \} . if '\\$1'SUBTITLE' \{\ . nr #\\*[DOC_]COVER_SUBTITLE 1 . shift . \} . if '\\$1'AUTHOR' \{\ . nr #\\*[DOC_]COVER_AUTHOR 1 . shift . \} . if '\\$1'EDITOR' \{\ . nr #\\*[DOC_]COVER_AUTHOR 1 . shift . \} . if '\\$1'DOCTYPE' \{\ . nr #\\*[DOC_]COVER_DOCTYPE 1 . shift . \} . if '\\$1'COPYRIGHT' \{\ . nr #\\*[DOC_]COVER_COPYRIGHT 1 . shift . \} . if '\\$1'MISC' \{\ . nr #\\*[DOC_]COVER_MISC 1 . shift . \} . if '\\$1'\\*[DOC_]COVERTEXT' \{\ . nr #\\*[DOC_]COVERTEXT 1 . shift . \} . if '\\$1'\\*[DOC_]COVER_IMAGE' \{\ . nr #\\*[DOC_]COVER_IMAGE 1 . shift . \} . if '\\$1'PDF_OUTLINE_LABEL' \{\ . shift . ds $PDF_\\*[DOC_]COVER_LABEL \\$1 . shift . \} . if '\\$1'BLANKPAGE' \{\ . nr #\\*[DOC_]COVER_BLANKPAGE 1 . shift . \} . \} . if '\\$0'DOC_COVER' .rm DOC_ .END \# \# COVER TITLE \# ----------- \# *Arguments: \# \# *Function: \# Stores cover title in string(s) for output on cover pages. \# .MAC COVERTITLE END . rm DOC_ . if '\\$0'DOC_COVERTITLE' \ . ds DOC_ DOC_ . nr #FROM_\\*[DOC_]COVERTITLE 1 . ie \\n[#NUM_ARGS]=0 \{\ . nr argc 0 1 . while \\n+[argc]<=3 \{\ . if \\n[#\\*[DOC_]COVER_TITLE_NUM] \{\ . nr #ITEM 0 1 . while \\n[#\\*[DOC_]COVERTITLE_NUM]>\\n[#ITEM] \{\ . rm $\\*[DOC_]COVERTITLE_\\n+[#ITEM] . \} . rr #\\*[DOC_]COVERTITLE_NUM . rm $\\*[DOC_]COVERTITLE . \} . \} . \} . el \{\ . nr #\\*[DOC_]COVERTITLE_NUM 0 1 . while \\n[#NUM_ARGS]>\\n[#\\*[DOC_]COVERTITLE_NUM] \{\ . ds \ $\\*[DOC_]COVERTITLE_\\n+[#\\*[DOC_]COVERTITLE_NUM] \\$\\n[#\\*[DOC_]COVERTITLE_NUM] . nr #\\*[DOC_]COVERTITLE_NUM \\n[#\\*[DOC_]COVERTITLE_NUM] . \} . ds $\\*[DOC_]COVERTITLE \\$* . \} .END \# .MAC COVER_ATTRIBUTE_STRING END . if '\\$0'DOC_COVER_ATTRIBUTE_STRING' \ . ds DOC_ DOC_ . ds $\\*[DOC_]COVER_ATTRIBUTE_STRING \\$1 . rm DOC_ .END . .ALIAS DOC_COVER_ATTRIBUTE_STRING COVER_ATTRIBUTE_STRING \# \# COVER TEXT \# ---------- \# *Arguments: \# [ START ] | \# *Function: \# With no arg, begins a diversion holding the cover text for \# output on the cover page. With START , sets a vertical \# starting position relative to the top edge of the page. With \# any other arg, ends the diversion. \# *Notes: \# Aliased as DOC_COVERTEXT. \# \# If no other items assigned to cover pages, starts 1/3 of the \# way down the cover page unless START pos is given, otherwise \# starts underneath the last of title, subtitle, author(s) or \# doctype, preceded by a blank line. \# \# Does not persist. \# .MAC COVERTEXT END . rm DOC_ . if '\\$0'DOC_COVERTEXT' .ds DOC_ DOC_ . if '\\$1'START' \{\ . shift . nr #\\*[DOC_]COVERTEXT_START_POS (u;\\$1) . shift . \} . ie '\\$1'' \{\ . nr #COVERTEXT_PP 1 . di \\*[DOC_]COVER_TEXT . ev COVER_TEXT . evc 0 \!. if \\\\n[#\\*[DOC_]COVERTEXT_ONLY] \ . sp |\\\\n[#T_MARGIN]u-\\\\n[#DOC_LEAD]u \!. ie !\\n[#\\*[DOC_]COVERTEXT_START_POS] \{\ \!. sp |\\n[.p]u/3u-1v \!. \} \!. el \{\ \!. vs 0 \!. sp |0i \!. vs \\\\n[#DOC_LEAD]u+\\\\*[$\\*[DOC_]COVER_LEAD_ADJ] \!. sp |\\n[#\\*[DOC_]COVERTEXT_START_POS]u-1 \!. \} \!. vpt . \} . el \{\ . br \!. vpt 0 . ev . di . rm $FONT . rr #COVERTEXT_PP . IQ CLEAR . \} . rm DOC_ .END . .ALIAS DOC_COVERTEXT COVERTEXT \# \# COVER IMAGE \# ----------- \#*Arguments: \# [ -L|-C|-R|-I Y-pos [ X-pos ] ] \#*Function: \# Places an image on doccovers and covers. \#*Notes: \# Aliased as DOC_COVER_IMAGE. \# \# and are required. With no further args, images \# are set at 0,0 by default so that full page images fill the entire \# printer sheet. \# \# Positioning args are the same as PDF_IMAGE. -L, -R, -C and -I \# observe the left and right margins. \# \# Y-pos is required for all but full page images; without it, images \# are flush with the top of the page. X-pos is only needed if the \# user prefers to give absolute X,Y positioning. \# \# Note that Y-pos comes before X-pos in the args. \# .MAC COVER_IMAGE END . if '\\$0'DOC_COVER_IMAGE' .ds DOC_ DOC_ . ds \\*[DOC_]COVER_IMG_FILE \\$1 . nr \\*[DOC_]COVER_IMG_W (z;\\$2) . nr \\*[DOC_]COVER_IMG_H (z;\\$3) . if !'\\$4'' \{\ . ie !\B'\\$4' \{\ . if '\\$4'-L' .nr \\*[DOC_]COVER_IMG_IND \ \\n[#L_MARGIN]u . if '\\$4'-C' .nr \\*[DOC_]COVER_IMG_IND \ \\n[#PAGE_WIDTH]u-\\n[\\*[DOC_]COVER_IMG_W]u/2 . if '\\$4'-R' .nr \\*[DOC_]COVER_IMG_IND \ \\n[#L_MARGIN]+\\n[.l]u-\\n[\\*[DOC_]COVER_IMG_W]u . if '\\$4'-I' \{\ . nr \\*[DOC_]COVER_IMG_IND \\n[#L_MARGIN]+\\$5 . if !'\\$6'' .nr \\*[DOC_]COVER_IMG_Y (u;\\$6) . shift \\n[#NUM_ARGS] . \} . if \B'\\$5' .nr \\*[DOC_]COVER_IMG_Y (u;\\$5) . \} . el \{\ . nr \\*[DOC_]COVER_IMG_Y (u;\\$4) . if \B'\\$5' .nr \\*[DOC_]COVER_IMG_X (u;\\$5) . \} . \} . rm DOC_ .END . .ALIAS DOC_COVER_IMAGE COVER_IMAGE \# .MAC DO_COVER_IMAGE END . ll \\n[#PAGE_WIDTH]u . po 0 . vs 0 . sp |0i . if \\n[\\*[DOC_]COVER_IMG_Y] .sp \\n[\\*[DOC_]COVER_IMG_Y]u . if \\n[\\*[DOC_]COVER_IMG_X] .in \\n[\\*[DOC_]COVER_IMG_X]u . if \\n[\\*[DOC_]COVER_IMG_IND] .in \\n[\\*[DOC_]COVER_IMG_IND]u . if \\n[.u]=1 .nf . nop \X'pdf: pdfpic \\*[\\*[DOC_]COVER_IMG_FILE] -L \ \\n[\\*[DOC_]COVER_IMG_W]z \\n[\\*[DOC_]COVER_IMG_H]z' . in . vs . po . ll .END . .ALIAS DO_DOC_COVER_IMAGE DO_COVER_IMAGE \# \# COVER PAGE LEADING \# ------------------ \# *Arguments: \# <+|- amount by which to in/decrease leading of cover/doc cover> \# *Function: \# Stores user supplied lead in/decrease in string $COVER_LEAD_ADJ \# or $DOC_COVER_LEAD_ADJ, depending on whether the macro was called \# with an alias (DOC_COVER_LEAD). \# *Notes: \# A unit of measure must be supplied. Decimal fractions OK. \# Default is +0, i.e. same as DOC_LEAD. \# .MAC COVER_LEAD END . ie '\\$0'DOC_COVER_LEAD' .ds $DOC_COVER_LEAD_ADJ \\$1 . el .ds $COVER_LEAD_ADJ \\$1 .END \# \# MISC_AUTOLEAD functionality has been removed. Leading for MISCs \# is now entered as an absolute value. The macro emits a warning. \# .MAC MISC_AUTOLEAD END . ds replacement \\$0 . substring replacement 0 -9 . ds replacement \\*[replacement]LEAD . ds cover-type \\$0 . substring cover-type 0 2 . ie '\\*[cover-type]'COV' .ds cover-type cover . el .ds cover-type doc-cover . tm1 "[mom]: \\$0 at line \\n[.c] of '\\n[.F]' is no longer valid. . tm1 " Leading of \\*[cover-type] MISC items is now set with \\*[replacement], which . tm1 " takes an absolute leading value. Please update your document. . ab [mom]: Aborting. .END . .ALIAS DOC_COVER_MISC_AUTOLEAD MISC_AUTOLEAD .ALIAS COVER_MISC_AUTOLEAD MISC_AUTOLEAD \# \# COVER PAGE START POSITION \# ------------------------- \# *Arguments: \# \# *Function: \# Stores user supplied lead in/decrease in #COVER_START_POS \# or #DOC_COVER_START_POS, depending on whether the macro was \# called by an alias (DOC_COVER_ADVANCE). \# *Notes: \# A unit of measure must be supplied. Decimal fractions OK. \# If user doesn't invoke this macro, the default starting \# position for both covers and doc covers is 1/3 of the way \# down the page (setup in DO_COVER). \# .MAC COVER_ADVANCE END . ds COVER_TYPE \\$0 . substring COVER_TYPE 0 2 . ie 'COVER_TYPE'DOC' .nr #DOC_COVER_START_POS (\\$1) . el .nr #COVER_START_POS (\\$1) .END . .ALIAS DOC_COVER_ADVANCE COVER_ADVANCE .ALIAS DOC_COVER_START_POS COVER_ADVANCE .ALIAS COVER_ADVANCE COVER_ADVANCE .ALIAS COVER_START_POS COVER_ADVANCE \# \# COVERS - WHETHER TO PRINT \# ------------------------- \# *Arguments: \# | \# *Function: \# Creates or removes registers #COVERS and #COVERS_OFF, checked for \# in DEFAULTS (in START) prior to printing \# .MAC COVERS END . ie '\\$0'DOC_COVERS' \{\ . ie '\\$1'' \{\ . rr #DOC_COVERS_OFF . nr #DOC_COVERS 1 . \} . el \{\ . rr #DOC_COVERS . nr #DOC_COVERS_OFF 1 . \} . \} . el \{\ . ie '\\$1'' \{\ . rr #COVERS_OFF . nr #COVERS 1 . \} . el \{\ . rr #COVERS . nr #COVERS_OFF 1 . \} . \} .END \# \# COVER_COUNTS_PAGES \# ------------------ \# *Arguments: \# | \# *Function: \# Creates or removes registers #COVERS_COUNT or #DOCCOVERS_COUNT, \# used in END_COVER to determine whether to increment the page \# number silently when doc covers or covers are output. \# .MAC COVER_COUNTS_PAGES END . if '\\$0'DOC_COVER_COUNTS_PAGES' \{\ . ie '\\$1'' .nr #DOCCOVERS_COUNT 1 . el .rr #DOCCOVERS_COUNT . return . \} . if '\\$0'COVER_COUNTS_PAGES' \{\ . ie '\\$1'' .nr #COVERS_COUNT 1 . el .rr #COVERS_COUNT . return . \} .END \# .MAC DO_COVER END . nr #DOING_COVER 1 . ev COVER . evc 0 . vpt 0 . if \\n[#PAGINATE]=1 \{\ . nr #PAGINATION_WAS_ON 1 . rr #PAGINATE . \} . if \\n[#HEADERS_ON]=1 \{\ . nr #HEADERS_WERE_ON 1 . HEADERS OFF . \} . if \\n[#FOOTERS_ON]=1 \{\ . nr #FOOTERS_WERE_ON 1 . FOOTERS OFF . \} . if \\n[#COLUMNS]=1 \{\ . nr #COLUMNS_WERE_ON 1 . rr #COLUMNS . \} . ds PDF_BM . ie '\\$0'DO_DOC_COVER' \{\ . ds DOC_ DOC_ . nr #DOC_COVER_DONE 1 . if '\\*[$PDF_DOC_COVER_LABEL]'' \ . ds $PDF_DOC_COVER_LABEL Cover: . \} . el \ . if '\\*[$PDF_COVER_LABEL]'' \ . ds $PDF_COVER_LABEL Title Page: . ds $COVER_TYPE \\*[DOC_]COVER_ . if !r#\\*[DOC_]COVER_START_POS \ . nr #\\*[DOC_]COVER_START_POS \\n[#PAGE_LENGTH]/3 . if \\n[#PRINT_STYLE]=1 \ . if !\\n[#SINGLE_SPACE]=1 .vs \\n[#DOC_LEAD]u/2u . if \\n[#PRINT_STYLE]=2 \{\ . vs \\n[#DOC_LEAD]u\\*[$\\*[DOC_]COVER_LEAD_ADJ] . nr #\\*[DOC_]COVER_LEAD \\n[.v] . \} . if \\n[.ns] .rs . if '\\$0'DO_COVER' \{\ . if \\n[TOC.RELOCATE]==5 \ . if !rTOC_BH .TOC_BEFORE_HERE . \} . if '\\$0'DO_DOC_COVER' \{\ . if \\n[TOC.RELOCATE]==3 \ . if !rTOC_BH .TOC_BEFORE_HERE . \} . RV_HARD_SET_MARGINS .\" Cover image . if \\n[#\\*[DOC_]COVER_IMAGE]=1 \{\ . DO_\\*[DOC_]COVER_IMAGE . rr #\\*[DOC_]COVER_IMAGE . \} .\" Start cover . sp |\\n[#\\*[DOC_]COVER_START_POS]u-1v . if !\\n[#PRINT_STYLE]=1 \ . if \\n[#\\*[DOC_]COVER_COLOR]=1 \ . COLOR \\*[$\\*[DOC_]COVER_COLOR] . \\*[DOC_]COVER_H_POS . if (\\n[#\\*[DOC_]COVER_TITLE]=1):(\\n[#\\*[DOC_]COVER_TITLE]=2) .ds DOC DOC . fam \\*[$\\*[DOC_]COVER_\\*[DOC]TITLE_FAM] . ft \\*[$\\*[DOC_]COVER_\\*[DOC]TITLE_FT] . ps \\*[$\\*[DOC_]COVER_\\*[DOC]TITLE_SIZE_CHANGE] . ie \\n[#PRINT_STYLE]=1 .TYPEWRITER . el .vs \\n[#\\*[DOC_]COVER_LEAD]u . nr PDFHREF.VIEW.LEADING \\n[PDFHREF.VIEW.LEADING.C] .\" Title and/or doctitle . if (\\n[#\\*[DOC_]COVER_TITLE]=1):(\\n[#\\*[DOC_]COVER_TITLE]=2) \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . vs \\n[.v]u*2u . sp -1.5 . CAPS . nr #ARG_NUM 0 1 . while \\n[#TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE "\\*[$TITLE_\\n[#ARG_NUM]]" . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$TITLE_\\n[#ARG_NUM]] . \} . CAPS OFF . vs . \} . el \{\ . DO_TITLE . rm $PRFX . \} . PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM] . \} .\" Chapter . if \\n[#\\*[DOC_]COVER_TITLE]=3 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . UNDERSCORE "\\*[$CHAPTER_STRING] \\*[$CHAPTER] . CAPS OFF . \} . el .DO_CHAPTER . PDF_BOOKMARK 1 \ \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[$CHAPTER_STRING] \\*[$CHAPTER] . if \\n[#\\*[DOC_]COVER_CHAPTER_CAPS]=1 .CAPS off . \} .\" Chapter title . if \\n[#\\*[DOC_]COVER_TITLE]=4 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . nr #ARG_NUM 0 1 . vs \\n[.v]u*2u . sp -1.5 . while \\n[#CHAPTER_TITLE_NUM]>=\\n[#ARG_NUM] \{\ . UNDERSCORE "\\*[$CHAPTER_TITLE_\\n+[#ARG_NUM]]" . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . \} . CAPS OFF . vs . \} . el \{\ . ds $PRFX CHAPTER_ . DO_TITLE . rm $PRFX . \} . PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM] . \} .\" Chapter + chapter title . if \\n[#\\*[DOC_]COVER_TITLE]=5 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . UNDERSCORE "\\*[$CHAPTER_STRING] \\*[$CHAPTER] . CAPS OFF . \} . el .DO_CHAPTER . if !'\\*[$CHAPTER_TITLE_1]'' \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . ie \\n[#SINGLE_SPACE]=0 .vs \\n[#DOC_LEAD]u/2u . el .vs \\n[#DOC_LEAD]u . sp . nr #ARG_NUM 0 1 . while \\n[#CHAPTER_TITLE_NUM]>=\\n+[#ARG_NUM] \{\ . PRINT "\\*[$CHAPTER_TITLE_\\n[#ARG_NUM]]" . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$CHAPTER_TITLE_\\n[#ARG_NUM]] . \} . if \\n[#SINGLE_SPACE]=0 .vs \\n[#DOC_LEAD]u . \} . el \{\ . ds $PRFX CHAPTER_ . if \\n[#PRINT_STYLE]=2 .nr #CHAPTER+TITLE 1 . if !'\\*[$\\*[DOC_]COVER_CHAPTER_TITLE_SPACER]'' \ . sp \\*[$\\*[DOC_]COVER_CHAPTER_TITLE_SPACER] . DO_TITLE . rr #CHAPTER+TITLE . rm $PRFX . \} . \} . PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM] . \} .\" (Doc)covertitle .\" Titles to (doc)covers that are entered with .\" .TITLE DOC_COVER title .\" and included in (DOC)COVER with TITLE get treated as .\" (DOC_)COVERTITLEs, so we define the appropriate strings and .\" registers from their (DOC_)COVER_TITLE equivalents. .\" . if (\\n[#\\*[DOC_]COVER_TITLE]=6):(\\n[#\\*[DOC_]COVER_TITLE]=7) \{\ . ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_FAM \ \\*[$\\*[DOC_]COVER_TITLE_FAM] . ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_FT \ \\*[$\\*[DOC_]COVER_TITLE_FT] . ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_COLOR \ \\*[$\\*[DOC_]COVER_TITLE_COLOR] . nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_COLOR \ \\n[#\\*[DOC_]COVER_TITLE_COLOR] . nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_CAPS \ \\n[#\\*[DOC_]COVER_TITLE_CAPS] . nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_SMALLCAPS \ \\n[#\\*[DOC_]COVER_TITLE_SMALLCAPS] . ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_LEAD \ \\*[$\\*[DOC_]COVER_TITLE_LEAD] . ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_SIZE_CHANGE \ \\*[$\\*[DOC_]COVER_TITLE_SIZE_CHANGE] . nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_UNDERLINE \ \\n[#\\*[DOC_]COVER_TITLE_UNDERLINE] . nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_UNDERLINE_WEIGHT \ \\n[#\\*[DOC_]COVER_TITLE_UNDERLINE_WEIGHT] . nr #\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_UNDERLINE_WEIGHT_ADJ \ \\n[#\\*[DOC_]COVER_TITLE_UNDERLINE_WEIGHT_ADJ] . ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_UNDERLINE_GAP \ \\*[$\\*[DOC_]COVER_TITLE_UNDERLINE_GAP] . ds $\\*[DOC_]COVER_\\*[DOC_]COVERTITLE_RULE_GAP \ \\*[$\\*[DOC_]COVER_TITLE_RULE_GAP] . ie \\n[#PRINT_STYLE]=1 \{\ . CAPS . vs \\n[.v]u*2u . nr #ARG_NUM 0 1 . while \\n[#\\*[DOC_]COVERTITLE_NUM]>=\\n+[#ARG_NUM] \{\ . UNDERSCORE "\\*[$\\*[DOC_]COVERTITLE_\\n[#ARG_NUM]]" . if \\n[#ARG_NUM]>1 .as PDF_BM " \" . as PDF_BM \\*[$\\*[DOC_]COVERTITLE_\\n[#ARG_NUM]] . \} . vs . CAPS OFF . \} . el \{\ . ds $PRFX \\*[DOC_]COVER . DO_TITLE . rm $PRFX . \} . PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM] . \} . ie !'\\*[DOC_]'' \{\ . if !\\n[#DOC_COVER_TITLE] \ . if '\\*[$PDF_\\*[DOC_]COVER_LABEL]'' \ . PDF_BOOKMARK 1 Cover page . \} . el \{\ . if !\\n[#COVER_TITLE] \ . if '\\*[$PDF_\\*[DOC_]COVER_LABEL]'' \ . PDF_BOOKMARK 1 Title page . \} . rr #\\*[DOC_]COVER_TITLE .\" Subtitle . if \\n[#\\*[DOC_]COVER_SUBTITLE]=1 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . if !'\\*[$\\*[DOC_]COVER_SUBTITLE_1]'' \ . ds $PRFX \\*[DOC_]COVER_ . sp 2 . nr #ARG_NUM 0 1 . while \\n[#\\*[$PRFX]SUBTITLE_NUM]>=\\n+[#ARG_NUM] \{\ . PRINT "\\*[$\\*[$PRFX]SUBTITLE_\\n[#ARG_NUM]]" . \} . rm $PRFX . \} . el \{\ . ie !'\\*[$\\*[DOC_]COVER_SUBTITLE_1]'' .ds $PRFX \\*[DOC_]COVER_SUB . el .ds $PRFX SUB . if !'\\*[$\\*[DOC_]COVER_SUBTITLE_SPACER]'' \ . sp \\*[$\\*[DOC_]COVER_SUBTITLE_SPACER] . DO_SUBTITLE . rm $PRFX . \} . \} . if \\n[#PRINT_STYLE]=1 \ . if !r#\\*[DOC_]COVER_SUBTITLE .sp .\" Author (plus attribution) . if \\n[#\\*[DOC_]COVER_AUTHOR]=1 \{\ . ie \\n[#PRINT_STYLE]=1 \ . sp . el \{\ . ie !'\\*[$\\*[DOC_]COVER_AUTHOR_LEAD]'' \ . vs \\*[$\\*[DOC_]COVER_AUTHOR_LEAD] . el .vs \\n[#\\*[DOC_]COVER_LEAD]u . \} . if '\\*[$\\*[DOC_]COVER_ATTRIBUTE_STRING]'' \ . ds $\\*[DOC_]COVER_ATTRIBUTE_STRING \ \\*[$ATTRIBUTE_STRING] . ie !\\n[#PRINT_STYLE]=1 \{\ . fam \\*[$\\*[DOC_]COVER_ATTRIBUTE_FAM] . ft \\*[$\\*[DOC_]COVER_ATTRIBUTE_FT] . ps \ \\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_ATTRIBUTE_SIZE_CHANGE] . if \\n[#\\*[DOC_]COVER_ATTRIBUTE_COLOR]=1 \ . COLOR \\*[$\\*[DOC_]COVER_ATTRIBUTE_COLOR] . if \\n[#\\*[DOC_]COVER_ATTRIBUTE_CAPS]=1 .CAPS . if \\n[#\\*[DOC_]COVER_ATTRIBUTE_SMALLCAPS]=1 .SMALLCAPS . if !'\\*[$\\*[DOC_]COVER_ATTRIBUTE_SPACER]'' \ . sp \\*[$\\*[DOC_]COVER_ATTRIBUTE_SPACER] . ie \\n[#\\*[DOC_]COVER_ATTRIBUTE_UNDERLINE] \{\ . ds $TITLE_TYPE \\*[DOC_]COVER_ATTRIBUTE . ie \\n[#\\*[DOC_]COVER_ATTRIBUTE_UNDERLINE]=2 \ . UNDERSCORE2 \\*[$\\*[DOC_]COVER_ATTRIBUTE_UNDERLINE_GAP] \ \\*[$\\*[DOC_]COVER_ATTRIBUTE_RULE_GAP] "\\*[$\\*[DOC_]COVER_ATTRIBUTE_STRING]" . el .UNDERSCORE \\*[$\\*[DOC_]COVER_ATTRIBUTE_STRING] . \} . el .PRINT "\\*[$\\*[DOC_]COVER_ATTRIBUTE_STRING]" . SMALLCAPS off . CAPS off . if \\n[#\\*[DOC_]COVER_ATTRIBUTE_COLOR]=1 \ . gcolor . \} . el \ . PRINT "\\*[$\\*[DOC_]COVER_ATTRIBUTE_STRING]" . ie \\n[#PRINT_STYLE]=1 .sp . el \{\ . if !'\\*[$\\*[DOC_]COVER_AUTHOR_SPACER]'' \ . sp \\*[$\\*[DOC_]COVER_AUTHOR_SPACER] . \} . if '\\$0'DO_COVER' \ . ds $PRFX COVER_ . if '\\$0'DO_DOC_COVER' \ . ds $PRFX DOC_COVER_ . DO_AUTHORS . rm $PRFX . \} .\" Named doctype string . if \\n[#DOC_TYPE]=3 \{\ . if \\n[#\\*[DOC_]COVER_DOCTYPE]=1 \{\ . ie \\n[#PRINT_STYLE]=1 \{\ . TYPEWRITER . sp 1.5 . UNDERSCORE2 3p 2p "\\*[$DOC_TYPE] . \} . el \{\ . fam \\*[$\\*[DOC_]COVER_DOCTYPE_FAM] . ft \\*[$\\*[DOC_]COVER_DOCTYPE_FT] . ps \ \\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_DOCTYPE_SIZE_CHANGE] . if \\n[#\\*[DOC_]COVER_DOCTYPE_COLOR]=1 \ . COLOR \\*[$\\*[DOC_]COVER_DOCTYPE_COLOR] . sp . if \\n[#\\*[DOC_]COVER_DOCTYPE_CAPS]=1 .CAPS . if \\n[#\\*[DOC_]COVER_DOCTYPE_SMALLCAPS]=1 .SMALLCAPS . if !'\\*[$\\*[DOC_]COVER_DOCTYPE_SPACER]'' \ . sp \\*[$\\*[DOC_]COVER_DOCTYPE_SPACER] . ie \\n[#\\*[DOC_]COVER_DOCTYPE_UNDERLINE] \{\ . ds $TITLE_TYPE \\*[DOC_]COVER_DOCTYPE . ie \\n[#\\*[DOC_]COVER_DOCTYPE_UNDERLINE]=2 \ . UNDERSCORE2 \\*[$\\*[DOC_]COVER_DOCTYPE_UNDERLINE_GAP] \ \\*[$\\*[DOC_]COVER_DOCTYPE_RULE_GAP] "\\*[$DOC_TYPE]" . el .UNDERSCORE "\\*[$DOC_TYPE]" . \} . el .PRINT "\\*[$DOC_TYPE]" . SMALLCAPS off . CAPS off . if \\n[#\\*[DOC_]COVER_DOCTYPE_COLOR]=1 \ . gcolor . \} . \} . \} .\" Covertext . if \\n[#\\*[DOC_]COVERTEXT]=1 \{\ . nr #DOING_COVERTEXT 1 . if !\\n[#\\*[DOC_]COVERTEXT_START_POS] .sp . if \\n[#\\*[DOC_]COVERTEXT]=1 \{\ . ev \\*[DOC_]COVERTEXT . nf . \\*[DOC_]COVER_TEXT . ev . \} . if \\n[#\\*[DOC_]COVERTEXT_ONLY] \ . PDF_BOOKMARK 1 \\*[$PDF_\\*[DOC_]COVER_LABEL] \\*[PDF_BM] . rr #\\*[DOC_]COVERTEXT . rm \\*[DOC_]COVER_TEXT . rr #DOING_COVERTEXT . rr #\\*[DOC_]COVERTEXT_START_POS . \} . sp |\\n[#VISUAL_B_MARGIN]u .\" Copyright . ie \\n[#PRINT_STYLE]=1 \ . if !\\n[#SINGLE_SPACE] .sp . el \{\ . fam \\*[$\\*[DOC_]COVER_COPYRIGHT_FAM] . ft \\*[$\\*[DOC_]COVER_COPYRIGHT_FT] . ps \\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_COPYRIGHT_SIZE_CHANGE] . nr #COPYRIGHT_V_POS \\n[#DOC_LEAD]-\\n[.v] . sp \\n[#COPYRIGHT_V_POS]u . rr #COPYRIGHT_V_POS . \} . if \\n[#\\*[DOC_]COVER_COPYRIGHT]=1 \{\ . if '\\*[$\\*[DOC_]COVER_COPYRIGHT]'' \ . ds $\\*[DOC_]COVER_COPYRIGHT \\*[$COVER_COPYRIGHT] . QUAD \\*[$\\*[DOC_]COVER_COPYRIGHT_QUAD] . if \\n[#\\*[DOC_]COVER_COPYRIGHT_COLOR]=1 \ . COLOR \\*[$\\*[DOC_]COVER_COPYRIGHT_COLOR] . ie !'\\*[$COPYRIGHT_V_ADJ]'' \ . PRINT \v'\\*[$COPYRIGHT_V_ADJ]'\\*[$\\*[DOC_]COVER_COPYRIGHT] . el \ . PRINT \\*[$\\*[DOC_]COVER_COPYRIGHT] . if \\n[#\\*[DOC_]COVER_COPYRIGHT_COLOR]=1 \ . gcolor . \} . sp |\\n[#VISUAL_B_MARGIN]u .\" Misc . if \\n[#\\*[DOC_]COVER_MISC]=1 \{\ . if \\n[#PRINT_STYLE]=2 \{\ . fam \\*[$\\*[DOC_]COVER_MISC_FAM] . ft \\*[$\\*[DOC_]COVER_MISC_FT] . ps \\n[#DOC_PT_SIZE]u\\*[$\\*[DOC_]COVER_MISC_SIZE_CHANGE] . vs \\*[$\\*[DOC_]COVER_MISC_LEAD] . if \\n[#\\*[DOC_]COVER_MISC_COLOR]=1 \ . COLOR \\*[$\\*[DOC_]COVER_MISC_COLOR] . \} . ie !'\\*[$\\*[DOC_]COVER_MISC_1]'' \{\ . QUAD \\*[$\\*[DOC_]COVER_MISC_QUAD] . da MISC_DIV . nr #NEXT_MISC 0 1 . while \\n[#\\*[DOC_]COVER_MISC_LINES]>=\\n+[#NEXT_MISC] \{\ . nop \\*[$\\*[DOC_]COVER_MISC_\\n[#NEXT_MISC]] . br . \} . da . \} . el \{\ . QUAD \\*[$MISC_QUAD] . da MISC_DIV . nr #NEXT_MISC 0 1 . while \\n[#MISC_LINES]>=\\n+[#NEXT_MISC] \{\ . nop \\*[$MISC_\\n[#NEXT_MISC]] . br . \} . da . \} . nr #MISC_V_ADJ \\n[#DOC_LEAD]-\\n[.v] . sp \\n[#MISC_V_ADJ]u . sp -\\n[dn]u+1 . nf . MISC_DIV . if \\n[#MISC_COLOR]=1 .gcolor . if \\n[#\\*[DOC_]COVER_MISC_COLOR]=1 .gcolor . rm MISC_DIV . rr #MISC_DEPTH . \} . if \\n[TOC.RELOCATE]==1 \{\ . if !\\n[#COVER_BLANKPAGE] \ . if !rTOC_BH .TOC_AFTER_HERE . \} . if '\\$0'DO_COVER' \{\ . if \\n[TOC.RELOCATE]==6 \ . if !rTOC_BH .TOC_AFTER_HERE . \} . if '\\$0'DO_DOC_COVER' \{\ . if \\n[TOC.RELOCATE]==4 \ . if !rTOC_BH .TOC_AFTER_HERE . \} . END_COVER .END \# \# Macro to terminate (doc)cover processing \# .MAC END_COVER END . EOL . vpt . rr #\\*[DOC_]COVERTEXT_ONLY . rr #\\*[DOC_]COVER_TITLE . rr #\\*[DOC_]COVERTITLE . rr #\\*[DOC_]COVER_SUBTITLE . rr #\\*[DOC_]COVER_AUTHOR . rr #\\*[DOC_]COVER_DOCTYPE . rr #\\*[DOC_]COVER_COPYRIGHT . rr #\\*[DOC_]COVER_MISC . rr #\\*[DOC_]COVERTEXT . rr #\\*[DOC_]COVER_IMAGE . rr #\\*[DOC_]COVER_BLANKPAGE . rm $PDF_\\*[DOC_]COVER_LABEL . rr #\\*[DOC_]COVER . if '\\*[$COVER_TYPE]'DOC_COVER_' .ds DOC DOC . rm $COVER_TYPE . if \\n[#DOC_TYPE]=5 .nr #SKIP 1 . nr #END_COVER 1 . NEWPAGE . rr #NEWPAGE . rr #SKIP . if \\n[#PAGINATION_WAS_ON]=1 .nr % +1 . ie \\n[#\\*[DOC_]COVER_BLANKPAGE]=1 \{\ . if \\n[TOC.RELOCATE] \ . if !\\n[#TOC_BH] .TOC_AFTER_HERE .\" Without the empty PDF_BOOKMARK, (doc)cover BLANKPAGE causes .\" the PDF outline to place the first doc or chapter before the TOC, .\" even though PDF output is correct. . PDF_BOOKMARK 1 . nop \& . bp . rr #\\*[DOC_]COVER_BLANKPAGE . if !\\n[#\\*[DOC]COVERS_COUNT]=1 .nr % -2 . rm DOC_ . \} . el \ . if !\\n[#\\*[DOC]COVERS_COUNT]=1 .nr #PAGE_NUM_ADJ -1 . if !'\\n[.ev]'0' .ev . if \\n[#PAGINATION_WAS_ON] \{\ . rr #PAGINATION_WAS_ON . PAGINATE . PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ]-1 . \} . if \\n[#HEADERS_WERE_ON] \{\ . rr #HEADERS_WERE_ON . HEADERS . \} . if \\n[#FOOTERS_WERE_ON] \{\ . rr #FOOTERS_WERE_ON . FOOTERS . \} . if \\n[#COLUMNS_WERE_ON]=1 \{\ . rr #COLUMNS_WERE_ON 1 . nr #COLUMNS 1 . \} . rr #DOING_COVER . if \\n[.ns] .nop \& . if \\n[#RECTO_VERSO] .nr #RV_POST_COVER 1 . rm DOC_ .END \# \# +++START THE DOCUMENT+++ \# \# THE START MACRO \# --------------- \# *Arguments: \# \# *Function: \# Macro to start document processing. Reads in default document \# style parameters and any parameters the user has changed before \# issuing START. Using the information gathered in the opening \# macros, prints appropriate title (or chapter #), subtitle, \# author and document type (if appropriate). \# *Notes: \# The .PRINT \& (zero-width character) is required to get the \# subsequent .sp request to work as advertised. \# \# The overall document line length, family, and point-size \# are stored in #DOC_L_LENGTH, $DOC_FAM, and #DOC_PT_SIZE for \# use in the HEADER and FOOTER macros. \# .MAC START END . nr #DOCS 1 . if \\n[TOC.RELOCATE]==2 \ . if !\\n[TOC_BH] .TOC_BEFORE_HERE . if !n .nop \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap' . if !\\n[#PRINT_STYLE] \{\ . PRINTSTYLE TYPEWRITE . PRINT \& . po 6P . ll 39P . ta \\n[.l]u . sp |1i-1v . CENTER . PRINT "You neglected to enter a PRINTSTYLE." . ab [mom]: PRINTSTYLE missing. Aborting '\\n[.F]'. . \} . if \\n[#LINENUMBERS]=1 \{\ . nm . NUMBER_LINES OFF . nr #LINENUMBERS 2 . \} . if \\n[#COLLATE] \{\ . COPYSTYLE \\*[$COPY_STYLE] . nr #HEADERS_ON \\n[#HEADER_STATE] . if \\n[#PAGE_NUM_V_POS]=1 .nr #PAGINATE \\n[#PAGINATION_STATE] . PRINT \& . if !'\\*[$RESTORE_PAGENUM_STYLE]'' \{\ . PAGENUM_STYLE \\*[$RESTORE_PAGENUM_STYLE] . rm $RESTORE_PAGENUM_STYLE . \} . if \\n[#PAGINATE_WAS_ON] \{\ . PAGINATE . rr #PAGINATE_WAS_ON . \} . \} . DEFAULTS . nr #PAGE_TOP \\n[#T_MARGIN]u-\\n[#DOC_LEAD]u . rr #RESET_TRAPS . if !r#EN_Q_AUTOLEAD .nr #EN_Q_LEAD \\n[#EN_LEAD] . if !r#EN_BQ_AUTOLEAD .nr #EN_BQ_LEAD \\n[#EN_LEAD] .\" TOC/recto-verso stuff . nr @L_MARGIN \\n[#DOC_L_MARGIN] . nr @R_MARGIN \\n[#DOC_R_MARGIN] .\" Covers and doc covers . if \\n[#DOC_COVERS]=1 \{\ . if \\n[#DOC_COVER]=1 .DO_DOC_COVER . \} . if \\n[#COVERS]=1 \{\ . if \\n[#COVER]=1 .DO_COVER . \} . nr PDFHREF.VIEW.LEADING \\n[PDFHREF.VIEW.LEADING.T] . if !\\n[#TOC] .RV_HARD_SET_MARGINS . if \\n[#COLUMNS] .COLUMNS \\n[#NUM_COLS] \\n[#GUTTER]u . sp |\\n[#DOCHEADER_ADVANCE]u-\\n[#DOC_LEAD]u .\" Collect TITLE for TOC. . if !\\n[#TOC]=1 \{\ . nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ] . af #TOC_ENTRY_PN \\g[#PAGENUMBER] . ie \\n[#USER_SET_TITLE_ITEM] \{\ . ds $TOC_TITLE_ITEM \\*[$USER_SET_TITLE_ITEM] . rr #USER_SET_TITLE_ITEM . rm $USER_SET_TITLE_ITEM . \} . el \{\ . ie \\n[#DOC_TYPE]=2 \{\ . ie '\\*[$CHAPTER_TITLE]'' \ . ds $TOC_TITLE_ITEM \\*[$CHAPTER_STRING] \\*[$CHAPTER] . el \{\ . ie '\\*[$CHAPTER]'' \ . ds $TOC_TITLE_ITEM \\*[$CHAPTER_TITLE] . el \ . ds $TOC_TITLE_ITEM \ \\*[$CHAPTER_STRING] \\*[$CHAPTER]: \\*[$CHAPTER_TITLE] . \} . \} . el \ . ds $TOC_TITLE_ITEM \\*[$TITLE] . \} . if \\n[#TOC_AUTHORS]=1 \{\ . ie '\\*[$TOC_AUTHORS]'' \ . as $TOC_TITLE_ITEM / \\*[$AUTHOR_1] . el \{\ . as $TOC_TITLE_ITEM / \\*[$TOC_AUTHORS] . rm $TOC_AUTHORS . \} . \} . as $TOC_TITLE_ITEM \| . if \\n[#PREFIX_CH_NUM] \ . ds $TOC_CH_NUM \ \\n[#CH_NUM].\[toc-hd-num-spacer] . if \\n[#TOC_PREFIX_CH_NUM] \{\ . rn $TOC_TITLE_ITEM $TOC_TITLE_ITEM_OLD . ds $TOC_CH_NUM \ \\n[#CH_NUM].\[toc-hd-num-spacer] . if (\\n[#PAD_TOC_CH_NUM]=2)&(\\n[#CH_NUM]<10) \ . ds $TOC_CH_NUM \h'\w'\0'u'\\*[$TOC_CH_NUM] . if \\n[#PAD_TOC_CH_NUM]=3 \{\ . if \\n[#CH_NUM]<10 \ . ds $TOC_CH_NUM \h'\w'\0'u*2u'\\*[$TOC_CH_NUM] . if (\\n[#CH_NUM]>=10)&(\\n[#CH_NUM]<100) \ . ds $TOC_CH_NUM \h'\w'\0'u'\\*[$TOC_CH_NUM] . \} . if \\n[#PAD_TOC_CH_NUM]=4 \{\ . if \\n[#CH_NUM]<10 \ . ds $TOC_CH_NUM \h'\w'\0'u*3u'\\*[$TOC_CH_NUM] . if (\\n[#CH_NUM]>=10)&(\\n[#CH_NUM]<100) \ . ds $TOC_CH_NUM \h'\w'\0'u*2u'\\*[$TOC_CH_NUM] . if (\\n[#CH_NUM]>=100)&(\\n[#CH_NUM]<1000) \ . ds $TOC_CH_NUM \h'\w'\0'u'\\*[$TOC_CH_NUM] . \} . ds $TOC_TITLE_ITEM \\*[$TOC_CH_NUM]\\*[$TOC_TITLE_ITEM_OLD] . rm $TOC_TITLE_ITEM_OLD . \} . \} . if !'\\*[$TOC_HEADING]'' \{\ . HEADING_TO_TOC . rm $TOC_HEADING . \} . if !\\n[#TOC] \{\ . if !'\\*[$TOC_TITLE_ITEM]'' \{\ . PDF_BOOKMARK 1 \\*[$TOC_TITLE_ITEM] . if !r #NO_TOC_ENTRY .TITLE_TO_TOC . if r #NO_TOC_ENTRY .rr #NO_TOC_ENTRY . \} . \} . if !\\n[#TOC] .nr #POST_TOP 1 .\" End TITLE collection . if \\n[#PRINT_PAGENUM_ON_PAGE_1] \{\ . if \\n[#PAGE_NUM_V_POS]=1 \{\ . br . sp |\\n[#HEADER_MARGIN]u . PRINT_PAGE_NUMBER . \} . \} . rr #COLLATE . rr #PAGINATION_STATE .\" End collate stuff . if \\n[#DOC_TYPE]=5 \{\ . rr @TOP . ch RR_@TOP . \} . sp |\\n[#DOCHEADER_ADVANCE]u-\\n[#DOC_LEAD]u . ie \\n[#DOC_HEADER]=0 \{\ . if \\n[.ns] .rs . if \\n[#DOC_TYPE]=4 \ . if !'\\n[.z]'' .di . nr #STORED_PP_INDENT \\n[#PP_INDENT] . PARA_INDENT 0 . PP . PARA_INDENT \\n[#STORED_PP_INDENT]u . rr #STORED_PP_INDENT . ie r #ADVANCE_FROM_TOP \{\ . br . sp |\\n[#ADVANCE_FROM_TOP]u-1v . if \\n[#ADJ_DOC_LEAD]=1 \ . if !\\n[#DOCHEADER_NO_SHIM] .SHIM_1 . \} . el \{\ . br . sp |\\n[#T_MARGIN]u-1v . \} . if \\n[#COLUMNS] \{\ . mk dc . nr #COL_NUM 0 1 . po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . ll \\n[#COL_L_LENGTH]u . \} . nr #PP 0 . \} . el \{\ . if \\n[#AUTO_LEAD] .nr #RESTORE_AUTO_LEAD 1 . nr #CURRENT_LEAD \\n[.v] . if \\n[#PRINT_STYLE]=2 .vs \\n[#DOC_LEAD]u\\*[$DOCHEADER_LEAD_ADJ] . nr #DOCHEADER_LEAD_DIFF \\n[#CURRENT_LEAD]-\\n[.v] . sp +\\n[#DOCHEADER_LEAD_DIFF]u . if \\n[#RESTORE_AUTO_LEAD] \{\ . nr #AUTO_LEAD 1 . nr #AUTOLEAD_VALUE \\n[#SAVED_AUTOLEAD_VALUE] . \} . nr #DOCHEADER_LEAD \\n[.v] . vpt 0 .\" Default doctype . if \\n[#DOC_TYPE]=1 \{\ . if \\n[.ns] \{\ . rs . nop \& . sp -1 . \} . ev DOCHEADER . evc 0 . L_MARGIN \\n[#DOC_L_MARGIN]u . LL \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . if \\n[#PRINT_STYLE]=1 .DEFAULT_DOCHEADER_TYPEWRITE . if \\n[#PRINT_STYLE]=2 .DEFAULT_DOCHEADER . ev . \} .\" Chapter doctype . if \\n[#DOC_TYPE]=2 \{\ . if \\n[.ns] .rs . ev DOCHEADER . evc 0 . if \\n[#DOCHEADER_COLOR]=1 \ . COLOR \\*[$DOCHEADER_COLOR] . L_MARGIN \\n[#DOC_L_MARGIN]u . LL \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . if \\n[#PRINT_STYLE]=1 .CHAPTER_DOCHEADER_TYPEWRITE . if \\n[#PRINT_STYLE]=2 .CHAPTER_DOCHEADER . ev . \} .\" Named . if \\n[#DOC_TYPE]=3 \{\ . if \\n[.ns] \{\ . rs . nop \& . sp -1 . \} . ev DOCHEADER . evc 0 . if \\n[#DOCHEADER_COLOR]=1 \ . COLOR \\*[$DOCHEADER_COLOR] . L_MARGIN \\n[#DOC_L_MARGIN]u . LL \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . if \\n[#PRINT_STYLE]=1 \{\ . DEFAULT_DOCHEADER_TYPEWRITE . if !\\n[#NO_PRINT_DOCTYPE] \{\ . sp . UNDERSCORE2 3p 2p "\\*[$DOC_TYPE]" . \} . \} . if \\n[#PRINT_STYLE]=2 .NAMED_DOCHEADER . ev . \} . if !\\n[#DOC_TYPE]=4 \{\ . if \\n[#PRINT_STYLE]=1 .sp . if \\n[#PRINT_STYLE]=2 .sp \\n[#DOC_LEAD]u*2u . if \\n[#COLUMNS] \{\ . nr #COL_NUM 0 1 . nr #L_LENGTH_FOR_EPI \\n[#L_LENGTH] . ie \\n[#RV_POST_COVER] \{\ . nr #COL_\\n+[#COL_NUM]_L_MARGIN \\n[#DOC_L_MARGIN] . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . rr #RV_POST_COVER . \} . el \{\ . po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . \} . LL \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . \} . nr #NO_PRINT_AUTHOR 1 . nr #NO_PRINT_DOCTYPE 1 . \} . vs \\n[#DOC_LEAD]u . if \\n[#PRINT_STYLE]=1 \ . if \\n[#SINGLE_SPACE]=1 .sp . if \\n[#ADJ_DOC_LEAD]=1 \ . if \\n[#ADVANCE_FROM_TOP]=0 \ . if \\n[#DOC_HEADER]=1 \ . if !\\n[#DOCHEADER_NO_SHIM] .SHIM_1 . if \\n[#COLUMNS] .mk dc . FAMILY \\*[$DOC_FAM] . QUAD \\*[$DOC_QUAD] . CLEANUP_DEFAULTS . nr #START_FOR_FOOTERS 1 . if !\\n[#DOC_TYPE]=4 .em TERMINATE . if \\n[#LINENUMBERS]=2 \{\ . ie \\n[#PER_SECTION] .NUMBER_LINES 1 . el .NUMBER_LINES RESUME . nr #LINENUMBERS 1 . \} . if \\n[#RUN_ON]=1 \{\ . if \\n[#FN_MARKER_STYLE]=1 .RUNON_WARNING . if \\n[#FN_MARKER_STYLE]=2 .RUNON_WARNING . \} . nr PDFHREF.VIEW.LEADING \\n[PDFHREF.VIEW.LEADING.H] . vpt . if !r flex .nr flex 1 . nr flex-spaces 0 .\" If one-page, don't flex. . if !dPDF.EXPORT \{\ . if \\n[#FLEX_ACTIVE] \{\ . if !\\n[#NO_FLEX] \{\ . if d pre-toc-\\n%@\\n[#COL_NUM] \ . nr #NO_FLEX 1 . if d pre-list-\\n%@\\n[#COL_NUM] \ . nr #NO_FLEX 1 . if d page-\\n%@\\n[#COL_NUM] \ . nr #NO_FLEX 1 . if '\\*[last-page]'\\n%@\\n[#COL_NUM]' \ . nr #NO_FLEX 1 . \} . \} . \} . if \\n[#DOC_TYPE]=5 \{\ . if \\n[#HDRFTR_BOTH] \ . HEADER_RECTO \\*[$HDR_RECTO_QUAD] "\\*[$HDR_RECTO_STRING]" . if \\n[#SLIDE_HEADERS] .HEADER . if \\n[#HDRFTR_BOTH] \ . FOOTER_RECTO \\*[$FTR_RECTO_QUAD] "\\*[$FTR_RECTO_STRING]" . if \\n[#SLIDE_FOOTERS] \ . PRINT_FOOTER . sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u . vpt . \} .END \# .MAC RR_ADVANCE_FROM_TOP END . rr #ADVANCE_FROM_TOP . ch RR_ADVANCE_FROM_TOP .END \# .MAC CLEANUP_DEFAULTS END . nr #START 1 . if \\n[#DOC_HEADER]=1 .nr #DOC_HEADER 2 . rm $TOC_TITLE_ITEM . rr #MISC_NUM . rr #MISCS . rr #NEXT_AUTHOR . rr #NEXT_MISC . wh \\n[nl]u+1u RR_ADVANCE_FROM_TOP . rr #DOCHEADER_NO_SHIM .END \# \# ==================================================================== \# \# +++MACROS TO CHANGE SOME DEFAULTS+++ \# \# DOCUMENT HEADER \# --------------- \# *Argument: \# | [distance to advance from top of page] [NO_SHIM] \# *Function: \# Turns printing of document header on or off. If a second \# numeric argument with units of measure is given, advances that \# distance from the top of the page without printing the document \# header. \# *Notes: \# Default is on. If the 1st argument is (which turns \# document headers off), the optional 2nd argument may be given \# (with a unit of measure). \# .MAC DOCHEADER END . if \\n[#NUM_ARGS]=0 .nr #DOC_HEADER 1 . if \\n[#NUM_ARGS]=1 \{\ . ie '\\$1'NO_SHIM' .nr #DOCHEADER_NO_SHIM 1 . el .nr #DOC_HEADER 0 . \} . if \\n[#NUM_ARGS]>1 \{\ . nr #DOC_HEADER 0 . if \B'\\$2' .nr #ADVANCE_FROM_TOP \\$2 . if '\\$3'NO_SHIM' .nr #DOCHEADER_NO_SHIM 1 . \} .END \# \# DOCUMENT HEADER LEADING \# ----------------------- \# *Arguments: \# <+|- amount by which to in/decrease leading of doc header> \# *Function: \# Stores user supplied lead in/decrease in string $DOCHEADER_LEAD_ADJ. \# *Notes: \# A unit of measure must be supplied. Decimal fractions OK. \# Default is +0, i.e. same as DOC_LEAD. \# .MAC DOCHEADER_LEAD END . ds $DOCHEADER_LEAD_ADJ \\$1 .END \# \# DOCHEADER ADVANCE \# ----------------- \# *Arguments: \# \# *Function: \# Creates register #DOCHEADER_ADVANCE, used in START. \# *Notes: \# Unit of measure required. \# Default is same as T_MARGIN. \# .MAC DOCHEADER_ADVANCE END . nr #DOCHEADER_ADVANCE \\$1 .END \# \# DOCUMENT LEFT MARGIN \# -------------------- \# *Argument: \# \# *Function: \# Creates or modifies register #DOC_L_MARGIN. \# *Notes: \# Affects everything on the page. \# .MAC DOC_LEFT_MARGIN END . if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0 . br . nr #DOC_L_MARGIN (\\$1) . L_MARGIN \\n[#DOC_L_MARGIN]u .END \# \# DOCUMENT RIGHT MARGIN \# --------------------- \# *Argument: \# \# *Function: \# Creates or modifies register #DOC_R_MARGIN. \# *Notes: \# Affects everything on the page. \# .MAC DOC_RIGHT_MARGIN END . br . nr #DOC_R_MARGIN (\\$1) . R_MARGIN \\n[#DOC_R_MARGIN] . nr #DOC_L_LENGTH \\n[#L_LENGTH] .END \# \# DOCUMENT LINE LENGTH \# -------------------- \# *Argument: \# \# *Function: \# Creates or modifies register #DOC_L_LENGTH. \# *Notes: \# Affects everything on the page. \# .MAC DOC_LINE_LENGTH END . if !\\n[DOCS] .DOC_MACRO_ERROR \\$0 . br . nr #DOC_L_LENGTH (\\$1) . LL \\n[#DOC_L_LENGTH]u . ta \\n[.l]u .END \# \# DOCUMENT FAMILY \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies string $DOC_FAM. \# *Notes: \# Affects everything except headers and footers. \# .MAC DOC_FAMILY END . if !\\n[DOCS] .DOC_MACRO_ERROR \\$0 . br . ds $DOC_FAM \\$1 . ds $FAMILY \\*[$DOC_FAM] . AUTHOR_FAMILY \\*[$DOC_FAM] . BLOCKQUOTE_FAMILY \\*[$DOC_FAM] . DOCHEADER_FAMILY \\*[$DOC_FAM] . DOCTYPE_FAMILY \\*[$DOC_FAM] . EPIGRAPH_FAMILY \\*[$DOC_FAM] . FOOTNOTE_FAMILY \\*[$DOC_FAM] . HDRFTR_FAMILY \\*[$DOC_FAM] . LINENUMBER_FAMILY \\*[$DOC_FAM] . QUOTE_FAMILY \\*[$DOC_FAM] . SUBTITLE_FAMILY \\*[$DOC_FAM] . TITLE_FAMILY \\*[$DOC_FAM] .END \# \# DOCUMENT POINT SIZE \# ------------------- \# *Argument: \# \# *Function: \# Creates or modifies register #DOC_PT_SIZE. \# *Notes: \# DOC_PT_SIZE is the basis for calculating all type sizes in \# a document. Ignored if PRINTSTYLE TYPEWRITE. \# .ALIAS DOC_PT_SIZE PT_SIZE \# \# DOCUMENT LEAD \# ------------- \# *Argument: \# [ADJUST] \# *Function: \# Creates or modifies register #DOC_LEAD. If the optional \# ADJUST argument is given, adjusts leading so that the last \# line of text falls exactly on #B_MARGIN. \# *Notes: \# DOC_LEAD is the basis for calculating all leading changes in \# a document. Default for TYPESET is 16; 24 for TYPEWRITE. \# \# Because the visible bottom or footer margin of a page depends \# on the overall document lead supplied by the register #DOC_LEAD, \# DOC_LEAD, in the body of a document, should always be associated \# with the start of a new page (in other words, just before or \# just after a manual NEWPAGE). Ignored if PRINTSTYLE TYPEWRITE. \# .MAC DOC_LEAD END . if \\n[#IGNORE] .return . if !\\n[#DOCS] .DOC_MACRO_ERROR \\$0 . br . if '\\$0'DOC_LEAD' \{\ . vs \\$1 . rr #DOC_AUTOLEAD . rr #DOC_AUTOLEAD_FACTOR . nr #DOC_LEAD \\n[.v] . \} . nr #RESET_TRAPS 1 . if !\\n[#ADJ_DOC_LEAD] .nr #REMOVE_ADJ 1 . if !'\\$0'DOC_LEAD' \{\ . if '\\$0'EN_LEAD' .nr #DOC_LEAD \\n[#EN_LEAD] . if '\\$0'BIB_LEAD' .nr #DOC_LEAD \\n[#BIB_LEAD] . if '\\$0'TOC_LEAD' .nr #DOC_LEAD \\n[#TOC_LEAD] . if '\\$2'ADJUST' .TRAPS . rr #RESET_TRAPS . \} .END \# \# ADJUST DOCUMENT LEAD \# -------------------- \# *Arguments: \# | \# *Function: \# Adjusts document lead so that the last line of text falls exactly \# on #B_MARGIN. \# .MAC DOC_LEAD_ADJUST END . ie '\\$1'' \{\ . nr #ADJ_DOC_LEAD 1 . rr #DOC_LEAD_ADJUST_OFF . \} . el \{\ . nr #ADJ_DOC_LEAD 0 . nr #DOC_LEAD_ADJUST_OFF 1 . \} .END \# \# SHIM \# ---- \# *Argument: \# None \# *Function: \# Advances to the next valid baseline. \# *Notes: \# If a user plays around with spacing in a doc (say, with ALD), \# it isn't easy to get mom back on track so she can achieve \# perfectly flush bottom margins. Any time SHIM is used, it \# ensures that the next output line falls on a valid baseline. \# \# First, a little convenience macro \# .MAC PROCESS_SHIM END . if !\\n[nl]=\\n[#VALID_BASELINE] \{\ . while \\n+[#VALID_BASELINE]<\\n[#CURRENT_V_POS] . . nr #SHIM \\n[#VALID_BASELINE]-\\n[#CURRENT_V_POS] . \} .END \# \# And a macro to disable SHIM \# .MAC NO_SHIM END . ie '\\$1'' \{\ . nr #NO_SHIM 1 . nr #FLEX_ACTIVE 1 . \} . el \{\ . rr #NO_SHIM . rr #SHIM . rr #FLEX_ACTIVE . \} .END \# .nr #NO_SHIM 2 \" Restored to 1 in DEFAULTS. \# .MAC SHIM END . if \\n[#NO_SHIM] \ . if !'\\$0'SHIM_1' .return . if !\\n[#NO_FLEX] \{\ . if !'\\$0'SHIM_1' \{\ . tm1 "[mom]: \ SHIM, line \\n[.c], is incompatible with flex-spacing, which is enabled. . tm1 " \ Flex-spacing must be disabled with NO_FLEX before using SHIM. . ab [mom]: Aborting '\\n[.F]', line \\n[.c]. . \} . \} . nr #VALID_BASELINE \\n[#T_MARGIN]-\\n[#DOC_LEAD] \\n[#DOC_LEAD] . if !r#CURRENT_V_POS .nr #CURRENT_V_POS \\n[.d] . ie \\n[#ADVANCE_FROM_TOP] \{\ . ie \\n[#CURRENT_V_POS]<(\\n[#T_MARGIN]-1v) \{\ . while \\n-[#VALID_BASELINE]>\\n[#CURRENT_V_POS] . . nr #VALID_BASELINE +\\n[#DOC_LEAD] . nr #SHIM \\n[#VALID_BASELINE]-\\n[#CURRENT_V_POS] . \} . el .PROCESS_SHIM . \} . el .PROCESS_SHIM . nr #SHIM_MAX \\n[#DOC_LEAD]*10/15 . if !\\n[#CALCULATE_ONLY] \{\ . if !\\n[defer-count] \ . if \\n[#SHIM]>\\n[#SHIM_MAX] .sp -1 ' sp \\n[#SHIM]u . \} . rr #CURRENT_V_POS .END \# .ALIAS SHIM_1 SHIM \# \# ==================================================================== \# \# +++FLEX SPACING+++ \# \# INSERT FLEX SPACE \# ----------------- \# *Arguments: \# FORCE \# *Function: \# Inserts flexible whitespace ("flex-space"). \# *Notes: \# FORCE restores flex-spacing if an .ns is preventing it. \# Useful in conjunction with deferred floated material that \# plants an .ns after outputting the last deferred float. \# .MAC FLEX END . if !\\n[#NO_SHIM] \{\ . if \\n[#NO_FLEX] \{\ . tm1 "[mom]: \ FLEX, line \\n[.c], is incompatible with shimming, which is presently enabled. . tm1 " \ Shimming must be disabled with NO_SHIM before using FLEX. . ab [mom]: Aborting '\\n[.F]', line \\n[.c]. . \} . \} . if '\\$1'FORCE' \{\ . nr flex:force 1 . return . \} . if !\\n[#NO_FLEX] \{\ . if !\\n[.ns] \{\ . if !\\n[.t]<=\\n[.v] \{\ . nr flex-spaces +1 . if dflex-space:\\n[flex]@\\n[#COL_NUM] \{\ . sp \\*[flex-space:\\n[flex]@\\n[#COL_NUM]] . \} . \} . \} . \} .END \# .MAC NO_FLEX END . rr flexed . ie '\\$1'' \{\ . nr #NO_FLEX 1 . if \\n[#FLEX_ACTIVE] .rr #FLEX_ACTIVE . \} . el \ . if !\\n[#DOC_TYPE]=5 .rr #NO_FLEX .END \# \# CALCULATE FLEX SPACES \# --------------------- \# *Function: \# Derives flex-space size by dividing the space remaining before \# FOOTER by the number of times FLEX was used on the page/col. \# *Notes: \# .h is reliable for determining space remaining, but can't be used \# for columns because it can't be zeroed from one col to the \# next. Workaround is to use nl for columns and compensate for \# .br's, .sp's, and .ne's. Here be dragons. \# .MAC CALCULATE_FLEX END . nr flex:target-pos \\n[.p]+\\n[#VARIABLE_FOOTER_POS]-1 . nr flex:current-pos \\n[.h]-\\n[.v] . if \\n[#COLUMNS] \{\ . ie \\n[.trunc] \ . nr flex:current-pos \\n[nl]-\\n[.v]-(\\n[.trunc]-1) . el .nr flex:current-pos \\n[nl]-\\n[.v] . if '\\n[.ev]'tbl*end' \{\ . nr flex:current-pos \\n[nl]-(\\n[.trunc]-1) . if \\n[tbl*boxed] .nr flex:current-pos -.65v . \} . ie \\n[nl-from-heading] \{\ . nr flex:current-pos \\n[nl-from-heading]-\\n[.v] . rr nl-from-heading . \} . el \{\ . if !\\n[.pe] \{\ . if \\n[nl]=(\\n[.p]+(\\n[#VARIABLE_FOOTER_POS]-1)) \ . nr flex-spaces -1 . \} . \} . \} . nr flex:space-remaining \ \\n[flex:target-pos]-\\n[flex:current-pos] . if \\n[flex-spaces] \{\ . nr flex-space:\\n[flex]@\\n[#COL_NUM] \ \\n[flex:space-remaining]/\\n[flex-spaces] . if dPDF.EXPORT \{\ . tm .ds flex-space:\\n[flex]@\\n[#COL_NUM] \ \\n[flex-space:\\n[flex]@\\n[#COL_NUM]]u .\" For debugging: catch edge-cases that result in negative .\" flex-spacing and don't apply flex to the page/column. . if \\n[flex-space:\\n[flex]@\\n[#COL_NUM]]<0 \{\ . tm .ds flex-space:\\n[flex]@\\n[#COL_NUM] 0 . tm .ds Negative flex space \\n%@\\n[#COL_NUM] (\\n[flex-space:\\n[flex]@\\n[#COL_NUM]]) . \} . \} . \} .END \# \# ==================================================================== \# \# +++INTERNATIONALIZATION+++ \# \# ATTRIBUTE STRING \# ---------------- \# *Argument: \# \# *Function: \# Creates or modifies string $ATTRIBUTE_STRING. \# *Notes: \# Default is "by". A blank string ("") may be used if no \# attribution is desired. Blank line results. \# .MAC ATTRIBUTE_STRING END . if !'\\$1'DOC_COVER' \ . if !'\\$1'COVER' .nr #NEITHER 1 . if !'\\$1'COVER' \ . if !'\\$1'DOC_COVER' .nr #NEITHER 1 . if '\\$1'DOC_COVER' \{\ . ds $DOC_COVER_ATTRIBUTE_STRING \\$2 . if '\\*[$DOC_COVER_ATTRIBUTE_STRING]'' \ . ds $DOC_COVER_ATTRIBUTE_STRING \& . \} . if '\\$1'COVER' \{\ . ds $COVER_ATTRIBUTE_STRING \\$2 . if '\\*[$COVER_ATTRIBUTE_STRING]'' \ . ds $COVER_ATTRIBUTE_STRING \& . \} . if \\n[#NEITHER]=1 \{\ . ds $ATTRIBUTE_STRING \\$1 . rr #NEITHER . \} .END \# \# CHAPTER STRING \# -------------- \# *Argument: \# \# *Function: \# Creates or modifies string $CHAPTER_STRING. \# *Notes: \# Default is "chapter". \# .MAC CHAPTER_STRING END . ds $CHAPTER_STRING \\$1 .END \# \# DRAFT STRING \# ------------ \# *Argument: \# \# *Function: \# Creates or modifies string $DRAFT_STRING. \# *Notes: \# Default is "draft". \# .MAC DRAFT_STRING END . ds $DRAFT_STRING \\$1 .END \# \# REVISION STRING \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies string $REVISION_STRING. \# *Notes: \# Default is "revision". \# .MAC REVISION_STRING END . ds $REVISION_STRING \\$1 .END \# \# FINIS STRING \# ------------ \# *Argument: \# \# *Function: \# Creates or modifies string $FINIS_STRING. \# *Notes: \# Default is "END". \# .MAC FINIS_STRING END . ds $FINIS_STRING \\$1 .END \# \# ==================================================================== \# \# +++RECTO/VERSO+++ \# \# RECTO_VERSO \# ----------- \# *Arguments: \# | \# *Function: \# Switches HDRFTR_LEFT and HDRFTR_RIGHT on alternate pages. Also \# switches page numbers left and right if either is chosen rather \# than the default centered page numbers. Switches left and right \# margins if differing values have been entered. \# *Notes: \# Default is OFF. \# .MAC RECTO_VERSO END . ie '\\$1'' .nr #RECTO_VERSO 1 . el .nr #RECTO_VERSO 0 .END \# \# FORCE RECTO \# ----------- \# *Function: \# Forces doccover and cover pages to recto \# .MAC FORCE_RECTO END . ie '\\$1'' \{\ . nr #FORCE_RECTO 1 . nr #DOC_COVER_BLANKPAGE 1 . nr #COVER_BLANKPAGE 1 . \} . el \{\ . rr #FORCE_RECTO . rr #DOC_COVER_BLANKPAGE . rr #COVER_BLANKPAGE . \} .END \# .MAC RV_HARD_SET_MARGINS END . DOC_LEFT_MARGIN \\n[@L_MARGIN]u . DOC_RIGHT_MARGIN \\n[@R_MARGIN]u . po \\n[#DOC_L_MARGIN]u . LL \\n[#DOC_L_LENGTH]u .END \# \# ==================================================================== \# \# +++EPIGRAPHS+++ \# \# EPIGRAPH INDENT \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies register #EPI_OFFSET_VALUE. \# *Notes: \# Default is 2 for TYPEWRITE, 3 for TYPESET. \# .MAC EPIGRAPH_INDENT END . rr #EPI_OFFSET_VALUE . rm $EPI_OFFSET_VALUE . ds $EVAL_EI_ARG \\$1 . substring $EVAL_EI_ARG -1 . ie \B'\\*[$EVAL_EI_ARG]' .nr #EPI_OFFSET_VALUE \\$1 . el .ds $EPI_OFFSET_VALUE \\$1 . rm $EVAL_EI_ARG .END \# \# EPIGRAPH AUTOLEAD \# ----------------- \# *Argument: \# \# *Function: \# Creates or modifies register #EPI_AUTOLEAD. \# *Notes: \# Default is 2 (for TYPESET; TYPEWRITE doesn't require this). \# .MAC EPIGRAPH_AUTOLEAD END . nr #EPI_AUTOLEAD (p;\\$1) .END \# \# EPIGRAPH \# -------- \# *Arguments: \# BLOCK | \# *Function: \# Places an epigraph before the document's text, after the \# document header, or after a HEAD. \# *Notes: \# #EPIGRAPH 1 = centered; 2 = block \# \# By default, epigraphs are centered, allowing the user \# to input them on a line per line basis. To change this \# behaviour, the user can supply the argument BLOCK, which \# will produce indented, filled text similar to BLOCKQUOTE. \# \# If a block epigraph contains more than one para, ALL paras of \# the epigraph must be preceded by PP. Otherwise, PP is optional. \# .MAC EPIGRAPH END . nr #PP_STYLE 2 . nr #Q_PP 0 . if \\n[#LINENUMBERS]=1 \{\ . NUMBER_LINES OFF . nr #LINENUMBERS 2 . \} . if \\n[#START] \{\ . if \\n[#PRINT_STYLE]=1 \ . if \\n[#AUTHOR_LINES]=1 .sp \\n[#DOC_LEAD]u . \} . ie '\\$1'' \{\ . nr #EPIGRAPH 1 . ev EPIGRAPH . nr #IN_DIVER 1 . ll \\n[#L_LENGTH]u . ta \\n[.l]u . CHECK_INDENT . if \\n[#COLUMNS] \{\ . ie \\n[#START] \{\ . ll \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . \} . el \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . \} . \} . CENTER . if \\n[#PRINT_STYLE]=1 \{\ . fam \\*[$TYPEWRITER_FAM] . ft R . if '\\*[$EPI_FT]'I' .FT I . ps \\*[$TYPEWRITER_PS] . ie \\n[#SINGLE_SPACE] .vs \\n[#DOC_LEAD]u . el .vs \\n[#DOC_LEAD]u/2u . nr #EPI_LEAD \\n[#LEAD] . nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] . \} . if \\n[#PRINT_STYLE]=2 \{\ . FAMILY \\*[$EPI_FAM] . FT \\*[$EPI_FT] . ps \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE] . if \\n[#EPI_COLOR]=1 \{\ . nf \m[\\*[$EPI_COLOR]] . EOL . \} . vs \\n[.ps]u+\\n[#EPI_AUTOLEAD]u . nr #EPI_LEAD \\n[#LEAD] . nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] . \} . di EPI_TEXT . nr #DIVERSIONS_HY_MARGIN (p;\\n[.ps]u*2.75)/1000 . HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p . hy 14 . nr #EPI_ACTIVE 1 . \} . el \{\ . ie '\\$1'BLOCK' \{\ . nr #EPIGRAPH 2 . ev EPIGRAPH . evc 0 . ie \\n[#START] \{\ . ie \\n[#COLUMNS] \{\ . ie r#EPI_OFFSET_VALUE \ . ll \ \\n[#L_LENGTH_FOR_EPI]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . el \ . ll \ \\n[#L_LENGTH_FOR_EPI]u-(\\*[$EPI_OFFSET_VALUE]u*2u) . ta \\n[.l]u . \} . el \{\ . ie r#EPI_OFFSET_VALUE \ . ll \ \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . el \ . ll \\n[#L_LENGTH]u-(\\*[$EPI_OFFSET_VALUE]*2u) . ta \\n[.l]u . \} . \} . el \{\ . ie r#EPI_OFFSET_VALUE \ . ll \ \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . el \ . ll \\n[#L_LENGTH]u-(\\*[$EPI_OFFSET_VALUE]*2u) . ta \\n[.l]u . if \\n[#COLUMNS] \{\ . ie r#EPI_OFFSET_VALUE \ . ll \ \\n[#COL_L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) . el \ . ll \\n[#COL_L_LENGTH]u-(\\*[$EPI_OFFSET_VALUE]*2u) . ta \\n[.l]u . \} . CHECK_INDENT . \} . if \\n[#PRINT_STYLE]=1 \{\ . fam \\*[$TYPEWRITER_FAM] . ft R . if '\\*[$EPI_FT]'I' .FT I . ps \\*[$TYPEWRITER_PS] . ie \\n[#SINGLE_SPACE] .vs \\n[#DOC_LEAD]u . el .vs \\n[#DOC_LEAD]u/2u . QUAD LEFT . HY OFF . nr #EPI_LEAD \\n[#LEAD] . nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] . di EPI_TEXT . nr #EPI_ACTIVE 1 . \} . if \\n[#PRINT_STYLE]=2 \{\ . FAMILY \\*[$EPI_FAM] . FT \\*[$EPI_FT] . ps \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE] . if \\n[#EPI_COLOR]=1 \{\ . nf \m[\\*[$EPI_COLOR]] . EOL . \} . vs \\n[.ps]u+\\n[#EPI_AUTOLEAD]u . QUAD \\*[$EPI_QUAD] . nr #DIVERSIONS_HY_MARGIN (p;\\n[.ps]u*2.75)/1000 . HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p . hy 14 . nr #EPI_LEAD \\n[#LEAD] . nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] . di EPI_TEXT . nr #EPI_ACTIVE 1 . \} . \} . el .DO_EPIGRAPH . \} .END \# \# DO EPIGRAPH \# ----------- \# *Arguments: \# \# *Function: \# Ends diversion started in EPIGRAPH. Makes spacing \# adjustments to compensate for the difference between epigraph \# leading and overall document leading, so that the bottom of \# the pages remain flush. \# *Notes: \# In addition to its usual place at the beginning of a \# document, EPIGRAPH may also be used after HEAD. \# .MAC DO_EPIGRAPH END . br . di . rr #IN_DIVER . if \\n[#RESET_FN_COUNTERS]=2 \{\ . if !\\n[#FN_COUNT]=1 \{\ . if ((\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS])+\\n[#DIVER_DEPTH])>(\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS]) \{\ . DIVER_FN_2_POST . rr #RESET_FN_COUNTERS . \} . \} . \} . nr #SAVED_FN_NUMBER \\n[#FN_NUMBER] . nr #DONE_ONCE 0 1 . REMOVE_INDENT . ev . nr #EPI_DEPTH \\n[#DIVER_DEPTH]-\\n[#EPI_LEAD] . nr #EPI_LINES \\n[#EPI_DEPTH]/\\n[#EPI_LEAD] . ie \\n[#START] \{\ . if !\\n[#NO_SHIM] .RLD \\n[#SHIM]u . nr #EPI_WHITESPACE (\\n[#DOC_LEAD]*\\n[#EPI_LINES])-\\n[#EPI_DEPTH] . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] . \} . if \\n[#PRINT_STYLE]=1 \ . if !\\n[#SINGLE_SPACE]=1 .ALD \\n[#DOC_LEAD]u . if \\n[#PRINT_STYLE]=2 \{\ . ie !\\n[#DOC_TYPE]=2 .RLD \\n[#DOC_LEAD]u . el \{\ . ie '\\*[$CHAPTER_TITLE]'' .RLD \\n[#DOC_LEAD]u . el .if '\\*[$CHAPTER]'' .RLD \\n[#DOC_LEAD]u . \} . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \ . ALD \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u) . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \ . ALD \ \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u . \} . \} . el \{\ . ie \\n[#EPI_DEPTH]<\\n[#TRAP_DISTANCE] \{\ . nr #EPI_FITS 1 . nr #EPI_WHITESPACE (\\n[#DOC_LEAD]*\\n[#EPI_LINES])-\\n[#EPI_DEPTH] . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] . \} . ie \\n[#PRINT_STYLE]=1 \ . ALD \\n[#DOC_LEAD]u/2u . el \{\ . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \ . ALD \ \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u) . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \ . ALD \ \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u . \} . if \\n[#DIVER_FN]=2 .rr #DIVER_FN . \} . el \{\ . nr #EPI_LINES_TO_TRAP 0 1 . while \\n[#EPI_LEAD]*\\n+[#EPI_LINES_TO_TRAP]<\\n[#TRAP_DISTANCE] \{\ . nr #LOOP 1 . \} . nr #EPI_LINES_TO_TRAP -1 . nr #EPI_WHITESPACE \ (\\n[#EPI_LINES_TO_TRAP]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_TRAP]*\\n[#EPI_LEAD]) . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] . \} . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \ . ALD \\n[#EPI_WHITESPACE]u . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \ . ALD \\n[#EPI_WHITESPACE]u-\\n[#DOC_LEAD]u . \} . \} . SET_EPI_OFFSET . nf . EPI_TEXT . br . ie \\n[#START] \{\ . if \\n[#PRINT_STYLE]=1 .SHIM_1 . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \ . ALD \\n[#EPI_WHITESPACE]u/2u . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \ . ALD (\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u . SHIM . \} . \} . el \{\ . rr #EPI_ACTIVE . ie \\n[#EPI_FITS] \{\ . ie \\n[#FN_FOR_EPI] \{\ . nr #EPI_LINES_TO_END 1 . nr #EPI_WHITESPACE \ (\\n[#EPI_LINES_TO_END]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_END]*\\n[#EPI_LEAD]) . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] . \} . ALD \\n[#EPI_WHITESPACE]u-(\\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u) . \} . el \{\ . ie \\n[#PRINT_STYLE]=1 \ . SHIM_1 . 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 . \} . \} . SHIM . \} . el \{\ . nr #EPI_LINES_TO_END \\n[#EPI_LINES]-\\n[#EPI_LINES_TO_TRAP] . if \\n[#LOOP] .nr #EPI_LINES_TO_END +1 . rr #LOOP . nr #EPI_WHITESPACE \ (\\n[#EPI_LINES_TO_END]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_END]*\\n[#EPI_LEAD]) . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] . \} . ALD \\n[#EPI_WHITESPACE]u-(\\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u) . if \\n[#PRINT_STYLE]=1 \{\ . if !\\n[#SINGLE_SPACE] \{\ . nr #EPI_LINES_EVEN \\n[#EPI_LINES_TO_END]%2 . ie \\n[#EPI_LINES_EVEN] .ALD .5v . el .RLD .5v . rr #EPI_LINES_EVEN . \} . \} . \} . \} . nr #PP_STYLE 1 . rr #EPI_FITS . ALD \\n[#DOC_LEAD]u . QUAD \\*[$DOC_QUAD] . po \\n[#L_MARGIN]u . if \\n[#COLUMNS] \{\ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . \} . if \\n[#START] \{\ . if \\n[#COLUMNS] \{\ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . mk dc . \} . \} . if \\n[#LINENUMBERS]=2 \{\ . NUMBER_LINES RESUME . nr #LINENUMBERS 1 . \} .END \# .MAC SET_EPI_OFFSET END . if \\n[#EPIGRAPH]=1 \{\ . po \\n[#L_MARGIN]u . if \\n[#COLUMNS] \{\ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . \} . \} . if \\n[#EPIGRAPH]=2 \{\ . ie !\\n[#EPI_OFFSET_VALUE]=0 \ . nr #EPI_OFFSET \ \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) . el \ . if !'\\*[$EPI_OFFSET_VALUE]'' \ . nr #EPI_OFFSET \\n[#L_MARGIN]+\\*[$EPI_OFFSET_VALUE] . if \\n[#COLUMNS] \{\ . ie !\\n[#EPI_OFFSET_VALUE]=0 \ . nr #EPI_OFFSET \ \\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) . el \ . if !'\\*[$EPI_OFFSET_VALUE]'' \ . nr #EPI_OFFSET \ \\n[#COL_\\n[#COL_NUM]_L_MARGIN]+\\*[$EPI_OFFSET_VALUE] . \} . if !'\\$0'GET_EPI_OFFSET' \ . if !\\n[#EPI_OFFSET]=0 .po \\n[#EPI_OFFSET]u . \} .END . .ALIAS GET_EPI_OFFSET SET_EPI_OFFSET \# \# ==================================================================== \# \# +++FINIS MACRO+++ \# \# FINIS \# ----- \# *Arguments: \# \# *Function: \# Deposits --END-- at the end of a document. \# .MAC FINIS END . if !\\n[@TOP] \{\ . if \\n[.t]<=2v \{\ . tm1 "[mom]: '\\n[.F]': Insufficient room to print \\$0 on last page. . return . \} . \} . br . ev FINIS . evc 0 . if \\n[#TAB_ACTIVE] .TQ . if \\n[#INDENT_ACTIVE] .IQ CLEAR . nr #EM_ADJUST (1m/8) . if \\n[#COLUMNS] \{\ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . \} . ALD \\n[#DOC_LEAD]u . CENTER . if \\n[#FINIS_STRING_CAPS]=1 .CAPS . if \\n[#PRINT_STYLE]=1 \{\ . ie !\\n[#FINIS_NO_DASHES] .PRINT "--\\*[$FINIS_STRING]-- . el .PRINT "\\*[$FINIS_STRING] . \} . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#FINIS_COLOR]=1 .COLOR \\*[$FINIS_COLOR] . ie !\\n[#FINIS_NO_DASHES] .ds $FINIS_DASH \ \v'-\\n[#EM_ADJUST]u'\[em]\v'+\\n[#EM_ADJUST]u' . el .rm $FINIS_DASH . PRINT \ \\*[$FINIS_DASH]\\*[$FINIS_STRING]\\*[$FINIS_DASH]\c . \} . EL . if \\n[#FINIS_COLOR]=1 .gcolor . if \\n[#FINIS_STRING_CAPS]=1 .CAPS OFF . ev . pdfsync .END \# .MAC FINIS_STRING_CAPS END . ie '\\$1'' .nr #FINIS_STRING_CAPS 1 . el .nr #FINIS_STRING_CAPS 0 .END . .ALIAS FINIS_CAPS FINIS_STRING_CAPS \# .MAC FINIS_NO_DASHES END . nr #FINIS_NO_DASHES 1 .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] .ALIAS SLIDE# PAGE# \# .MAC RESTORE_SPACE END . if !\\n[#START] .vpt 0 . if \\n[@TOP] \{\ . ch RR_@TOP . rr @TOP . \} . if \\n[#NEWPAGE] .rr #NEWPAGE . if \\n[.u]=1 .nr #FILLED 1 . nf . rs . nop \& . sp -1 . if \\n[#FILLED] \{\ . fi . rr #FILLED . \} . if !\\n[#START] .vpt .END \# \# HDRFTR RULE GAP \# --------------- \# *Argument: \# \# *Function: \# Creates or modifies register #HDRFTR_RULE_GAP to hold amount \# of space between header/footer and header/footer rule. \# *Notes: \# Default is 4p. \# .MAC HDRFTR_RULE_GAP END . nr #HDRFTR_RULE_GAP (\\$1) . if '\\$0'HEADER_RULE_GAP' \ . nr #HEADER_RULE_GAP \\n[#HDRFTR_RULE_GAP] . if '\\$0'FOOTER_RULE_GAP' \ . nr #FOOTER_RULE_GAP \\n[#HDRFTR_RULE_GAP] .END \# \# HDRFTR LEFT \# ----------- \# *Argument: \# \# *Function: \# Creates or modifies string $HDRFTR_LEFT. \# Creates register #USER_DEF_HDRFTR_LEFT, which, if 1, \# overrides the $HDRFTR_LEFT string created by default \# in DEFAULTS. \# *Notes: \# Especially useful if doc has more than one author, and a list \# of authors by last name is desired in header/footers. \# Default is author. \# \# If the argument is the # character, simply prints the current \# page number. \# \# If the user wants to incorporate the page number into the string, \# \*[PAGE#] must be used. For example, if the user wants to put \# an ellipsis 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 CAPS AND SMALLCAPS \# ------------------------------------ \# *Argument: \# | \# *Function: \# Turns capitalisation of $HDRFTR_ on or off. \# *Notes: \# Default for RIGHT (ie AUTHOR) is on. \# .MAC CAPS_SMALLCAPS_WARNING END . tm1 "[mom]: At line \\n[.c], both CAPS and SMALLCAPS have been enabled for HEADER_\\$1. . tm1 " CAPS takes precedence. .END . .MAC _HDRFTR_CAPS END . ds $HDR_FTR \\$0 . substring $HDR_FTR 0 5 \" HEADER or FOOTER . ds POSITION \\$0 . substring POSITION 7 7 . if '\\*[POSITION]'L' .ds POSITION LEFT . if '\\*[POSITION]'C' .ds POSITION CENTER . if '\\*[POSITION]'R' .ds POSITION RIGHT . if \\n[#HDRFTR_\\*[POSITION]_SMALLCAPS]=1 \ . CAPS_SMALLCAPS_WARNING \\*[POSITION] . ie '\\$1'' .nr #HDRFTR_\\*[POSITION]_CAPS 1 . el \{\ . nr #HDRFTR_\\*[POSITION]_CAPS 0 . ds $HDRFTR_\\*[POSITION]_SIZE_CHANGE +0 . \} .END . .MAC _HDRFTR_SMALLCAPS END . ds $HDR_FTR \\$0 . substring $HDR_FTR 0 5 \" HEADER or FOOTER . ds POSITION \\$0 . substring POSITION 7 7 . if '\\*[POSITION]'L' .ds POSITION LEFT . if '\\*[POSITION]'C' .ds POSITION CENTER . if '\\*[POSITION]'R' .ds POSITION RIGHT . if \\n[#HDRFTR_\\*[POSITION]_CAPS]=1 \ . CAPS_SMALLCAPS_WARNING \\*[POSITION] . ie '\\$1'' .nr #HDRFTR_\\*[POSITION]_SMALLCAPS 1 . el \ . nr #HDRFTR_\\*[POSITION]_SMALLCAPS 0 .END \# \# HDRFTR CENTER \# ------------- \# *Argument: \# \# *Function: \# Creates or modifies string $HDRFTR_CENTER. \# Creates register #USER_DEF_HDRFTR_CENTER, which, if 1, \# overrides the $HDRFTR_CENTER string created by default \# in COPYSTYLE. \# *Notes: \# Default is document type if DOCTYPE NAMED, Chapter # if DOCTYPE \# CHAPTER, draft and revision number if COPYSTYLE DRAFT. \# \# If the argument is the # character, simply prints the current \# page number. \# \# If the user wants to incorporate the page number into the string, \# \*[PAGE#] must be used. For example, if the user wants to put \# an ellipsis before the page number in the string, s/he should use \# ...\*[PAGE#], not ...# \# .MAC HDRFTR_CENTER END . nr #USER_DEF_HDRFTR_CENTER 1 . if '\\$0'HEADER_CENTER' \{\ . ds $HDRFTR_CENTER_OLD \\*[$HDRFTR_CENTER] . ds $HDRFTR_CENTER_NEW \\$1 . \} . if '\\$0'FOOTER_CENTRE' \{\ . ds $HDRFTR_CENTER_OLD \\*[$HDRFTR_CENTER] . ds $HDRFTR_CENTER_NEW \\$1 . \} . ie '\\$1'TOC' .ds $TOC_HDRFTR_CENTER \\$2 . el .ds $HDRFTR_CENTER \\$1 .END \# \# HDRFTR CENTER CAPS AND SMALLCAPS \# -------------------------------- \# *Argument: \# | \# *Function: \# Turns capitalisation of $HDRFTR_CENTER (typically, doctype of \# the document) on or off. \# *Notes: \# Default is on. \# .MAC HDRFTR_CENTER_SMALLCAPS END . if \\n[#HDRFTR_CENTER_SMALLCAPS]=1 \ . CAPS_SMALLCAPS_WARNING CENTER . ie '\\$1'' .nr #HDRFTR_CENTER_SMALLCAPS 1 . el \ . nr #HDRFTR_CENTER_SMALLCAPS 0 .END \# \# HDRFTR CENTER PADDING \# --------------------- \# *Argument: \# LEFT | RIGHT \# *Function: \# Creates or modifies registers #HDRFTR_CTR_PAD_LEFT or \# #HDRFTR_CTR_PAD_RIGHT. \# *Notes: \# By default, the HDRFTR_CENTER string is centered on the doc \# line length. Long titles or long author names can screw up \# visual centering, or create overprints. This macro allows the \# user to pad the center string by the specified amount of space \# to fix these problems. \# \# A unit of measure is required. \# .MAC HDRFTR_CENTER_PAD END . if '\\$1'LEFT' .nr #HDRFTR_CTR_PAD_LEFT (\\$2) . if '\\$1'RIGHT' .nr #HDRFTR_CTR_PAD_RIGHT (\\$2) .END \# \# SWITCH HDRFTR CENTER PADDING SIDE (support macro) \# ------------------------------------------------- \# *Argument: \# \# *Function: \# Switches the padding side of hdrftr center padding. \# *Notes: \# Required to keep spacing around hdrftr string constant \# in recto/verso documents. \# .MAC SWITCH_HDRFTR_CENTER_PAD END . nr #HDRFTR_CTR_PAD_TMP \\n[#HDRFTR_CTR_PAD_LEFT] . HDRFTR_CENTER_PAD LEFT \\n[#HDRFTR_CTR_PAD_RIGHT]u . HDRFTR_CENTER_PAD RIGHT \\n[#HDRFTR_CTR_PAD_TMP]u .END \# \# HDRFTR RIGHT \# ------------ \# *Argument: \# \# *Function: \# Creates or modifies string $HDRFTR_RIGHT. \# Creates register #USER_DEF_HDRFTR_RIGHT, which, if 1, \# overrides the $HDRFTR_RIGHT string created by default \# in DEFAULTS. \# *Notes: \# Default is document title. \# \# If the argument is the # character, simply prints the current \# page number. \# \# If the user wants to incorporate the page number into the string, \# \*[PAGE#] must be used. For example, if the user wants to put \# an ellipsis before the page number in the string, s/he should use \# ...\*[PAGE#], not ...# \# .MAC HDRFTR_RIGHT END . nr #USER_DEF_HDRFTR_RIGHT 1 . ds $HDRFTR_RIGHT \\$1 .END \# \# HDRFTR RIGHT CAPS AND SMALLCAPS \# ------------------------------- \# *Argument: \# | \# *Function: \# Turns capitalisation of $HDRFTR_RIGHT (typically, the title of \# the document) on or off. \# *Notes: \# Default is on. \# .MAC HDRFTR_RIGHT_SMALLCAPS END . if \\n[#HDRFTR_RIGHT_SMALLCAPS]=1 \ . CAPS_SMALLCAPS_WARNING RIGHT . ie '\\$1'' .nr #HDRFTR_RIGHT_SMALLCAPS 1 . el \ . nr #HDRFTR_RIGHT_SMALLCAPS 0 .END \# \# HDRFTR RULE \# ----------- \# *Arguments: \# | \# *Function: \# If invoked via the alias HDRFTR_RULE_INTERNAL in HDRFTR, prints a rule \# under the header/over the footer. Otherwise, turns HDRFTR_RULE \# on or off. \# .MAC HDRFTR_RULE END . if r #HEADERS_ON \ . if \\n[#HEADERS_ON]=1 .nr #HDRFTR_RULE_GAP \\n[#HEADER_RULE_GAP] . if r #FOOTERS_ON \ . if \\n[#FOOTERS_ON]=1 .nr #HDRFTR_RULE_GAP \\n[#FOOTER_RULE_GAP] . if '\\$0'HDRFTR_RULE_INTERNAL' \{\ . ie \\n[#USERDEF_HDRFTR] \{\ . nr #CAP_HEIGHT_ADJUST \\n[#HDRFTR_HEIGHT] . if \\n[#HEADERS_ON] \{\ . rt \\n[y]u . ALD \\n[#HDRFTR_RULE_GAP]u . nr #HDRFTR_RULE_WEIGHT \\n[#HEADER_RULE_WEIGHT] . nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#HEADER_RULE_WEIGHT_ADJ] . \} . if \\n[#FOOTERS_ON] \{\ . rt \\n[y]u . RLD \ \\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u+\\n[#FOOTER_RULE_WEIGHT]u . nr #HDRFTR_RULE_WEIGHT \\n[#FOOTER_RULE_WEIGHT] . nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#FOOTER_RULE_WEIGHT_ADJ] . \} . ie \\n[#HDRFTR_RULE_COLOR]=1 \{\ \m[\\*[$HDRFTR_RULE_COLOR]]\ \D't \\n[#HDRFTR_RULE_WEIGHT]u'\ \h'|0'\ \v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\ \D'l \\n[#DOC_L_LENGTH]u 0'\ \D't \\n[#RULE_WEIGHT]u'\ \h'-\\n[#RULE_WEIGHT]u'\ \m[] . \} . el \{\ \D't \\n[#HDRFTR_RULE_WEIGHT]u'\ \h'|0'\ \v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\ \D'l \\n[#DOC_L_LENGTH]u 0'\ \D't \\n[#RULE_WEIGHT]u'\ \h'-\\n[#RULE_WEIGHT]u' . \} . br . \} . el \{\ . if \\n[#PRINT_STYLE]=1 .nr #CAP_HEIGHT_ADJUST \\n[#CAP_HEIGHT] . if \\n[#PRINT_STYLE]=2 \{\ . ie \\n[#LEFT_CAP_HEIGHT]>\\n[#CENTER_CAP_HEIGHT] \ . nr #CAP_HEIGHT_ADJUST \\n[#LEFT_CAP_HEIGHT] . el .nr #CAP_HEIGHT_ADJUST \\n[#CENTER_CAP_HEIGHT] . ie \\n[#CAP_HEIGHT_ADJUST]>\\n[#RIGHT_CAP_HEIGHT] \ . nr #CAP_HEIGHT_ADJUST \\n[#CAP_HEIGHT_ADJUST] . el .nr #CAP_HEIGHT_ADJUST \\n[#RIGHT_CAP_HEIGHT] . \} . if \\n[#HEADERS_ON] \{\ . rt \\n[y]u . ALD \\n[#HDRFTR_RULE_GAP]u . nr #HDRFTR_RULE_WEIGHT \\n[#HEADER_RULE_WEIGHT] . nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#HEADER_RULE_WEIGHT_ADJ] . \} . if \\n[#FOOTERS_ON] \{\ . rt \\n[y]u . RLD \ \\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u+\\n[#FOOTER_RULE_WEIGHT]u . nr #HDRFTR_RULE_WEIGHT \\n[#FOOTER_RULE_WEIGHT] . nr #HDRFTR_RULE_WEIGHT_ADJ \\n[#FOOTER_RULE_WEIGHT_ADJ] . \} . ie \\n[#HDRFTR_RULE_COLOR]=1 \{\ \m[\\*[$HDRFTR_RULE_COLOR]]\ \D't \\n[#HDRFTR_RULE_WEIGHT]u'\ \h'|0'\ \v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\ \D'l \\n[#DOC_L_LENGTH]u 0'\ \D't \\n[#RULE_WEIGHT]u'\ \h'-\\n[#RULE_WEIGHT]u'\ \m[] . \} . el \{\ \D't \\n[#HDRFTR_RULE_WEIGHT]u'\ \h'|0'\ \v'+\\n[#HDRFTR_RULE_WEIGHT_ADJ]u'\ \D'l \\n[#DOC_L_LENGTH]u 0'\ \D't \\n[#RULE_WEIGHT]u'\ \h'-\\n[#RULE_WEIGHT]u' . \} . br . \} . \} . if '\\$0'HEADER_RULE' \{\ . ie '\\$1'' \{\ . nr #HEADER_RULE 1 . nr #HDRFTR_RULE 1 . \} . el \{\ . nr #HEADER_RULE 0 . nr #HDRFTR_RULE 0 . \} . \} . if '\\$0'FOOTER_RULE' \{\ . ie '\\$1'' \{\ . nr #FOOTER_RULE 1 . nr #HDRFTR_RULE 1 . \} . el \{\ . nr #FOOTER_RULE 0 . nr #HDRFTR_RULE 0 . \} . \} . if '\\$0'HDRFTR_RULE' \{\ . ie '\\$1'' .nr #HDRFTR_RULE 1 . el .nr #HDRFTR_RULE 0 . \} .END . .ALIAS HDRFTR_RULE_INTERNAL HDRFTR_RULE \# \# HDRFTR PLAIN \# ------------ \# *Arguments: \# \# *Function: \# Sets the family, font, and point size of all strings in \# header/footers to the same family and point size as running \# text. Font for the header/footer becomes roman throughout. \# .MAC HDRFTR_PLAIN END . nr #HDRFTR_PLAIN 1 . rm $HDRFTR_FAMILY . rm #HDRFTR_PT_SIZE . rm $HDRFTR_COLOR . rm $HDRFTR_LEFT_FAMILY . rm $HDRFTR_LEFT_FONT . rm $HDRFTR_LEFT_SIZE_CHANGE . rr #HDRFTR_LEFT_CAPS . rr #HDRFTR_LEFT_SMALLCAPS . rr #HDRFTR_LEFT_COLOR . rm $HDRFTR_CENTER_FAMILY . rm $HDRFTR_CENTER_FONT . rm $HDRFTR_CENTER_SIZE_CHANGE . rr #HDRFTR_CENTER_CAPS . rr #HDRFTR_CENTER_SMALLCAPS . rr #HDRFTR_CENTER_COLOR . rm $HDRFTR_RIGHT_FAMILY . rm $HDRFTR_RIGHT_FONT . rm $HDRFTR_RIGHT_SIZE_CHANGE . rr #HDRFTR_RIGHT_CAPS . rr #HDRFTR_RIGHT_SMALLCAPS . rr #HDRFTR_RIGHT_COLOR .END \# \# SWITCH HDRFTR \# ------------- \# *Arguments: \# | \# *Function: \# Creates or modifies register #SWITCH_HDRFTR, used to switch \# default location of HDRFTR_LEFT and HDRFTR_RIGHT. \# *Notes: \# Default is OFF. \# \# Typically, the author string appears at the left of header/footers, \# and the title string appears at the right. This switches the \# location of the two. Useful in conjunction with RECTO_VERSO to tweak \# switches on alternate pages to come out as the user wishes. The \# assumption of RECTO_VERSO is that the first page of the document \# (recto) is odd, and even though it has no header/footer, if it did \# have one, it would print as AUTHOR...CENTER...TITLE (or whatever \# strings the user has supplied for HDRFTR_LEFT/RIGHT), meaning that \# the next page, which does have a header/footer, will come out as \# TITLE...CENTER...AUTHOR (or whatever strings the user has supplied \# for HDRFTR_LEFT/RIGHT). SWITCH_HDRFTRS allows the user to get the \# desired string in the desired place on the desired recto/verso page. \# .MAC SWITCH_HDRFTR END . ie '\\$1'' .nr #SWITCH_HDRFTR 1 . el .nr #SWITCH_HDRFTR 0 .END \# \# USER DEFINED HDRFTR RECTO \# ------------------------- \# *Arguments: \# L | LEFT | C | CENTER | CENTER | R | RIGHT \# *Function: \# Toggles #USERDEF_HDRFTR on, stores quad as #USERDEF_HDRFTR_RECTO_QUAD, \# stores string in $USERDEF_HDRFTR_RECTO. \# *Notes: \# For use when users don't want 3-part headers/footers, but rather \# want to design their own headers/footers and need different \# headers/footers on recto and verso pages. Using just \# HEADER_RECTO or FOOTER_RECTO, even when recto/verso is not on, \# allows users to design their own headers/footers for doc pages. \# .MAC HDRFTR_RECTO END . nr #USERDEF_HDRFTR 1 . ds $QUAD_TYPE \\$1 . substring $QUAD_TYPE 0 0 . if '\\*[$QUAD_TYPE]'L' .nr #USERDEF_HDRFTR_RECTO_QUAD 1 . if '\\*[$QUAD_TYPE]'C' .nr #USERDEF_HDRFTR_RECTO_QUAD 2 . if '\\*[$QUAD_TYPE]'R' .nr #USERDEF_HDRFTR_RECTO_QUAD 3 . shift . ie '\\$1'CAPS' \{\ . nr #HDRFTR_RECTO_CAPS 1 . ds $USERDEF_HDRFTR_RECTO \\$2 . \} . el .ds $USERDEF_HDRFTR_RECTO \\$1 .END \# \# USER DEFINED HDRFTR VERSO \# ------------------------- \# *Arguments: \# L | LEFT | C | CENTER | CENTER | R | RIGHT \# *Function: \# Toggles #USERDEF_HDRFTR on, stores quad as #USERDEF_HDRFTR_VERSO_QUAD, \# stores string in $USERDEF_HDRFTR_VERSO. \# *Notes: \# For use when users don't want 3-part headers/footers, but rather \# want to design their own headers/footers and need different \# headers/footers on recto and verso pages. \# .MAC HDRFTR_VERSO END . nr #USERDEF_HDRFTR 1 . ds $QUAD_TYPE \\$1 . if !'\\*[$QUAD_TYPE]'' .substring $QUAD_TYPE 0 0 . if '\\*[$QUAD_TYPE]'L' .nr #USERDEF_HDRFTR_VERSO_QUAD 1 . if '\\*[$QUAD_TYPE]'C' .nr #USERDEF_HDRFTR_VERSO_QUAD 2 . if '\\*[$QUAD_TYPE]'R' .nr #USERDEF_HDRFTR_VERSO_QUAD 3 . shift . ie '\\$1'CAPS' \{\ . nr #HDRFTR_VERSO_CAPS 1 . ds $USERDEF_HDRFTR_VERSO \\$2 . \} . el .ds $USERDEF_HDRFTR_VERSO \\$1 .END \# \# PRINT FOOTER ON FIRST PAGE \# -------------------------- \# *Arguments: \# | \# *Function: \# Toggles register #PRINT_FOOTER_ON_PAGE_1 \# *Notes: \# Lets user choose whether to print footer on first \# page of doc. \# .MAC FOOTER_ON_FIRST_PAGE END . ie '\\$1'' .nr #PRINT_FOOTER_ON_PAGE_1 1 . el .rr #PRINT_FOOTER_ON_PAGE_1 .END \# \# PRINT PAGE NUMBER ON FIRST PAGE \# ------------------------------- \# *Arguments: \# | \# *Function: \# Toggles register #PRINT_PAGENUM_ON_PAGE_1 \# *Notes: \# Lets user choose whether to print page number on first \# page of doc and after collate when footers are on or page numbering \# has been user set at top of page. \# .MAC PAGENUM_ON_FIRST_PAGE END . ie '\\$1'' .nr #PRINT_PAGENUM_ON_PAGE_1 1 . el .rr #PRINT_PAGENUM_ON_PAGE_1 .END \# \# PRINT HEADER/FOOTER \# ------------------- \# *Arguments: \# \# *Function: \# Based on defaults or values entered by user, prints a \# three-part title at either the top or the bottom of the page. \# *Notes: \# Called from within either HEADER or FOOTER. \# .MAC PRINT_HDRFTR END . if \\n[#DOC_TYPE]=4 .nr #SUITE \En[.pn] . if \\n[#FOOTERS_ON] \{\ . if \\n[#START_FOR_FOOTERS] \{\ . rr #START_FOR_FOOTERS . if \\n[#DOC_TYPE]=5 \{\ . if !\\n[#HDRFTR_BOTH] .PRINT_USERDEF_HDRFTR . return . \} . if !\\n[#PRINT_FOOTER_ON_PAGE_1] \{\ . ie !\\n[#HDRFTR_BOTH] .return . el \{\ . rr #FOOTERS_ON . if !\\n[#COLLATE] .nr #HEADERS_ON 1 . ie \\n[#HEADER_RULE]=1 .HEADER_RULE . el .HEADER_RULE OFF . ie \\n[#HDRFTR_BOTH] .HEADER_VERSO \\*[$HDR_VERSO_QUAD] "\\*[$HDR_VERSO_STRING]" . el .HEADER_RECTO \\*[$HDR_RECTO_QUAD] "\\*[$HDR_RECTO_STRING]" . return . \} . \} . \} . \} . if \\n[#USERDEF_HDRFTR] \{\ . PRINT_USERDEF_HDRFTR . return . \} . if \\n[#SWITCH_HDRFTR] \{\ . ds $HDRFTR_TMP_SWITCH \\*[$HDRFTR_LEFT] . ds $HDRFTR_LEFT \\*[$HDRFTR_RIGHT] . ds $HDRFTR_RIGHT \\*[$HDRFTR_TMP_SWITCH] . ds $HDRFTR_TMP_SIZE_CHANGE_SWITCH \\*[$HDRFTR_LEFT_SIZE_CHANGE] . ds $HDRFTR_LEFT_SIZE_CHANGE \\*[$HDRFTR_RIGHT_SIZE_CHANGE] . ds $HDRFTR_RIGHT_SIZE_CHANGE \\*[$HDRFTR_TMP_SIZE_CHANGE_SWITCH] . nr #HDRFTR_TMP_CAPS_SWITCH \\n[#HDRFTR_LEFT_CAPS] . nr #HDRFTR_LEFT_CAPS \\n[#HDRFTR_RIGHT_CAPS] . nr #HDRFTR_TMP_SMALLCAPS_SWITCH \\n[#HDRFTR_LEFT_SMALLCAPS] . nr #HDRFTR_LEFT_SMALLCAPS \\n[#HDRFTR_RIGHT_SMALLCAPS] . nr #HDRFTR_RIGHT_CAPS \\n[#HDRFTR_TMP_CAPS_SWITCH] . ds $HDRFTR_TMP_COLOR_SWITCH \\*[$HDRFTR_LEFT_COLOR] . ds $HDRFTR_LEFT_COLOR \\*[$HDRFTR_RIGHT_COLOR] . ds $HDRFTR_RIGHT_COLOR \\*[$HDRFTR_TMP_COLOR_SWITCH] . rr #HDRFTR_TMP_CAPS_SWITCH . rm $HDRFTR_TMP_SWITCH . rm $HDRFTR_TMP_SIZE_CHANGE_SWITCH . rm $HDRFTR_TMP_COLOR_SWITCH . nr #SWITCH_HDRFTR 0 . \} . nr #PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ] . if \\n[#ENDNOTES] .PAGENUM_STYLE \\*[$EN_PN_STYLE] . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #LEFT_CAP_HEIGHT \\n[#CAP_HEIGHT] . di . \} . if o .RIGHT . if e .LEFT . if \\n[#RECTO_VERSO]=0 .LEFT . if \\n[#HDRFTR_LEFT_CAPS] .CAPS . ie '\\*[$HDRFTR_LEFT]'#' .PRINT \\n[#PAGENUMBER] . el \{\ . ie !'\\*[$HDRFTR_LEFT]'' .PRINT \\*[$HDRFTR_LEFT] . el .PRINT \& . \} . if \\n[#HDRFTR_LEFT_CAPS] .CAPS OFF . CENTER . if \\n[#HDRFTR_CENTER_CAPS] .CAPS . rt \\n[y]u . ie '\\*[$HDRFTR_CENTER]'#' .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\n[#PAGENUMBER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' . el \{\ . ie !'\\*[$HDRFTR_CENTER]'' .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\*[$HDRFTR_CENTER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' . el .PRINT \& . \} . if \\n[#HDRFTR_CENTER_CAPS] .CAPS OFF . if o .LEFT . if e .RIGHT . if \\n[#RECTO_VERSO]=0 .RIGHT . if \\n[#HDRFTR_RIGHT_CAPS] .CAPS . rt \\n[y]u . ie '\\*[$HDRFTR_RIGHT]'#' .PRINT \\n[#PAGENUMBER] . el \{\ . ie !'\\*[$HDRFTR_RIGHT]'' .PRINT \\*[$HDRFTR_RIGHT] . el .PRINT \& . \} . if \\n[#HDRFTR_RIGHT_CAPS] .CAPS OFF . \} . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#HDRFTR_COLOR]=1 \{\ . nf \m[\\*[$HDRFTR_COLOR]] . \} . fam \\*[$HDRFTR_LEFT_FAM] . ft \\*[$HDRFTR_LEFT_FT] . ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_LEFT_SIZE_CHANGE] . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #LEFT_CAP_HEIGHT \\n[#CAP_HEIGHT] . di . \} . if o .LEFT . if e .RIGHT . if \\n[#RECTO_VERSO]=0 .LEFT . if \\n[#HDRFTR_LEFT_SMALLCAPS] .SMALLCAPS . if \\n[#HDRFTR_LEFT_CAPS] .CAPS . ie '\\*[$HDRFTR_LEFT]'#' \{\ . ie \\n[#HDRFTR_LEFT_COLOR]=1 \ . PRINT \m[\\*[$HDRFTR_LEFT_COLOR]]\\n[#PAGENUMBER]\m[] . el \ . PRINT \\n[#PAGENUMBER] . \} . el \{\ . ie !'\\*[$HDRFTR_LEFT]'' \{\ . ie \\n[#HDRFTR_LEFT_COLOR]=1 \ . PRINT \m[\\*[$HDRFTR_LEFT_COLOR]]\\*[$HDRFTR_LEFT]\m[] . el \ . PRINT \\*[$HDRFTR_LEFT] . \} . el .nop \& . \} . if \\n[#HDRFTR_LEFT_CAPS] .CAPS OFF . if \\n[#HDRFTR_LEFT_SMALLCAPS] .SMALLCAPS OFF . fam \\*[$HDRFTR_CENTER_FAM] . ft \\*[$HDRFTR_CENTER_FT] . ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_CENTER_SIZE_CHANGE] . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #CENTER_CAP_HEIGHT \\n[#CAP_HEIGHT] . di . \} . CENTER . if \\n[#HDRFTR_CENTER_SMALLCAPS] .SMALLCAPS . if \\n[#HDRFTR_CENTER_CAPS] .CAPS . rt \\n[y]u . ie '\\*[$HDRFTR_CENTER]'#' \{\ . ie \\n[#HDRFTR_CENTER_COLOR]=1 .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\m[\\*[$HDRFTR_CENTER_COLOR]]\ \\n[#PAGENUMBER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u'\m[] . el .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\n[#PAGENUMBER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' . \} . el \{\ . ie !'\\*[$HDRFTR_CENTER]'' \{\ . ie \\n[#HDRFTR_CENTER_COLOR]=1 .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\m[\\*[$HDRFTR_CENTER_COLOR]]\ \\*[$HDRFTR_CENTER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u'\m[] . el .PRINT \ \h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\*[$HDRFTR_CENTER]\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' . \} . el .PRINT \& . \} . if \\n[#HDRFTR_CENTER_CAPS] .CAPS OFF . if \\n[#HDRFTR_CENTER_SMALLCAPS] .SMALLCAPS OFF . fam \\*[$HDRFTR_RIGHT_FAM] . ft \\*[$HDRFTR_RIGHT_FT] . ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_RIGHT_SIZE_CHANGE] . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #RIGHT_CAP_HEIGHT \\n[#CAP_HEIGHT] . di . \} . if o .RIGHT . if e .LEFT . if \\n[#RECTO_VERSO]=0 .RIGHT . if \\n[#HDRFTR_RIGHT_SMALLCAPS] .SMALLCAPS . if \\n[#HDRFTR_RIGHT_CAPS] .CAPS . rt \\n[y]u . ie '\\*[$HDRFTR_RIGHT]'#' \{\ . ie \\n[#HDRFTR_RIGHT_COLOR]=1 \ . PRINT \m[\\*[$HDRFTR_RIGHT_COLOR]]\\n[#PAGENUMBER]\m[] . el \ . PRINT \\n[#PAGENUMBER] . \} . el \{\ . ie !'\\*[$HDRFTR_RIGHT]'' \{\ . ie \\n[#HDRFTR_RIGHT_COLOR]=1 \ . PRINT \m[\\*[$HDRFTR_RIGHT_COLOR]]\\*[$HDRFTR_RIGHT]\m[] . el \ . PRINT \\*[$HDRFTR_RIGHT] . \} . el .PRINT \& . \} . if \\n[#HDRFTR_RIGHT_CAPS] .CAPS OFF . if \\n[#HDRFTR_RIGHT_SMALLCAPS] .SMALLCAPS OFF . \} . if \\n[#HDRFTR_RULE] .HDRFTR_RULE_INTERNAL . br .END \# \# PRINT USER DEFINED HEADER/FOOTER \# -------------------------------- \# *Arguments: \# \# *Function: \# Based on defaults or values entered by user, prints a single part \# (i.e. not 3-part) title at either the top or the bottom of the page. \# *Notes: \# Called from within PRINT_HDRFTR. \# .MAC PRINT_USERDEF_HDRFTR END . nr #PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ] . fc ^ # . if \\n[#PRINT_STYLE]=2 \{\ . fam \\*[$HDRFTR_FAM] . ft R . ps \\n[#HDRFTR_PT_SIZE]u . if \\n[#HDRFTR_COLOR]=1 \{\ . nf . COLOR \\*[$HDRFTR_COLOR] . \} . \} . ie \\n[#RECTO_VERSO] \{\ . if o \{\ . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=1 .LEFT . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 .CENTER . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 .RIGHT . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS . if '\\n[.ev]'FOOTER' .vs 0 . PRINT \\*[$USERDEF_HDRFTR_RECTO] . if '\\n[.ev]'FOOTER' .vs . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS OFF . EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] . di . \} . \} . if e \{\ . ie !'\\*[$USERDEF_HDRFTR_VERSO]'' \{\ . if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=1 .LEFT . if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=2 .CENTER . if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=3 .RIGHT . if \\n[#HDRFTR_VERSO_CAPS]=1 .CAPS . if '\\n[.ev]'FOOTER' .vs 0 . PRINT \\*[$USERDEF_HDRFTR_VERSO] . if '\\n[.ev]'FOOTER' .vs . if \\n[#HDRFTR_VERSO_CAPS]=1 .CAPS OFF . EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] . di . \} . \} . el \{\ . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=1 .LEFT . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 .CENTER . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 .RIGHT . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS . if '\\n[.ev]'FOOTER' .vs 0 . PRINT \\*[$USERDEF_HDRFTR_RECTO] . if '\\n[.ev]'FOOTER' .vs . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS OFF . EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] . di . \} . \} . \} . \} . el \{\ . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=1 .LEFT . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 .CENTER . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 .RIGHT . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS . if '\\n[.ev]'FOOTER' .vs 0 . if !r #SKIP .PRINT \\*[$USERDEF_HDRFTR_RECTO] . if '\\n[.ev]'FOOTER' .vs . if \\n[#HDRFTR_RECTO_CAPS]=1 .CAPS OFF . EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS . nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] . di . \} . \} . fc . if \\n[#PRINT_STYLE]=2 \{\ . ie \\n[#HDRFTR_COLOR]=1 \m[\\*[$HDRFTR_COLOR]] . el \m[black] . \} . if \\n[#HDRFTR_RULE] \ . HDRFTR_RULE_INTERNAL .END \# \# +++HEADERS+++ \# \# HEADERS (off or on) \# ------------------- \# *Arguments: \# | \# *Function: \# Turns headers at the top of the page off or on. \# *Notes: \# Default is on. \# .MAC HEADERS END . ie '\\$1'' .nr #HEADERS_ON 1 . el .nr #HEADERS_ON 0 .END \# \# HEADER MARGIN \# ------------- \# *Argument: \# \# *Function: \# Creates or modifies register #HEADER_MARGIN to hold amount \# of space between top of page and header. \# *Notes: \# Requires unit of measure. Default is 4P+6p, measured top-of-page \# to baseline. \# .MAC HEADER_MARGIN END . nr #HEADER_MARGIN (\\$1) .END \# \# HEADER GAP \# ---------- \# *Argument: \# \# *Function: \# Creates or modifies register #HEADER_GAP to hold amount \# of space between header and running text. \# *Notes: \# Default is 1P+6p. \# .MAC HEADER_GAP END . nr #HEADER_GAP (\\$1) .END \# \# HEADER \# ------ \# *Arguments: \# \# *Function: \# Resets margin notes, processes footnote and margin note \# leftover, takes care of recto-verso, prepares for columns after \# first, determines whether to flex-space the page,,outputs \# deferred floats, and does some tbl magic. If headers are \# enabled, prints header appropriate to DOC_TYPE, PRINTSTYLE, and \# COPYSTYLE. \# .MAC HEADER END . vpt 0 . if \\n[#DOC_TYPE]=5 \{\ . if \\n[#SLIDE_FOOTERS] \{\ . PRINT_FOOTER . if \\n[#HDRFTR_BOTH] \ . HEADER_RECTO \\*[$HDR_RECTO_QUAD] "\\*[$HDR_RECTO_STRING]" . \} . \} . nr flex-spaces 0 . nr flex +1 . if \\n[#NEW_DOC_PT_SIZE] .nr #DOC_PT_SIZE \\n[#NEW_DOC_PT_SIZE] . rr #NEW_DOC_PT_SIZE . if \\n[#RESET_TRAPS] \{\ . TRAPS . if \\n[#REMOVE_ADJ] .nr #DOC_LEAD -\\n[#DOC_LEAD_ADJ] . \} . rr #REMOVE_ADJ . rr #RESET_TRAPS . MNtop . rr #FROM_FOOTER . nr #FROM_HEADER 1 . nr #LAST_FN_COUNT_FOR_COLS \\n[#FN_COUNT_FOR_COLS] . if \\n[#FN_DEPTH] .PROCESS_FN_LEFTOVER . rr #RULED . if \\n[#RESET_FN_NUMBER] .nr #FN_NUMBER 0 1 . if !\\n[#DIVERTED] .rr #PREV_FN_DEFERRED . po \\n[#DOC_L_MARGIN]u . if \\n[#RECTO_VERSO] \{\ . if !\\n[#TOC_RV_SWITCH]=2 \{\ . nr #DOC_LR_MARGIN_TMP \\n[#DOC_L_MARGIN] . DOC_LEFT_MARGIN \\n[#DOC_R_MARGIN]u . if \\n[#CROPS] .DOC_LEFT_MARGIN \\n[#DOC_R_MARGIN]u+\\n[cropmarks]u . DOC_RIGHT_MARGIN \\n[#DOC_LR_MARGIN_TMP]u . if \\n[#CROPS] .DOC_RIGHT_MARGIN \\n[#DOC_LR_MARGIN_TMP]u-\\n[cropmarks]u . SWITCH_HDRFTR_CENTER_PAD . \} . \} . ev HEADER . if \\n[#PAGE_NUM_V_POS]=1 .vs 0 . sp |\\n[#HEADER_MARGIN]u-1v . mk y . ll \\n[#DOC_L_LENGTH]u . ta \\n[.l]u . if \\n[#PRINT_STYLE]=1 \{\ . fam \\*[$TYPEWRITER_FAM] . ft R . ps \\*[$TYPEWRITER_PS]\\*[$HDRFTR_SIZE_CHANGE] . \} . if \\n[#PRINT_STYLE]=2 \{\ . fam \\*[$HDRFTR_FAM] . ft R . ps \\n[#DOC_PT_SIZE]u\\*[$HDRFTR_SIZE_CHANGE] . \} . nr #HDRFTR_PT_SIZE \\n[#PT_SIZE] . if \\n[#CAPS_ON] \{\ . nr #CAPS_WAS_ON 1 . CAPS OFF . \} . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#ENDNOTES]=1 \{\ .\" Single-spaced endnotes have a different lead . if \\n[#EN_SINGLESPACE] \{\ . nr #RESTORE_DOC_LEAD \\n[#DOC_LEAD] . nr #DOC_LEAD \\n[#EN_LEAD]u . \} . \} . \} . if !n .nop \X'ps: exec 0 setlinejoin'\X'ps: exec 0 setlinecap' . sp -1v . if \\n[#DOC_TYPE]=5 \{\ . if \\n[#SLIDE_HEADERS] \{\ . HEADERS . if \\n[#SLIDE_FOOTERS] \{\ . FOOTERS off .\" So rule prints after header on first page . if !r #SKIP_RULE \{\ . sp . if \\n[#HEADER_RULE] .HEADER_RULE . nr #SKIP_RULE 1 . \} . \} . \} . \} . ie \\n[#HEADERS_ON] .PRINT_HDRFTR . el \{\ . if \\n[#PAGE_NUM_V_POS]=1 \ . if \\n[#PAGINATE] .PRINT_PAGE_NUMBER . \} . sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#ENDNOTES]=1 \{\ . if \\n[#EN_SINGLESPACE] \{\ . nr #DOC_LEAD \\n[#RESTORE_DOC_LEAD]u . rr #RESTORE_DOC_LEAD . \} . \} . \} . nr #PAGE_TOP \\n[nl] . ev .\" PDF boxes . if \\n[pdfbx-running]=1 \{\ . if !\\n[pdfbx-div-start] \{\ . ps \\n[#SIZE_AT_FOOTER]u . SIZESPECS . ds pdfbx-cap-adj \\*[$CAP_HEIGHT] . ps . sp |\\n[t]u-\\n[#LEAD_AT_FOOTER]u . sp (\\*[wt\\n[stack]]/2u)+\\*[pdfbx-cap-adj]+\\*[gap\\n[stack]]u . ch FOOTER \\n[#VFP\\n[stack]]u . \} . \} . po \\n[#L_MARGIN]u . if \\n[#RECTO_VERSO] .nr #L_MARGIN +\\n[#L_MARGIN_DIFF] . if \\n[#CAPS_WAS_ON] \{\ . CAPS . rr #CAPS_WAS_ON . \} . if \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB] . if \\n[#QUOTE] \{\ . ie \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB] . el \{\ . ie r #\\*[BQ]_OFFSET_VALUE .nr #\\*[BQ]_OFFSET \ \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#\\*[BQ]_OFFSET_VALUE]) . el .nr #\\*[BQ]_OFFSET \\n[#L_MARGIN]+\\*[$\\*[BQ]_OFFSET_VALUE] . ie \\n[#QUOTE]=1 \{\ . if !'\\*[$Q_QUAD]'CENTER' \ . if !'\\*[$Q_QUAD]'RIGHT' \ . po \\n[#Q_OFFSET]u . \} . el .po \\n[#\\*[BQ]_OFFSET]u . \} . if !\\n[pdfbx-running]=0 \{\ . if \\n[#PRINT_STYLE]=2 .sp \\n[#Q_LEAD_DIFF]u . \} . \} . if \\n[#IN_LIST] \ . po +\\n[#LIST_OFFSET_VALUE]u . if \\n[#RESET_FN_COUNTERS]=1 \{\ . rr #RESET_FN_COUNTERS . PROCESS_FN_IN_DIVER . nr #FN_COUNT \\n[#SAVED_FN_COUNT] 1 . if \\n[#COLUMNS]=1 .nr #FN_COUNT_FOR_COLS \\n[#SAVED_FN_COUNT_FOR_COLS] 1 . ie \\n[#RESET_FN_NUMBER]=1 .nr #FN_NUMBER \\n[#SAVED_FN_NUMBER] 1 . el .nr #FN_NUMBER \\n[#FN_NUMBER] 1 . rm FN_IN_DIVER . if dRUNON_FN_IN_DIVER .rm RUNON_FN_IN_DIVER . \} . if \\n[#EPIGRAPH] \{\ . ie \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB] . el \{\ . ie r#EPI_OFFSET_VALUE \ . nr #EPI_OFFSET \ \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) . el \ . nr #EPI_OFFSET \\n[#L_MARGIN]+\\*[$EPI_OFFSET_VALUE] . po \\n[#EPI_OFFSET]u . \} . \} . ie \\n[#EPIGRAPH] \{\ . ie !\\n[#EPI_ACTIVE] \{\ . ns . rr #EPI_ACTIVE . \} . el \{\ . ie \\n[#EPI_FITS] .ns . el .sp \\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u . \} . \} . el .ns . if \\n[#COLUMNS] \{\ . nr #FN_COUNT_FOR_COLS 0 1 . nr #L_MARGIN \\n[#DOC_L_MARGIN] . if \\n[#RECTO_VERSO] .COLUMNS \\n[#NUM_COLS] \\n[#GUTTER]u . nr #COL_NUM 0 1 . mk dc . po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n[.o] . if \\n[#TAB_ACTIVE] .TAB \\n[#CURRENT_TAB] . ll \\n[#COL_L_LENGTH]u . ta \\n[.l]u . if \\n[#QUOTE] \{\ . ie \\n[#\\*[BQ]_OFFSET_VALUE] \ . po +(\\n[#PP_INDENT]u*\\n[#\\*[BQ]_OFFSET_VALUE]u) . el \ . po +\\*[$\\*[BQ]_OFFSET_VALUE] . \} . if \\n[#EPIGRAPH] \{\ . if \\n[#EPI_ACTIVE] \{\ . ie \\n[#EPI_FITS] . . el .nr dc -\\n[#EPI_LEAD_DIFF] . \} . ie r#EPI_OFFSET_VALUE \{\ . po \ \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u+(\\n[#PP_INDENT]u*\\n[#EPI_OFFSET_VALUE]u) . \} . el .po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u+\\*[$EPI_OFFSET_VALUE] . \} . \} . rr #FROM_HEADER . rr #DEFER_SPACE_ADDED . if !\\n[#FN_DEPTH] .if r #DIVERTED .rr #DIVERTED . if \\n[#MN_OVERFLOW_LEFT]=1 \{\ . MN LEFT . nf . MN_OVERFLOW_LEFT . MN . \} . if \\n[#MN_OVERFLOW_RIGHT]=1 \{\ . MN RIGHT . nf . MN_OVERFLOW_RIGHT . MN . \} . rm MN_OVERFLOW_LEFT . rr #MN_OVERFLOW_LEFT . rr #no-repeat-MN-left . rm MN_OVERFLOW_RIGHT . rr #MN_OVERFLOW_RIGHT . rr #no-repeat-MN-right . if \\n[#PRE_COLLATE]=1 .rr #PRE_COLLATE . if \\n[#UNDERLINE_WAS_ON]=1 \{\ . vs 0 . ie !n \ . nop \R'#UNDERLINE_ON 1'\X'ps: exec \\n[_w] \\n[_d] decorline' . el .cu 1000 . br . ns . rr #UNDERLINE_WAS_ON . \} . if \\n[#RESTORE_PAGINATION] \{\ . PAGINATE . rr #RESTORE_PAGINATION . \} . ch RR_@TOP . ie \\n[tbl*have-header] .rr @TOP . el .wh \\n[nl]u+1u RR_@TOP . if \\n[#FLEX_ACTIVE] \{\ . if \\n[#RESTORE_FLEX] \{\ . rr #NO_FLEX . rr #RESTORE_FLEX . \} . if \\n[#RESTORE_COL_FLEX] \{\ . rr #NO_FLEX . rr #RESTORE_COL_FLEX . \} . \} .\" Don't flex the last page/col, or the page/col before a COLLATE, .\" NEWPAGE, COL_NEXT, or BLANKPAGE. . if !dPDF.EXPORT \{\ . if \\n[#FLEX_ACTIVE] \ . if !\\n[#NO_FLEX] \ . nr #RESTORE_FLEX 1 . if '\\*[last-page]'\\n%@\\n[#COL_NUM]' \ . if !\\n[#NO_FLEX] .nr #NO_FLEX 1 . if '\\*[pre-collate-\\n%]'\\n%@\\n[#COL_NUM]' \ . if !\\n[#NO_FLEX] .nr #NO_FLEX 1 . if '\\*[pre-newpage-\\n%]'\\n%@\\n[#COL_NUM]' \ . if !\\n[#NO_FLEX] .nr #NO_FLEX 1 . if d page-\\n%@\\n[#COL_NUM] .nr #NO_FLEX 1 . \} . ie \\n[defer] .PROCESS_FLOATS . el \{\ .\" These two sets of conditions only occur if the .br in .TS causes .\" a page break. . if !\\n[doing-tbl] \{\ . if (\\n[tbl*have-caption]=1)&(\\n[tbl*caption-after-label]=0) \{\ . RESTORE_SPACE . if !\\n[span] \{\ . ie \\n[#MLA] .sp \\n[tbl*label-lead-diff]u . el .sp \\n[tbl*caption-lead-diff]u . \} . \} . \} . \} .\" So tables without TH that don't fit don't overprint first row .\" at top of page . ie \\n[tbl*no-header] \{\ . rs . nop \& . vpt . rr \\n[tbl*no-header] . SHIM_1 . \} . el .vpt . if \\n[span] \{\ . ev FLOAT . if \\n[#INDENT_LEFT_ACTIVE] .in \\n[#L_INDENT]u/2u . nf . RESTORE_SPACE . if !\\n[tbl*no-top-hook] \ . if \\n[tbl*have-header:1] .tbl*print-header . ch FOOTER \\n[#VARIABLE_FOOTER_POS]u . ch FN_OVERFLOW_TRAP -\\n[#FN_OVERFLOW_TRAP_POS]u . \} . if !\\n[begin-tbl] \ . if !r tbl*no-top-hook .tbl@top-hook . rr tbl*no-top-hook . if r flex:force .rr flex:force . rr ref*last . if !\\n[float*defer] .ev 0 . if (\\n[pdfbx-running]=1):(\\n[#DOC_TYPE]=5) \{\ . rr @TOP . ch RR_@TOP . \} . if \\n[pdfbx-running]=1 \ . ch FOOTER \\n[#VFP\\n[stack]]u .END \# \# ==================================================================== \# \# +++FOOTERS+++ \# \# FOOTERS (off or on) \# ------------------- \# *Arguments: \# | \# *Function: \# Turns footers at the bottom of the page off or on. \# *Notes: \# Default is off. If on, page numbers automatically go at \# the top, centered, unless pagination has been turned off, \# or the pagenumber position has been changed to left or right. \# .MAC FOOTERS END . ie '\\$1'' \{\ . rr #HEADERS_ON . nr #FOOTERS_ON 1 . PAGENUM_POS TOP CENTER . \} . el .nr #FOOTERS_ON 0 .END \# \# FOOTER MARGIN \# ------------- \# *Argument: \#