|
|
1.1 root 1: .\" @(#)e4 6.1 (Berkeley) 5/22/86
2: .\"
3: .NH
4: The Language
5: .PP
6: We will not try to describe the language precisely here;
7: interested readers may refer to the appendix for more details.
8: Throughout this section, we will write expressions
9: exactly
10: as they are handed to the typesetting program (hereinafter called
11: .UC ``EQN'' ),
12: except that we won't show the delimiters
13: that the user types to mark the beginning and end of the expression.
14: The interface between
15: .UC EQN
16: and
17: .UC TROFF
18: is described at the end of this section.
19: .PP
20: As we said, typing x=y+z+1 should produce $x=y+z+1$,
21: and indeed it does.
22: Variables are made italic, operators and digits become roman,
23: and normal spacings between letters and operators are altered slightly
24: to give a more pleasing appearance.
25: .PP
26: Input is free-form.
27: Spaces and new lines in the input are used by
28: .UC EQN
29: to separate pieces of the input;
30: they are not used to create space in the output.
31: Thus
32: .P1
33: x = y
34: + z + 1
35: .P2
36: also gives $x=y+z+1$.
37: Free-form input is easier to type initially;
38: subsequent editing is also easier,
39: for an expression may be typed as many short lines.
40: .PP
41: Extra white space can be forced into the output by several
42: characters of various sizes.
43: A tilde ``\|~\|'' gives a space equal
44: to the normal word spacing in text;
45: a circumflex gives half this much,
46: and a tab charcter spaces to the next tab stop.
47: .PP
48: Spaces (or tildes, etc.)
49: also serve to delimit pieces of the input.
50: For example, to get
51: .EQ
52: f(t) = 2 pi int sin ( omega t )dt
53: .EN
54: we write
55: .P1
56: f(t) = 2 pi int sin ( omega t )dt
57: .P2
58: Here spaces are
59: .ul
60: necessary
61: in the input
62: to indicate that
63: .ul
64: sin, pi, int,
65: and
66: .ul
67: omega
68: are special, and potentially worth special treatment.
69: .UC EQN
70: looks up each such string of characters
71: in a table, and if appropriate gives it a translation.
72: In this case,
73: .ul
74: pi
75: and
76: .ul
77: omega
78: become their greek equivalents,
79: .ul
80: int
81: becomes the integral sign
82: (which must be moved down and enlarged so it looks ``right''),
83: and
84: .ul
85: sin
86: is made roman, following conventional mathematical practice.
87: Parentheses, digits and operators are automatically made roman
88: wherever found.
89: .PP
90: Fractions are specified with the keyword
91: .ul
92: over:
93: .P1
94: a+b over c+d+e = 1
95: .P2
96: produces
97: .EQ
98: a+b over c+d+e = 1
99: .EN
100: .PP
101: Similarly, subscripts and superscripts are introduced by the keywords
102: .ul
103: sub
104: and
105: .ul
106: sup:
107: .EQ
108: x sup 2 + y sup 2 = z sup 2
109: .EN
110: is produced by
111: .P1
112: x sup 2 + y sup 2 = z sup 2
113: .P2
114: The spaces after the 2's are necessary to mark the end of
115: the superscripts;
116: similarly the keyword
117: .ul
118: sup
119: has to be marked off by spaces or
120: some equivalent delimiter.
121: The return to the proper baseline is automatic.
122: Multiple levels of subscripts or superscripts
123: are of course allowed:
124: ``x\|\|sup\|\|y\|\|sup\|\|z'' is
125: $x sup y sup z$.
126: The construct
127: ``something
128: .ul
129: sub
130: something
131: .ul
132: sup
133: something''
134: is recognized as a special case,
135: so
136: ``x sub i sup 2''
137: is
138: $x sub i sup 2$ instead of ${x sub i} sup 2$.
139: .PP
140: More complicated expressions can now be formed with these
141: primitives:
142: .EQ
143: {partial sup 2 f} over {partial x sup 2} =
144: x sup 2 over a sup 2 + y sup 2 over b sup 2
145: .EN
146: is produced by
147: .P1
148: .ce 0
149: {partial sup 2 f} over {partial x sup 2} =
150: x sup 2 over a sup 2 + y sup 2 over b sup 2
151: .P2
152: Braces {} are used to group objects together;
153: in this case they indicate unambiguously what goes over what
154: on the left-hand side of the expression.
155: The language defines the precedence of
156: .ul
157: sup
158: to be higher than that of
159: .ul
160: over,
161: so
162: no braces are needed to get the correct association on the right side.
163: Braces can always be used when in doubt
164: about precedence.
165: .PP
166: The braces convention is an example of the power
167: of using a recursive grammar
168: to define the language.
169: It is part of the language that if a construct can appear
170: in some context,
171: then
172: .ul
173: any expression
174: in braces
175: can also occur in that context.
176: .PP
177: There is a
178: .ul
179: sqrt
180: operator for making square roots of the appropriate size:
181: ``sqrt a+b'' produces $sqrt a+b$,
182: and
183: .P1
184: x = {-b +- sqrt{b sup 2 -4ac}} over 2a
185: .P2
186: is
187: .EQ
188: x={-b +- sqrt{b sup 2 -4ac}} over 2a
189: .EN
190: Since large radicals look poor on our typesetter,
191: .ul
192: sqrt
193: is not useful for tall expressions.
194: .PP
195: Limits on summations, integrals and similar
196: constructions are specified with
197: the keywords
198: .ul
199: from
200: and
201: .ul
202: to.
203: To get
204: .EQ
205: sum from i=0 to inf x sub i -> 0
206: .EN
207: we need only type
208: .P1
209: sum from i=0 to inf x sub i -> 0
210: .P2
211: Centering and making the $SIGMA$ big enough and the limits smaller
212: are all automatic.
213: The
214: .ul
215: from
216: and
217: .ul
218: to
219: parts are both optional,
220: and the central part (e.g., the $SIGMA$)
221: can in fact be anything:
222: .P1
223: lim from {x -> pi /2} ( tan~x) = inf
224: .P2
225: is
226: .EQ
227: lim from {x -> pi /2} ( tan~x) = inf
228: .EN
229: Again,
230: the braces indicate just what goes into the
231: .ul
232: from
233: part.
234: .PP
235: There is a facility for making braces, brackets, parentheses, and vertical bars
236: of the right height, using the keywords
237: .ul
238: left
239: and
240: .ul
241: right:
242: .P1
243: left [ x+y over 2a right ]~=~1
244: .P2
245: makes
246: .EQ
247: left [ x+y over 2a right ]~=~1
248: .EN
249: A
250: .ul
251: left
252: need not have a corresponding
253: .ul
254: right,
255: as we shall see in the next example.
256: Any characters may follow
257: .ul
258: left
259: and
260: .ul
261: right,
262: but generally only various parentheses and bars are meaningful.
263: .PP
264: Big brackets, etc.,
265: are often used with another facility,
266: called
267: .ul
268: piles,
269: which make vertical piles of objects.
270: For example,
271: to get
272: .EQ
273: sign (x) ~==~ left {
274: rpile {1 above 0 above -1}
275: ~~lpile {if above if above if}
276: ~~lpile {x>0 above x=0 above x<0}
277: .EN
278: we can type
279: .P1
280: sign (x) ~==~ left {
281: rpile {1 above 0 above -1}
282: ~~lpile {if above if above if}
283: ~~lpile {x>0 above x=0 above x<0}
284: .P2
285: The construction ``left {''
286: makes a left brace big enough
287: to enclose the
288: ``rpile {...}'',
289: which is a right-justified pile of
290: ``above ... above ...''.
291: ``lpile'' makes a left-justified pile.
292: There are also centered piles.
293: Because of the recursive language definition,
294: a
295: pile
296: can contain any number of elements;
297: any element of a pile can of course
298: contain piles.
299: .PP
300: Although
301: .UC EQN
302: makes a valiant attempt
303: to use the right sizes and fonts,
304: there are times when the default assumptions
305: are simply not what is wanted.
306: For instance the italic
307: .ul
308: sign
309: in the previous example would conventionally
310: be in roman.
311: Slides and transparencies often require larger characters than normal text.
312: Thus we also provide size and font
313: changing commands:
314: ``size 12 bold {A~x~=~y}''
315: will produce
316: $size 12 bold{ A~x~=~y}$.
317: .ul
318: Size
319: is followed by a number representing a character size in points.
320: (One point is 1/72 inch;
321: this paper is set in 9 point type.)
322: .PP
323: If necessary, an input string can be quoted in "...",
324: which turns off grammatical significance, and any font or spacing changes that might otherwise be done on it.
325: Thus we can say
326: .P1
327: lim~ roman "sup" ~x sub n = 0
328: .P2
329: to ensure that the supremum doesn't become a superscript:
330: .EQ
331: lim~ roman "sup" ~x sub n = 0
332: .EN
333: .PP
334: Diacritical marks, long a problem in traditional typesetting,
335: are straightforward:
336: .EQ
337: x dot under + x hat + y tilde + X hat + Y dotdot = z+Z bar
338: .EN
339: is made by typing
340: .P1
341: x dot under + x hat + y tilde
342: + X hat + Y dotdot = z+Z bar
343: .P2
344: .PP
345: There are also facilities for globally changing default
346: sizes and fonts, for example for making viewgraphs
347: or for setting chemical equations.
348: The language allows for matrices, and for lining up equations
349: at the same horizontal position.
350: .PP
351: Finally, there is a definition facility,
352: so a user can say
353: .P1
354: define name "..."
355: .P2
356: at any time in the document;
357: henceforth, any occurrence of the token ``name''
358: in an expression
359: will be expanded into whatever was inside
360: the double quotes in its definition.
361: This lets users tailor
362: the language to their own specifications,
363: for it is quite possible to redefine
364: keywords
365: like
366: .ul
367: sup
368: or
369: .ul
370: over.
371: Section 6 shows an example of definitions.
372: .PP
373: The
374: .UC EQN
375: preprocessor reads intermixed text and equations,
376: and passes its output to
377: .UC TROFF.
378: Since
379: .UC TROFF
380: uses lines beginning with a period as control words
381: (e.g., ``.ce'' means ``center the next output line''),
382: .UC EQN
383: uses the sequence ``.EQ'' to mark the beginning of an equation and
384: ``.EN'' to mark the end.
385: The ``.EQ'' and ``.EN'' are passed through to
386: .UC TROFF
387: untouched,
388: so they can also be used by a knowledgeable user to
389: center equations, number them automatically, etc.
390: By default, however,
391: ``.EQ'' and ``.EN'' are simply ignored by
392: .UC TROFF ,
393: so by default equations are printed in-line.
394: .PP
395: ``.EQ'' and ``.EN'' can be supplemented by
396: .UC TROFF
397: commands as desired;
398: for example, a centered display equation
399: can be produced with the input:
400: .P1
401: .ce 0
402: .in 5
403: .ce
404: .EQ
405: x sub i = y sub i ...
406: .EN
407: .in 0
408: .P2
409: .PP
410: Since it is tedious to type
411: ``.EQ'' and ``.EN'' around very short expressions
412: (single letters, for instance),
413: the user can also define two characters to serve
414: as the left and right delimiters of expressions.
415: These characters are recognized anywhere in subsequent text.
416: For example if the left and right delimiters have both been set to ``#'',
417: the input:
418: .P1
419: Let #x sub i#, #y# and #alpha# be positive
420: .P2
421: produces:
422: .P1
423: Let $x sub i$, $y$ and $alpha$ be positive
424: .P2
425: .PP
426: Running a preprocessor is strikingly easy on
427: .UC UNIX.
428: To typeset
429: text stored in file
430: ``f\|'',
431: one issues the command:
432: .P1
433: eqn f | troff
434: .P2
435: The vertical bar connects the output
436: of one process
437: .UC (EQN)
438: to the input of another
439: .UC (TROFF) .
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.