@Section @Title { Horizontal galleys } @Tag { horizontal } @Begin @PP All the galleys so far have been @I { vertical galleys }: galleys whose components are separated by vertical concatenation symbols. There are also horizontal galleys, whose components are separated by the horizontal concatenation operator @Code "&" (or equivalently, by spaces). These work in the same way as vertical galleys, except for the change of direction. For example, the following defines the equivalent of an ordinary outdented paragraph, except that an option is provided for varying the size of the outdent: @ID @Code { "def @OutdentPar" " named outdent { 2f }" " right x" "{" " def @ParPlace { @Galley }" "" " def @LineList" " {" " outdent @Wide {} | @PAdjust @ParPlace" " //1vx @LineList" " }" "" " def @ParGalley force horizontally into { @ParPlace&&preceding }" " right x" " {" " x" " }" "" " @PAdjust @ParPlace" " // @ParGalley { x &1rt }" " //1vx @LineList" "}" } Notice the use of @Code "&1rt" to cancel the effect of @Code "@PAdjust" on the last line of the paragraph. This definition has a problem in that there will be a concluding unexpanded @Code "@LineList" symbol which will hold up promotion of the enclosing galley; this problem may be fixed by the same method used to end a list. @PP In an ideal world, there would be nothing further to say about horizontal galleys. However there are a few differences which arise from various practical considerations and limitations. Perhaps some day a more perfect symmetry will be implemented. @PP Each vertical galley has a fixed finite width, and every component is broken to that width. This is needed basically to trigger paragraph breaking. However, there is no equivalent of paragraph breaking in the vertical direction, so horizontal galleys do not have any particular fixed height. Instead, each component has its own individual height. @PP When two objects are separated by {@Code "/"}, they are assigned the same width (Section {@NumberOf targets}), and this holds true even if the two objects are subsequently separated by being promoted into different targets. For example, two aligned equations will have the same width, and hence their alignment will be preserved, even if they appear in different columns or pages. However, even though @Code "&" aligns the marks of its two parameters, it does not assign them a common height. This means that the height of any component of a horizontal galley promoted into one target does not affect the height consumed by the components promoted into any other target. The other horizontal concatenation operator, {@Code "|"}, does assign a common height to its two parameters; but sequences of objects separated by this operator cannot be the components of a horizontal galley. @PP Lout is able to read vertical galleys one paragraph at a time; in this way it processes the document in small chunks, never holding more than a few pages in memory at any time. However, horizontal galleys are always read in completely, so they should not be extremely long. @PP In principle Lout should be able to hyphenate the components of horizontal galleys when they are simple words, but this is not implemented at present. @PP In an ideal world, every paragraph would be treated as a horizontal galley. However, to do so in practice would be too slow and would lead to excessive clumsiness in notation, so at present Lout has two competing mechanisms in this area: the built-in paragraph breaker with its limited set of options as given under the @Code "@Break" operator, and horizontal galleys. As the example above shows, horizontal galleys are in principle capable of implementing many more paragraph styles than the built-in paragraph breaker could ever hope to do. The recommended practical strategy is to use the built-in paragraph breaker most of the time, and switch to horizontal galleys only for occasional tricks, such as paragraphs with drop capitals, circular outlines, etc. @End @Section