* only show user-visible changes.
@end ignore
+
+@item
+Two alternative methods for bar numbering can be set, especially for
+when using repeated music;
+
+@lilypond[fragment,quote,relative=1,noragged-right]
+\relative c'{
+ \set Score.alternativeNumberingStyle = #'numbers
+ \repeat volta 3 { c4 d e f | }
+ \alternative {
+ { c4 d e f | c2 d \break }
+ { f4 g a b | f4 g a b | f2 a | \break }
+ { c4 d e f | c2 d }
+ }
+ c1 \break
+ \set Score.alternativeNumberingStyle = #'numbers-with-letters
+ \repeat volta 3 { c,4 d e f | }
+ \alternative {
+ { c4 d e f | c2 d \break }
+ { f4 g a b | f4 g a b | f2 a | \break }
+ { c4 d e f | c2 d }
+ }
+ c1
+}
+@end lilypond
+
@item
Scheme expressions inside of embedded Lilypond (@code{#@{@dots{}#@}})
are now executed in lexical closure of the surrounding Scheme code.
<e-1>-"left"
@end lilypond
-
@item
The alignment of dynamic spanners (hairpins, text crescendo, etc.) is now
automatically broken if a different direction is explicitly given.
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.15.17"
+@c \version "2.15.25"
@node Entrada y salida generales
@chapter Entrada y salida generales
@translationof Automatic footnotes
De las dos instrucciones utilizadas para crear notas al pie
-automáticas, utilice @code{\autoFootnoteGrob} para los grobs
+automáticas, utilice @code{\footnoteGrob} para los grobs
individuales (es decir: la cabeza de las notas, plicas, ligaduras de
expresión, matices dinámicos y elementos de @code{\markup} si se
-utilizan @code{TextScripts}); y @code{\autoFootnote} para anotar las
+utilizan @code{TextScripts}); y @code{\footnote} para anotar las
notas de un acorde.
Las dos instrucciones aceptan tres argumentos; el @var{Objeto de
elemento de @code{\markup} que aparecerá en la nota, en la parte
inferior de la página.
-La instrucción @code{\autoFootnoteGrob} debe ir @emph{antes} del grob
+La instrucción @code{\footnoteGrob} debe ir @emph{antes} del grob
al que se adjunta la nota al pie:
@lilypond[verbatim,quote,ragged-right,papersize=a8]
\book {
\header { tagline = ##f }
\relative c' {
- \autoFootnoteGrob #'NoteHead #'(0.5 . -2)
+ \footnote #'(0.5 . -2) #'NoteHead
\markup { The first note }
a'4 b8
- \autoFootnoteGrob #'NoteHead #'(0.5 . 1)
+ \footnote #'(0.5 . 1) #'NoteHead
\markup { The third note }
e c4 d4
}
@end lilypond
Para anotar las notas de un acorde, la instrucción
-@code{\autoFootnote} debe ir @emph{después} de la nota a la que se
+@code{\footnote} debe ir @emph{después} de la nota a la que se
quiere adjuntar la nota al pie como un @code{TextScript}:
@lilypond[verbatim,quote,ragged-right,papersize=a8]
\header { tagline = ##f }
\relative c' {
<
- c-\autoFootnote #'(1 . -1.25) "Here is a C"
- es-\autoFootnote #'(2 . -0.25) \markup { \italic "An E-flat" }
- g-\autoFootnote #'(2 . 3) \markup { \bold "This is a G" }
+ c-\footnote #'(1 . -1.25) "Here is a C"
+ es-\footnote #'(2 . -0.25) \markup { \italic "An E-flat" }
+ g-\footnote #'(2 . 3) \markup { \bold "This is a G" }
>1
}
}
\book {
\header { copyright = \markup { "Copyright 1970" } }
\relative c' {
- \autoFootnoteGrob #'DynamicText #'(-3 . 0)
+ \footnote #'(-3 . 0) #'DynamicText
\markup { \bold Forte }
- \autoFootnoteGrob #'Slur #'(0 . 1.5)
+ \footnote #'(0 . 1.5) #'Slur
\markup { A slur }
a'4\f(
- \autoFootnoteGrob #'Beam #'(0 . -2)
+ \footnote #'(0 . -2) #'Beam
\markup { Beam }
b8)[ e]
- \autoFootnoteGrob #'Stem #'(1 . -1)
+ \footnote #'(1 . -1) #'Stem
\markup { \teeny { This is a stem } }
c4
- \autoFootnoteGrob #'AccidentalCautionary #'(0 . 0.5)
+ \footnote #'(0 . 0.5) #'AccidentalCautionary
\markup \italic { A cautionary accidental }
- \autoFootnoteGrob #'TextScript #'(0.5 . -0.5)
+ \footnote #'(0.5 . -0.5) #'TextScript
\markup \italic { Slow Down }
dis?4_"rit."
}
\book {
\header { tagline = ##f }
\relative c' {
- a'4-\footnoteGrob #'NoteHead #'(0.5 . -2)
- "1" \markup { \italic "1. The first note" }
+ a'4-\footnote
+ "1" #'(0.5 . -2) #'NoteHead \markup { \italic "1. The first note" }
b8
- e-\footnoteGrob #'NoteHead #'(0.5 . 1)
- \markup { \bold "2" } "2. The second note"
+ e-\footnote
+ \markup { \bold "2" } #'(0.5 . 1) #'NoteHead "2. The second note"
c4
- d\p-\footnoteGrob #'DynamicText #'(0.5 . -1) "3" "3. Piano"
+ d\p-\footnote "3" #'(0.5 . -1) #'DynamicText "3. Piano"
}
}
@end lilypond
\header { tagline = ##f }
\relative c' {
<
- c-\footnote #'(1 . -1.25) "1" "1. C"
- es-\footnote #'(2 . -0.25)
- \markup { \bold "b" } "b. E-flat"
- g-\footnote #'(2 . 3) "3" \markup { \italic "iii. G" }
+ c-\footnote "1" #'(1 . -1.25) "1. C"
+ es-\footnote
+ \markup { \bold "b" } #'(2 . -0.25) "b. E-flat"
+ g-\footnote "3" #'(2 . 3) \markup { \italic "iii. G" }
>1
}
}
\book {
\header { tagline = ##f }
\relative c' {
- \footnoteGrob #'DynamicText #'(-3 . 0)
- \markup { \teeny 1 }
+ \footnote
+ \markup { \teeny 1 } #'(-3 . 0) #'DynamicText
\markup { 1. \bold Forte }
- \footnoteGrob #'Slur #'(0 . 1.5)
- \markup { \teeny b }
+ \footnote
+ \markup { \teeny b } #'(0 . 1.5) #'Slur
\markup { b. A slur }
a'4\f(
- \footnoteGrob #'Beam #'(0 . -2)
- \markup { \teeny 3 }
+ \footnote
+ \markup { \teeny 3 } #'(0 . -2) #'Beam
\markup { 3. Beam }
b8)[ e]
- \footnoteGrob #'Stem #'(1 . -1)
- \markup { 4 }
+ \footnote
+ \markup { 4 } #'(1 . -1) #'Stem
\markup { \bold 4. { This is a stem } }
c4
- \footnoteGrob #'AccidentalCautionary #'(0 . 0.5)
- \markup \concat \teeny { "sharp (v)" }
+ \footnote
+ \markup \concat \teeny { "sharp (v)" } #'(0 . 0.5) #'AccidentalCautionary
\markup \italic { v. A cautionary accidental }
- \footnoteGrob #'TextScript #'(0.5 . -0.5)
- \markup \concat \teeny { "a" }
+ \footnote
+ \markup \concat \teeny { "a" } #'(0.5 . -0.5) #'TextScript
\markup \italic { a. Slow Down }
dis?4_"rit."
\breathe
- \footnoteGrob #'BreathingSign #'(1.5 . -0.25)
- \markup { \teeny \musicglyph #"rests.4" }
+ \footnote
+ \markup { \teeny \musicglyph #"rests.4" } #'(1.5 . -0.25) #'BreathingSign
\markup { \null }
}
}
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.15.17"
+@c \version "2.15.25"
@c Translators: Jean-Charles Malahieude, Valentin Villenave
@cindex note de bas de page automatique
@cindex bas de page, note automatique
-@funindex \autoFootnote
-@funindex \autoFootnoteGrob
+@funindex \footnote
+@funindex \footnoteGrob
@funindex \auto-footnote
LilyPond dispose, selon l'objet à référencer, de deux différentes
commandes pour créer des notes de bas de page automatiques. La commande
-@code{\autoFootnoteGrob} s'applique aux objets individuels, tels que
+@code{\footnoteGrob} s'applique aux objets individuels, tels que
tête de note, hampe, liaison, nuance ou @code{\markup} contenant un
-@code{TextScripts}. La commande @code{\autoFootnote}, quant à elle,
+@code{TextScripts}. La commande @code{\footnote}, quant à elle,
permet de référencer l'une des notes d'un accord.
Ces deux commandes requièrent trois arguments@tie{}: l'@var{Objet de
l'appel de note, et enfin un @code{\markup} contenant l'annotation qui
apparaîtra en bas de la page.
-La commande @code{\autoFootnoteGrob} doit être mentionnée @strong{avant}
+La commande @code{\footnoteGrob} doit être mentionnée @strong{avant}
l'objet auquel la note est attachée.
@c KEEP LY
\book {
\header { tagline = ##f }
\relative c' {
- \autoFootnoteGrob #'NoteHead #'(0.5 . -2)
+ \footnote #'(0.5 . -2) #'NoteHead
\markup { La première note }
a'4 b8
- \autoFootnoteGrob #'NoteHead #'(0.5 . 1)
+ \footnote #'(0.5 . 1) #'NoteHead
\markup { La troisième note }
e c4 d4
}
@end lilypond
Lorsqu'il s'agit de notes inscrites dans un accord, la commande
-@code{\autoFootnote} doit être mentionnée @strong{après} la note à
+@code{\footnote} doit être mentionnée @strong{après} la note à
laquelle le @code{TextScript} fait référence.
@c KEEP LY
\header { tagline = ##f }
\relative c' {
<
- c-\autoFootnote #'(1 . -1.25) "Voici un do"
- es-\autoFootnote #'(2 . -0.25) \markup { \italic "Un mi bémol" }
- g-\autoFootnote #'(2 . 3) \markup { \bold "Ceci est un sol" }
+ c-\footnote #'(1 . -1.25) "Voici un do"
+ es-\footnote #'(2 . -0.25) \markup { \italic "Un mi bémol" }
+ g-\footnote #'(2 . 3) \markup { \bold "Ceci est un sol" }
>1
}
}
\book {
\header { copyright = \markup { "Copyright 1970" } }
\relative c' {
- \autoFootnoteGrob #'DynamicText #'(-3 . 0)
+ \footnote #'(-3 . 0) #'DynamicText
\markup { \bold Forte }
- \autoFootnoteGrob #'Slur #'(0 . 1.5)
+ \footnote #'(0 . 1.5) #'Slur
\markup { A slur }
a'4\f(
- \autoFootnoteGrob #'Beam #'(0 . -2)
+ \footnote #'(0 . -2) #'Beam
\markup { Beam }
b8)[ e]
- \autoFootnoteGrob #'Stem #'(1 . -1)
+ \footnote #'(1 . -1) #'Stem
\markup { \teeny { This is a stem } }
c4
- \autoFootnoteGrob #'AccidentalCautionary #'(0 . 0.5)
+ \footnote #'(0 . 0.5) #'AccidentalCautionary
\markup \italic { A cautionary accidental }
- \autoFootnoteGrob #'TextScript #'(0.5 . -0.5)
+ \footnote #'(0.5 . -0.5) #'TextScript
\markup \italic { Slow Down }
dis?4_"rit."
}
\book {
\header { tagline = ##f }
\relative c' {
- a'4-\footnoteGrob #'NoteHead #'(0.5 . -2)
- "1" \markup { \italic "1. The first note" }
+ a'4-\footnote
+ "1" #'(0.5 . -2) #'NoteHead \markup { \italic "1. The first note" }
b8
- e-\footnoteGrob #'NoteHead #'(0.5 . 1)
- \markup { \bold "2" } "2. The second note"
+ e-\footnote
+ \markup { \bold "2" } #'(0.5 . 1) #'NoteHead "2. The second note"
c4
- d\p-\footnoteGrob #'DynamicText #'(0.5 . -1) "3" "3. Piano"
+ d\p-\footnote "3" #'(0.5 . -1) #'DynamicText "3. Piano"
}
}
@end lilypond
\header { tagline = ##f }
\relative c' {
<
- c-\footnote #'(1 . -1.25) "1" "1. C"
- es-\footnote #'(2 . -0.25)
- \markup { \bold "b" } "b. E-flat"
- g-\footnote #'(2 . 3) "3" \markup { \italic "iii. G" }
+ c-\footnote "1" #'(1 . -1.25) "1. C"
+ es-\footnote
+ \markup { \bold "b" } #'(2 . -0.25) "b. E-flat"
+ g-\footnote "3" #'(2 . 3) \markup { \italic "iii. G" }
>1
}
}
\book {
\header { copyright = \markup { "Copyright 1970" } }
\relative c' {
- \footnoteGrob #'DynamicText #'(-3 . 0)
- \markup { \teeny 1 }
+ \footnote
+ \markup { \teeny 1 } #'(-3 . 0) #'DynamicText
\markup { 1. \bold Forte }
- \footnoteGrob #'Slur #'(0 . 1.5)
- \markup { \teeny b }
+ \footnote
+ \markup { \teeny b } #'(0 . 1.5) #'Slur
\markup { b. A slur }
a'4\f(
- \footnoteGrob #'Beam #'(0 . -2)
- \markup { \teeny 3 }
+ \footnote
+ \markup { \teeny 3 } #'(0 . -2) #'Beam
\markup { 3. Beam }
b8)[ e]
- \footnoteGrob #'Stem #'(1 . -1)
- \markup { 4 }
+ \footnote
+ \markup { 4 } #'(1 . -1) #'Stem
\markup { \bold 4. { This is a stem } }
c4
- \footnoteGrob #'AccidentalCautionary #'(0 . 0.5)
- \markup \concat \teeny { "sharp (v)" }
+ \footnote
+ \markup \concat \teeny { "sharp (v)" } #'(0 . 0.5) #'AccidentalCautionary
\markup \italic { v. A cautionary accidental }
- \footnoteGrob #'TextScript #'(0.5 . -0.5)
- \markup \concat \teeny { "a" }
+ \footnote
+ \markup \concat \teeny { "a" } #'(0.5 . -0.5) #'TextScript
\markup \italic { a. Slow Down }
dis?4_"rit."
\breathe
- \footnoteGrob #'BreathingSign #'(1.5 . -0.25)
- \markup { \teeny \musicglyph #"rests.4" }
+ \footnote
+ \markup { \teeny \musicglyph #"rests.4" } #'(1.5 . -0.25) #'BreathingSign
\markup { \null }
}
}
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.15.17"
+@c \version "2.15.25"
@node General input and output
@chapter General input and output
@unnumberedsubsubsec Automatic footnotes
Of the two commands used to create automatic footnotes, use
-@code{\autoFootnoteGrob} for individual grobs (i.e. note heads, stems,
+@code{\footnoteGrob} for individual grobs (i.e. note heads, stems,
slurs, dynamics and @code{\markup} when using @code{TextScripts});
-and @code{\autoFootnote} for annotating chorded notes.
+and @code{\footnote} for annotating chorded notes.
Both commands take three arguments; the @var{Layout Object} to be
annotated, the @var{(x . y)} position of the indicator and a
@code{\markup} that will appear in the footnote at the bottom of the
page.
-The command @code{\autoFootnoteGrob} must come @emph{before} the grob
+The command @code{\footnoteGrob} must come @emph{before} the grob
that the footnote is being attached to:
@lilypond[verbatim,quote,ragged-right,papersize=a8]
\book {
\header { tagline = ##f }
\relative c' {
- \autoFootnoteGrob #'NoteHead #'(0.5 . -2)
+ \footnote #'(0.5 . -2) #'NoteHead
\markup { The first note }
a'4 b8
- \autoFootnoteGrob #'NoteHead #'(0.5 . 1)
+ \footnote #'(0.5 . 1) #'NoteHead
\markup { The third note }
e c4 d4
}
}
@end lilypond
-To annotate chorded notes, the @code{\autoFootnote} must come
+To annotate chorded notes, the @code{\footnote} must come
@emph{after} the note to which the footnote is being attached as a
@code{TextScript}:
\header { tagline = ##f }
\relative c' {
<
- c-\autoFootnote #'(1 . -1.25) "Here is a C"
- es-\autoFootnote #'(2 . -0.25) \markup { \italic "An E-flat" }
- g-\autoFootnote #'(2 . 3) \markup { \bold "This is a G" }
+ c-\footnote #'(1 . -1.25) "Here is a C"
+ es-\footnote #'(2 . -0.25) \markup { \italic "An E-flat" }
+ g-\footnote #'(2 . 3) \markup { \bold "This is a G" }
>1
}
}
\book {
\header { copyright = \markup { "Copyright 1970" } }
\relative c' {
- \autoFootnoteGrob #'DynamicText #'(-3 . 0)
+ \footnote #'(-3 . 0) #'DynamicText
\markup { \bold Forte }
- \autoFootnoteGrob #'Slur #'(0 . 1.5)
+ \footnote #'(0 . 1.5) #'Slur
\markup { A slur }
a'4\f(
- \autoFootnoteGrob #'Beam #'(0 . -2)
+ \footnote #'(0 . -2) #'Beam
\markup { Beam }
b8)[ e]
- \autoFootnoteGrob #'Stem #'(1 . -1)
+ \footnote #'(1 . -1) #'Stem
\markup { \teeny { This is a stem } }
c4
- \autoFootnoteGrob #'AccidentalCautionary #'(0 . 0.5)
+ \footnote #'(0 . 0.5) #'AccidentalCautionary
\markup \italic { A cautionary accidental }
- \autoFootnoteGrob #'TextScript #'(0.5 . -0.5)
+ \footnote #'(0.5 . -0.5) #'TextScript
\markup \italic { Slow Down }
dis?4_"rit."
}
\book {
\header { tagline = ##f }
\relative c' {
- a'4-\footnoteGrob #'NoteHead #'(0.5 . -2)
- "1" \markup { \italic "1. The first note" }
+ a'4-\footnote
+ "1" #'(0.5 . -2) #'NoteHead \markup { \italic "1. The first note" }
b8
- e-\footnoteGrob #'NoteHead #'(0.5 . 1)
- \markup { \bold "2" } "2. The second note"
+ e-\footnote
+ \markup { \bold "2" } #'(0.5 . 1) #'NoteHead "2. The second note"
c4
- d\p-\footnoteGrob #'DynamicText #'(0.5 . -1) "3" "3. Piano"
+ d\p-\footnote "3" #'(0.5 . -1) #'DynamicText "3. Piano"
}
}
@end lilypond
\header { tagline = ##f }
\relative c' {
<
- c-\footnote #'(1 . -1.25) "1" "1. C"
- es-\footnote #'(2 . -0.25)
- \markup { \bold "b" } "b. E-flat"
- g-\footnote #'(2 . 3) "3" \markup { \italic "iii. G" }
+ c-\footnote "1" #'(1 . -1.25) "1. C"
+ es-\footnote
+ \markup { \bold "b" } #'(2 . -0.25) "b. E-flat"
+ g-\footnote "3" #'(2 . 3) \markup { \italic "iii. G" }
>1
}
}
\book {
\header { tagline = ##f }
\relative c' {
- \footnoteGrob #'DynamicText #'(-3 . 0)
- \markup { \teeny 1 }
+ \footnote
+ \markup { \teeny 1 } #'(-3 . 0) #'DynamicText
\markup { 1. \bold Forte }
- \footnoteGrob #'Slur #'(0 . 1.5)
- \markup { \teeny b }
+ \footnote
+ \markup { \teeny b } #'(0 . 1.5) #'Slur
\markup { b. A slur }
a'4\f(
- \footnoteGrob #'Beam #'(0 . -2)
- \markup { \teeny 3 }
+ \footnote
+ \markup { \teeny 3 } #'(0 . -2) #'Beam
\markup { 3. Beam }
b8)[ e]
- \footnoteGrob #'Stem #'(1 . -1)
- \markup { 4 }
+ \footnote
+ \markup { 4 } #'(1 . -1) #'Stem
\markup { \bold 4. { This is a stem } }
c4
- \footnoteGrob #'AccidentalCautionary #'(0 . 0.5)
- \markup \concat \teeny { "sharp (v)" }
+ \footnote
+ \markup \concat \teeny { "sharp (v)" } #'(0 . 0.5) #'AccidentalCautionary
\markup \italic { v. A cautionary accidental }
- \footnoteGrob #'TextScript #'(0.5 . -0.5)
- \markup \concat \teeny { "a" }
+ \footnote
+ \markup \concat \teeny { "a" } #'(0.5 . -0.5) #'TextScript
\markup \italic { a. Slow Down }
dis?4_"rit."
\breathe
- \footnoteGrob #'BreathingSign #'(1.5 . -0.25)
- \markup { \teeny \musicglyph #"rests.4" }
+ \footnote
+ \markup { \teeny \musicglyph #"rests.4" } #'(1.5 . -0.25) #'BreathingSign
\markup { \null }
}
}
The @code{measureLength} property is described in @ref{Time
administration}.
-@cindex repeats with ties
-@cindex alternative endings with ties
-@cindex ties in repeats
-@cindex ties in alternative endings
+@cindex repeats, with ties
+@cindex alternative endings, with ties
+@cindex ties, in repeats
+@cindex ties, alternative endings
@funindex \repeatTie
Ties may be added to a second ending:
@end lilypond
@snippets
-
@lilypondfile[verbatim,quote,texidoc,doctitle]
{shortening-volta-brackets.ly}
@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-the-double-repeat-default-for-volte.ly}
+@cindex repeats, bar numbers letters
+@cindex repeats, alternative bar numbers
+
+@lilypondfile[verbatim,quote,texidoc,doctitle]
+{alternative-bar-numbering.ly}
+
@seealso
Music Glossary:
@rglos{repeat},
@rinternals{VoltaRepeatedMusic},
@rinternals{UnfoldedRepeatedMusic}.
-
@knownissues
-
@cindex repeat, ambiguous
@cindex nested repeat
@cindex repeat, nested
c1 | c | c | c
@end lilypond
-
@snippets
-
@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-the-bar-number-for-the-first-measure.ly}
@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{printing-bar-numbers-inside-boxes-or-circles.ly}
+@cindex bar numbers, with letters
+@cindex bar numbers, with repeats
+
+@lilypondfile[verbatim,quote,texidoc,doctitle]
+{alternative-bar-numbering.ly}
+
@cindex bar number alignment
@lilypondfile[verbatim,quote,texidoc,doctitle]
@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle]
{removing-bar-numbers-from-a-score.ly}
-
@seealso
Snippets:
@rlsr{Rhythms}.
@rinternals{BarNumber},
@rinternals{Bar_number_engraver}.
-
@cindex bar number collision
@cindex collision, bar number
+<!--
+we depend on an external entity here, which we cannot control. Suppose
+we go from 2.15.x to 2.17.x and put the documentation under "v2.17".
+For some time, Google won't have the new location in its index, so the
+search would get nothing. It would be better to keep "v2.15" in the
+search for a while and have a redirection from "v2.15" to "v2.17".
+-->
+
<form action="http://google.com/search"
method="get"
name="search"
- onSubmit="search.q.value='site:lilypond.org +v2.14 '
+ onSubmit="search.q.value='site:lilypond.org/doc/v2.15 '
+ search.brute_query.value"
- onMouseMove="search.q.value='site:lilypond.org +v2.14 '
+ onMouseMove="search.q.value='site:lilypond.org/doc/v2.15 '
+ search.brute_query.value"
- onKeyUp="search.q.value='site:lilypond.org +v2.14 '
+ onKeyUp="search.q.value='site:lilypond.org/doc/v2.15 '
+ search.brute_query.value">
<input type="hidden" name="btnG" value="Google Search">
<input type="text" name="brute_query" onfocus="this.value=''" value="Search">
@include macros.itexi
@ifnothtml
+@macro nodeprefix{PRE}
+@end macro
@macro lydoctitle{TEXT}
@unnumberedsec \TEXT\
@end macro
@end ifnothtml
@ifhtml
+@macro nodeprefix{PRE}
+@unmacro lydoctitle
@macro lydoctitle{TEXT}
-@node \TEXT\
-@unnumberedsec \TEXT\
+@node \PRE\: \\TEXT\\
+@unnumberedsec \\TEXT\\
+@end macro
@end macro
@end ifhtml
--- /dev/null
+% DO NOT EDIT this file manually; it is automatically
+% generated from Documentation/snippets/new
+% Make any changes in Documentation/snippets/new/
+% and then run scripts/auxiliar/makelsr.py
+%
+% This file is in the public domain.
+%% Note: this file works from version 2.15.24
+\version "2.15.24"
+
+\header {
+ lsrtags = "editorial-annotations, staff-notation, tweaks-and-overrides"
+ texidoc = "Two alternative methods for bar numbering can be set,
+ especially for when using repeated music."
+ doctitle = "Alternative bar numbering"
+} % begin verbatim
+
+
+\relative c'{
+ \set Score.alternativeNumberingStyle = #'numbers
+ \repeat volta 3 { c4 d e f | }
+ \alternative {
+ { c4 d e f | c2 d \break }
+ { f4 g a b | f4 g a b | f2 a | \break }
+ { c4 d e f | c2 d }
+ }
+ c1 \break
+ \set Score.alternativeNumberingStyle = #'numbers-with-letters
+ \repeat volta 3 { c,4 d e f | }
+ \alternative {
+ { c4 d e f | c2 d \break }
+ { f4 g a b | f4 g a b | f2 a | \break }
+ { c4 d e f | c2 d }
+ }
+ c1
+}
@node Ancient notation
@unnumbered Ancient notation
+@nodeprefix Ancient notation
@ruser{Ancient notation}
@node Chords
@unnumbered Chords
+@nodeprefix Chords
@ruser{Chord notation}
@node Contexts and engravers
@unnumbered Contexts and engravers
+@nodeprefix Contexts and engravers
@c FIXME make xref more precise when the chapter has been
@c revised in GDP
@node Editorial annotations
@unnumbered Editorial annotations
+@nodeprefix Editorial annotations
@ruser{Editorial annotations}
adding-fingerings-to-a-score.ly
allowing-fingerings-to-be-printed-inside-the-staff.ly
+alternative-bar-numbering.ly
analysis-brackets-above-the-staff.ly
applying-note-head-styles-depending-on-the-step-of-the-scale.ly
avoiding-collisions-with-chord-fingerings.ly
@node Expressive marks
@unnumbered Expressive marks
+@nodeprefix Expressive marks
@ruser{Expressive marks}
@node Fretted strings
@unnumbered Fretted strings
+@nodeprefix Fretted strings
@ruser{Fretted string instruments}
@node Keyboards
@unnumbered Keyboards
+@nodeprefix Keyboards
@ruser{Keyboard and other multi-staff instruments}
@node MIDI
@unnumbered MIDI
+@nodeprefix MIDI
@ruser{MIDI output}
--- /dev/null
+\version "2.15.24"
+
+\header {
+ lsrtags = "editorial-annotations, staff-notation, tweaks-and-overrides"
+ texidoc = "Two alternative methods for bar numbering can be set,
+ especially for when using repeated music."
+ doctitle = "Alternative bar numbering"
+}
+
+\relative c'{
+ \set Score.alternativeNumberingStyle = #'numbers
+ \repeat volta 3 { c4 d e f | }
+ \alternative {
+ { c4 d e f | c2 d \break }
+ { f4 g a b | f4 g a b | f2 a | \break }
+ { c4 d e f | c2 d }
+ }
+ c1 \break
+ \set Score.alternativeNumberingStyle = #'numbers-with-letters
+ \repeat volta 3 { c,4 d e f | }
+ \alternative {
+ { c4 d e f | c2 d \break }
+ { f4 g a b | f4 g a b | f2 a | \break }
+ { c4 d e f | c2 d }
+ }
+ c1
+}
@node Paper and layout
@unnumbered Paper and layout
+@nodeprefix Paper and layout
@c FIXME not precise enough reference?
@ruser{Spacing issues}
@node Percussion
@unnumbered Percussion
+@nodeprefix Percussion
@ruser{Percussion}
@node Pitches
@unnumbered Pitches
+@nodeprefix Pitches
@ruser{Pitches}
@node Repeats
@unnumbered Repeats
+@nodeprefix Repeats
@ruser{Repeats}
@node Rhythms
@unnumbered Rhythms
+@nodeprefix Rhythms
@ruser{Rhythms}
@node Simultaneous notes
@unnumbered Simultaneous notes
+@nodeprefix Simultaneous notes
@ruser{Simultaneous notes}
@node Spacing
@unnumbered Spacing
+@nodeprefix Spacing
@ruser{Spacing issues}
@node Staff notation
@unnumbered Staff notation
+@nodeprefix Staff notation
@ruser{Staff notation}
adding-an-extra-staff.ly
adding-indicators-to-staves-which-get-split-after-a-break.ly
adding-orchestral-cues-to-a-vocal-score.ly
+alternative-bar-numbering.ly
changing-the-number-of-lines-in-a-staff.ly
changing-the-staff-size.ly
creating-blank-staves.ly
@node Templates
@unnumbered Templates
+@nodeprefix Templates
@lysnippets
@node Text
@unnumbered Text
+@nodeprefix Text
@ruser{Text}
@node Titles
@unnumbered Titles
+@nodeprefix Titles
@ruser{Titles and headers}
@node Tweaks and overrides
@unnumbered Tweaks and overrides
+@nodeprefix Tweaks and overrides
@c FIXME make xref more precise when the chapter has been
@c revised in GDP
adjusting-grace-note-spacing.ly
altering-the-length-of-beamed-stems.ly
+alternative-bar-numbering.ly
analysis-brackets-above-the-staff.ly
asymmetric-slurs.ly
avoiding-collisions-with-chord-fingerings.ly
@node Unfretted strings
@unnumbered Unfretted strings
+@nodeprefix Unfretted strings
@ruser{Unfretted string instruments}
@node Vocal music
@unnumbered Vocal music
+@nodeprefix Vocal music
@ruser{Vocal music}
@node Winds
@unnumbered Winds
+@nodeprefix Winds
@ruser{Wind instruments}
@node World music
@unnumbered World music
+@nodeprefix World music
@ruser{World music}
the music are adjusted to match the layout of your document.
This is a separate program from @command{lilypond} itself, and is run
-on the command line; for more information, see @ref{Command-line
-usage}. If you have MacOS 10.3 or 10.4 and you have trouble running
-@code{lilypond-book}, see @rweb{MacOS X}.
+on the command line; for more information, see
+@ref{Command-line usage}. If you have trouble running
+@code{lilypond-book} on Windows or Mac OS X using the command line, then
+see either @rweb{Windows} or @rweb{MacOS X}.
This procedure may be applied to @LaTeX{}, HTML, Texinfo or DocBook
documents.
@cindex texinfo
-@cindex latex
+@cindex LaTex
@cindex texinfo
@cindex texi
-@cindex html
+@cindex HTML
@cindex docbook
-@cindex documents, adding music to
-@cindex HTML, music in
-@cindex Texinfo, music in
-@cindex DocBook, music in
-@cindex @LaTeX{}, music in
+@cindex documents, adding music
+@cindex HTML, adding music
+@cindex Texinfo, adding music
+@cindex DocBook, adding music
+@cindex LaTeX, adding music
@menu
* An example of a musicological document::
twocolumn mode, remember to add @option{-t landscape} to the
@command{dvips} options.
+@knownissues
+The @code{\pageBreak} command will not work within a
+@code{\begin@{lilypond@} @dots{} \end@{lilypond@}} environment.
+
+Many @code{\paper} block variables will also not work within a
+@code{\begin@{lilypond@} @dots{} \end@{lilypond@}} environment. Use
+@code{\newcommand} with @code{\betweenLilyPondSystem} in the preamble;
+
+@example
+\newcommand@{\betweenLilyPondSystem@}[1]@{\vspace@{36mm@}\linebreak@}
+@end example
+
+
@subsubheading Texinfo
To produce a Texinfo document (in any output format), follow the normal
#(use-modules (guile-user))
@end example
-@warning{Windows users must use double quotes instead of single quotes.}
-
@noindent
at the top of the @code{.ly} file.
+@warning{Windows users must use double quotes instead of single quotes.}
+
@cindex output, format
@cindex format, output
and his ensemble @uref{http://www.earlymusicny.org/, Early Music
New York} (engraving by Nicolas Sceaux).
+@item
+Mussorgsky's @emph{Pictures at an exhibition}, re-orchestrated and
+conducted by @uref{http://www.aurelienbello.com/,Aurélien Bello} with
+the @uref{http://www.junge-philharmonie-brandenburg.de/,Junge Philharmonie Brandenburg}
+on Oct 10 2011 and again on Apr 15-16 2012.
+
@end itemize
@divEnd
@c used for news about the upcoming release; see CG 10.2
+@newsItem
+@subsubheading LilyPond 2.15.26 released! @emph{Jan 16, 2012}
+
+We are happy to announce the release of LilyPond 2.15.26. This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version. Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+The 2.15.25 has been skipped due to build problems.
+
+@newsEnd
+
+
@newsItem
@subsubheading LilyPond 2.15.24 released! @emph{Jan 07, 2012}
# For both online and offline docs, issue `make doc WEB_TARGETS="offline online"'
WEB_TARGETS = offline
-WWW-post:
+WEB_EXAMPLE_FILES = $(wildcard input/$(outdir)/*.ly) \
+ $(wildcard input/*/$(outdir)/*.ly) \
+ $(wildcard input/*/*/$(outdir)/*.ly)
+
+WEB_TRACKED_FILES = $(wildcard $(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}) \
+ $(wildcard input/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}) \
+ $(wildcard input/*/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}) \
+ $(wildcard Documentation/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}) \
+ $(wildcard Documentation/$(outdir)/*/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php})
+
+WWW-post: $(top-build-dir)/.htaccess $(outdir)/examples.html $(outdir)/offline-root/index.html
+
# need UTF8 setting in case this is hosted on a website.
+$(top-build-dir)/.htaccess:
echo -e 'AddDefaultCharset utf-8\nAddCharset utf-8 .html\nAddCharset utf-8 .en\nAddCharset utf-8 .nl\nAddCharset utf-8 .txt\n' > $(top-build-dir)/.htaccess
+
+$(outdir)/examples.html: $(WEB_EXAMPLE_FILES)
$(buildscript-dir)/mutopia-index -o $(outdir)/examples.html input/
- find $(outdir) -name '*-root' | xargs rm -rf
+
+$(outdir)/offline-root/index.html: $(WEB_TRACKED_FILES)
$(buildscript-dir)/www_post $(PACKAGE_NAME) $(TOPLEVEL_VERSION) $(outdir) "$(WEB_TARGETS)"
find $(outdir)/offline-root -type l | xargs rm -f
endif # ifeq ($(out),www)
doc-clean: snippets-clean $(tree-share-prefix)/lilypond-force
-default: $(config_h) build-dir-setup
+default: $(config_h) build-dir-setup build-scripts
build-dir-setup: $(tree-share-prefix)/lilypond-force
+build-scripts:
+ $(MAKE) -C scripts/build
+
PO_FILES = $(call src-wildcard,$(src-depth)/po/*.po)
HELP_CATALOGS = $(PO_FILES:po/%.po=%)
CATALOGS = $(HELP_CATALOGS:lilypond=)
-$(tree-share-prefix)/lilypond-force link-tree: GNUmakefile $(outdir)/VERSION
# Preparing LilyPond tree for build-dir exec
+link-tree: $(tree-share-prefix)/lilypond-force
+
+$(tree-share-prefix)/lilypond-force: GNUmakefile $(outdir)/VERSION
cd $(top-build-dir)/$(outbase) && rm -rf bin lib share
mkdir -p $(tree-bin)
mkdir -p $(tree-share-prefix)
ln -sf ../../../../../po/$(outconfbase)/$i.mo lilypond.mo) &&) true
touch $(tree-share-prefix)/lilypond-force
-$(tree-share-prefix)/mf-link-tree link-mf-tree: $(tree-share-prefix)/lilypond-force
+link-mf-tree: $(tree-share-prefix)/mf-link-tree
+
+$(tree-share-prefix)/mf-link-tree: $(tree-share-prefix)/lilypond-force
-rm -f $(tree-share-prefix)/fonts/otf/* && \
rm -f $(tree-share-prefix)/fonts/svg/* && \
rm -f $(tree-share-prefix)/fonts/fonts.conf && \
ln -s ../../../../../../mf/$(outconfbase)/*.tfm .
-cd $(tree-share-prefix)/fonts/type1 && \
ln -s ../../../../../../mf/$(outconfbase)/*.pf? .
+ touch $(tree-share-prefix)/mf-link-tree
TAGS.make: dummy
etags -o $@ $(find $(top-src-dir) -name 'GNUmakefile*' -o -name '*.make')
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=15
-PATCH_LEVEL=25
+PATCH_LEVEL=27
MY_PATCH_LEVEL=
VERSION_STABLE=2.14.2
-VERSION_DEVEL=2.15.24
+VERSION_DEVEL=2.15.26
-\version "2.15.7"
+\version "2.15.25"
\header {
texidoc = "This is an example of automatic footnote numbering
where the number is reset on each page. It uses the symbol-footnotes
\markup { h i }
\relative c' {
-\autoFootnoteGrob #'NoteHead #'(1 . -1) \markup { j }
+\footnote #'(1 . -1) #'NoteHead \markup { j }
a b c d }
\pageBreak
\relative c' {
d4 e
- < f a-\autoFootnote #'(1 . -1) \markup { n } c >
- \autoFootnoteGrob #'Beam #'(1 . 1) \markup { o }
- \autoFootnoteGrob #'Hairpin #'(1 . 1) \markup { p }
+ < f a-\footnote #'(1 . -1) \markup { n } c >
+ \footnote #'(1 . 1) #'Beam \markup { o }
+ \footnote #'(1 . 1) #'Hairpin \markup { p }
a8\< [ b c d ] a4 b c |
d a b c |
d a b c |
-\version "2.15.21"
+\version "2.15.25"
\header {
texidoc = "This regtest makes sure that footnote numbers are laid out
in the correct vertical order.
d4 e
\once \override FootnoteItem #'numbering-assertion-function =
#(lambda (grob) (make-footnote-numbering-assertion-function 0))
- < f a-\autoFootnote #'(1 . -1) \markup { n } c >
+ < f a-\footnote #'(1 . -1) \markup { n } c >
\once \override FootnoteSpanner #'numbering-assertion-function =
#(simultaneous-footnote-numbering-assertion-function 2 4)
- \autoFootnoteGrob #'Beam #'(1 . 1) \markup { o }
- \autoFootnoteGrob #'Hairpin #'(1 . 1) \markup { p }
+ \footnote #'(1 . 1) #'Beam \markup { o }
+ \footnote #'(1 . 1) #'Hairpin \markup { p }
a8\< [ b c d ] a4 b c\f |
d a b c |\break
d,4 e
\once \override FootnoteItem #'numbering-assertion-function =
#(lambda (grob) (make-footnote-numbering-assertion-function 6))
- < f a-\autoFootnote #'(1 . -1) \markup { n } c >
+ < f a-\footnote #'(1 . -1) \markup { n } c >
\once \override FootnoteSpanner #'numbering-assertion-function =
#(simultaneous-footnote-numbering-assertion-function 8 10)
- \autoFootnoteGrob #'Beam #'(1 . 1) \markup { o }
- \autoFootnoteGrob #'Hairpin #'(1 . 1) \markup { p }
+ \footnote #'(1 . 1) #'Beam \markup { o }
+ \footnote #'(1 . 1) #'Hairpin \markup { p }
a8\< [ b c d ] a4 b c |
d a b c\f |\pageBreak
d,4 e
\once \override FootnoteItem #'numbering-assertion-function =
#(lambda (grob) (make-footnote-numbering-assertion-function 12))
- < f a-\autoFootnote #'(1 . -1) \markup { n } c >
+ < f a-\footnote #'(1 . -1) \markup { n } c >
\once \override FootnoteSpanner #'numbering-assertion-function =
#(simultaneous-footnote-numbering-assertion-function 14 16)
- \autoFootnoteGrob #'Beam #'(1 . 1) \markup { o }
- \autoFootnoteGrob #'Hairpin #'(1 . 1) \markup { p }
+ \footnote #'(1 . 1) #'Beam \markup { o }
+ \footnote #'(1 . 1) #'Hairpin \markup { p }
a8\< [ b c d ] a4 b c |
d a b c\! |\break
}
d4 e
\once \override FootnoteItem #'numbering-assertion-function =
#(lambda (grob) (make-footnote-numbering-assertion-function 1))
- < f a-\autoFootnote #'(1 . -1) \markup { n } c >
+ < f a-\footnote #'(1 . -1) \markup { n } c >
\once \override FootnoteSpanner #'numbering-assertion-function =
#(simultaneous-footnote-numbering-assertion-function 3 5)
- \autoFootnoteGrob #'Beam #'(1 . 1) \markup { o }
- \autoFootnoteGrob #'Hairpin #'(1 . 1) \markup { p }
+ \footnote #'(1 . 1) #'Beam \markup { o }
+ \footnote #'(1 . 1) #'Hairpin \markup { p }
a8\< [ b c d ] a4 b c\f |
d a b c |\break
d,4 e
\once \override FootnoteItem #'numbering-assertion-function =
#(lambda (grob) (make-footnote-numbering-assertion-function 7))
- < f a-\autoFootnote #'(1 . -1) \markup { n } c >
+ < f a-\footnote #'(1 . -1) \markup { n } c >
\once \override FootnoteSpanner #'numbering-assertion-function =
#(simultaneous-footnote-numbering-assertion-function 9 11)
- \autoFootnoteGrob #'Beam #'(1 . 1) \markup { o }
- \autoFootnoteGrob #'Hairpin #'(1 . 1) \markup { p }
+ \footnote #'(1 . 1) #'Beam \markup { o }
+ \footnote #'(1 . 1) #'Hairpin \markup { p }
a8\< [ b c d ] a4 b c |
d a b c\f |\pageBreak
d,4 e
\once \override FootnoteItem #'numbering-assertion-function =
#(lambda (grob) (make-footnote-numbering-assertion-function 13))
- < f a-\autoFootnote #'(1 . -1) \markup { n } c >
+ < f a-\footnote #'(1 . -1) \markup { n } c >
\once \override FootnoteSpanner #'numbering-assertion-function =
#(simultaneous-footnote-numbering-assertion-function 15 17)
- \autoFootnoteGrob #'Beam #'(1 . 1) \markup { o }
- \autoFootnoteGrob #'Hairpin #'(1 . 1) \markup { p }
+ \footnote #'(1 . 1) #'Beam \markup { o }
+ \footnote #'(1 . 1) #'Hairpin \markup { p }
a8\< [ b c d ] a4 b c |
d a b c\! |\break
}
-\version "2.15.21"
+\version "2.15.25"
\header {
texidoc = "This is an example of automatic footnote numbering
where the number is not reset on each page. It uses the default
\relative c' {
\once \override FootnoteItem #'numbering-assertion-function =
#(lambda (grob) (make-footnote-numbering-assertion-function 3))
- \autoFootnoteGrob #'NoteHead #'(1 . -1) \markup { j }
+ \footnote #'(1 . -1) #'NoteHead \markup { j }
a b c d
}
d4 e
\once \override FootnoteItem #'numbering-assertion-function =
#(lambda (grob) (make-footnote-numbering-assertion-function 5))
- < f a-\autoFootnote #'(1 . -1) \markup { n } c >
+ < f a-\footnote #'(1 . -1) \markup { n } c >
\once \override FootnoteSpanner #'numbering-assertion-function =
#(simultaneous-footnote-numbering-assertion-function 6 7)
- \autoFootnoteGrob #'Beam #'(1 . 1) \markup { o }
- \autoFootnoteGrob #'Hairpin #'(1 . 1) \markup { p }
+ \footnote #'(1 . 1) #'Beam \markup { o }
+ \footnote #'(1 . 1) #'Hairpin \markup { p }
a8\< [ b c d ] a4 b c |
d a b c |
d a b c |
-\version "2.15.17"
+\version "2.15.25"
\header {
texidoc = "With grobs that have break visibility, footnotes will
automatically take the break visibility of the grob being footnoted.
{
\relative c' {
c1
- \footnoteGrob #'TimeSignature #'(0 . 2) "foo" "bar"
+ \footnote "foo" #'(0 . 2) #'TimeSignature "bar"
\time 3/4
\break \pageBreak
c2.
\once \override Staff . FootnoteItem #'break-visibility = ##(#f #f #t)
- \footnoteGrob #'TimeSignature #'(0 . 2) "foo" "bar"
+ \footnote "foo" #'(0 . 2) #'TimeSignature "bar"
\time 4/4
\break \pageBreak
c1 \bar "|."
-\version "2.14.0"
+\version "2.15.25"
\header {
texidoc = "The padding between a footnote and the footer can be tweaked."
}
\book {
\relative c' {
- \footnoteGrob #'NoteHead
- #'(1 . -1)
+ \footnote
\markup { \tiny 1 }
+ #'(1 . -1) #'NoteHead
\markup { 1. Tiny space below. }
e1
- \footnoteGrob #'NoteHead
- #'(1 . -1)
+ \footnote
\markup { \tiny 2 }
+ #'(1 . -1) #'NoteHead
\markup { 2. Tiny space below. }
e1
- \footnoteGrob #'NoteHead
- #'(1 . -1)
+ \footnote
\markup { \tiny 3 }
+ #'(1 . -1) #'NoteHead
\markup { 3. Big space below. }
e1
}}
-\version "2.14.0"
+\version "2.15.25"
\header {
texidoc = "Footnotes are annotated at the correct place, and the
annotation goes to the correct page."
\book {
\relative c'' {
-\footnoteGrob #'Hairpin
- #'(0.5 . 0.5)
+\footnote
\markup { \tiny "1." }
+ #'(0.5 . 0.5) #'Hairpin
\markup { 1. \justify { Goes to the first broken spanner. } }
b4\< c d a
b c d a
b c d a\!
\once \override FootnoteSpanner #'spanner-placement = #RIGHT
-\footnoteGrob #'Hairpin
- #'(0.5 . 0.5)
+\footnote
\markup { \tiny "2." }
+ #'(0.5 . 0.5) #'Hairpin
\markup { 2. \justify { Goes to the last broken spanner. } }
b4\< c d a
b c d a
-\version "2.14.0"
+\version "2.15.25"
\header {
texidoc = "Lilypond does footnotes."
}
\markup { h i }
\relative c' {
-\footnoteGrob #'NoteHead #'(1 . -1) \markup { \tiny 4 } \markup { 4. j }
+\footnote \markup { \tiny 4 } #'(1 . -1) #'NoteHead \markup { 4. j }
a b c d }
\pageBreak
\relative c' {
d4 e
- < f a-\footnote #'(1 . -1) \markup { \tiny 6 } \markup { 6. n } c >
- \footnoteGrob #'Beam #'(1 . 1) \markup { \tiny 7 } \markup { 7. o }
- \footnoteGrob #'Hairpin #'(1 . 1) \markup { \tiny 8 } \markup { 8. p }
+ < f a-\footnote \markup { \tiny 6 } #'(1 . -1) \markup { 6. n } c >
+ \footnote \markup { \tiny 7 } #'(1 . 1) #'Beam \markup { 7. o }
+ \footnote \markup { \tiny 8 } #'(1 . 1) #'Hairpin \markup { 8. p }
a8\< [ b c d\f ] r2. |
}}
-\version "2.15.17"
+\version "2.15.25"
\header {
texidoc = "LilyPond does in-notes.
\relative c' {
\repeat unfold 5 {
\once \override FootnoteItem #'footnote = ##f
- \footnoteGrob #'NoteHead #'(0 . 0)
- "" \markup { \box \fill-line { "this is a test" } }
+ \footnote
+ "" #'(0 . 0) #'NoteHead \markup { \box \fill-line { "this is a test" } }
\repeat unfold 5 { a\< b c d\! }
- \autoFootnoteGrob #'NoteHead #'(-1 . 1) "foobar"
+ \footnote #'(-1 . 1) #'NoteHead "foobar"
\repeat unfold 5 { a\< b c d\! }
}
}
argument))
-footnoteGrob =
-#(define-music-function (parser location grob-name offset text footnote)
- (symbol? number-pair? markup? markup?)
- (_i "Attach @var{text} to @var{grob-name} at offset @var{offset},
-with @var{text} referring to @var{footnote} (use like @code{\\once})")
- (make-music 'FootnoteEvent
- 'automatically-numbered #f
- 'symbol grob-name
- 'X-offset (car offset)
- 'Y-offset (cdr offset)
- 'text text
- 'footnote-text footnote))
-
-autoFootnoteGrob =
-#(define-music-function (parser location grob-name offset footnote)
- (symbol? number-pair? markup?)
- (_i "Footnote @var{grob-name} with the text in @var{footnote}
-allowing for the footnote to be automatically numbered such that
-the number appears at @var{offset}. Note that, for this to take effect,
-auto-numbering must be turned on in the paper block. Otherwise, no
-number will appear. Use like @code{\\once})")
- (make-music 'FootnoteEvent
- 'automatically-numbered #t
- 'symbol grob-name
- 'X-offset (car offset)
- 'Y-offset (cdr offset)
- 'text (make-null-markup)
- 'footnote-text footnote))
-
-
footnote =
-#(define-music-function (parser location offset text footnote)
- (number-pair? markup? markup?)
- (_i "Attach @var{text} at @var{offset} with @var{text} referring
-to @var{footnote} (use like @code{\\tweak})")
- (make-music 'FootnoteEvent
- 'automatically-numbered #f
- 'X-offset (car offset)
- 'Y-offset (cdr offset)
- 'text text
- 'footnote-text footnote))
-
-autoFootnote =
-#(define-music-function (parser location offset footnote)
- (number-pair? markup?)
- (_i "Footnote the item after which this comes with the text in
-@var{footnote} allowing for the footnote to be automatically numbered
-such that the number appears at @var{offset}. Note that, for this to
-take effect, auto-numbering must be turned on in the paper block.
-Otherwise, no number will appear. Use like @code{\\tweak})")
- (make-music 'FootnoteEvent
- 'automatically-numbered #t
- 'X-offset (car offset)
- 'Y-offset (cdr offset)
- 'text (make-null-markup)
- 'footnote-text footnote))
+#(define-music-function (parser location text offset grob-name footnote)
+ ((markup?) number-pair? (symbol? '()) markup?)
+ (_i "Attach @var{text} at @var{offset} with @var{text} referring to
+@var{footnote}. If @var{text} is given as @code{\\default}, use
+autonumbering instead. Note that, for this to take effect,
+auto-numbering must be turned on in the paper block. Otherwise, no
+number will appear. Footnotes are applied like articulations. If a
+symbol @var{grob-name} is specified, all grobs of that kind at the
+current time step are affected.")
+ (make-music
+ 'FootnoteEvent
+ 'X-offset (car offset)
+ 'Y-offset (cdr offset)
+ 'automatically-numbered (not text)
+ 'text (or text (make-null-markup))
+ 'footnote-text footnote
+ 'symbol grob-name))
grace =
#(def-grace-function startGraceMusic stopGraceMusic
for prefix, ext_list in pages_dict.items ():
for lang_ext in ext_list:
file_name = langdefs.lang_file_name (prefix, lang_ext, '.html')
- in_f = open (file_name)
- s = in_f.read()
- in_f.close()
-
- s = s.replace ('%', '%%')
- s = hack_urls (s, prefix, target, bool (int (versiontup[1]) % 2))
- s = add_header (s, prefix)
-
- ### add footer
- if footer_tag_re.search (s) == None:
- if 'web' in file_name:
- s = add_footer (s, footer_tag + web_footer)
- else:
- s = add_footer (s, footer_tag + footer)
-
- available, missing = find_translations (prefix, lang_ext)
- page_flavors = process_links (s, prefix, lang_ext, file_name, missing, target)
- # Add menu after stripping: must not have autoselection for language menu.
- page_flavors = add_menu (page_flavors, prefix, available, target, translation)
- for k in page_flavors:
- page_flavors[k][1] = page_flavors[k][1] % subst[page_flavors[k][0]]
- out_f = open (name_filter (k), 'w')
- out_f.write (page_flavors[k][1])
- out_f.close()
+ source_time = os.path.getmtime(file_name)
+ dest_time = 0
+ if os.path.exists(name_filter(file_name)):
+ dest_time = os.path.getmtime(name_filter(file_name))
+ if dest_time < source_time:
+
+ in_f = open (file_name)
+ s = in_f.read()
+ in_f.close()
+
+ s = s.replace ('%', '%%')
+ s = hack_urls (s, prefix, target, bool (int (versiontup[1]) % 2))
+ s = add_header (s, prefix)
+
+ ### add footer
+ if footer_tag_re.search (s) == None:
+ if 'web' in file_name:
+ s = add_footer (s, footer_tag + web_footer)
+ else:
+ s = add_footer (s, footer_tag + footer)
+
+ available, missing = find_translations (prefix, lang_ext)
+ page_flavors = process_links (s, prefix, lang_ext, file_name, missing, target)
+ # Add menu after stripping: must not have autoselection for language menu.
+ page_flavors = add_menu (page_flavors, prefix, available, target, translation)
+ for k in page_flavors:
+ page_flavors[k][1] = page_flavors[k][1] % subst[page_flavors[k][0]]
+ out_f = open (name_filter (k), 'w')
+ out_f.write (page_flavors[k][1])
+ out_f.close()
# if the page is translated, a .en.html symlink is necessary for content negotiation
if target == 'online' and ext_list != ['']:
os.symlink (os.path.basename (prefix) + '.html', name_filter (prefix + '.en.html'))
# Helper functions
########################################################################
-def find_file (name, include_path, raise_error=True):
- for i in include_path:
+def find_file (name, include_path, working_dir=None, raise_error=True):
+ current_path = working_dir or os.getcwd();
+ for i in [current_path] + include_path:
full = os.path.join (i, name)
+ full = os.path.normpath (os.path.join (current_path, full))
if os.path.exists (full):
return full
return []
def input_fullname (self, input_filename):
- return find_file (input_filename, self.global_options.include_path)
+ return find_file (input_filename, self.global_options.include_path,
+ self.global_options.original_dir)
def adjust_snippet_command (self, cmd):
return cmd
import re
import tempfile
import os
+import sys
import subprocess
import book_base as BookBase
from book_snippets import *
\expandafter\preLilyPondExample
\fi
\def\lilypondbook{}%%
-\input %(base)s-systems.tex
+\input{%(base)s-systems.tex}
\ifx\postLilyPondExample \undefined
\else
\expandafter\postLilyPondExample
progress (_ ("Running `%s' on file `%s' to detect default page settings.\n")
% (global_options.latex_program, tmpfile));
cmd = '%s %s' % (global_options.latex_program, tmpfile);
- proc = subprocess.Popen (cmd,
- universal_newlines=True, shell=True,
- stdout=subprocess.PIPE, stderr=subprocess.PIPE);
- (parameter_string, error_string) = proc.communicate ()
- if proc.returncode != 0:
- warning (_ ("Unable to auto-detect default page settings:\n%s")
- % error_string);
+ ly.debug_output ("Executing: %s\n" % cmd);
+ run_env = os.environ.copy()
+ run_env['LC_ALL'] = 'C'
+
+ ### unknown why this is necessary
+ universal_newlines = True
+ if sys.platform == 'mingw32':
+ universal_newlines = False
+ ### use os.system to avoid weird sleep() problems on
+ ### GUB's python 2.4.2 on mingw
+ # make file to write to
+ output_dir = tempfile.mkdtemp()
+ output_filename = os.path.join(output_dir, 'output.txt')
+ # call command
+ cmd += " > %s" % output_filename
+ returncode = os.system(cmd)
+ parameter_string = open(output_filename).read()
+ if returncode != 0:
+ warning (_ ("Unable to auto-detect default settings:\n"))
+ # clean up
+ os.remove(output_filename)
+ os.rmdir(output_dir)
+ else:
+ proc = subprocess.Popen (cmd,
+ env=run_env,
+ universal_newlines=universal_newlines,
+ shell=True,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ (parameter_string, error_string) = proc.communicate ()
+ if proc.returncode != 0:
+ warning (_ ("Unable to auto-detect default settings:\n%s")
+ % error_string)
os.unlink (tmpfile)
if os.path.exists (auxfile):
os.unlink (auxfile)
def snippet_output (self, basename, snippet):
str = ''
rep = snippet.get_replacements ();
- rep['base'] = basename
+ rep['base'] = basename.replace ('\\', '/')
str += self.output_print_filename (basename, snippet)
if VERBATIM in snippet.option_dict:
rep['verb'] = snippet.verb_ly ()
existing = open (filename, 'r').read ()
if self.relevant_contents (existing) != self.relevant_contents (self.full_ly ()):
- warning ("%s: duplicate filename but different contents of orginal file,\n\
+ warning ("%s: duplicate filename but different contents of original file,\n\
printing diff against existing file." % filename)
ly.stderr_write (self.filter_pipe (self.full_ly (), 'diff -u %s -' % filename))
else:
LilypondSnippet.__init__ (self, type, match, formatter, line_number, global_options)
self.filename = self.substring ('filename')
self.ext = os.path.splitext (os.path.basename (self.filename))[1]
- self.contents = file (BookBase.find_file (self.filename, global_options.include_path)).read ()
+ self.contents = file (BookBase.find_file (self.filename,
+ global_options.include_path, global_options.original_dir)).read ()
def get_snippet_code (self):
return self.contents;
if os.path.exists (xmlfilename):
diff_against_existing = self.filter_pipe (self.contents, 'diff -u %s - ' % xmlfilename)
if diff_against_existing:
- warning (_ ("%s: duplicate filename but different contents of orginal file,\n\
+ warning (_ ("%s: duplicate filename but different contents of original file,\n\
printing diff against existing file.") % xmlfilename)
ly.stderr_write (diff_against_existing)
else:
import re
import tempfile
import subprocess
+import sys
import book_base as BookBase
from book_snippets import *
import lilylib as ly
progress (_ ("Running texi2pdf on file %s to detect default page settings.\n") % tmpfile);
# execute the command and pipe stdout to the parameter_string:
- cmd = 'LC_ALL=C %s -c -o %s %s' % (global_options.texinfo_program, outfile, tmpfile);
+ cmd = '%s -c -o %s %s' % (global_options.texinfo_program, outfile, tmpfile);
ly.debug_output ("Executing: %s\n" % cmd);
-
- proc = subprocess.Popen (cmd,
- universal_newlines=True, shell=True,
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- (parameter_string, error_string) = proc.communicate ()
- if proc.returncode != 0:
- warning (_ ("Unable to auto-detect default settings:\n%s")
- % error_string)
+ run_env = os.environ.copy()
+ run_env['LC_ALL'] = 'C'
+
+ ### unknown why this is necessary
+ universal_newlines = True
+ if sys.platform == 'mingw32':
+ universal_newlines = False
+ ### use os.system to avoid weird sleep() problems on
+ ### GUB's python 2.4.2 on mingw
+ # make file to write to
+ output_dir = tempfile.mkdtemp()
+ output_filename = os.path.join(output_dir, 'output.txt')
+ # call command
+ cmd += " > %s" % output_filename
+ returncode = os.system(cmd)
+ parameter_string = open(output_filename).read()
+ if returncode != 0:
+ warning (_ ("Unable to auto-detect default settings:\n"))
+ # clean up
+ os.remove(output_filename)
+ os.rmdir(output_dir)
+ else:
+ proc = subprocess.Popen (cmd,
+ env=run_env,
+ universal_newlines=universal_newlines,
+ shell=True,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ (parameter_string, error_string) = proc.communicate ()
+ if proc.returncode != 0:
+ warning (_ ("Unable to auto-detect default settings:\n%s")
+ % error_string)
os.unlink (tmpfile)
if os.path.exists(outfile):
os.unlink (outfile)
r"\1\\accidentalStyle", str)
return str
+def brace_matcher (n):
+ # poor man's matched brace scanning, gives up
+ # after n+1 levels. Matches any string with balanced
+ # braces inside; add the outer braces yourself if needed.
+ # Nongreedy.
+ return r"[^{}]*?(?:{"*n+r"[^{}]*?"+r"}[^{}]*?)*?"*n
+
+matchstring = r'"(?:[^"\\]|\\.)*"'
+matcharg = (r"\s+(?:[$#]['`]?\s*(?:[a-zA-Z]\S*|" + matchstring + r"|\("
+ + paren_matcher(20) + r"\))|" + matchstring + r"|\\[a-z_A-Z]+)")
+matchmarkup = (r'(?:\\markup\s*(?:{' + brace_matcher (20) +r'}|' +
+ matchstring + r'|(?:\\[a-z_A-Z][a-z_A-Z-]*(?:' + matcharg +
+ r')*?\s*)*(?:' + matchstring + "|{" + brace_matcher (20) +
+ "}))|" + matchstring + ")")
+
+@rule((2, 15, 25), r"\(auto)?Footnote(Grob)? -> \footnote")
+def conv (str):
+ # The following replacement includes the final markup argument in
+ # the match in order to better avoid touching the equally named
+ # markup function. The other functions have unique names, so
+ # there is no point in including their last, possibly complex
+ # argument in the match.
+ str = re.sub (r"\\footnote(" + matcharg + (r")(\s*" + matchmarkup)*2 + ")",
+ r"\\footnote\2\1\3", str)
+ str = re.sub (r"\\footnoteGrob"+("(" + matcharg + ")")*2 + r"(\s*" + matchmarkup + ")",
+ r"\\footnote\3\2\1", str)
+ str = re.sub (r"\\autoFootnoteGrob" + ("(" + matcharg + ")")*2,
+ r"\\footnote\2\1", str)
+ str = re.sub (r"\\autoFootnote",
+ r"\\footnote", str)
+ return str
# Guidelines to write rules (please keep this at the end of this file)
#
# - keep at most one rule per version; if several conversions should be done,
whitespaces = re.compile (r'\s+')
section_translation_re = re.compile ('^@(node|(?:unnumbered|appendix)\
(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|\
-(?:major|chap|(?:sub){0,2})heading|lydoctitle|translationof) \
+(?:major|chap|(?:sub){0,2})heading|lydoctitle|translationof|nodeprefix) \
(.+)$', re.MULTILINE)
external_node_re = re.compile (r'\s+@c\s+external.*')
print 'writing:', p
f = open (p, 'w')
+ node_prefix_title = ''
this_title = ''
this_filename = 'index'
this_anchor = ''
this_filename = anchor
elif original_node in initial_map:
this_filename = initial_map[original_node][2]
+ elif sec[0] == "nodeprefix":
+ node_prefix_title = remove_texinfo (sec[1])
+ node_prefix_anchor = create_texinfo_anchor (sec[1])
else:
# Some pages might not use a node for every section, so
# treat this case here, too: If we already had a section
this_anchor = create_texinfo_anchor (sec[1])
had_section = True
+ if sec[0] == "lydoctitle" and node_prefix_title:
+ this_title = "%s: %s" % (node_prefix_title, this_title)
+ this_anchor = "%s-%s" % (node_prefix_anchor, this_anchor)
+
if split == 'custom':
# unnumbered nodes use the previously used file name,
# only numbered nodes get their own filename! However,
for t in targets:
out_root = target_pattern % t
strip_file_name[t] = lambda s: os.path.join (target_pattern % t, (strip_re.sub ('', s)))
- os.mkdir (out_root)
- map (os.mkdir, [os.path.join (out_root, d) for d in dirs])
+ if not os.path.exists (out_root):
+ os.mkdir (out_root)
+ for d in dirs:
+ new_dir = os.path.join (out_root, d)
+ if not os.path.exists (new_dir):
+ os.mkdir (new_dir)
for f in hardlinked_files:
- os.link (f, strip_file_name[t] (f))
+ if not os.path.isfile (strip_file_name[t] (f)):
+ os.link (f, strip_file_name[t] (f))
for l in symlinks:
p = mirrortree.new_link_path (os.path.normpath (os.readlink (l)), os.path.dirname (l), strip_re)
dest = strip_file_name[t] (l)
p.add_option ("-I", '--include', help=_ ("add DIR to include path"),
metavar=_ ("DIR"),
action='append', dest='include_path',
- default=[os.path.abspath (os.getcwd ())])
+ default=[])
p.add_option ('--info-images-dir',
help=_ ("format Texinfo output so that Info will "
(global_options, args) = opt_parser.parse_args ()
global_options.information = {'program_version': ly.program_version, 'program_name': ly.program_name }
-
- global_options.include_path = map (os.path.abspath, global_options.include_path)
+ global_options.original_dir = original_dir
# Load the python packages (containing e.g. custom formatter classes)
# passed on the command line
if global_options.lily_output_dir:
# This must be first, so lilypond prefers to read .ly
# files in the other lybookdb dir.
- includes = [os.path.abspath(global_options.lily_output_dir)] + includes
+ includes = [global_options.lily_output_dir] + includes
global_options.process_cmd += ' '.join ([' -I %s' % ly.mkarg (p)
for p in includes])
base_file_name + global_options.formatter.default_extension)
os.chdir (original_dir)
- file (dep_file, 'w').write ('%s: %s'
+ file (dep_file, 'w').write ('%s: %s\n'
% (final_output_file, ' '.join (inputs)))
if __name__ == '__main__':
done
done
-
+ rm -f GNUmakefile
cat <<EOF > GNUmakefile
depth = .
include config\$(if \$(conf),-\$(conf),).make
include \$(configure-srcdir)/GNUmakefile.in
EOF
+ chmod 444 GNUmakefile
AC_SUBST(VPATH)
fi
])