]> git.donarmstrong.com Git - lilypond.git/blobdiff - Documentation/user/programming-interface.itely
Imported Upstream version 2.12.3
[lilypond.git] / Documentation / user / programming-interface.itely
index b64f0d87d126bf555d71b616d345a850739fba9c..91019af07bc0d977893e83c12a5dbe40310e0d2b 100644 (file)
@@ -7,20 +7,24 @@
     version that you are working on.  See TRANSLATION for details.
 @end ignore
 
     version that you are working on.  See TRANSLATION for details.
 @end ignore
 
+@c \version "2.12.0"
+
 @node Interfaces for programmers
 @chapter Interfaces for programmers
 
 Advanced tweaks may be performed by using Scheme.  If you are
 not familiar with Scheme, you may wish to read our
 @node Interfaces for programmers
 @chapter Interfaces for programmers
 
 Advanced tweaks may be performed by using Scheme.  If you are
 not familiar with Scheme, you may wish to read our
-@ref{Scheme tutorial}.
+@rlearning{Scheme tutorial}.
 
 @menu
 
 @menu
-* Music functions::             
-* Programmer interfaces::       
-* Building complicated functions::  
-* Markup programmer interface::  
-* Contexts for programmers::    
-* Scheme procedures as properties::  
+* Music functions::
+* Programmer interfaces::
+* Building complicated functions::
+* Markup programmer interface::
+* Contexts for programmers::
+* Scheme procedures as properties::
+* Using Scheme code instead of \tweak::
+* Difficult tweaks::
 @end menu
 
 
 @end menu
 
 
@@ -30,13 +34,13 @@ not familiar with Scheme, you may wish to read our
 This section discusses how to create music functions within LilyPond.
 
 @menu
 This section discusses how to create music functions within LilyPond.
 
 @menu
-* Overview of music functions::  
-* Simple substitution functions::  
-* Paired substitution functions::  
-* Mathematics in functions::    
-* Void functions::              
-* Functions without arguments::  
-* Overview of available music functions::  
+* Overview of music functions::
+* Simple substitution functions::
+* Paired substitution functions::
+* Mathematics in functions::
+* Void functions::
+* Functions without arguments::
+* Overview of available music functions::
 @end menu
 
 @node Overview of music functions
 @end menu
 
 @node Overview of music functions
@@ -47,8 +51,8 @@ code is easy.  The general form of these functions is
 
 @example
 function =
 
 @example
 function =
-#(define-music-function (parser location @var{var1} @var{var2}... )
-                        (@var{var1-type?} @var{var2-type?}...)
+#(define-music-function (parser location @var{var1} @var{var2}...@var{vari}... )
+                        (@var{var1-type?} @var{var2-type?}...@var{vari-type?}...)
   #@{
     @emph{...music...}
   #@})
   #@{
     @emph{...music...}
   #@})
@@ -58,10 +62,10 @@ function =
 where
 
 @multitable @columnfractions .33 .66
 where
 
 @multitable @columnfractions .33 .66
-@item @var{argi}         @tab @var{i}th variable
-@item @var{argi-type?}   @tab type of variable
+@item @var{vari}         @tab @var{i}th variable
+@item @var{vari-type?}   @tab type of @var{i}th variable
 @item @var{...music...}  @tab normal LilyPond input, using
 @item @var{...music...}  @tab normal LilyPond input, using
 variables as @code{#$var1}.
variables as @code{#$var1}, etc.
 @end multitable
 
 There following input types may be used as variables
 @end multitable
 
 There following input types may be used as variables
@@ -70,7 +74,7 @@ other documentation specifically about Scheme for more
 variable types.
 
 @multitable @columnfractions .33 .66
 variable types.
 
 @multitable @columnfractions .33 .66
-@headitem Input type          @tab @var{argi-type?} notation
+@headitem Input type          @tab @var{vari-type?} notation
 @item Integer                 @tab @code{integer?}
 @item Float (decimal number)  @tab @code{number?}
 @item Text string             @tab @code{string?}
 @item Integer                 @tab @code{integer?}
 @item Float (decimal number)  @tab @code{number?}
 @item Text string             @tab @code{string?}
@@ -79,11 +83,11 @@ variable types.
 @item A pair of variables     @tab @code{pair?}
 @end multitable
 
 @item A pair of variables     @tab @code{pair?}
 @end multitable
 
-The @code{parser} and @code{location} argument are mandatory,
+The @code{parser} and @code{location} arguments are mandatory,
 and are used in some advanced situations.  The @code{parser}
 and are used in some advanced situations.  The @code{parser}
-argument is used to access to the value of another LilyPond
+argument is used to gain access to the value of another LilyPond
 variable.  The @code{location} argument
 variable.  The @code{location} argument
-is used to set the ``origin'' of the music expression that is built
+is used to set the @q{origin} of the music expression that is built
 by the music function, so that in case of a syntax error LilyPond
 can tell the user an appropriate place to look in the input file.
 
 by the music function, so that in case of a syntax error LilyPond
 can tell the user an appropriate place to look in the input file.
 
@@ -230,7 +234,7 @@ turning off Point and Click).  To do this, we return a @code{void}
 music expression.
 
 That is why the form
 music expression.
 
 That is why the form
-that is returned is the @code{(make-music ...)}. With the
+that is returned is the @code{(make-music ...)}.  With the
 @code{'void} property set to @code{#t}, the parser is told to
 actually disregard this returned music
 expression.  Thus the important part of the void music function is the
 @code{'void} property set to @code{#t}, the parser is told to
 actually disregard this returned music
 expression.  Thus the important part of the void music function is the
@@ -251,7 +255,7 @@ noPointAndClick =
 @subsection Functions without arguments
 
 In most cases a function without arguments should be written
 @subsection Functions without arguments
 
 In most cases a function without arguments should be written
-with an identifier,
+with an variable,
 
 @example
 dolce = \markup@{ \italic \bold dolce @}
 
 @example
 dolce = \markup@{ \italic \bold dolce @}
@@ -263,13 +267,13 @@ without arguments,
 @example
 displayBarNum =
 #(define-music-function (parser location) ()
 @example
 displayBarNum =
 #(define-music-function (parser location) ()
-   (if (eq? #t (ly:get-option display-bar-numbers))
+   (if (eq? #t (ly:get-option 'display-bar-numbers))
        #@{ \once \override Score.BarNumber #'break-visibility = ##f #@}
        #@{#@}))
 @end example
 
 To actually display bar numbers where this function is called,
        #@{ \once \override Score.BarNumber #'break-visibility = ##f #@}
        #@{#@}))
 @end example
 
 To actually display bar numbers where this function is called,
-invoke lilypond with
+invoke @command{lilypond} with
 
 @example
 lilypond -d display-bar-numbers FILENAME.ly
 
 @example
 lilypond -d display-bar-numbers FILENAME.ly
@@ -293,8 +297,8 @@ This section contains information about mixing LilyPond
 and Scheme.
 
 @menu
 and Scheme.
 
 @menu
-* Input variables and Scheme::  
-* Internal music representation::  
+* Input variables and Scheme::
+* Internal music representation::
 @end menu
 
 
 @end menu
 
 
@@ -333,7 +337,7 @@ traLaLa = @{ c'4 d'4 @}
 @noindent
 is internally converted to a Scheme definition
 @example
 @noindent
 is internally converted to a Scheme definition
 @example
-(define traLaLa @var{Scheme value of ``@code{... }''})
+(define traLaLa @var{Scheme value of `@code{... }'})
 @end example
 
 This means that input variables and Scheme variables may be freely
 @end example
 
 This means that input variables and Scheme variables may be freely
@@ -356,28 +360,29 @@ traLaLa = { c'4 d'4 }
 { \twice }
 @end lilypond
 
 { \twice }
 @end lilypond
 
-Due to parser lookahead
+@c Due to parser lookahead
 
 In this example, the assignment happens after parser has verified that
 
 In this example, the assignment happens after parser has verified that
-nothing interesting happens after @code{traLaLa = @{ ... @}}. Without
+nothing interesting happens after @code{traLaLa = @{ ... @}}.  Without
 the dummy statement in the above example, the @code{newLa} definition
 is executed before @code{traLaLa} is defined, leading to a syntax
 error.
 
 the dummy statement in the above example, the @code{newLa} definition
 is executed before @code{traLaLa} is defined, leading to a syntax
 error.
 
-The above example shows how to `export' music expressions from the
+The above example shows how to @q{export} music expressions from the
 input to the Scheme interpreter.  The opposite is also possible.  By
 wrapping a Scheme value in the function @code{ly:export}, a Scheme
 value is interpreted as if it were entered in LilyPond syntax.
 Instead of defining @code{\twice}, the example above could also have
 been written as
 input to the Scheme interpreter.  The opposite is also possible.  By
 wrapping a Scheme value in the function @code{ly:export}, a Scheme
 value is interpreted as if it were entered in LilyPond syntax.
 Instead of defining @code{\twice}, the example above could also have
 been written as
+
 @example
 @example
-@dots{}
+...
 @{ #(ly:export (make-sequential-music (list newLa))) @}
 @end example
 
 Scheme code is evaluated as soon as the parser encounters it.  To
 define some Scheme code in a macro (to be called later), use
 @{ #(ly:export (make-sequential-music (list newLa))) @}
 @end example
 
 Scheme code is evaluated as soon as the parser encounters it.  To
 define some Scheme code in a macro (to be called later), use
-@ref{Void functions} or
+@ref{Void functions}, or
 
 @example
 #(define (nopc)
 
 @example
 #(define (nopc)
@@ -389,9 +394,9 @@ define some Scheme code in a macro (to be called later), use
 @end example
 
 
 @end example
 
 
-@refbugs
+@knownissues
 
 
-Mixing Scheme and LilyPond identifiers is not possible with the
+Mixing Scheme and LilyPond variables is not possible with the
 @code{--safe} option.
 
 
 @code{--safe} option.
 
 
@@ -404,21 +409,21 @@ it takes up time.  Time is a rational number that measures the length
 of a piece of music in whole notes.
 
 A music object has three kinds of types:
 of a piece of music in whole notes.
 
 A music object has three kinds of types:
-@itemize @bullet
+@itemize
 @item
 music name: Each music expression has a name.  For example, a note
 @item
 music name: Each music expression has a name.  For example, a note
-leads to a @internalsref{NoteEvent}, and @code{\simultaneous} leads to
-a @internalsref{SimultaneousMusic}.  A list of all expressions
-available is in the Program reference manual, under
-@internalsref{Music expressions}.
+leads to a @rinternals{NoteEvent}, and @code{\simultaneous} leads to
+a @rinternals{SimultaneousMusic}.  A list of all expressions
+available is in the Internals Reference manual, under
+@rinternals{Music expressions}.
 
 @item
 
 @item
-`type' or interface: Each music name has several `types' or
+@q{type} or interface: Each music name has several @q{types} or
 interfaces, for example, a note is an @code{event}, but it is also a
 @code{note-event}, a @code{rhythmic-event}, and a
 @code{melodic-event}.  All classes of music are listed in the
 interfaces, for example, a note is an @code{event}, but it is also a
 @code{note-event}, a @code{rhythmic-event}, and a
 @code{melodic-event}.  All classes of music are listed in the
-Program reference, under
-@internalsref{Music classes}.
+Internals Reference, under
+@rinternals{Music classes}.
 
 @item
 C++ object: Each music object is represented by an object of the C++
 
 @item
 C++ object: Each music object is represented by an object of the C++
@@ -426,19 +431,19 @@ class @code{Music}.
 @end itemize
 
 The actual information of a music expression is stored in properties.
 @end itemize
 
 The actual information of a music expression is stored in properties.
-For example, a @internalsref{NoteEvent} has @code{pitch} and
+For example, a @rinternals{NoteEvent} has @code{pitch} and
 @code{duration} properties that store the pitch and duration of that
 note.  A list of all properties available is in the internals manual,
 @code{duration} properties that store the pitch and duration of that
 note.  A list of all properties available is in the internals manual,
-under @internalsref{Music properties}.
+under @rinternals{Music properties}.
 
 A compound music expression is a music object that contains other
 music objects in its properties.  A list of objects can be stored in
 
 A compound music expression is a music object that contains other
 music objects in its properties.  A list of objects can be stored in
-the @code{elements} property of a music object, or a single `child'
-music object in the @code{element} object.  For example,
-@internalsref{SequentialMusic} has its children in @code{elements},
-and @internalsref{GraceMusic} has its single argument in
+the @code{elements} property of a music object, or a single @q{child}
+music object in the @code{element} property.  For example,
+@rinternals{SequentialMusic} has its children in @code{elements},
+and @rinternals{GraceMusic} has its single argument in
 @code{element}.  The body of a repeat is stored in the @code{element}
 @code{element}.  The body of a repeat is stored in the @code{element}
-property of @internalsref{RepeatedMusic}, and the alternatives in
+property of @rinternals{RepeatedMusic}, and the alternatives in
 @code{elements}.
 
 
 @code{elements}.
 
 
@@ -450,10 +455,10 @@ This section explains how to gather the information necessary
 to create complicated music functions.
 
 @menu
 to create complicated music functions.
 
 @menu
-* Displaying music expressions::  
-* Music properties::            
-* Doubling a note with slurs (example)::  
-* Adding articulation to notes (example)::  
+* Displaying music expressions::
+* Music properties::
+* Doubling a note with slurs (example)::
+* Adding articulation to notes (example)::
 @end menu
 
 
 @end menu
 
 
@@ -462,7 +467,6 @@ to create complicated music functions.
 
 @cindex internal storage
 @funindex \displayMusic
 
 @cindex internal storage
 @funindex \displayMusic
-@funindex \displayLilyMusic
 
 When writing a music function it is often instructive to inspect how
 a music expression is stored internally.  This can be done with the
 
 When writing a music function it is often instructive to inspect how
 a music expression is stored internally.  This can be done with the
@@ -575,6 +579,8 @@ of the @code{NoteEvent} object,
 
 The note pitch can be changed by setting this 'pitch property,
 
 
 The note pitch can be changed by setting this 'pitch property,
 
+@funindex \displayLilyMusic
+
 @example
 #(set! (ly:music-property (first (ly:music-property someNote 'elements))
                           'pitch)
 @example
 #(set! (ly:music-property (first (ly:music-property someNote 'elements))
                           'pitch)
@@ -589,7 +595,7 @@ d'
 @subsection Doubling a note with slurs (example)
 
 Suppose we want to create a function which translates
 @subsection Doubling a note with slurs (example)
 
 Suppose we want to create a function which translates
-input like ``@code{a}'' into ``@code{a( a)}''.  We begin
+input like @code{a} into @code{a( a)}.  We begin
 by examining the internal representation of the music
 we want to end up with.
 
 by examining the internal representation of the music
 we want to end up with.
 
@@ -628,7 +634,7 @@ we want to end up with.
 @end example
 
 The bad news is that the @code{SlurEvent} expressions
 @end example
 
 The bad news is that the @code{SlurEvent} expressions
-must be added ``inside'' the note (or more precisely,
+must be added @q{inside} the note (or more precisely,
 inside the @code{EventChord} expression).
 
 Now we examine the input,
 inside the @code{EventChord} expression).
 
 Now we examine the input,
@@ -766,12 +772,12 @@ necessary, but just like clear variable names, it is good practice.
 (let ((result-event-chord (ly:music-deep-copy event-chord)))
 @end example
 
 (let ((result-event-chord (ly:music-deep-copy event-chord)))
 @end example
 
-`@code{let}' is used to declare local variables.  Here we use one local
-variable, named `@code{result-event-chord}', to which we give the value
-@code{(ly:music-deep-copy event-chord)}.  `@code{ly:music-deep-copy}' is
+@code{let} is used to declare local variables.  Here we use one local
+variable, named @code{result-event-chord}, to which we give the value
+@code{(ly:music-deep-copy event-chord)}.  @code{ly:music-deep-copy} is
 a function specific to LilyPond, like all functions prefixed by
 a function specific to LilyPond, like all functions prefixed by
-`@code{ly:}'.  It is use to make a copy of a music
-expression.  Here we copy `@code{event-chord} (the parameter of the
+@code{ly:}.  It is use to make a copy of a music
+expression.  Here we copy @code{event-chord} (the parameter of the
 function).  Recall that our purpose is to add a marcato to an
 @code{EventChord} expression.  It is better to not modify the
 @code{EventChord} which was given as an argument, because it may be
 function).  Recall that our purpose is to add a marcato to an
 @code{EventChord} expression.  It is better to not modify the
 @code{EventChord} which was given as an argument, because it may be
@@ -785,8 +791,8 @@ add the marcato to its elements list property.
 (set! place new-value)
 @end example
 
 (set! place new-value)
 @end example
 
-Here, what we want to set (the "place") is the "elements" property of
-@code{result-event-chord} expression
+Here, what we want to set (the @q{place}) is the @q{elements} property of
+@code{result-event-chord} expression.
 
 @example
 (ly:music-property result-event-chord 'elements)
 
 @example
 (ly:music-property result-event-chord 'elements)
@@ -796,7 +802,7 @@ Here, what we want to set (the "place") is the "elements" property of
 (the @code{'elements}, @code{'duration}, @code{'pitch}, etc, that we
 see in the @code{\displayMusic} output above).  The new value is the
 former elements property, with an extra item: the
 (the @code{'elements}, @code{'duration}, @code{'pitch}, etc, that we
 see in the @code{\displayMusic} output above).  The new value is the
 former elements property, with an extra item: the
-@code{MarcatoEvent} expression, which we copy from the
+@code{ArticulationEvent} expression, which we copy from the
 @code{\displayMusic} output,
 
 @example
 @code{\displayMusic} output,
 
 @example
@@ -805,12 +811,12 @@ former elements property, with an extra item: the
       (ly:music-property result-event-chord 'elements))
 @end example
 
       (ly:music-property result-event-chord 'elements))
 @end example
 
-`@code{cons}' is used to add an element to a list without modifying the
+@code{cons} is used to add an element to a list without modifying the
 original list.  This is what we
 want: the same list as before, plus the new @code{ArticulationEvent}
 expression.  The order inside the elements property is not important here.
 
 original list.  This is what we
 want: the same list as before, plus the new @code{ArticulationEvent}
 expression.  The order inside the elements property is not important here.
 
-Finally, once we have added the @code{MarcatoEvent} to its elements
+Finally, once we have added the marcato articulation to its @code{elements}
 property, we can return @code{result-event-chord}, hence the last line of
 the function.
 
 property, we can return @code{result-event-chord}, hence the last line of
 the function.
 
@@ -844,9 +850,10 @@ Markups are implemented as special Scheme functions which produce a
 Stencil object given a number of arguments.
 
 @menu
 Stencil object given a number of arguments.
 
 @menu
-* Markup construction in Scheme::  
-* How markups work internally::  
-* New markup command definition::  
+* Markup construction in Scheme::
+* How markups work internally::
+* New markup command definition::
+* New markup list command definition::
 @end menu
 
 
 @end menu
 
 
@@ -859,14 +866,14 @@ The @code{markup} macro builds markup expressions in Scheme while
 providing a LilyPond-like syntax.  For example,
 @example
 (markup #:column (#:line (#:bold #:italic "hello" #:raise 0.4 "world")
 providing a LilyPond-like syntax.  For example,
 @example
 (markup #:column (#:line (#:bold #:italic "hello" #:raise 0.4 "world")
-                  #:bigger #:line ("foo" "bar" "baz")))
+                  #:larger #:line ("foo" "bar" "baz")))
 @end example
 
 @noindent
 is equivalent to:
 @example
 \markup \column @{ \line @{ \bold \italic "hello" \raise #0.4 "world" @}
 @end example
 
 @noindent
 is equivalent to:
 @example
 \markup \column @{ \line @{ \bold \italic "hello" \raise #0.4 "world" @}
-                  \bigger \line @{ foo bar baz @} @}
+                  \larger \line @{ foo bar baz @} @}
 @end example
 
 @noindent
 @end example
 
 @noindent
@@ -881,7 +888,7 @@ LilyPond markup syntax and Scheme markup syntax.
         @code{(markup markup1 markup2 ... )}
 @item @code{\command} @tab @code{#:command}
 @item @code{\variable} @tab @code{variable}
         @code{(markup markup1 markup2 ... )}
 @item @code{\command} @tab @code{#:command}
 @item @code{\variable} @tab @code{variable}
-@item @code{\center-align @{ ... @}} @tab @code{#:center-align ( ... )}
+@item @code{\center-column @{ ... @}} @tab @code{#:center-column ( ... )}
 @item @code{string} @tab @code{"string"}
 @item @code{#scheme-arg} @tab @code{scheme-arg}
 @end multitable
 @item @code{string} @tab @code{"string"}
 @item @code{#scheme-arg} @tab @code{scheme-arg}
 @end multitable
@@ -894,7 +901,7 @@ useful when defining new markup commands (see
 @ref{New markup command definition}).
 
 
 @ref{New markup command definition}).
 
 
-@refbugs
+@knownissues
 
 The markup-list argument of commands such as @code{#:line},
 @code{#:center}, and @code{#:column} cannot be a variable or
 
 The markup-list argument of commands such as @code{#:line},
 @code{#:center}, and @code{#:column} cannot be a variable or
@@ -969,7 +976,7 @@ The arguments are
 @item argi-type?
 a type predicate for the i@var{th} argument
 @item layout
 @item argi-type?
 a type predicate for the i@var{th} argument
 @item layout
-the `layout' definition
+the @q{layout} definition
 @item props
 a list of alists, containing all active properties.
 @end table
 @item props
 a list of alists, containing all active properties.
 @end table
@@ -1111,16 +1118,113 @@ to the @code{interpret-markup} function, with the @code{layout} and
 
 Note: there is now an internal command @code{\smallCaps} which can
 be used to set text in small caps.  See
 
 Note: there is now an internal command @code{\smallCaps} which can
 be used to set text in small caps.  See
-@ref{Overview of text markup commands} for details.
+@ref{Text markup commands}, for details.
+
+@knownissues
+
+Currently, the available combinations of arguments (after the standard
+@var{layout} and @var{props} arguments) to a markup command defined with
+@code{define-markup-command} are limited as follows.
+
+@table @asis
+@item (no argument)
+@itemx @var{list}
+@itemx @var{markup}
+@itemx @var{markup markup}
+@itemx @var{scm}
+@itemx @var{scm markup}
+@itemx @var{scm scm}
+@itemx @var{scm scm markup}
+@itemx @var{scm scm markup markup}
+@itemx @var{scm markup markup}
+@itemx @var{scm scm scm}
+@end table
+
+@noindent
+In the above table, @var{scm} represents native Scheme data types like
+@q{number} or @q{string}.
 
 
+As an example, it is not possible to use a markup command @code{foo} with
+four arguments defined as
 
 
+@example
+#(define-markup-command (foo layout props
+                         num1    str1    num2    str2)
+                        (number? string? number? string?)
+  ...)
+@end example
+
+@noindent
+If you apply it as, say,
+
+@example
+\markup \foo #1 #"bar" #2 #"baz"
+@end example
+
+@cindex Scheme signature
+@cindex signature, Scheme
+@noindent
+@command{lilypond} complains that it cannot parse @code{foo} due to its
+unknown Scheme signature.
+
+
+@node New markup list command definition
+@subsection New markup list command definition
+Markup list commands are defined with the
+@code{define-markup-list-command} Scheme macro, which is similar to the
+@code{define-markup-command} macro described in
+@ref{New markup command definition}, except that where the latter returns
+a single stencil, the former returns a list stencils.
+
+In the following example, a @code{\paragraph} markup list command is
+defined, which returns a list of justified lines, the first one being
+indented.  The indent width is taken from the @code{props} argument.
+@example
+#(define-markup-list-command (paragraph layout props args) (markup-list?)
+   (let ((indent (chain-assoc-get 'par-indent props 2)))
+     (interpret-markup-list layout props
+       (make-justified-lines-markup-list (cons (make-hspace-markup indent)
+                                               args)))))
+@end example
+
+Besides the usual @code{layout} and @code{props} arguments, the
+@code{paragraph} markup list command takes a markup list argument, named
+@code{args}.  The predicate for markup lists is @code{markup-list?}.
+
+First, the function gets the indent width, a property here named
+@code{par-indent}, from the property list @code{props} If the property
+is not found, the default value is @code{2}.  Then, a list of justified
+lines is made using the @code{make-justified-lines-markup-list}
+function, which is related to the @code{\justified-lines}
+built-in markup list command.  An horizontal space is added at the
+beginning using the @code{make-hspace-markup} function.  Finally, the
+markup list is interpreted using the @code{interpret-markup-list}
+function.
+
+This new markup list command can be used as follows:
+@example
+\markuplines @{
+  \paragraph @{
+    The art of music typography is called \italic @{(plate) engraving.@}
+    The term derives from the traditional process of music printing.
+    Just a few decades ago, sheet music was made by cutting and stamping
+    the music into a zinc or pewter plate in mirror image.
+  @}
+  \override-lines #'(par-indent . 4) \paragraph @{
+    The plate would be inked, the depressions caused by the cutting
+    and stamping would hold ink.  An image was formed by pressing paper
+    to the plate.  The stamping and cutting was completely done by
+    hand.
+  @}
+@}
+@end example
 
 @node Contexts for programmers
 @section Contexts for programmers
 
 @menu
 
 @node Contexts for programmers
 @section Contexts for programmers
 
 @menu
-* Context evaluation::          
-* Running a function on all layout objects::  
+* Context evaluation::
+* Running a function on all layout objects::
 @end menu
 
 @node Context evaluation
 @end menu
 
 @node Context evaluation
@@ -1168,7 +1272,7 @@ where @var{proc} is a Scheme function, taking three arguments.
 When interpreted, the function @var{proc} is called for every layout
 object found in the context @var{context}, with the following
 arguments:
 When interpreted, the function @var{proc} is called for every layout
 object found in the context @var{context}, with the following
 arguments:
-@itemize @bullet
+@itemize
 @item the layout object itself,
 @item the context where the layout object was created, and
 @item the context where @code{\applyOutput} is processed.
 @item the layout object itself,
 @item the context where the layout object was created, and
 @item the context where @code{\applyOutput} is processed.
@@ -1178,8 +1282,8 @@ arguments:
 In addition, the cause of the layout object, i.e., the music
 expression or object that was responsible for creating it, is in the
 object property @code{cause}.  For example, for a note head, this is a
 In addition, the cause of the layout object, i.e., the music
 expression or object that was responsible for creating it, is in the
 object property @code{cause}.  For example, for a note head, this is a
-@internalsref{NoteHead} event, and for a @internalsref{Stem} object,
-this is a @internalsref{NoteHead} object.
+@rinternals{NoteHead} event, and for a @rinternals{Stem} object,
+this is a @rinternals{NoteHead} object.
 
 Here is a function to use for @code{\applyOutput}; it blanks
 note-heads on the center-line:
 
 Here is a function to use for @code{\applyOutput}; it blanks
 note-heads on the center-line:
@@ -1218,7 +1322,7 @@ In this case, the procedure is executed as soon as the value of the
 property is requested during the formatting process.
 
 Most of the typesetting engine is driven by such callbacks.
 property is requested during the formatting process.
 
 Most of the typesetting engine is driven by such callbacks.
-Properties that typically use callbacks include  
+Properties that typically use callbacks include
 
 @table @code
 @item stencil
 
 @table @code
 @item stencil
@@ -1248,8 +1352,8 @@ can be inserted with a grob closure.  Here is a setting from
 @noindent
 In this example, both @code{ly:self-alignment-interface::x-aligned-on-self} and
 @code{ly:self-alignment-interface::centered-on-x-parent} are called
 @noindent
 In this example, both @code{ly:self-alignment-interface::x-aligned-on-self} and
 @code{ly:self-alignment-interface::centered-on-x-parent} are called
-with the grob as argument. The results are added with the @code{+}
-function. To ensure that this addition is properly executed, the whole
+with the grob as argument.  The results are added with the @code{+}
+function.  To ensure that this addition is properly executed, the whole
 thing is enclosed in @code{ly:make-simple-closure}.
 
 In fact, using a single procedure as property value is equivalent to
 thing is enclosed in @code{ly:make-simple-closure}.
 
 In fact, using a single procedure as property value is equivalent to
@@ -1262,3 +1366,145 @@ In fact, using a single procedure as property value is equivalent to
 The inner @code{ly:make-simple-closure} supplies the grob as argument
 to @var{proc}, the outer ensures that result of the function is
 returned, rather than the @code{simple-closure} object.
 The inner @code{ly:make-simple-closure} supplies the grob as argument
 to @var{proc}, the outer ensures that result of the function is
 returned, rather than the @code{simple-closure} object.
+
+
+@node Using Scheme code instead of \tweak
+@section 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 Difficult tweaks
+@section 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 @rinternals{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{NonMusicalPaperColumn} and @code{PaperColumn}, still works as
+expected within @code{\context} blocks.
+
+@end itemize
+
+
+
+
+