Annotation of 43BSDReno/share/doc/usd/25.trofftut/tt10, revision 1.1.1.1

1.1       root        1: .\"    @(#)tt10        6.1 (Berkeley) 5/23/86
                      2: .\"
                      3: .NH
                      4: Number Registers and Arithmetic
                      5: .PP
                      6: .UL troff
                      7: has a facility for doing arithmetic,
                      8: and for defining and using variables with numeric values,
                      9: called
                     10: .ul
                     11: number registers.
                     12: Number registers, like strings and macros, can be useful in setting up a document
                     13: so it is easy to change later.
                     14: And of course they serve for any sort of arithmetic computation.
                     15: .PP
                     16: Like strings, number registers have one or two character names.
                     17: They are set by the
                     18: .BD .nr
                     19: command,
                     20: and are referenced anywhere by
                     21: .BD \enx
                     22: (one character name) or
                     23: .BD \en(xy
                     24: (two character name).
                     25: .PP
                     26: There are quite a few pre-defined number registers maintained by
                     27: .UL troff ,
                     28: among them
                     29: .BD %
                     30: for the current page number;
                     31: .BD nl
                     32: for the current vertical position on the page;
                     33: .BD dy ,
                     34: .BD mo
                     35: and
                     36: .BD yr
                     37: for the current day, month and year; and
                     38: .BD .s
                     39: and
                     40: .BD .f
                     41: for the current size and font.
                     42: (The font is a number from 1 to 4.)
                     43: Any of these can be used in computations like any other register,
                     44: but some, like
                     45: .BD .s
                     46: and
                     47: .BD .f ,
                     48: cannot be changed with
                     49: .BD .nr .
                     50: .PP
                     51: As an example of the use of number registers,
                     52: in the
                     53: .BD \-ms
                     54: macro package [4],
                     55: most significant parameters are defined in terms of the values
                     56: of a handful of number registers.
                     57: These include the point size for text, the vertical spacing,
                     58: and the line and title lengths.
                     59: To set the point size and vertical spacing for the following paragraphs, for example, a user may say
                     60: .P1
                     61: ^nr PS 9
                     62: ^nr VS 11
                     63: .P2
                     64: The paragraph macro
                     65: .BD .PP
                     66: is defined (roughly) as follows:
                     67: .P1
                     68: .ta  1i
                     69: ^de PP
                     70: ^ps \e\en(PS   \e" reset size
                     71: ^vs \e\en(VSp  \e" spacing
                     72: ^ft R  \e" font
                     73: ^sp 0.5v       \e" half a line
                     74: ^ti +3m
                     75: ^^
                     76: .P2
                     77: This sets the font to Roman and the point size and line spacing
                     78: to whatever values are stored in the number registers
                     79: .BD PS
                     80: and
                     81: .BD VS .
                     82: .PP
                     83: Why are there two backslashes?
                     84: This is the eternal problem of how to quote a quote.
                     85: When
                     86: .UL troff
                     87: originally reads the macro definition,
                     88: it peels off one backslash
                     89: to see what's coming next.
                     90: To ensure that another is left in the definition when the 
                     91: macro is
                     92: .ul
                     93: used,
                     94: we have to put in two backslashes in the definition.
                     95: If only one backslash is used, 
                     96: point size and vertical spacing will be frozen at the time the macro
                     97: is defined, not when it is used.
                     98: .PP
                     99: Protecting by an extra layer of backslashes
                    100: is only needed for
                    101: .BD \en ,
                    102: .BD \e* ,
                    103: .BD \e$
                    104: (which we haven't come to yet),
                    105: and
                    106: .BD \e
                    107: itself.
                    108: Things like
                    109: .BD \es ,
                    110: .BD \ef ,
                    111: .BD \eh ,
                    112: .BD \ev ,
                    113: and so on do not need an extra backslash,
                    114: since they are converted by
                    115: .UL troff
                    116: to an internal code immediately upon being seen.
                    117: .WS
                    118: .PP
                    119: Arithmetic expressions can appear anywhere that
                    120: a number is expected.
                    121: As a trivial example,
                    122: .P1
                    123: ^nr PS \e\en(PS\-2
                    124: .P2
                    125: decrements PS by 2.
                    126: Expressions can use the arithmetic operators +, \-, *, /, % (mod),
                    127: the relational operators >, >=, <, <=, =, and != (not equal),
                    128: and parentheses.
                    129: .PP
                    130: Although the arithmetic we have done so far
                    131: has been straightforward,
                    132: more complicated things are somewhat tricky.
                    133: First,
                    134: number registers hold only integers.
                    135: .UL troff
                    136: arithmetic uses truncating integer division, just like Fortran.
                    137: Second, in the absence of parentheses,
                    138: evaluation is done left-to-right
                    139: without any operator precedence
                    140: (including relational operators).
                    141: Thus
                    142: .P1
                    143: 7*\-4+3/13
                    144: .P2
                    145: becomes `\-1'.
                    146: Number registers can occur anywhere in an expression,
                    147: and so can scale indicators like
                    148: .BD p ,
                    149: .BD i ,
                    150: .BD m ,
                    151: and so on (but no spaces).
                    152: Although integer division causes truncation,
                    153: each number and its scale indicator is converted
                    154: to machine units (1/432 inch) before any arithmetic is done,
                    155: so
                    156: 1i/2u
                    157: evaluates to
                    158: 0.5i
                    159: correctly.
                    160: .PP
                    161: The scale indicator
                    162: .BD u
                    163: often has to appear
                    164: when you wouldn't expect it _
                    165: in particular, when arithmetic is being done
                    166: in a context that implies horizontal or vertical dimensions.
                    167: For example,
                    168: .P1
                    169: ^ll 7/2i
                    170: .P2
                    171: would seem obvious enough _
                    172: 3\(12 inches.
                    173: Sorry.
                    174: Remember that the default units for horizontal parameters like
                    175: .BD .ll
                    176: are ems.
                    177: That's really `7 ems / 2 inches',
                    178: and when translated into machine units, it becomes zero.
                    179: How about
                    180: .P1
                    181: ^ll 7i/2
                    182: .P2
                    183: Sorry, still no good _
                    184: the `2' is `2 ems', so `7i/2' is small,
                    185: although not zero.
                    186: You
                    187: .ul
                    188: must
                    189: use
                    190: .P1
                    191: ^ll 7i/2u
                    192: .P2
                    193: So again, a safe rule is to
                    194: attach a scale indicator to every number,
                    195: even constants.
                    196: .PP
                    197: For arithmetic done within a
                    198: .BD .nr
                    199: command,
                    200: there is no implication of horizontal or vertical dimension,
                    201: so the default units are `units',
                    202: and 7i/2 and 7i/2u
                    203: mean the same thing.
                    204: Thus
                    205: .P1
                    206: ^nr ll 7i/2
                    207: ^ll \e\en(llu
                    208: .P2
                    209: does just what you want,
                    210: so long as you
                    211: don't forget the
                    212: .BD u
                    213: on the
                    214: .BD .ll
                    215: command.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.