are available and explains how to lookup which knob to use for a
certain effect.
+
+@cindex Program reference
+
The controls available for tuning are described in a separate
document, the @internalsref{Program reference} manual. That manual
lists all different variables, functions and options available in
Internally, LilyPond uses Scheme (a LISP dialect) to provide
infrastructure. Overriding layout decisions in effect accesses the
-program internals, so it is necessary to learn a (very small) subset
-of Scheme. That is why this chapter starts with a short tutorial on
-entering numbers, lists, strings and symbols in Scheme.
+program internals, which requires Scheme input. Scheme elements are
+introduced in a @code{.ly} file with the hash mark
+@code{#}.@footnote{@ref{Scheme tutorial} contains a a short tutorial
+on entering numbers, lists, strings and symbols in Scheme.}
@menu
-* Scheme tutorial::
-* File structure::
* Interpretation contexts::
-* Tuning output::
+* The \override command::
* Fonts::
* Text markup::
* Global layout::
+* File structure::
@end menu
-@node Scheme tutorial
-@section Scheme tutorial
-
-@cindex Scheme
-@cindex GUILE
-@cindex Scheme, in-line code
-@cindex accessing Scheme
-@cindex evaluating Scheme
-@cindex LISP
-
-LilyPond uses the Scheme programming language, both as part of the
-input syntax, and as internal mechanism to glue together modules of
-the program. This section is a very brief overview of entering data in
-Scheme.@footnote{If you want to know more about Scheme, see
-@uref{http://www.schemers.org}.}
-
-The most basic thing of a language is data: numbers, character
-strings, lists, etc. Here is a list of data types that are relevant to
-LilyPond input.
-
-@table @asis
-@item Booleans
- Boolean values are True or False. The Scheme for True is @code{#t}
- and False is @code{#f}.
-@item Numbers
- Numbers are entered in the standard fashion,
- @code{1} is the (integer) number one, while @code{-1.5} is a
- floating point number (a non-integer number).
-@item Strings
- Strings are enclosed in double quotes,
- @example
- "this is a string"
- @end example
-
- Strings may span several lines
- @example
- "this
- is
- a string"
- @end example
-
- Quotation marks and newlines can also be added with so-called escape
- sequences. The string @code{a said "b"} is entered as
- @example
- "a said \"b\""
- @end example
-
- Newlines and backslashes are escaped with @code{\n} and @code{\\}
-respectively.
-@end table
-
-
-In a music file, snippets of Scheme code are introduced with the hash
-mark @code{#}. So, the previous examples translated in LilyPond are
-
-@example
- ##t ##f
- #1 #-1.5
- #"this is a string"
- #"this
- is
- a string"
-@end example
-
-For the rest of this section, we will assume that the data is entered
-in a music file, so we add @code{#}s everywhere.
-
-Scheme can be used to do calculations. It uses @emph{prefix}
-syntax. Adding 1 and 2 is written as @code{(+ 1 2)} rather than the
-traditional 1+2.
-
-@lisp
- #(+ 1 2)
- @result{} #3
-@end lisp
-
-The arrow @result{} shows that the result of evaluating @code{(+ 1 2)}
-is @code{3}. Calculations may be nested; the result of a function may
-be used for another calculation.
-
-@lisp
- #(+ 1 (* 3 4))
- @result{} #(+ 1 12)
- @result{} #13
-@end lisp
-
-These calculations are examples of evaluations; an expression like
-@code{(* 3 4)} is replaced by its value @code{12}. A similar thing
-happens with variables. After defining a variable
-
-@example
- twelve = #12
-@end example
-
-variables can also be used in expressions, here
-
-@example
- twentyFour = #(* 2 twelve)
-@end example
-
-the number 24 is stored in the variable @code{twentyFour}.
-
-The @emph{name} of a variable is also an expression, similar to a
-number or a string. It is entered as
-
-@example
- #'twentyFour
-@end example
-
-The quote mark @code{'} prevents Scheme interpreter from substituting
-@code{24} for the @code{twentyFour}. Instead, we get the name
-@code{twentyFour}.
-
-This syntax will be used very frequently, since many of the layout
-tweaks involve assigning (Scheme) values to internal variables, for
-example
-
-@example
- \override Stem #'thickness = #2.6
-@end example
-
-This instruction adjusts the appearance of stems. The value @code{2.6}
-is put into a the @code{thickness} variable of a @code{Stem}
-object. This makes stems almost twice as thick as their normal size.
-To distinguish between variables defined in input files (like
-@code{twentyFour} in the example above), and internal variables, we
-will call the latter ``properties.'' So, the stem object has a
-@code{thickness} property.
-
-Two-dimensional offsets (X and Y coordinates) as well as object sizes
-(intervals with a left and right point) are entered as @code{pairs}. A
-pair@footnote{In Scheme terminology, the pair is called @code{cons},
-and its two elements are called car and cdr respectively.} is entered
-as @code{(first . second)} and, like symbols, they must be quoted,
-
-@example
- \override TextScript #'extra-offset = #'(1 . 2)
-@end example
-
-This assigns the pair (1, 2) to @code{extra-offset} variable of the
-TextScript object. This moves the object 1 staff space to the right,
-and 2 spaces up.
-
-The two elements of a pair may be arbitrary values, for example
-
-@example
- #'(1 . 2)
- #'(#t . #f)
- #'("blah-blah" . 3.14159265)
-@end example
-
-A list is entered by enclosing its elements in parentheses, and adding
-a quote. For example,
-@example
- #'(1 2 3)
- #'(1 2 "string" #f)
-@end example
-
-We have been using lists all along. A calculation, like @code{(+ 1
-2)} is also a list (containing the symbol @code{+} and the numbers 1
-and 2). Normally lists are interpreted as calculations, and the Scheme
-interpreter substitutes the outcome of the calculation. To enter a
-list, we stop evaluation. This is done by quoting the list with a
-quote @code{'} symbol. For calculations, do not use a quote.
-
-Inside a quoted list or pair, there is no need to quote anymore. The
-following is a pair of symbols, a list of symbols and a list of lists
-respectively,
-
-@example
- #'(stem . head)
- #'(staff clef key-signature)
- #'((1) (2))
-@end example
-
-@node File structure
-@section File structure
-
-The following items may be present in a @file{.ly} file at toplevel
-
-@itemize @bullet
-@item An output definition, such as @code{\bookpaper}, @code{\midi}
-and @code{\paper}. Such a definition at toplevel changes the default
-settings for the block entered.
-
-@item An @code{\header} block. This sets the global header block. This
-is the block containing the definitions for book-wide settings, like
-composer, title, etc.
-
-@item An @code{\addquote} statement. See @ref{Quoting other voices}
-for more information.
-
-@item A @code{\score} block. This score will be collected with other
-toplevel scores, and combined as a single @code{\book}.
-
-This behavior can be changed by setting the variable
-@code{toplevel-score-handler} at toplevel. The default handler is
-defined in the init file @file{scm/lily.scm}.
-
-@item A @code{\book} block formats the block
-
-This behavior can be changed by setting the variable
-@code{toplevel-book-handler} at toplevel. The default handler is
-defined in the init file @file{scm/lily.scm}.
-
-
-@item A compound music expression, such as
-@example
- @{ c'4 d' e'2 @}
-@end example
-
-This will add the piece in a @code{\score}, and formats it into a
-single book together with all other toplevel @code{\score}s and music
-expressions.
-
-This behavior can be changed by setting the variable
-@code{toplevel-music-handler} at toplevel. The default handler is
-defined in the init file @file{scm/lily.scm}.
-
-@end itemize
-
-The following example shows three things which may be entered at
-toplevel
-@verbatim
- \paper {
- % movements are non-justified by default
- raggedright = ##t
- }
-
- \header {
- title = "Do-re-mi"
- }
-
- { c'4 d' e2 }
-@end verbatim
-
-
-At any point in a file, any of the following lexical instructions can
-be entered:
-
-@itemize @bullet
-@item @code{\version}
-@item @code{\include}
-@item @code{\encoding}
-@item @code{\renameinput}
-@end itemize
-
-
@node Interpretation contexts
@section Interpretation contexts
* Layout tunings within contexts::
* Changing context default settings::
* Defining new contexts::
-* Which properties to change::
@end menu
@node Creating contexts
@end lilypond
@noindent
-the @var{context} argument to @code{\set} is left out, and the current
-@internalsref{Voice} is used.
+the @var{context} argument to @code{\set} is left out, so automatic
+beaming is switched off in the current @internalsref{Voice}.
Contexts are hierarchical, so if a bigger context was specified, for
example @context{Staff}, then the change would also apply to all
@noindent
which removes the definition of @var{prop}. This command removes
-the definition only if it is set in @var{context}. In
+the definition only if it is set in @var{context}, so
@example
- \set Staff.autoBeaming = ##f
- \unset Voice.autoBeaming
+ \set Staff.autoBeaming = ##f
@end example
@noindent
-the current @context{Voice} does not have the property, and the
-definition at @context{Staff} level remains intact. Like @code{\set},
-the @var{context} argument does not have to be specified for a bottom
-context.
+introduces a property setting at @code{Staff} level. The setting also
+applies to the current @code{Voice}. However,
+
+@example
+ \unset Voice.autoBeaming
+@end example
+
+@noindent
+does not have any effect. To cancel this setting, the @code{\unset}
+must be specified on the same level as the original @code{\set}. In
+other words, undoing the effect of @code{Staff.autoBeaming = ##f}
+requires
+@example
+ \unset Staff.autoBeaming
+@end example
+
+Like @code{\set}, the @var{context} argument does not have to be
+specified for a bottom context, so the two statements
+
+@example
+ \set Voice.autoBeaming = ##t
+ \set autoBeaming = ##t
+@end example
+
+@noindent
+are equivalent.
+
Settings that should only apply to a single time-step can be entered
-easily with @code{\once}, for example in
+with @code{\once}, for example in
@lilypond[verbatim,relative=2,fragment]
c4
In the second stave there are no time signature or clef symbols. This
is a rather crude method of making objects disappear since it will affect
-the entire staff. The spacing will be adversely influenced too. A more
+the entire staff. The spacing is adversely influenced too. A more
sophisticated methods of blanking objects is shown in @ref{Common
tweaks}.
signatures are normally synchronized across the score. This is done
by the @code{Timing_engraver}. This plug-in keeps an administration of
time signature, location within the measure, etc. By moving the
-@code{Timing_engraver} engraver from Score to Staff context, we can
-have a score where each staff has its own time signature.
+@code{Timing_engraver} engraver from @code{Score} to @code{Staff}
+context, we can have a score where each staff has its own time
+signature.
@cindex polymetric scores
c4
@end lilypond
-The @code{\override} command is executed during the interpreting phase,
-and changes the definition of the @code{Stem} within
-@context{Staff}. After the command all stems are thickened.
+The @code{\override} command changes the definition of the @code{Stem}
+within the current @context{Staff}. After the command is interpreted
+all stems are thickened.
Analogous to @code{\set}, the @var{context} argument may be left out,
causing it to default to @context{Voice}, and adding @code{\once} applies
@end lilypond
@noindent
-the slur is fatter and the beam is not. This is because the command for
+the slur is fatter but the beam is not. This is because the command for
@code{Beam} comes after the Beam is started. Therefore it has no effect.
Analogous to @code{\unset}, the @code{\revert} command for a context
@node Changing context default settings
@subsection Changing context default settings
-The adjustments of the previous chapters can also be entered separate
+The adjustments of the previous subsections (@ref{Changing context
+properties on the fly}, @ref{Modifying context plug-ins} and
+@ref{Layout tunings within contexts}) can also be entered separate
from the music, in the @code{\paper} block,
@example
- \paper @{
- @dots{}
- \context @{
- \Staff
-
- \set fontSize = #-2
- \override Stem #'thickness
- \remove "Time_signature_engraver"
- @}
- @}
+\paper @{
+ @dots{}
+ \context @{
+ \Staff
+
+ \set fontSize = #-2
+ \override Stem #'thickness
+ \remove "Time_signature_engraver"
+ @}
+@}
@end example
Here
@end example
@noindent
-takes the existing definition @context{Staff} from the identifier
-@code{Staff}. This works analogously to other contexts.
+takes the existing definition for context @context{Staff} from the
+identifier @code{\Staff}.
The statements
@example
- \set fontSize = #-2
- \override Stem #'thickness
- \remove "Time_signature_engraver"
+ \set fontSize = #-2
+ \override Stem #'thickness
+ \remove "Time_signature_engraver"
@end example
@noindent
affect all staves in the score.
+Other contexts can be modified analogously.
+
The @code{\set} keyword is optional within the @code{\paper} block, so
@example
+\context @{
+ @dots{}
fontSize = #-2
+@}
@end example
@noindent
@refbugs
-It is not possible to collect changes in a variable, and apply them to
-one @code{\context} definition by referring to that variable.
+It is not possible to collect context changes in a variable, and apply
+them to one @code{\context} definition by referring to that variable.
@node Defining new contexts
-@node Which properties to change
-@subsection Which properties to change
-
-There are many different properties. Not all of them are listed in
-this manual. However, the program reference lists them all in the
-section @internalsref{Tunable-context-properties}, and most properties
-are demonstrated in one of the
-@ifhtml
-@uref{../../../../input/test/out-www/collated-files.html,tips-and-tricks}
-@end ifhtml
-@ifnothtml
-tips-and-tricks
-@end ifnothtml
-examples.
-
-
-@node Tuning output
-@section Tuning output
+@node The \override command
+@section The \override command
In the previous section, we have already touched on a command that
changes layout details, the @code{\override} command. In this section,
for many situations. The next section will discuss general use of
@code{\override}.
-@ignore
-There are situations where default layout decisions are not
-sufficient. In this section we discuss ways to override these
-defaults.
-
-Formatting is internally done by manipulating so called objects
-(graphic objects). Each object carries with it a set of properties
-(object or layout properties) specific to the object. For example, a
-stem object has properties that specify its direction, length, and
-thickness.
-
-The most direct way of tuning the output is to alter the values of
-these properties. There are two ways of doing that: First, you can
-temporarily change the definition of one type of object, thus
-affecting a whole set of objects. Second, you can select one specific
-object, and set a layout property in that object.
-
-Do not confuse layout properties with translation
-properties. Translation properties always use a mixed caps style
-naming, and are manipulated using @code{\set} and @code{\unset}:
-@example
- \set Context.propertyName = @var{value}
-@end example
-
-Layout properties are use Scheme style variable naming, i.e. lower
-case words separated with dashes. They are symbols, and should always
-be quoted using @code{#'}. For example, this could be an imaginary
-layout property name:
-@example
- #'layout-property-name
-@end example
-
-@end ignore
@menu
* Common tweaks::
@end lilypond
@noindent
-and blanking a stem in that voice, the tie appears to cross voices:
+and blanking the first up-stem in that voice, the tie appears to cross
+voices:
@lilypond[fragment,relative=2,verbatim]
<< {
We demonstrate how to glean this information from the notation manual
and the program reference.
-The program reference is a set of HTML pages, which is part of the
-documentation package. On Unix systems, it is typically in
-@file{/usr/share/doc/lilypond}. If you have them, it is best to
-bookmark them in your webbrowser, because you will need them. They
-are also available on the web: go to the
-@uref{http://lilypond.org,LilyPond website}, click ``Documentation'',
-select the correct version, and then click ``Program reference.''
-
-If you have them, use the local HTML files. They will load faster,
-and they are exactly matched to LilyPond version installed.
-
-
@node Navigating the program reference
@subsection Navigating the program reference
f
@end lilypond
-If you visit the documentation of @code{Fingering} (in @ref{Fingering
-instructions}), you will notice that there is written:
+If you visit the documentation on fingering instructions (in
+@ref{Fingering instructions}), you will notice that there is written:
@quotation
@seealso
@end quotation
-This fragments points to two parts of the program reference: a page
+
+
+This fragment points to two parts of the program reference: a page
on @code{FingerEvent} and on @code{Fingering}.
The page on @code{FingerEvent} describes the properties of the music
@item @internalsref{Fingering_engraver}:
Music types accepted: @b{@internalsref{fingering-event}}
@item @internalsref{fingering-event}:
-Music event type @code{fingering-event} is in Music objects of type
+Music event type @code{fingering-event} is in Music expressions named
@b{@internalsref{FingerEvent}}
@end itemize
@internalsref{Music-definitions},
@end ifhtml
@ifnothtml
-Music definitions
+@code{Music definitions}
@end ifnothtml
on @internalsref{Translation}, and the @internalsref{Backend}. Every
chapter lists all the definitions used, and all properties that may be
@node Layout interfaces
@subsection Layout interfaces
-@internalsref{Fingering} is a layout object. Such an object is a
+@cindex interface, layout
+@cindex layout interface
+
+The HTML page which we found in the previous section, describes the
+layout object called @internalsref{Fingering}. Such an object is a
symbol within the score. It has properties, which store numbers (like
-thicknesses and directions), but also pointers to related objects.
-A layout object is also called @emph{grob},
+thicknesses and directions), but also pointers to related objects. A
+layout object is also called @emph{grob},
@cindex grob
which is short for Graphical Object.
has the following aspects
@itemize @bullet
-@item Its size is independent of the horizontal spacing, unlike slurs or beams
+@item Its size is independent of the horizontal spacing, unlike slurs or beams.
@item It is a piece of text. Granted, it's usually a very short text.
@item The
vertical position is also coordinated with other super and subscript
-symbols
+symbols.
@end itemize
Each of these aspects is captured in a so-called @emph{interface},
))
@end verbatim
-as you can see, @code{Fingering} is nothing more than a bunch of
-variable settings, and the webpage is directly generated from this
-definition.
+@noindent
+As you can see, the @code{Fingering} object is nothing more than a
+bunch of variable settings, and the webpage in the Program Reference
+is directly generated from this definition.
@node Determining the grob property
@subsection Determining the grob property
@item padding
(dimension, in staff space)
- add this much extra space between objects that are next to each
+ Add this much extra space between objects that are next to each
other.
@end table
@end quotation
fingering. The following command inserts 3 staff spaces of white
between the note and the fingering:
@example
-\once \override Fingering #'padding = #3
+\once \override Voice.Fingering #'padding = #3
@end example
Inserting this command before the Fingering object is created,
i.e. before @code{c2}, yields the following result:
@lilypond[relative=2,fragment,verbatim]
-\once \override Fingering
- #'padding = #3
+\once \override Voice.Fingering #'padding = #3
c-2
\stemUp
f
@end lilypond
-In this case, the context for this tweak is @context{Voice}, which
-does not have to be specified for @code{\override}. This fact can
-also be deduced from the program reference, for the page for the
-@internalsref{Fingering_engraver} plug-in says
+In this case, the context for this tweak is @context{Voice}. This
+fact can also be deduced from the program reference, for the page for
+the @internalsref{Fingering_engraver} plug-in says
@quotation
Fingering_engraver is part of contexts: @dots{} @b{@internalsref{Voice}}
@node Selecting font sizes
@subsection Selecting font sizes
-The most common thing to change about the appearance of fonts is their
-size. The font size of any context can be easily changed by setting
-the @code{fontSize} property for that context. Its value is a number:
-negative numbers make the font smaller, positive numbers larger. An
-example is given below:
-@c
+
+The easiest method of setting the font size of any context, is by
+setting the @code{fontSize} property.
+
@lilypond[fragment,relative=1,verbatim]
- c4 c4 \set fontSize = #-3
- f4 g4
+ c8
+ \set fontSize = #-4
+ c f
+ \set fontSize = #3
+ g
@end lilypond
-This command will set @code{font-size} (see below) in all layout
-objects in the current context. It does not change the size of
-variable symbols, such as beams or slurs.
-The font size is set by modifying the @code{font-size} property. Its
-value is a number indicating the size relative to the standard size.
-Each step up is an increase of approximately 12% of the font size. Six
-steps is exactly a factor two. The Scheme function @code{magstep}
-converts a @code{font-size} number to a scaling factor.
+It does not change the size of variable symbols, such as beams or
+slurs.
-LilyPond has fonts in different design sizes: the music fonts for
+Internally, the @code{fontSize} context property will cause
+@code{font-size} property to be set in all layout objects. The value
+of @code{font-size} is a number indicating the size relative to the
+standard size for the current staff height. Each step up is an
+increase of approximately 12% of the font size. Six steps is exactly a
+factor two. The Scheme function @code{magstep} converts a
+@code{font-size} number to a scaling factor.
+
+@lilypond[fragment,relative=1,verbatim]
+ c8
+ \override NoteHead #'font-size = #-4
+ c f
+ \override NoteHead #'font-size = #3
+ g
+@end lilypond
+
+LilyPond has fonts in different design sizes. The music fonts for
smaller sizes are chubbier, while the text fonts are relatively wider.
Font size changes are achieved by scaling the design size that is
-closest to the desired size.
+closest to the desired size. The standard font size (for
+@code{font-size} equals 0), depends on the standard staff height. For
+a 20 pt staff, a 10pt font is selected.
The @code{font-size} mechanism does not work for fonts selected
through @code{font-name}. These may be scaled with
-@code{font-magnification}.
-
-
-One of the uses of @code{fontSize} is to get smaller symbols for cue
-notes. An elaborate example of those is in
-@inputfileref{input/test,cue-notes.ly}.
-
-@cindex cue notes
-@cindex @code{font-style}
+@code{font-magnification}. The @code{font-size} property can only be
+set on layout objects that use fonts; these are the ones supporting
+@internalsref{font-interface} layout interface.
@refcommands
@node Font selection
@subsection Font selection
-Font selection for the standard fonts, @TeX{}'s Computer Modern fonts,
-can also be adjusted with a more fine-grained mechanism. By setting
-the object properties described below, you can select a different font;
-all three mechanisms work for every object that supports
-@code{font-interface}:
+
+
+@cindex font selection
+@cindex font magnification
+@cindex @code{font-interface}
+
+By setting the object properties described below, you can select a
+font from the preconfigured font families. LilyPond has default
+support for the feta music fonts and @TeX{}'s Computer Modern text
+fonts.
@itemize @bullet
Init files: @file{ly/declarations-init.ly} contains hints how new
fonts may be added to LilyPond.
-@refbugs
-
-No style sheet is provided for other fonts besides the @TeX{}
-Computer Modern family.
-
-@cindex font selection
-@cindex font magnification
-@cindex @code{font-interface}
@node Text markup
@cindex typeset text
-LilyPond has an internal mechanism to typeset texts. You can access it
-with the keyword @code{\markup}. Within markup mode, you can enter texts
-similar to lyrics: simply enter them, surrounded by spaces:
+The internal mechanism to typeset texts is accessed with the keyword
+@code{\markup}. Within markup mode, you can enter texts similar to
+lyrics. They are simply entered, while commands use the backslash @code{\}.
@cindex markup
@lilypond[verbatim,fragment,relative=1]
Similarly, for moving whole texts over notes with
@code{\raise}, use the following trick:
-@example
- "" \raise #0.5 raised
-@end example
+@lilypond[verbatim]
+{
+ c'^\markup { \raise #0.5 not-raised }
+ c'^\markup { "" \raise #0.5 raised }
+}
+@end lilypond
-The text @code{raised} is now raised relative to the empty string
-@code{""} which is not visible. Alternatively, complete objects can
-be moved with layout properties such as @code{padding} and
+On the second note, the text @code{raised} is moved relative to the
+empty string @code{""} which is not visible. Alternatively, complete
+objects can be moved with layout properties such as @code{padding} and
@code{extra-offset}.
@refbugs
-Text layout is ultimately done by @TeX{}, which does kerning of
-letters. LilyPond does not account for kerning, so texts will be
-spaced slightly too wide.
+No kerning or generation of ligatures is only done when the by @TeX{}
+backend is used. In this case, LilyPond does not account for them so
+texts will be spaced slightly too wide.
Syntax errors for markup mode are confusing.
-Markup texts cannot be used in the titling of the @code{\header}
-field. Titles are made by La@TeX{}, so La@TeX{} commands should be used
-for formatting.
-
-
@menu
* Text encoding::
@node Overview of text markup commands
@subsection Overview of text markup commands
+The following commands can all be used inside @code{\markup @{ @}}.
+
@include markup-commands.tely
The global layout determined by three factors: the page layout, the
line breaks, and the spacing. These all influence each other. The
choice of spacing determines how densely each system of music is set,
-which influences where line breaks are chosen, and thus
-ultimately how many pages a piece of music takes. This section
-explains how to tune the algorithm for spacing.
+which influences where line breaks are chosen, and thus ultimately how
+many pages a piece of music takes.
Globally spoken, this procedure happens in three steps: first,
flexible distances (``springs'') are chosen, based on durations. All
@tab song books
@item feta20
-@tab 17.82
+@tab 20
@tab 7.0
@tab standard parts
* Page layout::
@end menu
+
+@node Vertical spacing of piano staves
+@subsection Vertical spacing of piano staves
+
+The distance between staves of a @internalsref{PianoStaff} cannot be
+computed during formatting. Rather, to make cross-staff beaming work
+correctly, that distance has to be fixed beforehand.
+
+The distance of staves in a @code{PianoStaff} is set with the
+@code{forced-distance} property of the
+@internalsref{VerticalAlignment} object, created in
+@internalsref{PianoStaff}.
+
+It can be adjusted as follows
+@verbatim
+\new PianoStaff \with {
+ \override VerticalAlignment #'forced-distance = #9
+} {
+ ...
+}
+@end example
+This would bring the staves together at a distance of 9 staff spaces,
+measured from the center line of each staff.
+
+
@node Vertical spacing
@subsection Vertical spacing
@cindex staves per page
@cindex space between staves
-The height of each system is determined automatically by LilyPond, to
-keep systems from bumping into each other, some minimum distances are
-set. By changing these, you can put staves closer together, and thus
-put more systems onto one page.
+The height of each system is determined automatically. To prevent
+systems from bumping into each other, some minimum distances are set.
+By changing these, you can put staves closer together, and thus put
+more systems onto one page.
-Normally staves are stacked vertically. To make
-staves maintain a distance, their vertical size is padded. This is
-done with the property @code{minimumVerticalExtent}. It takes a pair
-of numbers, so if you want to make it smaller from its, then you could
-set
+Normally staves are stacked vertically. To make staves maintain a
+distance, their vertical size is padded. This is done with the
+property @code{minimumVerticalExtent}. It takes a pair of numbers, so
+if you want to make it smaller from its default, then you could set
@example
\set Staff.minimumVerticalExtent = #'(-4 . 4)
@end example
@code{minimumVerticalExtent} is interpreted as an interval, where the
center line is the 0, so the first number is generally negative. The
staff can be made larger at the bottom by setting it to @code{(-6
-. 4)}.
+. 4)}.
-The piano staves are handled a little differently: to make cross-staff
-beaming work correctly, it is necessary that the distance between staves
-is fixed beforehand. This is also done with a
-@internalsref{VerticalAlignment} object, created in
-@internalsref{PianoStaff}. In this object the distance between the
-staves is fixed by setting @code{forced-distance}. If you want to
-override this, use a @code{\context} block as follows:
-@example
- \paper @{
- \context @{
- \PianoStaff
- \override VerticalAlignment #'forced-distance = #9
- @}
- @dots{}
- @}
-@end example
-This would bring the staves together at a distance of 9 staff spaces,
-measured from the center line of each staff.
@seealso
Internals: Vertical alignment of staves is handled by the
@internalsref{VerticalAlignment} object.
+@refbugs
+
+@code{minimumVerticalExtent} is syntactic sugar for setting
+@code{minimum-Y-extent} of the @internalsref{VerticalAxisGroup} of the
+current context. It can only be changed score wide.
@subsection Horizontal Spacing
The spacing engine translates differences in durations into
-stretchable distances (``springs'') of differing lengths. Longer
+stretchable distances (``springs'') of differring lengths. Longer
durations get more space, shorter durations get less. The shortest
durations get a fixed amount of space (which is controlled by
@code{shortest-duration-space} in the @internalsref{SpacingSpanner} object).
+@node File structure
+@section File structure
+
+The bigger part of this manual is concerned with entering various
+forms of music in LilyPond. However, many music expressions are not
+valid input on their own, for example, a @code{.ly} file containing
+only a note
+@example
+ c'4
+@end example
+
+@noindent
+will result in a parsing error. Instead, music should be inside other
+expressions, which may be put in a file by themselves. Such
+expressions are called toplevel expressions. This section enumerates
+them all.
+
+A @code{.ly} file contains any number of toplevel expressions, where a
+toplevel expressions is one of the following
+
+@itemize @bullet
+@item An output definition, such as @code{\bookpaper}, @code{\midi}
+and @code{\paper}. Such a definition at toplevel changes the default
+settings for the block entered.
+
+@item An @code{\header} block. This sets the global header block. This
+is the block containing the definitions for book-wide settings, like
+composer, title, etc.
+
+@item An @code{\addquote} statement. See @ref{Quoting other voices}
+for more information.
+
+@item A @code{\score} block. This score will be collected with other
+toplevel scores, and combined as a single @code{\book}.
+
+This behavior can be changed by setting the variable
+@code{toplevel-score-handler} at toplevel. The default handler is
+defined in the init file @file{scm/lily.scm}.
+
+@item
+A @code{\book} block logically combines multiple movements
+(ie. multiple @code{\score} blocks) into one document. A number of
+@code{\scores} creates a single output file, where all movement are
+concatenated..
+
+This behavior can be changed by setting the variable
+@code{toplevel-book-handler} at toplevel. The default handler is
+defined in the init file @file{scm/lily.scm}.
+
+
+@item A compound music expression, such as
+@example
+ @{ c'4 d' e'2 @}
+@end example
+
+This will add the piece in a @code{\score}, and formats it into a
+single book together with all other toplevel @code{\score}s and music
+expressions.
+
+This behavior can be changed by setting the variable
+@code{toplevel-music-handler} at toplevel. The default handler is
+defined in the init file @file{scm/lily.scm}.
+
+@end itemize
+
+The following example shows three things which may be entered at
+toplevel
+@verbatim
+ \paper {
+ % movements are non-justified by default
+ raggedright = ##t
+ }
+
+ \header {
+ title = "Do-re-mi"
+ }
+
+ { c'4 d' e2 }
+@end verbatim
+
+
+At any point in a file, any of the following lexical instructions can
+be entered:
+
+@itemize @bullet
+@item @code{\version}
+@item @code{\include}
+@item @code{\encoding}
+@item @code{\renameinput}
+@end itemize
+