@c -*- coding: utf-8; mode: texinfo; -*-
@c This file is part of lilypond.tely
@ignore
    Translation of GIT committish: FILL-IN-HEAD-COMMITTISH

    When revising a translation, copy the HEAD committish of the
    version that you are working on.  See TRANSLATION for details.
@end ignore

@node Changing defaults
@chapter Changing defaults


The purpose of LilyPond's design is to provide the finest output
quality as a default.  Nevertheless, it may happen that you need to
change this default layout.  The layout is controlled through a large
number of proverbial @q{knobs and switches.}  This chapter does not
list each and every knob.  Rather, it outlines what groups of controls
are available and explains how to lookup which knob to use for a
particular effect.


@cindex Internals Reference

The controls available for tuning are described in a separate
document, the
@iftex
Internals Reference manual.
@end iftex
@ifnottex
@ref{Top,Internals Reference,,lilypond-internals}.
@end ifnottex
That manual
lists all different variables, functions and options available in
LilyPond.  It is written as a HTML document, which is available
@c leave the @uref as one long line.
@uref{http://@/lilypond@/.org/@/doc/@/stable/@/Documentation/@/user/@/lilypond@/-internals/,on@/-line},
but is also included with the LilyPond documentation package.

There are four areas where the default settings may be changed:

@itemize
@item
Automatic notation: changing the automatic creation of notation
elements.  For example, changing the beaming rules.

@item
Output: changing the appearance of individual
objects.  For example, changing stem directions or the location of
subscripts.

@item
Context: changing aspects of the translation from music events to
notation.  For example, giving each staff a separate time signature.

@item
Page layout: changing the appearance of the spacing, line
breaks, and page dimensions.  These modifications are discussed
in @ref{Non-musical notation}, and @ref{Spacing issues}.
@end itemize

Internally, LilyPond uses Scheme (a LISP dialect) to provide
infrastructure.  Overriding layout decisions in effect accesses the
program internals, which requires Scheme input.  Scheme elements are
introduced in a @code{.ly} file with the hash mark
@code{#}.@footnote{@rlearning{Scheme tutorial}, contains a short tutorial
on entering numbers, lists, strings, and symbols in Scheme.}


@menu
* Interpretation contexts::     
* The \override command::       
* Discussion of specific tweaks::  
@end menu


@node Interpretation contexts
@section Interpretation contexts

This section describes what contexts are, and how to modify them.

@menu
* Contexts explained::          
* Creating contexts::           
* Changing context properties on the fly::  
* Modifying context plug-ins::  
* Layout tunings within contexts::  
* Changing context default settings::  
* Defining new contexts::       
* Aligning contexts::           
* Vertical grouping of grobs::  
@end menu


@node Contexts explained
@subsection Contexts explained

When music is printed, a lot of notational elements must be added to the
output.  For example, compare the input and output of the following example:

@lilypond[quote,verbatim,relative=2,fragment]
cis4 cis2. g4
@end lilypond

The input is rather sparse, but in the output, bar lines, accidentals,
clef, and time signature are added.  LilyPond @emph{interprets} the
input.  During this step, the musical information is inspected in time
order, similar to reading a score from left to right.  While reading
the input, the program remembers where measure boundaries are, and which
pitches require explicit accidentals.  This information can be presented on
several levels.  For example, the effect of an accidental is limited
to a single staff, while a bar line must be synchronized across the
entire score.

Within LilyPond, these rules and bits of information are grouped in
@emph{Contexts}.  Some examples of contexts are @code{Voice},
@code{Staff}, and @code{Score}.  They are hierarchical, for
example: a @code{Staff} can contain many @code{Voice}s, and a
@code{Score} can contain many @code{Staff} contexts.

@quotation
@sourceimage{context-example,5cm,,}
@end quotation

Each context has the responsibility for enforcing some notation rules,
creating some notation objects and maintaining the associated
properties.  For example, the @code{Voice} context may introduce an
accidental and then the @code{Staff} context maintains the rule to
show or suppress the accidental for the remainder of the measure.  The
synchronization of bar lines is handled at @code{Score} context.

However, in some music we may not want the bar lines to be
synchronized -- consider a polymetric score in 4/4 and 3/4 time.  In
such cases, we must modify the default settings of the @code{Score}
and @code{Staff} contexts.

For very simple scores, contexts are created implicitly, and you need
not be aware of them.  For larger pieces, such as anything with more
than one staff, they must be
created explicitly to make sure that you get as many staves as you
need, and that they are in the correct order.  For typesetting pieces
with specialized notation, it can be useful to modify existing or
to define new contexts.


A complete description of all available contexts is in the program
reference, see
@ifhtml
@internalsref{Contexts}.
@end ifhtml
@ifnothtml
Translation @expansion{} Context.
@end ifnothtml

@c [TODO: describe propagation]


@node Creating contexts
@subsection Creating contexts

For scores with only one voice and one staff, contexts are
created automatically.  For more complex scores, it is necessary to
create them by hand.  There are three commands that do this.

@itemize

@item
The easiest command is @code{\new}, and it also the quickest to type.
It is prepended to a music expression, for example

@funindex \new
@cindex new contexts
@cindex Context, creating

@example
\new @var{type} @var{music expression}
@end example

@noindent
where @var{type} is a context name (like @code{Staff} or
@code{Voice}).  This command creates a new context, and starts
interpreting the @var{music expression} with that.

A practical application of @code{\new} is a score with many
staves.  Each part that should be on its own staff, is preceded with
@code{\new Staff}.

@lilypond[quote,verbatim,relative=2,ragged-right,fragment]
<<
  \new Staff { c4 c }
  \new Staff { d4 d }
>>
@end lilypond

The @code{\new} command may also give a name to the context,

@example
\new @var{type} = @var{id} @var{music}
@end example
However, this user specified name is only used if there is no other
context already earlier with the same name.


@funindex \context

@item
Like @code{\new}, the @code{\context} command also directs a music
expression to a context object, but gives the context an explicit name.  The
syntax is

@example
\context @var{type} = @var{id} @var{music}
@end example

This form will search for an existing context of type @var{type}
called @var{id}.  If that context does not exist yet, a new
context with the specified name is created.  This is useful if
the context is referred to later on.  For example, when
setting lyrics the melody is in a named context

@example
\context Voice = "@b{tenor}" @var{music}
@end example

@noindent
so the texts can be properly aligned to its notes,

@example
\new Lyrics \lyricsto "@b{tenor}" @var{lyrics}
@end example

@noindent

Another possible use of named contexts is funneling two different
music expressions into one context.  In the following example,
articulations and notes are entered separately,

@example
music = @{ c4 c4 @}
arts = @{ s4-. s4-> @}
@end example

They are combined by sending both to the same @code{Voice} context,

@example
<<
  \new Staff \context Voice = "A" \music
  \context Voice = "A" \arts
>>
@end example
@lilypond[quote,ragged-right]
music = { c4 c4 }
arts = { s4-. s4-> }
\relative c'' <<
  \new Staff \context Voice = "A" \music
  \context Voice = "A" \arts
>>
@end lilypond

With this mechanism, it is possible to define an Urtext (original
edition), with the option to put several distinct articulations on the
same notes.

@cindex creating contexts

@item
The third command for creating contexts is
@example
\context @var{type} @var{music}
@end example


@noindent
This is similar to @code{\context} with @code{= @var{id}}, but matches
any context of type @var{type}, regardless of its given name.

This variant is used with music expressions that can be interpreted at
several levels.  For example, the @code{\applyOutput} command (see
@ref{Running a function on all layout objects}).  Without an explicit
@code{\context}, it is usually applied to @code{Voice}

@example
\applyOutput #'@var{context} #@var{function}   % apply to Voice
@end example

To have it interpreted at the @code{Score} or @code{Staff} level use
these forms

@example
\applyOutput #'Score #@var{function}
\applyOutput #'Staff #@var{function}
@end example

@end itemize


@node Changing context properties on the fly
@subsection Changing context properties on the fly

@cindex properties
@funindex \set
@cindex changing properties

Each context can have different @emph{properties}, variables contained
in that context.  They can be changed during the interpretation step.
This is achieved by inserting the @code{\set} command in the music,

@example
\set @var{context}.@var{prop} = #@var{value}
@end example

For example,
@lilypond[quote,verbatim,relative=2,fragment]
R1*2
\set Score.skipBars = ##t
R1*2
@end lilypond

This command skips measures that have no notes.  The result is that
multi-rests are condensed.  The value assigned is a Scheme object.  In
this case, it is @code{#t}, the boolean True value.

If the @var{context} argument is left out, then the current bottom-most
context (typically @code{ChordNames}, @code{Voice}, or
@code{Lyrics}) is used.  In this example,

@lilypond[quote,verbatim,relative=2,fragment]
c8 c c c
\set autoBeaming = ##f
c8 c c c
@end lilypond

@noindent
the @var{context} argument to @code{\set} is left out, so automatic
beaming is switched off in the current @internalsref{Voice}.  Note that
the bottom-most context does not always contain the property that you
wish to change -- for example, attempting to set the @code{skipBars}
property (of the bottom-most context, in this case @code{Voice}) will
have no effect.

@lilypond[quote,verbatim,relative=2,fragment]
R1*2
\set skipBars = ##t
R1*2
@end lilypond

Contexts are hierarchical, so if a bigger context was specified, for
example @code{Staff}, then the change would also apply to all
@code{Voice}s in the current stave.  The change is applied
@q{on-the-fly}, during the music, so that the setting only affects the
second group of eighth notes.

@funindex \unset

There is also an @code{\unset} command,
@example
\unset @var{context}.@var{prop}
@end example

@noindent
which removes the definition of @var{prop}.  This command removes
the definition only if it is set in @var{context}, so

@example
\set Staff.autoBeaming = ##f
@end example

@noindent
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.


@cindex \once
Settings that should only apply to a single time-step can be entered
with @code{\once}, for example in

@lilypond[quote,verbatim,relative=2,fragment]
c4
\once \set fontSize = #4.7
c4
c4
@end lilypond

the property @code{fontSize} is unset automatically after the second
note.

A full description of all available context properties is in the
program reference, see
@ifhtml
@internalsref{Tunable context properties}.
@end ifhtml
@ifnothtml
Translation @expansion{} Tunable context properties.
@end ifnothtml


@node Modifying context plug-ins
@subsection Modifying context plug-ins

Notation contexts (like @code{Score} and @code{Staff}) not only
store properties,
they also contain plug-ins called @q{engravers} that create notation
elements.  For example, the @code{Voice} context contains a
@code{Note_head_engraver} and the @code{Staff} context contains a
@code{Key_signature_engraver}.

For a full a description of each plug-in, see
@ifhtml
@internalsref{Engravers and Performers}.
@end ifhtml
@ifnothtml
Internals Reference @expansion{} Translation @expansion{} Engravers.
@end ifnothtml
Every context described in
@ifhtml
@internalsref{Contexts}
@end ifhtml
@ifnothtml
Internals Reference @expansion{} Translation @expansion{} Context.
@end ifnothtml
lists the engravers used for that context.


It can be useful to shuffle around these plug-ins.  This is done by
starting a new context with @code{\new} or @code{\context}, and
modifying it,

@funindex \with

@example
\new @var{context} \with @{
  \consists @dots{}
  \consists @dots{}
  \remove @dots{}
  \remove @dots{}
  @emph{etc.}
@}
@{
  @emph{..music..}
@}
@end example

@noindent
where the @dots{} should be the name of an engraver.  Here is a simple
example which removes @code{Time_signature_engraver} and
@code{Clef_engraver} from a @code{Staff} context,

@lilypond[quote,relative=1,verbatim,fragment]
<<
  \new Staff {
    f2 g
  }
  \new Staff \with {
     \remove "Time_signature_engraver"
     \remove "Clef_engraver"
  } {
    f2 g2
  }
>>
@end lilypond

In the second staff 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.  This method also influences the spacing, which may or
may not be desirable.  A more
sophisticated method of blanking objects is shown in @rlearning{Common tweaks}.

The next example shows a practical application.  Bar lines and time
signatures are normally synchronized across the score.  This is done
by the @code{Timing_translator} and @code{Default_bar_line_engraver}.
This plug-in keeps an administration of time signature, location
within the measure, etc.  By moving thes engraver from @code{Score} to
@code{Staff} context, we can have a score where each staff has its own
time signature.

@cindex polymetric scores
@cindex Time signatures, multiple

@lilypond[quote,relative=1,ragged-right,verbatim,fragment]
\new Score \with {
  \remove "Timing_translator"
  \remove "Default_bar_line_engraver"
} <<
  \new Staff \with {
    \consists "Timing_translator"
    \consists "Default_bar_line_engraver"
  } {
      \time 3/4
      c4 c c c c c
  }
  \new Staff \with {
    \consists "Timing_translator"
    \consists "Default_bar_line_engraver"
  } {
       \time 2/4
       c4 c c c c c
  }
>>
@end lilypond


@node Layout tunings within contexts
@subsection Layout tunings within contexts

Each context is responsible for creating certain types of graphical
objects.  The settings used for printing these objects are also stored by
context.  By changing these settings, the appearance of objects can be
altered.

The syntax for this is

@example
\override @var{context}.@var{name} #'@var{property} = #@var{value}
@end example

Here @var{name} is the name of a graphical object, like @code{Stem} or
@code{NoteHead}, and @var{property} is an internal variable of the
formatting system (@q{grob property} or @q{layout property}).  The latter is a
symbol, so it must be quoted.  The subsection @ref{Constructing a
tweak}, explains what to fill in for @var{name}, @var{property}, and
@var{value}.  Here we only discuss the functionality of this command.

The command

@verbatim
\override Staff.Stem #'thickness = #4.0
@end verbatim

@noindent
makes stems thicker (the default is 1.3, with staff line thickness as a
unit).  Since the command specifies @code{Staff} as context, it only
applies to the current staff.  Other staves will keep their normal
appearance.  Here we see the command in action:

@lilypond[quote,verbatim,relative=2,fragment]
c4
\override Staff.Stem #'thickness = #4.0
c4
c4
c4
@end lilypond

The @code{\override} command changes the definition of the @code{Stem}
within the current @code{Staff}.  After the command is interpreted
all stems are thickened.

Analogous to @code{\set}, the @var{context} argument may be left out,
causing the default context @code{Voice} to be used.  Adding
@code{\once} applies the change during one timestep only.

@lilypond[quote,fragment,verbatim,relative=2]
c4
\once \override Stem #'thickness = #4.0
c4
c4
@end lilypond

The @code{\override} must be done before the object is
started.  Therefore, when altering @emph{Spanner} objects such as slurs
or beams, the @code{\override} command must be executed at the moment
when the object is created.  In this example,

@lilypond[quote,fragment,verbatim,relative=2]
\override Slur #'thickness = #3.0
c8[( c
\override Beam #'thickness = #0.6
c8 c])
@end lilypond

@noindent
the slur is fatter but the beam is not.  This is because the command for
@code{Beam} comes after the Beam is started, so it has no effect.

Analogous to @code{\unset}, the @code{\revert} command for a context
undoes an @code{\override} command; like with @code{\unset}, it only
affects settings that were made in the same context.  In other words, the
@code{\revert} in the next example does not do anything.

@example
\override Voice.Stem #'thickness = #4.0
\revert Staff.Stem #'thickness
@end example

Some tweakable options are called @q{subproperties} and reside inside
properties.  To tweak those, use commands of the form

@c leave this as a long long
@example
\override @var{context}.@var{name} #'@var{property} #'@var{subproperty} = #@var{value}
@end example

@noindent
such as

@example
\override Stem #'details #'beamed-lengths = #'(4 4 3)
@end example


@seealso

Internals: @internalsref{OverrideProperty}, @internalsref{RevertProperty},
@internalsref{PropertySet}, @internalsref{Backend}, and
@internalsref{All layout objects}.


@knownissues

The back-end is not very strict in type-checking object properties.
Cyclic references in Scheme values for properties can cause hangs
or crashes, or both.


@node Changing context default settings
@subsection Changing context default settings

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 separately
from the music in the @code{\layout} block,

@example
\layout @{
  @dots{}
  \context @{
    \Staff

    \set fontSize = #-2
    \override Stem #'thickness = #4.0
    \remove "Time_signature_engraver"
  @}
@}
@end example

The @code{\Staff} command brings in the existing definition of the
staff context so that it can be modified.

The statements
@example
\set fontSize = #-2
\override Stem #'thickness = #4.0
\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{\layout} block, so

@example
\context @{
  @dots{}
  fontSize = #-2
@}
@end example

@noindent
will also work.



@knownissues

It is not possible to collect context changes in a variable and apply
them to a @code{\context} definition by referring to that variable.

The @code{\RemoveEmptyStaffContext} will overwrite your current
@code{\Staff} settings.  If you wish to change the defaults for a
staff which uses @code{\RemoveEmptyStaffContext}, you must do so
after calling @code{\RemoveEmptyStaffContext}, ie

@example
\layout @{
  \context @{
    \RemoveEmptyStaffContext

    \override Stem #'thickness = #4.0
  @}
@}
@end example


@node Defining new contexts
@subsection Defining new contexts

Specific contexts, like @code{Staff} and @code{Voice}, are made of
simple building blocks.  It is possible to create new types of
contexts with different combinations of engraver plug-ins.

The next example shows how to build a different type of
@code{Voice} context from scratch.  It will be similar to
@code{Voice}, but only prints centered slash note heads.  It can be used
to indicate improvisation in jazz pieces,

@lilypond[quote,ragged-right]
\layout { \context {
  \name ImproVoice
  \type "Engraver_group"
  \consists "Note_heads_engraver"
  \consists "Text_engraver"
  \consists Pitch_squash_engraver
  squashedPosition = #0
  \override NoteHead #'style = #'slash
  \override Stem #'transparent = ##t
  \alias Voice
}
\context { \Staff
  \accepts "ImproVoice"
}}

\relative c'' {
  a4 d8 bes8 \new ImproVoice { c4^"ad lib" c
   c4 c^"undress" c_"while playing :)" c }
  a1
}
@end lilypond


These settings are defined within a @code{\context} block inside a
@code{\layout} block,

@example
\layout @{
  \context @{
    @dots{}
  @}
@}
@end example

In the following discussion, the example input shown should go in place
of the @dots{} in the previous fragment.

First it is necessary to define a name for the new context:

@example
\name ImproVoice
@end example

Since it is similar to the @code{Voice}, we want commands that work
on (existing) @code{Voice}s to remain working.  This is achieved by
giving the new context an alias @code{Voice},

@example
\alias Voice
@end example

The context will print notes and instructive texts, so we need to add
the engravers which provide this functionality,

@example
\consists Note_heads_engraver
\consists Text_engraver
@end example

but we only need this on the center line,

@example
\consists Pitch_squash_engraver
squashedPosition = #0
@end example

The @internalsref{Pitch_squash_engraver} modifies note heads (created
by @internalsref{Note_heads_engraver}) and sets their vertical
position to the value of @code{squashedPosition}, in this case@tie{}@code{0},
the center line.

The notes look like a slash, and have no stem,

@example
\override NoteHead #'style = #'slash
\override Stem #'transparent = ##t
@end example

All these plug-ins have to cooperate, and this is achieved with a
special plug-in, which must be marked with the keyword @code{\type}.
This should always be @internalsref{Engraver_group},

@example
\type "Engraver_group"
@end example

Put together, we get

@example
\context @{
  \name ImproVoice
  \type "Engraver_group"
  \consists "Note_heads_engraver"
  \consists "Text_engraver"
  \consists Pitch_squash_engraver
  squashedPosition = #0
  \override NoteHead #'style = #'slash
  \override Stem #'transparent = ##t
  \alias Voice
@}
@end example

@funindex \accepts
Contexts form hierarchies.  We want to hang the @code{ImproVoice}
under @code{Staff}, just like normal @code{Voice}s.  Therefore, we
modify the @code{Staff} definition with the @code{\accepts}
command,

@example
\context @{
  \Staff
  \accepts ImproVoice
@}
@end example

@funindex \denies
The opposite of @code{\accepts} is @code{\denies},
which is sometimes needed when reusing existing context definitions.

Putting both into a @code{\layout} block, like

@example
\layout @{
  \context @{
    \name ImproVoice
    @dots{}
  @}
  \context @{
    \Staff
    \accepts "ImproVoice"
  @}
@}
@end example

Then the output at the start of this subsection can be entered as

@example
\relative c'' @{
  a4 d8 bes8
  \new ImproVoice @{
    c4^"ad lib" c
    c4 c^"undress"
    c c_"while playing :)"
  @}
  a1
@}
@end example


@node Aligning contexts
@subsection Aligning contexts

New contexts may be aligned above or below exisiting contexts.  This
could be useful in setting up a vocal staff (@rlearning{Vocal ensembles}) and
in ossia,

FIXME: this section doens't work in pdf.  (?)

@cindex ossia
@findex alignAboveContext
@findex alignBelowContext

@lilypond[quote,ragged-right]
ossia = { f4 f f f }
\score{
  \relative c' \new Staff = "main" {
    c4 c c c
    <<
      \new Staff \with {alignAboveContext=main} \ossia
      { d8 f d f d f d f }
    >>
  }
}
@end lilypond


@node Vertical grouping of grobs
@subsection Vertical grouping of grobs

The VerticalAlignment and VerticalAxisGroup grobs work together.
VerticalAxisGroup groups together different grobs like Staff, Lyrics,
etc.  VerticalAlignment then vertically aligns the different grobs
grouped together by VerticalAxisGroup.  There is usually only one
VerticalAlignment per score but every Staff, Lyrics, etc. has its own
VerticalAxisGroup. 


@node The \override command
@section The @code{\override} command

In the previous section, we have already touched on a command that
changes layout details: the @code{\override} command.  In this section,
we will look in more detail at how to use the command in practice.  The
general syntax of this command is:

@example
\override @var{context}.@var{layout_object} #'@var{layout_property} = #@var{value}
@end example

This will set the @var{layout_property} of the specified @var{layout_object},
which is a member of the @var{context}, to the @var{value}.

@menu
* Constructing a tweak::        
* Navigating the program reference::  
* Layout interfaces::           
* Determining the grob property::  
* Objects connected to the input::  
* Using Scheme code instead of \tweak::  
* \set versus \override::       
* Difficult tweaks::            
@end menu



@node Constructing a tweak
@subsection Constructing a tweak

Commands which change output generally look like

@example
\override Voice.Stem #'thickness = #3.0
@end example

@noindent
To construct this tweak we must determine these bits of information:

@itemize
@item the context: here @code{Voice}.
@item the layout object: here @code{Stem}.
@item the layout property: here @code{thickness}.
@item a sensible value: here @code{3.0}.
@end itemize

Some tweakable options are called @q{subproperties} and reside inside
properties.  To tweak those, use commands in the form

@example
\override Stem #'details #'beamed-lengths = #'(4 4 3)
@end example

@cindex internal documentation
@cindex finding graphical objects
@cindex graphical object descriptions
@cindex tweaking
@funindex \override
@cindex internal documentation

For many properties, regardless of the data type of the property, setting the
property to false ( @code{##f} ) will result in turning it off, causing
Lilypond to ignore that property entirely.  This is particularly useful for
turning off grob properties which may otherwise be causing problems.

We demonstrate how to glean this information from the notation manual
and the program reference.




@node Navigating the program reference
@subsection Navigating the program reference

Suppose we want to move the fingering indication in the fragment
below:

@lilypond[quote,fragment,relative=2,verbatim]
c-2
\stemUp
f
@end lilypond

If you visit the documentation on fingering instructions (in
@ref{Fingering instructions}), you will notice:

@quotation
@seealso

Internals Reference: @internalsref{Fingering}.

@end quotation


@c  outdated info; probably will delete.
@ignore
This fragment points to two parts of the program reference: a page
on @code{FingerEvent} and one on @code{Fingering}.

The page on @code{FingerEvent} describes the properties of the music
expression for the input @code{-2}.  The page contains many links
forward.  For example, it says

@quotation
Accepted by: @internalsref{Fingering_engraver},
@end quotation

@noindent
That link brings us to the documentation for the Engraver, the
plug-in, which says

@quotation
This engraver creates the following layout objects: @internalsref{Fingering}.
@end quotation

In other words, once the @code{FingerEvent}s are interpreted, the
@code{Fingering_engraver} plug-in will process them.
@end ignore

@ignore
@c  I can't figure out what this is supposed to mean.  -gp

The @code{Fingering_engraver} is also listed to create
@internalsref{Fingering} objects,

@c  old info?  it doesn't make any sense to me with our current docs.
This is also the
second bit of information listed under @b{See also} in the Notation
manual.
@end ignore

@ifnothtml
The programmer's reference is available as an HTML document.  It is
highly recommended that you read it in HTML form, either online or
by downloading the HTML documentation.  This section will be much more
difficult to understand if you are using the 
PDF manual.
@end ifnothtml

Follow the link to @internalsref{Fingering}.  At the top of the
page, you will see

@quotation
Fingering objects are created by: @internalsref{Fingering_engraver} and
@internalsref{New_fingering_engraver}.
@end quotation

By following related links inside the program reference, we can follow the
flow of information within the program:

@itemize

@item @internalsref{Fingering}:
@internalsref{Fingering} objects are created by:
@internalsref{Fingering_engraver}

@item @internalsref{Fingering_engraver}:
Music types accepted: @internalsref{fingering-event}

@item @internalsref{fingering-event}:
Music event type @code{fingering-event} is in Music expressions named
@internalsref{FingerEvent}
@end itemize

This path goes against the flow of information in the program: it
starts from the output, and ends at the input event.  You could
also start at an input event, and read with the flow of
information, eventually ending up at the output object(s).

The program reference can also be browsed like a normal document.  It
contains chapters on
@ifhtml
@internalsref{Music definitions},
@end ifhtml
@ifnothtml
@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
tuned.


@node Layout interfaces
@subsection Layout interfaces

@cindex interface, layout
@cindex layout interface
@cindex grob

The HTML page that 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 that store numbers (like
thicknesses and directions), but also pointers to related objects.  A
layout object is also called a @emph{Grob}, which is short for Graphical
Object.  For more details about Grobs, see @internalsref{grob-interface}.

The page for @code{Fingering} lists the definitions for the
@code{Fingering} object.  For example, the page says

@quotation
@code{padding} (dimension, in staff space):

@code{0.5}
@end quotation

@noindent
which means that the number will be kept at a distance of at least 0.5
of the note head.


Each layout object may have several functions as a notational or
typographical element.  For example, the Fingering object
has the following aspects

@itemize
@item
Its size is independent of the horizontal spacing, unlike slurs or beams.

@item
It is a piece of text.  Granted, it is usually a very short text.

@item
That piece of text is typeset with a font, unlike slurs or beams.

@item
Horizontally, the center of the symbol should be aligned to the
center of the note head.

@item
Vertically, the symbol is placed next to the note and the staff.

@item
The vertical position is also coordinated with other superscript
and subscript symbols.
@end itemize

Each of these aspects is captured in so-called @emph{interface}s,
which are listed on the @internalsref{Fingering} page at the bottom

@quotation
This object supports the following interfaces:
@internalsref{item-interface},
@internalsref{self-alignment-interface},
@internalsref{side-position-interface}, @internalsref{text-interface},
@internalsref{text-script-interface}, @internalsref{font-interface},
@internalsref{finger-interface}, and @internalsref{grob-interface}.
@end quotation

Clicking any of the links will take you to the page of the respective
object interface.  Each interface has a number of properties.  Some of
them are not user-serviceable (@q{Internal properties}), but others
can be modified.

We have been talking of @emph{the} @code{Fingering} object, but actually it
does not amount to much.  The initialization file (see
@rlearning{Default files})
@file{scm/@/define@/-grobs@/.scm} shows the soul of the @q{object},

@example
(Fingering
  . ((padding . 0.5)
     (avoid-slur . around)
     (slur-padding . 0.2)
     (staff-padding . 0.5)
     (self-alignment-X . 0)
     (self-alignment-Y . 0)
     (script-priority . 100)
     (stencil . ,ly:text-interface::print)
     (direction . ,ly:script-interface::calc-direction)
     (font-encoding . fetaNumber)
     (font-size . -5) 		; don't overlap when next to heads.
     (meta . ((class . Item)
     (interfaces . (finger-interface
                    font-interface
                    text-script-interface
                    text-interface
                    side-position-interface
                    self-alignment-interface
                    item-interface))))))
@end example

@noindent
As you can see, the @code{Fingering} object is nothing more than a
bunch of variable settings, and the webpage in the Internals Reference
is directly generated from this definition.


@node Determining the grob property
@subsection Determining the grob property

Recall that we wanted to change the position of the @b{2} in

@lilypond[quote,fragment,relative=2,verbatim]
c-2
\stemUp
f
@end lilypond

Since the @b{2} is vertically positioned next to its note, we have to
meddle with the interface associated with this positioning.  This is
done using @code{side-position-interface}.  The page for this interface
says

@quotation
@code{side-position-interface}

Position a victim object (this one) next to other objects (the
support).  The property @code{direction} signifies where to put the
victim object relative to the support (left or right, up or down?)
@end quotation

@cindex padding
@noindent
Below this description, the variable @code{padding} is described as

@quotation
@table @code
@item padding
(dimension, in staff space)

Add this much extra space between objects that are next to each other.
@end table
@end quotation

By increasing the value of @code{padding}, we can move the
fingering away from the note head.  The following command inserts
3 staff spaces of white
between the note and the fingering:
@example
\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[quote,relative=2,fragment,verbatim]
\once \override Voice.Fingering #'padding = #3
c-2
\stemUp
f
@end lilypond


In this case, the context for this tweak is @code{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{} @internalsref{Voice}
@end quotation


@node Objects connected to the input
@subsection Objects connected to the input

@funindex \tweak

In some cases, it is possible to take a short-cut for tuning graphical
objects.  For objects that result directly from a piece of the input,
you can use the @code{\tweak} function, for example

@lilypond[relative=2,fragment,verbatim,ragged-right]
<
  c
  \tweak #'color #red d
  g
  \tweak #'duration-log #1  a
>4-\tweak #'padding #10 -.
@end lilypond

As you can see, properties are set in the objects directly,
without mentioning the grob name or context where this should be
applied.

This technique only works for objects that are directly connected to
an @internalsref{Event} from the input, for example

@itemize
@item note heads, caused by chord-pitch (i.e., notes inside a chord)
@item articulation signs, caused by articulation instructions
@end itemize

It notably does not work for stems and accidentals (these are caused
by note heads, not by music events) or clefs (these are not caused by
music inputs, but rather by the change of a property value).

There are very few objects which are @emph{directly} connected to
output.  A normal note (like @code{c4}) is not directly connected
to output, so

@example
\tweak #'color #red c4
@end example

@noindent
does not change color.  See @ref{Displaying music expressions}, for
details.


@node Using Scheme code instead of \tweak
@subsection Using Scheme code instead of @code{\tweak}

The main disadvantage of @code{\tweak} is its syntactical
inflexibility.  For example, the following produces a syntax error.

@example
F = \tweak #'font-size #-3 -\flageolet

\relative c'' @{
  c4^\F c4_\F
@}
@end example

@noindent
With other words, @code{\tweak} doesn't behave like an articulation
regarding the syntax; in particular, it can't be attached with
@code{^} and @code{_}.

Using Scheme, this problem can be circumvented.  The route to the
result is given in @ref{Adding articulation to notes (example)},
especially how to use @code{\displayMusic} as a helping guide.

@example
F = #(let ((m (make-music 'ArticulationEvent
                          'articulation-type "flageolet")))
       (set! (ly:music-property m 'tweaks)
             (acons 'font-size -3
                    (ly:music-property m 'tweaks)))
       m)
 
\relative c'' @{
  c4^\F c4_\F
@}
@end example

@noindent
Here, the @code{tweaks} properties of the flageolet object
@code{m} (created with @code{make-music}) are extracted with
@code{ly:music-property}, a new key-value pair to change the
font size is prepended to the property list with the
@code{acons} Scheme function, and the result is finally
written back with @code{set!}.  The last element of the
@code{let} block is the return value, @code{m} itself.


@node \set versus \override
@subsection @code{\set} vs. @code{\override}

We have seen two methods of changing properties: @code{\set} and
@code{\override}.  There are actually two different kinds of
properties.

Contexts can have properties, which are usually named in
@code{studlyCaps}.  They mostly control the translation from
music to notatino, eg. @code{localKeySignature} (for determining
whether to print accidentals), @code{measurePosition} (for
determining when to print a bar line).  Context properties can
change value over time while interpreting a piece of music;
@code{measurePosition} is an obvious example of
this.  Context properties are modified with @code{\set}.

There is a special type of context property: the element
description.  These properties are named in @code{StudlyCaps}
(starting with capital letters).  They contain the
@q{default settings} for said graphical object as an
association list.  See @file{scm/@/define@/-grobs@/.scm}
to see what kind of settings there are.  Element descriptions
may be modified with @code{\override}.

@code{\override} is actually a shorthand;

@example
\override @var{context}.@var{name} #'@var{property} = #@var{value}
@end example

@noindent
is more or less equivalent to

@c  leave this long line -gp
@example
\set @var{context}.@var{name} #'@var{property} = #(cons (cons '@var{property} @var{value}) <previous value of @var{context})
@end example

The value of @code{context} (the alist) is used to initalize
the properties of individual grobs.  Grobs also have
properties, named in Scheme style, with
@code{dashed-words}.  The values of grob properties change
during the formatting process: formatting basically amounts
to computing properties using callback functions.

@code{fontSize} is a special property: it is equivalent to
entering @code{\override ... #'font-size} for all pertinent
objects.  Since this is a common change, the special
property (modified with @code{\set}) was created.


@node Difficult tweaks
@subsection Difficult tweaks

There are a few classes of difficult adjustments.

@itemize


@item
One type of difficult adjustment is the appearance of spanner objects,
such as slur and tie.  Initially, only one of these objects is created,
and they can be adjusted with the normal mechanism.  However, in some
cases the spanners cross line breaks.  If this happens, these objects
are cloned.  A separate object is created for every system that it is
in.  These are clones of the original object and inherit all
properties, including @code{\override}s.


In other words, an @code{\override} always affects all pieces of a
broken spanner.  To change only one part of a spanner at a line break,
it is necessary to hook into the formatting process.  The
@code{after-line-breaking} callback contains the Scheme procedure that
is called after the line breaks have been determined, and layout
objects have been split over different systems.

In the following example, we define a procedure
@code{my-callback}.  This procedure

@itemize
@item
determines if we have been split across line breaks
@item
if yes, retrieves all the split objects
@item
checks if we are the last of the split objects
@item
if yes, it sets @code{extra-offset}.
@end itemize

This procedure is installed into @internalsref{Tie}, so the last part
of the broken tie is translated up.

@lilypond[quote,verbatim,ragged-right]
#(define (my-callback grob)
  (let* (
         ; have we been split?
         (orig (ly:grob-original grob))

         ; if yes, get the split pieces (our siblings)
         (siblings (if (ly:grob? orig)
                     (ly:spanner-broken-into orig) '() )))

   (if (and (>= (length siblings) 2)
             (eq? (car (last-pair siblings)) grob))
     (ly:grob-set-property! grob 'extra-offset '(-2 . 5)))))

\relative c'' {
  \override Tie #'after-line-breaking =
  #my-callback
  c1 ~ \break c2 ~ c
}
@end lilypond

@noindent
When applying this trick, the new @code{after-line-breaking} callback
should also call the old one @code{after-line-breaking}, if there is
one.  For example, if using this with @code{Hairpin},
@code{ly:hairpin::after-line-breaking} should also be called.


@item Some objects cannot be changed with @code{\override} for
technical reasons.  Examples of those are @code{NonMusicalPaperColumn}
and @code{PaperColumn}.  They can be changed with the
@code{\overrideProperty} function, which works similar to @code{\once
\override}, but uses a different syntax.

@example
\overrideProperty
#"Score.NonMusicalPaperColumn"  % Grob name
#'line-break-system-details     % Property name
#'((next-padding . 20))         % Value
@end example

Note, however, that @code{\override}, applied to
@code{NoteMusicalPaperColumn} and @code{PaperColumn}, still works as
expected within @code{\context} blocks.

@end itemize






@node Discussion of specific tweaks
@section Discussion of specific tweaks

@menu
* Line styles::                 
* Controlling visibility of objects::  
@end menu

@node Line styles
@subsection Line styles

Valentin: write stuff here.


@node Controlling visibility of objects
@subsection Controlling visibility of objects

stuff about #'break-visibility

