@SysInclude { eq }
@SysInclude { tab }
@SysInclude { fig }
@SysInclude { pas }
@SysInclude { graph }
@SysInclude { cprint }
@SysInclude { slides }
@SysDatabase @Reference { loutrefs }
@OverheadTransparencies
    @Title { A Practical Introduction to the

Lout

Document Formatting System
}
    @RunningTitle { lout }
    @Author { Jeffrey H. Kingston }
    @Institution {
Basser Dept. of Computer Science
The University of Sydney
}
    @InitialLanguage { English }
//

@Overhead
    @Title { A simple input file }
@Begin
@ID @Code {
"@SysInclude { doc }"
"@Doc @Text @Begin"
"Hello, world"
"@End @Text"
}
@LP
@LP
@Heading { How to format it }
@ID @Code {
"lout filename > out.ps"
"ghostview out.ps"
"mpr out.ps"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
Hello, world
}
@End @Overhead

@Overhead
    @Title { Headings and paragraphs }
@Begin
@ID @Code {
"@SysInclude { doc }"
"@Doc @Text @Begin"
"@Heading { Introduction }"
"@PP"
"The design of the Lout formatting"
"system was undertaken with the"
"needs of the @I { ordinary user }"
"very much in mind."
"@End @Text"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
@Heading { Introduction }
@PP
The design of the Lout formatting
system was undertaken with the
needs of the @I { ordinary user }
very much in mind.
}
@End @Overhead

@Overhead
    @Title { Displays }
@Begin
@ID @Code {
"You certainly don't want to return to"
"his office and report:"
"@IndentedDisplay @I {"
"`I can't find an efficient algorithm, I"
"guess I'm just too dumb.'"
"}"
"To avoid serious damage to your"
"position in the company, it would"
"be better if ..."
}
@End @Overhead

@Overhead @Begin
@ShowPage {
You certainly don't want to return to
his office and report:
@IndentedDisplay @I {
`I can't find an efficient algorithm, I
guess I'm just too dumb.'
}
To avoid serious damage to your
position in the company, it would
be better if ...
}
@End @Overhead

@Overhead
    @Title { Paragraph breaking styles }
@Begin
@ID @Code {
"You certainly don't want to return to"
"his office and report:"
"@ID { ragged nohyphen } @Break @I {"
"`I can't find an efficient algorithm, I"
"guess I'm just too dumb.'"
"}"
"To avoid serious damage to your"
"position in the company, it would"
"be better if ..."
}
@End @Overhead

@Overhead @Begin
@ShowPage {
You certainly don't want to return to
his office and report:
@ID { ragged nohyphen } @Break @I {
`I can't find an efficient algorithm, I
guess I'm just too dumb.'
}
To avoid serious damage to your
position in the company, it would
be better if ...
}
@End @Overhead

@Overhead
    @Title { Lists }
@Begin
@ID @Code {
"@Heading { Operating Instructions }"
"@NumberedList"
"@ListItem { Press small green lever. }"
"@ListItem { Wait approximately 10 seconds"
"until red light flashes. }"
"@ListItem { If smoke emerges from rear of unit,"
"call Service Department. }"
"@EndList"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
@Heading { Operating Instructions }
@NumberedList
@ListItem { Press small green lever. }
@ListItem { Wait approximately 10 seconds
until red light flashes. }
@ListItem { If smoke emerges from rear of unit,
call Service Department. }
@EndList
}
@End @Overhead

@Overhead
    @Title { Technical reports }
@Begin
@ID @Code {
"@SysInclude { report }"
"@Report"
"    @Title { ... }"
"    @Author { ... }"
"    @Institution { ... }"
"    @DateLine { ... }"
"//"
"@Abstract { ... }"
"@Section { ... }"
"@Section { ... }"
"@Section { ... }"
"@Appendix { ... }"
"@Appendix { ... }"
}
@End @Overhead

@Overhead
    @Title { Sections }
@Begin
@ID @Code {
"@Section"
"    @Tag { dfs }"
"    @Title { Depth-first search }"
"@Begin"
"@PP"
"We turn now to our first algorithm"
"on general graphs ..."
"@End @Section"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
@Heading { 10.6.  Depth-first search }
@PP
We turn now to our first algorithm
on general graphs ...
}
@End @Overhead

@Overhead
    @Title { Cross references }
@Begin
@ID @Code {
"For further information, consult"
"Section @NumberOf dfs on page"
"@PageOf { dfs }."
}
@End @Overhead

@Overhead @Begin
@ShowPage {
For further information, consult
Section 10.6 on page 245.
}
@End @Overhead

@Overhead
    @Title { References }
@Begin
@ID @Code {
"@Database @Reference { myrefs }"
"..."
"For the details, consult the User's"
"Guide @Cite { $kingston1995lout.user }."
}
@End @Overhead

@Overhead @Begin
@ShowPage {
For the details, consult the User's
Guide [1].
@LP
...
@LP
@Heading { References }
@NumberedList
@LI @RefPrint kingston1995lout.user
@LI ...
@EndList
}
@End @Overhead

@Overhead
    @Title { Database file myrefs.ld }
@Begin
@ID @Code {
"{ @Reference"
"     @Tag { kingston1995lout.user }"
"     @Type { Book }"
"     @Author { Jeffrey H. Kingston }"
"     @Title { A User's Guide to the Lout"
"Document Formatting System (Version 3) }"
"     @Institution { Basser Department of"
"Computer Science }"
"     @Address { University of Sydney"
"2006, Australia }"
"     @Year { 1994 }"
"}"
}
@End @Overhead

@Overhead
    @Title { Books (and theses) }
@Begin
@BulletList
@LI { Title page, preface, introduction }
@LI { Automatic table of contents }
@LI { Prefatory pages numbered in Roman numerals }
@LI { Chapters, sections, subsections, appendices }
@LI { References at end of chapters or book }
@LI { Running page headers }
@LI { Odd-even page formats }
@LI { Sorted index }
@EndList
@End @Overhead

@Overhead
    @Title { Making a sorted index }
@Begin
@ID @Code {
"@PP"
"There are several possible ways to implement the"
"@I Partition procedure,"
"partition @Index { @I Partition (in {@I Quicksort}) }"
"but the following seems to be the best.  Starting ..."
}
@End @Overhead

@Overhead @Begin
@ShowPage {
@Heading { Index }
@LD lines @Break {
...
partial order, 227
@I Partition (in {@I Quicksort}), 189
postorder traversal
    of binary tree, 19
    topological ordering, 229
...
}
}
@End @Overhead

@Overhead
    @Title { Equation formatting }
@Begin
@ID @Code {
"@SysInclude { eq }"
"..."
"Since @Eq { T(n-i) = T(0) = 0 } we have"
"@IndentedDisplay @Eq {"
"T(n) = big sum from i=0 to n-1 2 sup i = 2 sup n - 1"
"}"
"for the number of disk moves made by the Towers"
"of Hanoi algorithm, given @Eq { n } disks."
}
@End @Overhead

@Overhead @Begin
@ShowPage {
Since @Eq { T(n-i) = T(0) = 0 } we have
@IndentedDisplay @Eq {
T(n) = big sum from i=0 to n-1 2 sup i = 2 sup n - 1
}
for the number of disk moves made by the Towers of Hanoi
algorithm, given @Eq { n } disks.
}
@End @Overhead

@Overhead
    @Title { Another equation }
@Begin
@ID @Code {
"@CenteredDisplay @Eq {"
"big int supp 1 on 0 `"
"dx over sqrt { 1 - x sup 2 }"
"= pi over 2"
"}"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
@CenteredDisplay @Eq {
big int supp 1 on 0 `
dx over sqrt { 1 - x sup 2 }
= pi over 2
}
}
@End @Overhead

@Overhead
    @Title { Tables }
@Begin
@ID @Code {
"@SysInclude { tab }"
"..."
"@Tab"
"    @Fmta { @Col @I A ! @Col B }"
"{"
"@Rowa"
"   A { Fortran }"
"   B { The first ... language }"
"@Rowa"
"   A { Algol-60 }"
"   B { Said to be ... successors }"
"@Rowa"
"   A { Pascal }"
"   B { The famous ... successors }"
"}"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
@Tab
    vmargin { 0.4v }
    @Fmta { @Col @I A ! @Col B }
{
@Rowa
   A { Fortran }
   B { The first high-level
programming language }
@Rowa
   A { Algol-60 }
   B { Said to be a better
language than most of its successors }
@Rowa
   A { Pascal }
   B { The most famous of
Algol-60's successors }
}
}
@End @Overhead

@Overhead
    @Title { Another table }
@Begin
@RID @Code {
"@Tab"
"   hmargin { 0.4c }"
"   vmargin { 0.3v }"
"   side { single }"
"   @Fmta { @Col @B @CC X @Over A,B,C }"
"   @Fmtb { @Col @I A ! @Col B !! @Col C }"
"{"
""
"@Rowa  above { single }"
"   X { Value of mathematical ... dollars) }"
""
"@Rowb  above { double }"
"   A { Quadratic formula }"
"   B { @Eq { x ^= { ... } over 2a } }"
"   C { 3^.5 }"
""
"@Rowb  below { single }"
"   A { Binomial theorem }"
"   B { @Eq { ( a + b ) sup n ^= ... b sup n-k } }"
"   C { 12^ }"
"}"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
0.6 @Scale @Tab
   hmargin { 0.4c }
   vmargin { 0.3v }
   side { single }
   @Fmta { @Col @B @CC X @Over A,B,C }
   @Fmtb { @Col @I A ! @Col B !! @Col C }
{
@Rowa
   above { single }
   X { Value of mathematical formulae (millions of dollars) }
@Rowb
   above { double }
   A { Quadratic formula }
   B { @Eq { x ^= { minus b +- sqrt { b sup 2 - 4ac } } over 2a } }
   C { 3^.5 }
@Rowb
   below { single }
   A { Binomial theorem }
   B { @Eq { ( a + b ) sup n ^= big sum from k=0 to infty 
matrix atleft { ( } atright { ) } { n above k } a sup k b sup n-k
} }
   C { 12^ }
}
}
@End @Overhead

@Overhead
    @Title { Pascal programs }
@Begin
@ID @Code {
"@SysInclude { pas }"
"..."
"@ID @Pas {"
"procedure DoPriAbstract(root: PriEntry);"
"begin"
"    if root^.leftchild <> nil then begin"
"        DoPriAbstract(root^.leftchild);"
"        write(', ');"
"    end;"
"    PriKeyAbstract(root^.key);"
"    write(':');"
"    PriValueAbstract(root^.value);"
"    if root^.rightchild <> nil then begin"
"        write(', ');"
"        DoPriAbstract(root^.rightchild);"
"    end;"
"end;"
"}"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
@Pas {
procedure DoPriAbstract(root: PriEntry);
begin
    if root^.leftchild <> nil then begin
        DoPriAbstract(root^.leftchild);
        write(', ');
    end;
    PriKeyAbstract(root^.key);
    write(':');
    PriValueAbstract(root^.value);
    if root^.rightchild <> nil then begin
        write(', ');
        DoPriAbstract(root^.rightchild);
    end;
end;
} |0io
}
@End @Overhead

@Overhead
    @Title { Basic graphics }
@Begin
@ID @Code {
"45d @Rotate 1.5 @Scale @Box {"
"    Hello, world"
"}"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
@ID @Code {
45d @Rotate 1.5 @Scale @Box {
    Hello, world
}
}
}
@End @Overhead

@Overhead
    @Title { Advanced graphics }
@Begin
@ID @Code {
"@SysInclude { fig }"
"..."
"@Fig {"
"@Box"
"    margin { 0c }"
"    paint { black }"
"@Ellipse"
"    linestyle { noline }"
"    paint { white }"
"{ Hello, world }"
"}"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
@Fig {
@Box
    margin { 0c }
    paint { black }
@Ellipse
    linestyle { noline }
    paint { white }
{ Hello, world }
}
}
@End @Overhead

@Overhead
    @Title { Point labelling }
@Begin
@ID @Code {
"@Fig {"
"A::"
"{"
"    1:: @Ellipse { 3c @Wide 2c @High }"
"    //3c"
"    2:: @Box { 3c @Wide 2c @High }"
"}"
"@ShowLabels"
"}"
}
@End @Overhead

@Overhead @Begin
@ShowPage {
@Fig {
A::
{
    1:: @Ellipse { 3c @Wide 2c @High }
    //3c
    2:: @Box { 3c @Wide 2c @High }
}
@ShowLabels
}
}
@End @Overhead

@Overhead
    @Title { Graphs }
@Begin
@LP
@ID -1p @Font @Code {
"@Graph"
"    abovecaption { New South Wales road deaths"
"(per 100 million vehicle km) }"
"{"
"    @Data  points { plus }  pairs { dashed }"
"    { 1963 5.6  1971 4.3  1976 3.7  1979 3.4"
"    1982 2.9  1985 2.3  1988 2.0 }"
"}"
}
@End @Overhead

@Overhead @Begin
@ShowPage @Graph
    width { 9 cm }
    height { 6 cm }
    abovecaption { New South Wales road deaths
(per 100 million vehicle km) }
{
    @Data
        points { plus }
        pairs { dashed }
    {
        1963 5.6  1971 4.3  1976 3.7  1979 3.4  1982 2.9  1985 2.3  1988 2.0
    }
}
@End @Overhead

@Overhead @Begin
@RID @Code {
"-2p @Font @Graph"
"    style { axes }"
"    xorigin { 0 }  yorigin { 0 }"
"    xticks { 10@ 50@ 100@ 200@ 500@ }"
"    objects {  @NE at { 300 2 } @I { Exponential }"
"      @SE at { ... } @I { Uniform } }"
"    belowcaption { @I n }"
"{"
"    @Data points { filledcircle } { ... }"
"    @Data points { filledcircle } { ... }"
""
"    @Data pairs { dashed }"
"    { 10 2  500 2 }"
""
"    @Data pairs { dashed }"
"    {"
"        xloop from { 10 } to { 500 } by { 20 } do"
"        {"
"            x  sqrt { pi*x / 4 } + 1"
"        }"
"    }"
"}"
}
@End @Overhead

@Overhead @Begin
@ShowPage -2p @Font @Graph
    style { axes }
    xorigin { 0 }
    yorigin { 0 }
    width { 10 cm }
    height { 7 cm }
    xticks { 10@ 50@ 100@ 200@ 500@ }
    objects {
       @NE at { 300 2 } @I { Exponential }
       @SE at { 300 sqrt { pi*300/4 } + 1 } @I { Uniform }
    }
    belowcaption { @I n }
    belowgap { 0 cm }
{
    @Data points { filledcircle }
    { 10 1.97  50 2.01  100 2.00  200 2.0  500 2.00 }

    @Data points { filledcircle }
    { 10 3.53  50 7.45  100 9.32  200 13.41  500 21.63 }

    @Data pairs { dashed }
    { 10 2  500 2 }

    @Data pairs { dashed }
    {
        xloop from { 10 } to { 500 } by { 20 } do
        {
            x  sqrt { pi*x / 4 } + 1
        }
    }
}
@End @Overhead
