aboutsummaryrefslogtreecommitdiffstats
path: root/doc/expert/exa_equa
diff options
context:
space:
mode:
Diffstat (limited to 'doc/expert/exa_equa')
-rw-r--r--doc/expert/exa_equa149
1 files changed, 149 insertions, 0 deletions
diff --git a/doc/expert/exa_equa b/doc/expert/exa_equa
new file mode 100644
index 0000000..67852b8
--- /dev/null
+++ b/doc/expert/exa_equa
@@ -0,0 +1,149 @@
+@Section
+ @Title { An equation formatting package }
+ @Tag { eq }
+@Begin
+@PP
+In this section we describe the design and implementation of the Eq
+eq. @Index { Eq equation formatting package }
+equation formatting package. Equation formatting makes a natural first
+example, partly because its requirements have strongly influenced the
+design of Lout, and partly because no cross references or galleys are
+required.
+@PP
+To the author's knowledge, Eq is the first equation formatter to be
+implemented as a collection of high-level definitions. This approach
+has significant advantages: the basics of language and layout are
+trivial, so the implementor can concentrate on fine-tuning; and the
+definitions, being readily available, can be improved, extended, or even
+replaced.
+@PP
+As described in the User's Guide @Cite { $kingston1995lout.user }, an
+equation is entered in a format based on the one introduced by the eqn
+language of Kernighan and Cherry @Cite { $kernighan1975eqn }:
+kernighan.b @Index { Kernighan, B. }
+cherry.l @Index { Cherry, L. }
+@ID @Code {
+"@Eq { { x sup 2 + y sup 2 } over 2 }"
+}
+The result is
+@ID @Eq { { x sup 2 + y sup 2 } over 2 }
+In outline, the definition of the @Code "@Eq" symbol is
+eq.example @Index { @Code "@Eq" example }
+@ID @Code {
+"export sup over \"+\" \"2\" \"<=\""
+"def @Eq"
+" body @Body"
+"{"
+" def sup precedence 60 left x right y { ... }"
+" def over precedence 54 left x right y { ... }"
+" def \"2\" { Base @Font \"2\" }"
+" def \"+\" { {Symbol Base} @Font \"+\" }"
+" def \"<=\" { {Symbol Base} @Font \"\\243\" }"
+" ..."
+""
+" Slope @Font 1.2f @Break 0c @Space @Body"
+"}"
+}
+A body parameter is used to restrict the visibility of the equation
+formatting symbols (there are hundreds of them). The equation as a whole
+is set in Slope (i.e. Italic) font, and symbols such as @Code "\"2\"" and
+@Code "\"+\"" are defined when other fonts are needed. Precedences are
+used to resolve ambiguities such as {@Code "a sup b over c"}. Eq takes
+all spacing decisions on itself, so to prevent white space
+typed by the user from interfering, the equation is enclosed in
+{@Code "0c @Space"}. We will discuss the {@Code "1.2f @Break"} later.
+@PP
+Thus have we disposed of the language design part of the equation
+formatting problem; it remains now to define the twenty or so symbols
+with parameters, and get the layout right.
+@PP
+Every equation has an {@I axis}: an imaginary horizontal line through
+the centre of variables, through the bar of built-up fractions, and so
+on. We can satisfy this requirement by ensuring that the result of each
+symbol has a single row mark, on the axis. For example, the
+superscripting symbol is defined as follows:
+sup.example @Index { @Code "sup" example }
+@ID @Code {
+"def sup"
+" precedence 60"
+" associativity left"
+" left x"
+" named gap { @SupGap }"
+" right y"
+"{"
+" @HContract @VContract {"
+" | @Smaller y"
+" ^/gap x"
+" }"
+"}"
+}
+The @Code "@VContract" and @Code "^/" symbols together ensure that the axis
+of the result is the axis of the left parameter. A @Code "gap"
+parameter has been provided for varying the height of the superscript,
+with default value @Code "@SupGap" defined elsewhere as
+{@Code "0.40fk"}. It is important that such gaps be expressed in units
+that vary with the font size, so that they remain correct when the size
+changes. Collecting the default values into symbols like @Code
+"@SupGap" ensures consistency and assists when tuning the values. Here
+is another characteristic definition:
+over.example @Index { @Code "over" example }
+@ID @Code {
+"def over"
+" precedence 54"
+" associativity left"
+" left x"
+" named gap { 0.2f }"
+" right y"
+"{"
+" @HContract @VContract {"
+" |0.5rt @OneCol x"
+" ^//gap @HLine"
+" //gap |0.5rt @OneCol y"
+" }"
+"}"
+}
+Both parameters are centred, since we do not know which will be the
+wider; we use @@OneCol to make sure that the entire parameter is
+centred, not just its first column, and @@HContract ensures that the
+fraction will never expand to fill all the available space, as Lout objects
+have a natural tendency to do (Section {@NumberOf size}). @Code "@HLine"
+is a horizontal line of the width of the column:
+hline.example @Index { @Code "@Hline" example }
+@ID @Code {
+"def @HLine"
+" named line { \"0.05 ft setlinewidth\" }"
+"{ "
+" { \"0 0 moveto xsize 0 lineto\" line \"stroke\" } @Graphic {}"
+"}"
+}
+Here we are relying on the expanding tendency just mentioned.
+@PP
+The remaining symbols are quite similar to these ones. We conclude with
+a few fine points of mathematical typesetting mentioned by a leading
+authority, D. E. Knuth @Cite { $knuth1984tex }.
+knuth.d @Index { Knuth, D. }
+@PP
+Some symbols, such as @Eq {lessequal} and @Eq { notequal }, should have a
+thick space on each side; others, such as @Eq {plus} and @Eq {minus},
+have a medium space; others have a thin space on the right only. This
+would be easy to do except that these spaces are not wanted in
+superscripts and subscripts:
+@ID @Eq { r sup n+1 - 1 }
+In effect, the definition of such symbols changes depending on the
+context; but Lout does not permit such a change. Luckily, the so-called
+`style' information set by the @@Font, @@Break, and @@Space symbols can
+change in this way. Accordingly, Eq uses the @Code y unit, which is
+part of style, for these spaces:
+@ID @Code {
+"def @MedGap { 0.20y }"
+""
+"def \"+\" { &@MedGap plus &@MedGap }"
+""
+"def @HSqueeze right x { 0.2f @YUnit x }"
+}
+In the equation as a whole, the y unit is initially set to
+{@Code 1f}, and so @Code "@MedGap" ordinarily supplies 20% of this
+amount. But superscripts and subscripts are enclosed in the
+@Code "@HSqueeze" symbol, which, by changing the y unit, ensures that
+any @Code "@MedGap" within them is much smaller than usual.
+@End @Section