diff options
Diffstat (limited to 'doc/expert/pre_conc')
-rw-r--r-- | doc/expert/pre_conc | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/doc/expert/pre_conc b/doc/expert/pre_conc new file mode 100644 index 0000000..4ce6e2b --- /dev/null +++ b/doc/expert/pre_conc @@ -0,0 +1,325 @@ +@Section + @Title { Concatenation symbols and paragraphs } + @Tag { concatenation } +@Begin +@PP +There are ten concatenation symbols, in three families: +concatenation. @Index { Concatenation symbols } +@ID @Tab + vmargin { 0.5vx } + @Fmta { @Col @Code A ! @Col @Code B ! @Col @Code C ! @Col @Code D ! @Col E } +{ +@Rowa A { "/" } B { "^/" } C { "//" } D { "^//" } E { Vertical concatenation } +@Rowa A { "|" } B { "^|" } C { "||" } D { "^||" } E { Horizontal concatenation } +@Rowa A { "&" } B { "^&" } C { } D { } E {In-paragraph concatenation} +} +Each symbol produces an object which combines together the two +parameters. The right parameter must be separated from the symbol by at +least one white space character. +@PP +The vertical concatenation symbol @Code "/" places its left parameter +vertical.concatenation @Index { Vertical concatenation } +above its right parameter with their column marks aligned. If one +parameter has more column marks than the other, empty columns are +inserted at the right to equalize the numbers. The variant @Code "//" +ignores column marks and left-justifies the objects. +@PP +The horizontal concatenation symbols @Code "|" and @Code "||" are horizontal +horizontal.concatenation @Index { Horizontal concatenation } +analogues of @Code "/" and {@Code "//"}: they place their two parameters side +by side, with row mark alignment or top-justification respectively. The +in.paragraph.concatenation @Index { In-paragraph concatenation } +in-paragraph concatenation symbol @Code "&" produces horizontal concatenation +within a paragraph; its special properties are treated in detail at the +end of this section. +@PP +The concatenation symbols in any one family are @I { mutually associative }, +which means that +@ID { +@Code "{" @I x {@Code "|"}{@I p} @I y @Code "}" {@Code "|"}{@I q} @I z +} +is always the same as +@ID { +@I x {@Code "|"}{@I p} @Code "{" @I y {@Code "|"}{@I q} @I z @Code "}" +} +for any objects {@I x}, {@I y}, and {@I z}, any gaps @I p and @I q (defined +below), and any choice of {@Code "|"}, {@Code "^|"}, {@Code "||"}, and +{@Code "^||"}. In practice we always omit such braces, since they are +redundant and can be misleading. The result of the complete sequence of +concatenations will be called the {@I{whole concatenation object}}, and +the objects which make it up will be called the {@I components}. +@PP +One mark is designated as the @I { principal mark }, usually the mark of +principal.mark @Index { Principal mark } +the first component. A later mark can be chosen for this honour by +attaching {@Code "^"} to the preceding concatenation symbol. See Section +{@NumberOf onerow} for examples. +@PP +A {@I gap}, +gap @Index Gap +specifying the distance between the two +parameters, may follow any concatenation symbol. There may be no spaces +between a concatenation symbol and its gap. A missing gap is taken +to be {@Code 0ie}. The gap is effectively a third parameter of the +concatenation symbol, and it may be an arbitrary object provided that it +evaluates to a juxtaposition of simple words. In general, the gap must +be enclosed in braces, like this: +@ID @Code { +"//{ @Style&&mystyle @Open { @TopMargin } }" +} +but the braces may be omitted when the object is a juxtaposition of +simple words or an invocation of a symbol without parameters, as in +@Code "//0.3vx" and {@Code "||@Indent"}. +@PP +A gap consists of a length plus a gap mode plus an optional indication +of unbreakability. A @I length +length @Index { Length } +is represented by an decimal number (which may not be negative) followed +by a unit of measurement. For example, @Code "2.5c" represents the +length 2.5 centimetres. Figure {@NumberOf units} gives the full selection +of units of measurement. +c.unit @Index { @Code c unit } +p.unit @Index { @Code p unit } +m.unit @Index { @Code m unit } +f.unit @Index { @Code f unit } +s.unit @Index { @Code s unit } +v.unit @Index { @Code v unit } +w.unit @Index { @Code w unit } +b.unit @Index { @Code b unit } +r.unit @Index { @Code r unit } +d.unit @Index { @Code d unit } + +@Figure + @Caption { The thirteen units of measurement provided by Lout. } + @Tag { units } +@Begin + @Tab + vmargin { 0.3v } + side { yes } + @Fmta { @Col @Code A ! @Col B } + { + @Rowa above { yes } A { c } B { Centimetres. } + @Rowa A { i } B { Inches. +} + @Rowa A { p } B { Points ({@Code 72p} = {@Code 1i}). +} + @Rowa A { m } B { Ems ({@Code 12m} = {@Code 1i}). +} + @Rowa A { f } B { +One @Code f equals the size of the current font, as specified by +the @@Font symbol (Section {@NumberOf font}). This unit is +appropriate for lengths that should change with the font size. +} + @Rowa A { s } B { +One @Code s equals the preferred gap between two words in the +current font, as specified in the definition of the font, or by the +@@Space symbol (Section {@NumberOf break}). +} + @Rowa A { v } B { +One @Code v equals the current gap between lines introduced during +paragraph breaking, as specified by the @@Break symbol (Section +{@NumberOf break}). This unit is appropriate for lengths, such as the +spaces between paragraphs, which should change with the inter-line gap. +} + @Rowa A { w } B { +One @Code w equals the width of the following component, or its height if the +symbol is vertical concatenation. +} + @Rowa A { b } B { +One @Code b equals the width of the whole concatenation object, +or its height if the symbol is vertical concatenation. +} + @Rowa A { r } B { +One @Code r equals one @Code b minus one {@Code w}. This unit is used +for centring, and for left and right justification. +} + @Rowa A { d } B { +Degrees. This unit may only be used with the @Code "@Rotate" symbol. +} + @Rowa A { y } B { +One @Code y equals the current value set by the @Code "@YUnit" +symbol (Section {@NumberOf yunit}). This unit is not used internally +by Lout; it is included for the convenience of application packages. +} + @Rowa below { yes } A { z } B { +One @Code z equals the current value set by the @Code "@ZUnit" +symbol (Section {@NumberOf yunit}). This unit is not used internally +by Lout; it is included for the convenience of application packages. +} + } +@End @Figure + +@PP +After the length comes an optional @I {gap mode}, +gap.mode @Index { Gap mode } +which is a single letter following the length, indicating how the length +is to be measured. As shown in Figure {@NumberOf gapmodes}, + +@Figure + @Tag { gapmodes } + @Caption { The six gap modes provided by Lout. } +@Begin +@Fig { +{ /2.5vx Edge-to-edge |0.3i {@Code "|"} &1p {@I l} &1p {@Code e} + /4vx Hyphenation |0.3i {@Code "|"} &1p {@I l} &1p {@Code h} + /4vx Overstrike |0.3i {@Code "|"} &1p {@I l} &1p {@Code o} + /4vx Mark-to-mark |0.3i {@Code "|"} &1p {@I l} &1p {@Code x} + /4vx Kerning |0.3i {@Code "|"} &1p {@I l} &1p {@Code k} + /4vx Tabulation |0.3i {@Code "|"} &1p {@I l} &1p {@Code t} +} +||0.5i +@Box margin { 0c } 6c @Wide 13.2c @High 9p @Font +{ + @OneRow { + @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co } + @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co } + @At { 2.2c @Wide 1.4c @High } @Put { @DoubleArrow 1.8c } + @At { 2.2c @Wide 1.6c @High } @Put { 1.8c @Wide { &0.5rt @I l } } + } + //4vx + @OneRow { + @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co } + @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co } + @At { 2.2c @Wide 1.4c @High } @Put { @DoubleArrow 1.8c } + @At { 2.2c @Wide 1.6c @High } @Put { 1.8c @Wide { &0.5rt @I l } } + } + //4vx + @OneRow { + @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co } + @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co } + @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c } + @At { 1.2c @Wide 1.7c @High } @Put { 3.3c @Wide { &0.5rt @I l } } + } + //4vx + @OneRow { + @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co } + @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co } + @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c } + @At { 1.2c @Wide 1.7c @High } + @Put 3.3c @Wide { |0.5rt { max( {@I {l, a+b+l"/10"}}) } } + @At { 1.2c @Wide 0.4c @High } @Put { @DoubleArrow 1.0c } + @At { 1.2c @Wide 0.2c @High } @Put { 1.0c @Wide { &0.5rt @I a } } + @At { 4c @Wide 0.4c @High } @Put { @DoubleArrow 0.5c } + @At { 4c @Wide 0.2c @High } @Put { 0.5c @Wide { &0.5rt @I b } } + } + //4vx + @OneRow { + @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co } + @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co } + @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c } + @At { 1.2c @Wide 1.7c @High } + @Put { 3.3c @Wide { |0.5rt max( {@I {l, a, b}})}} + @At { 1.2c @Wide 0.4c @High } @Put { @DoubleArrow 1.0c } + @At { 1.2c @Wide 0.2c @High } @Put { 1.0c @Wide { &0.5rt @I a } } + @At { 4c @Wide 0.4c @High } @Put { @DoubleArrow 0.5c } + @At { 4c @Wide 0.2c @High } @Put { 0.5c @Wide { &0.5rt @I b } } + } + //4vx + @OneRow { + @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co } + @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co } + @At { 0.0c @Wide 1.6c @High } @Put { @DoubleArrow 4.0c } + @At { 2.8c @Wide 1.8c @High } @Put { @I l } + } + //5vx + @DoubleArrow 6c + //0.1c |0.5rt @I { current bound } +} + +} +@End @Figure +with edge-to-edge gap mode +edge.to.edge @Index { Edge-to-edge gap mode } +e.gap.mode @Index { @Code e gap mode } +the length @I l is measured from the trailing edge +of the first object to the leading edge of the second. Edge-to-edge is the +default mode: the @Code e may be omitted. Hyphenation gap mode is +hyphenation.gap @Index { Hyphenation gap mode } +h.gap.mode @Index { @Code h gap mode } +similar, except as explained at the end of this section. +@PP +Mark-to-mark, +mark.to.mark @Index { Mark-to-mark gap mode } +x.gap.mode @Index { @Code x gap mode } +overstrike, +overstrike @Index { Overstrike gap mode } +o.gap.mode @Index { @Code o gap mode } +and kerning +kerning.mode @Index { Kerning gap mode } +k.gap.mode @Index { @Code k gap mode } +measure the length from the last mark +of the first object to the first mark of the second. In the case of +mark-to-mark, if the length is too small to prevent the objects +almost overlapping, it is widened until they no longer do. (The extra +@I { "l/10" } is not applied when plain text output is in effect.) Kerning +also widens, with the aim of preventing the mark of either object from +overlapping the other object; this mode is used for subscripts and +superscripts. +@PP +tabulation @Index { Tabulation gap mode } +t.gap.mode @Index { @Code t gap mode } +centring @Index { Centring } +right.justif @Index { Right justification } +Tabulation ignores the first object and places the leading edge of the +second object at a distance @I l from the left edge of the whole +concatenation object. It is the main user of the @Code b and @Code r +units of measurement; for example, @Code "|1rt" will right-justify the +following component, and @Code "|0.5rt" will centre it. +@PP +The value @Code "|0rt" separating the first and second items in a +sequence of horizontally concatenated objects is somewhat special in +that it denotes left justification of the object to its left in the +available space. This is identical with @Code "|0ie" when the object to +the left also has the principal mark; but when it does not, @Code "|0rt" +will cause the object to the left to appear further to the left than it +would otherwise have done, if space to do so is available. +@PP +A gap is optionally concluded with an indication of unbreakability, +which is a letter @Code "u" appended to the gap. A paragraph will +never be broken at an unbreakable gap, nor will a galley be broken +across two targets at such a gap. Basser Lout's implementation is +slightly defective in that it ignores any unbreakable indication +in the gap separating the first component promoted into any target +from the second. +@PP +When two objects are separated only by zero or more white space +white.space.when @SubIndex { when significant } +space.f.when @SubIndex { when significant } +characters (spaces, tabs, newlines, and formfeeds), Lout inserts +{@Code "&"}{@I k}{@Code "s"} between the two objects, where @I k is the +number of spaces. Precisely, @I k is determined by discarding all space +characters and tabs that precede newlines (these are invisible so are +better ignored), then counting 1 for each newline, formfeed or space, +and 8 for each tab character. The gap will be unbreakable if @I k +is zero. +@PP +A sequence of two or more objects separated by @Code "&" symbols is a +paragraph.breaking.in.detail @SubIndex { in detail } +{@I paragraph}. Lout breaks paragraphs into lines automatically as +required, by converting some of the @Code "&" symbols into +{@Code "//1vx"}. Unbreakable gaps are not eligible for this +conversion. `Optimal' line breaks are chosen, using a +method adapted from @TeX @Cite { $knuth1984tex }. +tex @RawIndex { @TeX } +tex.optimal @SubIndex { optimal paragraph breaking } +@PP +If an @Code "&" symbol whose gap has hyphenation mode +hyphenation @Index { Hyphenation gap mode } +tex.hyphenation @SubIndex { hyphenation } +is chosen for replacement by {@Code "//1vx"}, a hyphen will be appended to +the preceding object, unless that object is a word which already ends with +a hyphen. For example, +@ID @Code { +Long words may be "hyph &0ih enat &0ih ed." +} +could have the following result, depending where the line breaks fall: +@ID 2i @Wide { +Long words may be hyph &0ih enat &0ih ed. +} +Basser Lout inserts hyphenation gaps automatically as required, again +following the method of @TeX, which approximates the hyphenations in +Webster's dictionary. To prevent the hyphenation of a single word, +enclose it in quotes. Further control over paragraph breaking and +hyphenation is provided by the @@Break and @@Space symbols (Sections +{@NumberOf break} and {@NumberOf space}). +@End @Section |