include $(depth)/make/stepmake.make
+DOCUMENTATION_INCLUDES += -I $(outdir) \
+ -I $(top-build-dir)/Documentation/snippets/out \
+ -I $(top-src-dir)/Documentation/included \
+ -I $(top-src-dir)/Documentation/pictures \
+ -I $(top-src-dir)/Documentation \
+ -I $(top-src-dir)/input/regression
+
OUT_TXT_FILES = $(addprefix $(outdir)/, $(addsuffix .txt, $(README_TOP_FILES)))
$(buildscript-dir)/text2html $<
# Explicitly list the dependencies on generated content
-$(outdir)/web.texi: $(outdir)/we-wrote.itexi $(outdir)/others-did.itexi $(outdir)/weblinks.itexi
+$(outdir)/web.texi: $(outdir)/we-wrote.itexi $(outdir)/others-did.itexi $(outdir)/weblinks.itexi $(outdir)/version.itexi
ifeq ($(out),www)
## Extra images dependencies
$(OUT_TEXINFO_MANUALS): $(outdir)/pictures
$(outdir)/pictures:
- $(MAKE) -C pictures WWW-1
+ $(MAKE) -C pictures out=www WWW-1
ln -sf ../pictures/$(outdir) $@
$(outdir)/web.texi: $(outdir)/css $(outdir)/ly-examples
$(outdir)/css:
- $(MAKE) -C css
+ $(MAKE) -C css out=www WWW-1
ln -sf ../css/$(outdir) $@
$(outdir)/ly-examples:
- $(MAKE) -C ly-examples
+ $(MAKE) -C ly-examples out=www WWW-1
ln -sf ../ly-examples/$(outdir) $@
endif
@end ignore
+@item
+LilyPond no longer automatically infers a @samp{\defaultchild}
+context in a context definition with @samp{\accepts} clauses. Any
+context definition without an explicit or inherited
+@samp{\defaultchild} definition counts as a @samp{Bottom} context
+and will be eligible for rhythmic events and overrides without
+causing the implicit creation of other contexts. Be sure to
+specify a @samp{\defaultchild} for non-@samp{Bottom} contexts when
+defining them from scratch.
+
+@item
+There is now extensive support for both discant and bass accordion
+register symbols in the @samp{scm accreg} module, see
+@ruser{Accordion Registers}.
+@lilypond[verbatim,quote]
+#(use-modules (scm accreg))
+\new PianoStaff
+<<
+ \new Staff \relative
+ { \clef "treble" \discant "10"
+ r8 s32 f'[ bes f] s e[ a e] s d[ g d] s16 e32[ a]
+ \discant "121"
+ << { r16 <f bes> r <e a> r <d g> } \\
+ { d r a r bes r } >> |
+ <cis e a>1
+ }
+ \new Staff \relative
+ { \clef "treble" \freeBass "1"
+ r8 d'32 s16. c32 s16. bes32 s16. a32[ cis] s16
+ \clef "bass" \stdBass "Master"
+ << { r16 <f, bes d>^"b" r <e a c>^"am" r <d g bes>^"gm" |
+ <e a cis>1^"a" } \\
+ { d8_"D" c_"C" bes_"B" | a1_"A" }
+ >>
+ }
+>>
+@end lilypond
+
+@item
+New commands @code{markLengthOn} and @code{markLengthOff} control
+the allowance of horizontal space for tempo and rehearsal marks.
+
+@lilypond[quote,relative=2]
+\markLengthOn
+\compressFullBarRests
+\tempo "Molto vivace" c2 c'
+\mark\default
+\tempo "Meno mosso" R1*16
+\mark\default
+g,2 g
+\bar "||"
+\markLengthOff
+\tempo "Molto vivace" c2 c'
+\mark#1
+\tempo "Meno mosso" R1*16
+\mark\default
+g,2 g
+@end lilypond
+
+@item
+Rehearsal marks at the beginning of a line are now placed to the right
+of the clef and key signature by default. As in previous versions, the
+@code{break-alignable-interface} controls the behavior.
+
+@lilypond[quote,relative=2]
+\set Score.barNumberVisibility = #all-bar-numbers-visible
+\set Timing.currentBarNumber = #72
+\bar"||" \time 3/4 \key e\major \mark#10 \tempo "Adagio" b2.
+@end lilypond
+
@item
Decimal numbers can now be written directly in music,
without a hash sign. Together with the previous change
@seealso
Glossar:
@rglos{ligature}.
-
+
Notationsreferenz:
@ref{Weiße Mensuralligaturen},
@ref{Ligaturen der gregorianischen Quadratnotation}.
@seealso
Glossar:
@rglos{ligature}.
-
+
Notationreferenz:
@ref{ Ligaturen der gregorianischen Quadratnotation},
@ref{Weiße Mensuralligaturen},
@c try Till Rettig
@c Add example of white noteheads:
@c In the french baroque some composers used white noteheads in slow pieces,
-@c mainly in 3/2-time. A quarter looks there like a eighth with a white
+@c mainly in 3/2-time. A quarter looks there like an eighth with a white
@c notehead. (Franz-Rudolf Kuhnen)
@c TODO Add example of this:
Guide, node Updating translation committishes.
@end ignore
-@c \version "2.17.11"
+@c \version "2.17.27"
@c Translators: Till Paala
\layout @{
\context @{
\TabStaff
- stringTunings = \stringTuning \notemode @{ <c' g' d'' a''> @}
+ stringTunings = \stringTuning <c' g' d'' a''>
@}
@}
@end example
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.17.11"
+@c \version "2.17.27"
@node Instrumentos de cuerda con trastes
@section Instrumentos de cuerda con trastes
\layout @{
\context @{
\TabStaff
- stringTunings = \stringTuning \notemode @{ <c' g' d'' a''> @}
+ stringTunings = \stringTuning <c' g' d'' a''>
@}
@}
@end example
}
@Article{blostein91,
- note = {This paper provides a overview of the algorithm used in LIME
+ note = {This paper provides an overview of the algorithm used in LIME
for spacing individual lines. HWN},
year = {1991},
title = {Justification of Printed Music},
@Book{wanske88,
annote = {I. A very thorough overview of engraving practices of various
craftsmen. It includes detailed specs of characters, dimensions
-etc. II. a thorough overview of a anonymous (by now antiquated)
+etc. II. a thorough overview of an anonymous (by now antiquated)
automated system. EDV Means e(lektronischen) D(aten)v(erarbeitung),
electronic data processing HWN.},
year = {1988},
the leading arguments of markup functions that take a markup as
their last argument.
+@funindex \markup
+@cindex markup macro
+@funindex interpret-markup
+Markup commands have a rather complex life cycle. The body of a
+markup command definition is responsible for converting the
+arguments of the markup command into a stencil expression which is
+returned. Quite often this is accomplished by calling the
+@code{interpret-markup} function on a markup expression, passing
+the @var{layout} and @var{props} arguments on to it. Those
+arguments are usually only known at a very late stage in
+typesetting. Markup expressions have their components assembled
+into markup expressions already when @code{\markup} in a LilyPond
+expression or the @code{markup} macro in Scheme is expanded. The
+evaluation and typechecking of markup command arguments happens at
+the time @code{\markup}/@code{markup} are interpreted.
+
+But the actual conversion of markup expressions into stencil
+expressions by executing the markup function bodies only happens
+when @code{interpret-markup} is called on a markup expression.
+
@node On properties
@unnumberedsubsubsec On properties
@node New markup list command definition
@subsection New markup list command definition
+@funindex define-markup-list-command
+@funindex interpret-markup-list
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 of stencils.
+In a similar vein, @code{interpret-markup-list} is used instead of
+@code{interpret-markup} for converting a markup list into a list
+of 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.
@node Inline Scheme code
@section Inline Scheme code
-TODO: the example for this section is ill-chosen since
-@example
-F = -\tweak font-size #-3 -\flageolet
-@end example
-(note the @samp{-} marking it as a post event) will actually work fine
-for the stated purpose. Until this section gets a rewrite, let's
-pretend we don't know.
+TODO: after this section had been written, LilyPond has improved
+to the point that finding a @emph{simple} example where one would
+@emph{have} to revert to Scheme has become rather hard.
+
+Until this section gets a rewrite, let's pretend we don't know.
The main disadvantage of @code{\tweak} is its syntactical
-inflexibility. For example, the following produces a syntax error.
+inflexibility. For example, the following produces a syntax error
+(or rather, it did so at some point in the past).
@example
F = \tweak font-size #-3 -\flageolet
@code{Voice} approprié, le graveur @code{Ligature_bracket_engraver} par
le graveur de ligature qui convient -- voir les rubriques
@ref{Ligatures mensurales} et @ref{Neumes et ligatures grégoriennes} à
-ce sujet.
+ce sujet.
@seealso
Glossaire musicologique :
de la portée. Le chiffre porté en suffixe permet alors de les
différencier. Vous pouvez forcer le positionnement du glyphe sur une
ligne, comme expliqué à la section @ref{Clefs}. Dans la colonne
-exemple, la note suivant la clé est un do médium.
+exemple, la note suivant la clé est un do médium.
Les clés d'ut de Petrucci avaient une hampe gauche différente selon
leur ligne de rattachement.
@end lilypond
La rubrique @ref{Métrique} expose les principes généraux sur
-l'utilisation des indications de métrique.
+l'utilisation des indications de métrique.
@seealso
Glossaire musicologique :
Pour de la musique ancienne, vous disposez de plusieurs styles de tête
de note, en plus du style par défaut @code{default}. Vous pouvez
affecter à la propriété @code{style} de l'objet @code{NoteHead}
-les valeurs @code{baroque}, @code{neomensural}, @code{mensural},
+les valeurs @code{baroque}, @code{neomensural}, @code{mensural},
@code{petrucci}, @code{blackpetrucci} ou @code{semipetrucci}.
Le style @code{baroque} diffère du style @code{default} par
@knownissues
L'espacement des ligatures n'est pas des meilleurs.
-
+
@node Réédition de musique ancienne
@subsection Réédition de musique ancienne
@c try Till Rettig
@c Add example of white note heads:
@c In the french baroque some composers used white note heads in slow pieces,
-@c mainly in 3/2-time. A quarter looks there like a eighth with a white
+@c mainly in 3/2-time. A quarter looks there like an eighth with a white
@c note head. (Franz-Rudolf Kuhnen)
@c TODO Add example of this:
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.17.11"
+@c \version "2.17.27"
@c Translators: Matthieu Jacquot
@c Translation checkers: Jean-Charles Malahieude
\layout @{
\context @{
\TabStaff
- stringTunings = \stringTuning \notemode @{ <c' g' d'' a''> @}
+ stringTunings = \stringTuning <c' g' d'' a''>
@}
@}
@end example
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.17.11"
+@c \version "2.17.27"
@c Translators: Yoshiki Sawada
@c Translation status: post-GDP
\layout @{
\context @{
\TabStaff
- stringTunings = \stringTuning \notemode @{ <c' g' d'' a''> @}
+ stringTunings = \stringTuning <c' g' d'' a''>
@}
@}
@end example
* Advanced rhythmic commands::
@end menu
-
@node Bar lines and bar checks
@subsection Bar lines and bar checks
-@subheading Bar lines
+@menu
+* Bar lines::
+* Bar checks::
+@end menu
+
+@node Bar lines
+@unnumberedsubsubsec Bar lines
+
Single bar lines are automatically placed in the music so
there is no need to add them manually. Other types of bar
g1 e1 \bar "||" c2. c'4 \bar "|."
@end lilypond
-@subheading Bar checks
+@node Bar checks
+@unnumberedsubsubsec Bar checks
+
Though not strictly necessary, @emph{bar checks} should be
used in the input code to show where bar lines are expected
@node Accidentals and key signatures
@subsection Accidentals and key signatures
+@menu
+* Accidentals::
+* Key signatures::
+* Warning key signatures and pitches::
+@end menu
+
@warning{New users are often confused by these -- please read the
warning at the bottom of this page, especially if you are not
familiar with music theory!}
-@subheading Accidentals
+@node Accidentals
+@unnumberedsubsubsec Accidentals
+
@cindex accidentals
@cindex accidentals and key signatures
@end lilypond
@cindex key signature, setting
-@subheading Key signatures
+
+@node Key signatures
+@unnumberedsubsubsec Key signatures
+
@cindex key signature
@cindex major
@smallspace
-@subheading Warning: key signatures and pitches
+@node Warning key signatures and pitches
+@unnumberedsubsubsec Warning: key signatures and pitches
+
Music Glossary: @rglos{accidental}, @rglos{key signature},
@rglos{pitch}, @rglos{flat}, @rglos{natural}, @rglos{sharp},
@funindex ( ... )
@funindex \( ... \)
-@subheading Ties
+@menu
+* Ties::
+* Slurs::
+* Phrasing slurs::
+* Warnings slurs vs. ties::
+@end menu
+
+@node Ties
+@unnumberedsubsubsec Ties
Music Glossary: @rglos{tie}.
g4~ g c2~ | c4~ c8 a~ a2 |
@end lilypond
-@subheading Slurs
+@node Slurs
+@unnumberedsubsubsec Slurs
Music Glossary: @rglos{slur}.
d4( c16) cis( d e c cis d) e( d4)
@end lilypond
-@subheading Phrasing slurs
+@node Phrasing slurs
+@unnumberedsubsubsec Phrasing slurs
+
Music Glossary: @rglos{slur}, @rglos{phrasing}.
@smallspace
@cindex slurs versus ties
-@subheading Warnings: slurs vs. ties
+
+@node Warnings slurs vs. ties
+@unnumberedsubsubsec Warnings: slurs vs. ties
+
Music Glossary: @rglos{articulation}, @rglos{slur}, @rglos{tie}.
@node Articulation and dynamics
@subsection Articulation and dynamics
+@menu
+* Articulations::
+* Fingerings::
+* Dynamics::
+@end menu
+
+@node Articulations
+@unnumberedsubsubsec Articulations
-@subheading Articulations
@cindex articulation
@cindex accent
c4-> c-. c2-_
@end lilypond
-@subheading Fingerings
+@node Fingerings
+@unnumberedsubsubsec Fingerings
+
@cindex fingering
c4_-^1 d^. f^4_2-> e^-_+
@end lilypond
-@subheading Dynamics
+@node Dynamics
+@unnumberedsubsubsec Dynamics
+
@cindex dynamics
@cindex decrescendo
@node Advanced rhythmic commands
@subsection Advanced rhythmic commands
-@subheading Partial measure
+@menu
+* Partial measure::
+* Tuplets::
+* Grace notes::
+@end menu
+
+@node Partial measure
+@unnumberedsubsubsec Partial measure
+
@cindex pickup
@cindex anacrusis
c2 d |
@end lilypond
-@subheading Tuplets
+@node Tuplets
+@unnumberedsubsubsec Tuplets
+
@cindex tuplets
@cindex triplets
\tuplet 3/2 { d4 a8 }
@end lilypond
-@subheading Grace notes
+@node Grace notes
+@unnumberedsubsubsec Grace notes
+
@cindex grace notes
@cindex acciaccatura
@cindex compound music expression
@cindex music expression, compound
+@menu
+* Analogy mathematical expressions::
+* Simultaneous music expressions multiple staves::
+* Simultaneous music expressions single staff::
+@end menu
+
In LilyPond input files, music is represented by @emph{music
expressions}. A single note is a music expression:
{ { a4 g } f4 g }
@end lilypond
-@subheading Analogy: mathematical expressions
+@node Analogy mathematical expressions
+@unnumberedsubsubsec Analogy: mathematical expressions
+
This mechanism is similar to mathematical formulas: a big formula
is created by composing small formulas. Such formulas are called
polyphonic scores.
-@subheading Simultaneous music expressions: multiple staves
+@node Simultaneous music expressions multiple staves
+@unnumberedsubsubsec Simultaneous music expressions: multiple staves
+
@cindex multiple staves
@cindex staves, multiple
@code{@bs{}relative} command.}
-@subheading Simultaneous music expressions: single staff
+@node Simultaneous music expressions single staff
+@unnumberedsubsubsec Simultaneous music expressions: single staff
+
To determine the number of staves in a piece, LilyPond looks at
the beginning of the first expression. If there is a single note,
}
@end lilypond
-
-
-
@node Staff groups
@subsection Staff groups
@code{\context} block within a @code{\layout} block. Each
@code{\context} block will affect all contexts of the type specified
throughout the @code{\score} or @code{\book} block in which the
-@code{\layout} block appears. Here is a example to show the format:
+@code{\layout} block appears. Here is an example to show the format:
@lilypond[verbatim,quote]
\score {
@cindex example, first
@cindex case sensitive
+@menu
+* Producing output::
+@end menu
+
@qq{Compiling} is the term used for processing an input file in
LilyPond format to produce output file(s). Output files are
generally PDF (for printing or viewing), MIDI (for playing), and
@smallspace
-@subheading Producing output
+@node Producing output
+@unnumberedsubsubsec Producing output
@cindex PDF file
@cindex viewing music
@cindex simple notation
@cindex notation, simple
+@menu
+* Pitches::
+* Durations (rhythms)::
+* Rests::
+* Time signature::
+* Tempo marks::
+* Clef::
+* All together::
+@end menu
+
LilyPond will add some notation elements automatically. In the
next example, we have only specified four pitches, but LilyPond
has added a clef, time signature, and rhythms.
values are useful.
-@subheading Pitches
+@node Pitches
+@unnumberedsubsubsec Pitches
@cindex pitches
@cindex relative mode
quotes @code{''} and not one double quote @code{"}@tie{}!
@c " - keeps quotes in order for context-sensitive editor -td
-@subheading Durations (rhythms)
+@node Durations (rhythms)
+@unnumberedsubsubsec Durations (rhythms)
@cindex note durations
@cindex durations
}
@end lilypond
-
-@subheading Rests
+@node Rests
+@unnumberedsubsubsec Rests
@cindex rest
@cindex notating rests
@end lilypond
-@subheading Time signature
+@node Time signature
+@unnumberedsubsubsec Time signature
@cindex time signature
}
@end lilypond
-@subheading Tempo marks
+@node Tempo marks
+@unnumberedsubsubsec Tempo marks
@cindex tempo marks
@cindex metronome marks
@end lilypond
-@subheading Clef
+@node Clef
+@unnumberedsubsubsec Clef
@cindex clef
@cindex treble
@end lilypond
-@subheading All together
+@node All together
+@unnumberedsubsubsec All together
Here is a small example showing all these elements together:
correct processing. For example, errors will be generated if the
@code{stencil} property of the @code{NoteHead} object is set to
@code{#f}. If this is the case, you can instead use the
-@code{point-stencil} function, which sets the stencil to a object
+@code{point-stencil} function, which sets the stencil to an object
with zero size:
@lilypond[quote,verbatim,relative=2]
@code{side-position-interface} and the nearest other object (generally
the note or the staff lines); @code{staff-padding} applies only to
those objects which are always set outside the staff -- it controls
-the minimum amount of space that should be inserted between that
-object and the staff. Note that @code{staff-padding} has no effect on
-objects which are positioned relative to the note rather than the
+the minimum distance from the staff to the outside-staff object.
+Note that @code{staff-padding} has no effect on
+objects that are positioned relative to the note rather than the
staff, even though it may be overridden without error for such objects
-- it is simply ignored.
@cindex objects, aligning on a baseline
@code{staff-padding} can be used to align objects such as dynamics
-along a baseline at a fixed height above the staff, rather than at a
-height dependent on the position of the note to which they are
-attached. It is not a property of @code{DynamicText} but of
+along a baseline at a fixed distance from the staff, when no other
+notation forces them further from the staff.
+It is not a property of @code{DynamicText} but of
@code{DynamicLineSpanner}. This is because the baseline should apply
equally to @strong{all} dynamics, including those created as extended
spanners. So this is the way to align the dynamic marks in the
@cindex staff-padding property, example
@lilypond[quote,fragment,ragged-right,verbatim,relative=2]
-\dynamicUp
-% Extend width by 1 unit
-\override DynamicText.extra-spacing-width = #'(-0.5 . 0.5)
-% Align dynamics to a base line 2 units above staff
-\override DynamicLineSpanner.staff-padding = #2
-a4\f b\mf a\mp b\p
+\override DynamicLineSpanner.staff-padding = #3
+a4\f b\mf a\p b\mp
@end lilypond
@ref{Advanced tweaks with Scheme}.
@lilypond[quote,verbatim,ragged-right]
-mpdolce = -\tweak #'self-alignment-X #-0.6 #
- (make-dynamic-script
- (markup #:dynamic "mp"
- #:normal-text #:italic "dolce" ))
+mpdolce =
+ \tweak self-alignment-X #-0.6
+ #(make-dynamic-script
+ #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #})
inst =
#(define-music-function
@example
%%% save this to a file called "definitions.ily"
-mpdolce = -\tweak #'self-alignment-X #-0.6 #
- (make-dynamic-script
- (markup #:dynamic "mp"
- #:normal-text #:italic "dolce" ))
+mpdolce =
+ \tweak self-alignment-X #-0.6
+ #(make-dynamic-script
+ #@{ \markup @{ \dynamic mp \normal-text \italic \bold dolce @} #@})
inst =
#(define-music-function
@end example
@lilypond[quote,ragged-right]
-mpdolce = -\tweak #'self-alignment-X #-0.6 #
- (make-dynamic-script
- (markup #:dynamic "mp"
- #:normal-text #:italic "dolce" ))
+mpdolce =
+ \tweak self-alignment-X #-0.6
+ #(make-dynamic-script
+ #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #})
inst =
#(define-music-function
@example
%%% definitions.ily
-mpdolce = -\tweak #'self-alignment-X #-0.6 #
- (make-dynamic-script
- (markup #:dynamic "mp"
- #:normal-text #:italic "dolce" ))
+mpdolce =
+ \tweak self-alignment-X #-0.6
+ #(make-dynamic-script
+ #@{ \markup @{ \dynamic mp \normal-text \italic \bold dolce @} #@})
inst =
#(define-music-function
@end example
@lilypond[quote,ragged-right]
-mpdolce = -\tweak #'self-alignment-X #-0.6 #
- (make-dynamic-script
- (markup #:dynamic "mp"
- #:normal-text #:italic "dolce" ))
+mpdolce =
+ \tweak self-alignment-X #-0.6
+ #(make-dynamic-script
+ #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #})
inst =
#(define-music-function
@example
%%% web-publish.ily
-mpdolce = -\tweak #'self-alignment-X #-0.6 #
- (make-dynamic-script
- (markup #:dynamic "mp"
- #:normal-text #:italic "dolce" ))
+mpdolce =
+ \tweak self-alignment-X #-0.6
+ #(make-dynamic-script
+ #@{ \markup @{ \dynamic mp \normal-text \italic \bold dolce @} #@})
inst =
#(define-music-function
@end example
@lilypond[quote,ragged-right]
-mpdolce = -\tweak #'self-alignment-X #-0.6 #
- (make-dynamic-script
- (markup #:dynamic "mp"
- #:normal-text #:italic "dolce" ))
+mpdolce =
+ \tweak self-alignment-X #-0.6
+ #(make-dynamic-script
+ #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #})
inst =
#(define-music-function
OUT_SMALL_PNG_FILES = $(OUT_PNG_FILES:%.png=%-small.png)
ifeq ($(out),www)
-all: $(OUT_PNG_FILES) $(OUT_SMALL_PNG_FILES)
+local-WWW-1: $(OUT_PNG_FILES) $(OUT_SMALL_PNG_FILES)
endif
$(outdir)/%.png: %.ly
handle_broken_smobs (); should conserve a little memory.
* Fixed handling of orphaned score-elements. Any element that does
-not have its Line_of_score as a ancestor in both directions, is silently
+not have its Line_of_score as an ancestor in both directions, is silently
removed from the output. This guarantees that programming errors
don't result in coredumps from Dimension_cache::common_refpoint ():
element->line_l () is always a common reference point.
OUT_TXT_FILES = $(addprefix $(outdir)/, $(addsuffix .txt, $(TEXTS)))
##local-WWW-2: $(OUT_TXT_FILES) $(OUT_HTMLFILES) txt-to-html
-copy-for-me:
- $(foreach a, $(README_TOP_FILES), cp ../$(a) $(outdir)/$(a).txt && ) true
-
$(outdir)/%.txt: %
cp $< $@
S: ?,
FI: nousu.
-Indicator for a indeterminately rising pitch bend. Compare with
+Indicator for an indeterminately rising pitch bend. Compare with
@emph{glissando}, which has determinate starting and ending pitches.
@seealso
S: ?,
FI: lasku.
-Indicator for a indeterminately falling pitch bend. Compare with
+Indicator for an indeterminately falling pitch bend. Compare with
@emph{glissando}, which has determinate starting and ending pitches.
@seealso
@code{\context} block within a @code{\layout} block. Each
@code{\context} block will affect all contexts of the type specified
throughout the @code{\score} or @code{\book} block in which the
-@code{\layout} block appears. Here is a example to show the format:
+@code{\layout} block appears. Here is an example to show the format:
@lilypond[verbatim,quote]
\score {
correct processing. For example, errors will be generated if the
@code{stencil} property of the @code{NoteHead} object is set to
@code{#f}. If this is the case, you can instead use the
-@code{point-stencil} function, which sets the stencil to a object
+@code{point-stencil} function, which sets the stencil to an object
with zero size:
@lilypond[quote,verbatim,relative=2]
@c try Till Rettig
@c Add example of white note heads:
@c In the french baroque some composers used white note heads in slow pieces,
-@c mainly in 3/2-time. A quarter looks there like a eighth with a white
+@c mainly in 3/2-time. A quarter looks there like an eighth with a white
@c note head. (Franz-Rudolf Kuhnen)
@c TODO Add example of this:
rehearsal marks are aligned:
@lilypond[verbatim,quote,relative=1]
-% The rehearsal mark will be aligned to right edge of the Clef
+% The rehearsal mark will be aligned to the right edge of the Clef
\override Score.RehearsalMark.break-align-symbols = #'(clef)
\key a \major
\clef treble
\mark "↓"
e1
-% The rehearsal mark will be centered above the Time Signature
+% The rehearsal mark will be aligned to the left edge of the Time Signature
\override Score.RehearsalMark.break-align-symbols = #'(time-signature)
\key a \major
\clef treble
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.17.11"
+@c \version "2.17.27"
@node Fretted string instruments
@section Fretted string instruments
\layout @{
\context @{
\TabStaff
- stringTunings = \stringTuning \notemode @{ <c' g' d'' a''> @}
+ stringTunings = \stringTuning <c' g' d'' a''>
@}
@}
@end example
\new Staff = "up" {
\voiceOne
% Make space for fingering in the cross-staff voice
- \once\override DynamicLineSpanner.staff-padding = #3.4
+ \once\override DynamicLineSpanner.staff-padding = #4
e''2\p\< d''\>
c''1\!
}
@snippets
@lilypondfile[verbatim,quote,texidoc,doctitle]
-{accordion-discant-symbols.ly}
+{accordion-registers.ly}
@seealso
Snippets:
@item @code{ChordNames} @tab baseline
@item @code{NoteNames} @tab baseline
@item @code{Lyrics} @tab baseline
-@item @code{Dynamics} @tab vertical center
+@item @code{Dynamics} @tab mid-height of @q{m}
@item @code{FiguredBass} @tab highest point
@item @code{FretBoards} @tab top line
@end multitable
\new Lyrics { \lyrics { \skip 1*2 | ghijk1 | } }
>>
-%% The reference point for Dynamics is its vertical center
+%% The reference point for Dynamics is the midline of 'm' in the font
<<
\new RhythmicStaff {
- \set RhythmicStaff.instrumentName = #"vertical center "
+ \set RhythmicStaff.instrumentName = #"mid-height "
\labelContext "Dynamics" s1*3
}
\new Dynamics { s1\mp s\fp }
lsrtags = "keyboards, specific-notation, symbols-and-glyphs, workaround"
texidoc = "
-Accordion discant-specific symbols are added using @code{\\markup}. The
-placement of the symbols can be tweaked by changing the
+This snippet has been obsoleted by predefined markup commands, see
+@ruser{Accordion Registers}. It's still useful as a simple
+demonstration of how to combine symbols: the placement of the symbols
+added with @code{\\markup} can be tweaked by changing the
@code{\\translate-scaled} arguments. @code{\\translate-scaled} is
used here rather than @code{\\translate} in order to let the
positioning of the symbol parts adapt to changes of @code{font-size}.
-%% DO NOT EDIT this file manually; it is automatically
-%% generated from LSR http://lsr.dsi.unimi.it
-%% Make any changes in LSR itself, or in Documentation/snippets/new/ ,
-%% and then run scripts/auxiliar/makelsr.py
-%%
-%% This file is in the public domain.
-\version "2.17.25"
+% 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.17.27
+\version "2.17.27"
\header {
lsrtags = "contemporary-notation, expressive-marks, symbols-and-glyphs"
texidoc = "
In order to make parts of a crescendo hairpin invisible, the following
method is used: A white rectangle is drawn on top of the respective
-part of the crescendo hairpin, making it invisible. The rectangle is
-defined as postscript code within a text markup.
-
-To fine-tune the position and size of the markup, the number preceding
-@code{setgray} in the postscript definition can be set to a value less
-than one, making it grey. The two numbers before @code{scale} in the
-postscript code are responsible for the width and height of the
-rectangle, the two numbers before @code{translate} change the x- and
-y-origin of the rectangle.
+part of the crescendo hairpin, making it invisible.
+The markup command @code{with-dimensions} tells LilyPond to consider only
+the bottom edge of the rectangle when spacing it against the hairpin.
+The property @code{staff-padding} prevents the rectangle from fitting
+between the hairpin and staff.
Make sure to put the hairpin in a lower layer than the text markup to
draw the rectangle over the hairpin.
<<
{
\dynamicUp
- \override DynamicLineSpanner.staff-padding = #4
r2 r16 c'8.\pp r4
}
\\
\override DynamicLineSpanner.layer = #0
des,2\mf\< ~
\override TextScript.layer = #2
- des16_\markup {
- \postscript #"
- 1.9 -8 translate
- 5 4 scale
- 1 setgray
- 0 0 moveto
- 0 1 lineto
- 1 1 lineto
- 1 0 lineto
- 0 0 lineto
- fill"
- }
+ \once\override TextScript.staff-padding = #6
+ \once\override TextScript.vertical-skylines = #'()
+ des16_\markup \with-dimensions #'(2 . 7) #'(0 . 0)
+ \with-color #white
+ \filled-box #'(2 . 7) #'(0 . 2) #0
r8. des4 ~ des16->\sff
}
>>
-% 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.16.0
-\version "2.16.0"
+%% DO NOT EDIT this file manually; it is automatically
+%% generated from LSR http://lsr.dsi.unimi.it
+%% Make any changes in LSR itself, or in Documentation/snippets/new/ ,
+%% and then run scripts/auxiliar/makelsr.py
+%%
+%% This file is in the public domain.
+\version "2.17.14"
\header {
lsrtags = "contexts-and-engravers, specific-notation"
-%% DO NOT EDIT this file manually; it is automatically
-%% generated from LSR http://lsr.dsi.unimi.it
-%% Make any changes in LSR itself, or in Documentation/snippets/new/ ,
-%% and then run scripts/auxiliar/makelsr.py
-%%
-%% This file is in the public domain.
-\version "2.17.25"
+% 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.17.27
+\version "2.17.27"
\header {
lsrtags = "headword"
\key g \major
\time 6/8
\partial 2
- \once \override TextScript.staff-padding = #2
+ \once \override TextScript.padding = #2
d'8 \staccato
^ \markup { \column {
RONDO
lsrtags = "keyboards, specific-notation, symbols-and-glyphs, workaround"
texidoc = "
-Accordion discant-specific symbols are added using @code{\\markup}. The
-placement of the symbols can be tweaked by changing the
+This snippet has been obsoleted by predefined markup commands, see
+@ruser{Accordion Registers}. It's still useful as a simple
+demonstration of how to combine symbols: the placement of the symbols
+added with @code{\\markup} can be tweaked by changing the
@code{\\translate-scaled} arguments. @code{\\translate-scaled} is
used here rather than @code{\\translate} in order to let the
positioning of the symbol parts adapt to changes of @code{font-size}.
--- /dev/null
+\version "2.17.27"
+
+\header {
+ lsrtags = "contemporary-notation, expressive-marks, symbols-and-glyphs"
+
+ texidoc = "
+In order to make parts of a crescendo hairpin invisible, the following
+method is used: A white rectangle is drawn on top of the respective
+part of the crescendo hairpin, making it invisible.
+
+The markup command @code{with-dimensions} tells LilyPond to consider only
+the bottom edge of the rectangle when spacing it against the hairpin.
+The property @code{staff-padding} prevents the rectangle from fitting
+between the hairpin and staff.
+
+Make sure to put the hairpin in a lower layer than the text markup to
+draw the rectangle over the hairpin.
+
+"
+ doctitle = "Broken Crescendo Hairpin"
+}
+
+\relative c' {
+ <<
+ {
+ \dynamicUp
+ r2 r16 c'8.\pp r4
+ }
+ \\
+ {
+ \override DynamicLineSpanner.layer = #0
+ des,2\mf\< ~
+ \override TextScript.layer = #2
+ \once\override TextScript.staff-padding = #6
+ \once\override TextScript.vertical-skylines = #'()
+ des16_\markup \with-dimensions #'(2 . 7) #'(0 . 0)
+ \with-color #white
+ \filled-box #'(2 . 7) #'(0 . 2) #0
+ r8. des4 ~ des16->\sff
+ }
+ >>
+}
+++ /dev/null
-\version "2.16.0"
-
-\header {
- lsrtags = "contexts-and-engravers, specific-notation"
-
- texidoc = "
-The notation problem, creating a certain symbol, is handled by plugins.
- Each plugin is called an Engraver. In this example, engravers are
-switched on one by one, in the following order:
-
-- note heads,
-
-
-- staff symbol,
-
-
-- clef,
-
-
-- stem,
-
-
-- beams, slurs, accents,
-
-
-- accidentals, bar lines, time signature and key signature.
-
-
-
-Engravers are grouped. For example, note heads, slurs, beams etc. form
-a @code{Voice} context. Engravers for key signature, accidentals, bar
-line, etc. form a @code{Staff} context.
-
-"
- doctitle = "Engravers one-by-one"
-}
-
-%% sample music
-topVoice = \relative c' {
- \key d \major
- es8([ g] a[ fis])
- b4
- b16[-. b-. b-. cis-.]
- d4->
-}
-
-botVoice = \relative c' {
- \key d \major
- c8[( f] b[ a)]
- es4
- es16[-. es-. es-. fis-.]
- b4->
-}
-
-hoom = \relative c {
- \key d \major
- \clef bass
- g8-. r
- r4
- fis8-.
- r8
- r4
- b'4->
-}
-
-pah = \relative c' {
- r8 b-.
- r4
- r8 g8-.
- r16 g-. r8
- \clef treble
- fis'4->
-}
-
-%
-% setup for Request->Element conversion. Guru-only
-%
-
-MyStaff = \context {
- \type "Engraver_group"
- \name Staff
-
- \description "Handles clefs, bar lines, keys, accidentals. It can contain
-@code{Voice} contexts."
-
- \consists "Output_property_engraver"
-
- \consists "Font_size_engraver"
-
- \consists "Volta_engraver"
- \consists "Separating_line_group_engraver"
- \consists "Dot_column_engraver"
-
- \consists "Ottava_spanner_engraver"
- \consists "Rest_collision_engraver"
- \consists "Piano_pedal_engraver"
- \consists "Piano_pedal_align_engraver"
- \consists "Instrument_name_engraver"
- \consists "Grob_pq_engraver"
- \consists "Forbid_line_break_engraver"
- \consists "Axis_group_engraver"
-
- \consists "Pitch_squash_engraver"
-
- localKeySignature = #'()
-
- % explicitly set instrumentName, so we don't get
- % weird effects when doing instrument names for
- % piano staves
-
- instrumentName = #'()
- shortInstrumentName = #'()
-
- \accepts "Voice"
- \defaultchild "Voice"
-}
-
-
-MyVoice = \context {
- \type "Engraver_group"
- \name Voice
-
- \description "
- Corresponds to a voice on a staff. This context handles the
- conversion of dynamic signs, stems, beams, super- and subscripts,
- slurs, ties, and rests.
-
- You have to instantiate this explicitly if you want to have
- multiple voices on the same staff."
-
- localKeySignature = #'()
- \consists "Font_size_engraver"
-
- % must come before all
- \consists "Output_property_engraver"
- \consists "Arpeggio_engraver"
- \consists "Multi_measure_rest_engraver"
- \consists "Text_spanner_engraver"
- \consists "Grob_pq_engraver"
- \consists "Note_head_line_engraver"
- \consists "Glissando_engraver"
- \consists "Ligature_bracket_engraver"
- \consists "Breathing_sign_engraver"
- % \consists "Rest_engraver"
- \consists "Grace_beam_engraver"
- \consists "New_fingering_engraver"
- \consists "Chord_tremolo_engraver"
- \consists "Percent_repeat_engraver"
- \consists "Slash_repeat_engraver"
-
- %{
- Must come before text_engraver, but after note_column engraver.
- %}
- \consists "Text_engraver"
- \consists "Dynamic_engraver"
- \consists "Fingering_engraver"
-
- \consists "Script_column_engraver"
- \consists "Rhythmic_column_engraver"
- \consists "Cluster_spanner_engraver"
- \consists "Tie_engraver"
- \consists "Tie_engraver"
- \consists "Tuplet_engraver"
- \consists "Note_heads_engraver"
- \consists "Rest_engraver"
-}
-
-
-\score {
- \topVoice
- \layout {
- \context { \MyStaff }
- \context { \MyVoice }
- }
-}
-
-
-MyStaff = \context {
- \MyStaff
- \consists "Staff_symbol_engraver"
-}
-
-\score {
- \topVoice
- \layout {
- \context { \MyStaff }
- \context { \MyVoice }
- }
-}
-
-MyStaff = \context {
- \MyStaff
- \consists "Clef_engraver"
- \remove "Pitch_squash_engraver"
-}
-
-\score {
- \topVoice
- \layout {
- \context { \MyStaff }
- \context { \MyVoice }
- }
-}
-
-MyVoice = \context {
- \MyVoice
- \consists "Stem_engraver"
-}
-
-\score {
- \topVoice
- \layout {
- \context { \MyStaff }
- \context { \MyVoice }
- }
-}
-
-MyVoice = \context {
- \MyVoice
- \consists "Beam_engraver"
-}
-
-\score {
- \topVoice
- \layout {
- \context { \MyStaff }
- \context { \MyVoice }
- }
-}
-
-MyVoice = \context {
- \MyVoice
- \consists "Phrasing_slur_engraver"
- \consists "Slur_engraver"
- \consists "Script_engraver"
-}
-
-
-\score {
- \topVoice
- \layout {
- \context { \MyStaff }
- \context { \MyVoice }
- }
-}
-
-MyStaff = \context {
- \MyStaff
- \consists "Bar_engraver"
- \consists "Time_signature_engraver"
-}
-
-\score {
- \topVoice
- \layout {
- \context { \MyStaff }
- \context { \MyVoice }
- }
-}
-
-MyStaff = \context {
- \MyStaff
- \consists "Accidental_engraver"
- \consists "Key_engraver"
-}
-\score {
- \topVoice
- \layout {
- \context { \MyStaff }
- \context { \MyVoice }
- }
-}
--- /dev/null
+\version "2.17.27"
+
+\header {
+ lsrtags = "headword"
+
+ texidoc = "
+Expressive headword
+
+"
+ doctitle = "Expressive headword"
+}
+\include "english.ly"
+
+% NR 1.3 Expressive marks
+
+% L. v. Beethoven, Op. 49 no. 1
+% Piano sonata 19 - "Leichte Sonate"
+% measures 1 - 12
+
+%\layout {
+% \context {
+% \Score
+% \override SpacingSpanner.base-shortest-duration =
+% #(ly:make-moment 1/20)
+% }
+%}
+
+\new PianoStaff <<
+
+ % RH Staff
+ \new Staff {
+ \clef treble
+ \key g \major
+ \time 6/8
+ \partial 2
+ \once \override TextScript.padding = #2
+ d'8 \staccato
+ ^ \markup { \column {
+ RONDO
+ \italic Allegro } }
+ d'8 \staccato
+ g'8 \staccato
+ a'8 \staccato
+
+ |
+
+ b'8 [ (
+ g'8 ] )
+ e'8 \staccato
+ e' \staccato
+ a'8 \staccato
+ b'8 \staccato
+
+ |
+
+ c''8 [ (
+ a'8 ] )
+ e''8 \staccato
+ d''8 \staccato
+ c''8 \staccato
+ b'8 \staccato
+
+ |
+
+ a'8 \staccato
+ g'8 \staccato
+ a'8 \staccato
+ \acciaccatura { g'16 [ a'16 ] }
+ bf'8
+ a'8 \staccato
+ g'8 \staccato
+
+ |
+
+ fs'8 [ (
+ d'8 ] )
+ d'8 \staccato
+ d'8 \staccato
+ g'8 \staccato
+ a'8 \staccato
+
+ |
+
+ b'8 [ (
+ g'8 ] )
+ e'8 \staccato
+ e'8 \staccato
+ a'8 \staccato
+ b'8 \staccato
+
+ |
+
+ c''8 [ (
+ a'8 ] )
+ e''8 \staccato
+ d''8 \staccato
+ c''8 \staccato
+ b'8 \staccato
+
+ |
+
+ a'8 \staccato
+ g'8 \staccato
+ a'8 \staccato
+ <<
+ {
+ \voiceOne
+ d'8
+ g'8
+ fs'8
+ \oneVoice
+ }
+ \new Voice {
+ \voiceTwo
+ d'4
+ c'8
+ \oneVoice
+ }
+ >>
+
+ |
+
+ <b g'>4 \tenuto
+ d'8 \staccato
+ g'8 \staccato
+ b'8 \staccato
+ d''8 \staccato
+
+ |
+
+ d''8 (
+ <c'' a'>8 \staccato )
+ <c'' a'>8 \staccato
+ d''8 (
+ <b' g'>8 \staccato )
+ <b' g'>8 \staccato
+
+ |
+
+ d''8 (
+ <c'' a'>8 \staccato )
+ <c'' a'>8 \staccato
+ d''8 (
+ <b' g'>8 \staccato )
+ <b' g'>8 \staccato
+
+ |
+
+ d''8 \staccato
+ <c'' a'>8 \staccato
+ <b' g'>8 \staccato
+ d'' \staccato
+ <c'' a'>8 \staccato
+ <b' g'>8 \staccato
+
+ |
+
+ <d'' c'' a'>4 \fermata
+ r8 r4 r8
+ }
+
+ % LH Staff
+ \new Staff {
+ \clef bass
+ \key g \major
+ \time 6/8
+ \partial 2
+ r8
+ r8
+ <d' b>8 \staccato
+ <c' a>8 \staccato
+
+ |
+
+ <b g>4
+ r8
+ r8
+ <e' c'>8 \staccato
+ <d' b>8 \staccato
+
+ |
+
+ <c' a>4
+ r8
+ r8
+ <a fs>8 \staccato
+ <b g>8 \staccato
+
+ |
+
+ <c' a>8 \staccato
+ <b d'>8 \staccato
+ <e' c'>8 \staccato
+ <e' cs'>4. (
+
+ |
+
+ d'4 )
+ r8
+ r8
+ <d' b!>8 \staccato
+ <c'! a>8 \staccato
+
+ |
+
+ <b g>4
+ r8
+ r8
+ <e' c'>8 \staccato
+ <d' b>8 \staccato
+
+ |
+
+ <c' a>4
+ r8
+ r8
+ <a fs>8 \staccato
+ <b g>8 \staccato
+
+ |
+
+ <c' a>8 \staccato
+ <d' b>8 \staccato
+ <e' c'>8 \staccato
+ <b d>4
+ <a d>8 \staccato
+
+ |
+
+ <g g,>4 \tenuto
+ r8
+ r4
+ r8
+
+ |
+
+ r8
+ <d' fs>8 \staccato
+ <d' fs>8 \staccato
+ r8
+ <d' g>8 \staccato
+ <d' g>8 \staccato
+
+ |
+
+ r8
+ <d' fs>8 \staccato
+ <d' fs>8 \staccato
+ r8
+ <d' g>8 \staccato
+ <d' g>8 \staccato
+
+ |
+
+ r8
+ <d' fs>8 \staccato
+ <d' g>8 \staccato
+ r8
+ <d' fs>8 \staccato
+ <d' g>8 \staccato
+
+ |
+
+ <d' fs>4 \fermata
+ r8 r4 r8
+ }
+
+>>
--- /dev/null
+\version "2.17.27"
+
+\header {
+ lsrtags = "headword"
+
+ texidoc = "
+Piches headword
+
+"
+ doctitle = "Pitches headword"
+}
+% L. v. Beethoven
+% Piano sonata 21 - Dem Grafen von Waldstein Gewidmet
+% chorale at measures 34 - 40+
+
+\include "english.ly"
+
+\new PianoStaff <<
+
+ % RH Staff
+ \new Staff <<
+
+ % RH Voice 1
+ \new Voice {
+ \set Score.currentBarNumber = #34
+ \voiceOne
+ gs''2 ( ^ \markup \italic { dolce e molto ligato }
+ fs''4
+ e''4
+ |
+ ds''2
+ cs''2 )
+ |
+ ds''2 (
+ e''4
+ fs''4
+ |
+ <gs'' e''>2
+ <fs'' ds''>2 )
+ |
+ \oneVoice
+ \clef bass
+ <gs' e' b>2 (
+ <fs' ds' a>4
+ <e' cs' gs>4
+ |
+ <ds' bs fs>2
+ <cs' a e>2 )
+ |
+ \voiceOne
+ b2 %(
+ cs'4
+ ds'4
+ |
+ \clef treble
+ <e' gs>4 %)
+ r4 r2
+ }
+
+ % RH Voice 2
+ \new Voice {
+ \voiceTwo
+ \override Staff.DynamicLineSpanner.staff-padding = #3
+ <e'' b'>2 \p
+ <ds'' a'>4
+ <cs'' gs'>4
+ |
+ <bs' fs'>2
+ e'2
+ |
+ <b'! a'>2 -\tweak #'style #'none \cresc
+ b'4
+ <e'' cs''>4
+ |
+ b'2. ( \sf \>
+ a'4 )
+ \clef bass
+ | \break
+ s1 \p
+ |
+ s1
+ |
+ <gs e>4 (
+ <a fs>2. )
+ |
+ s4
+ r4 r2
+ }
+
+ >>
+
+ % LH Staff
+ \new Staff {
+ \override Staff.SustainPedalLineSpanner.staff-padding = #6
+ <gs' e'>2 ( \sustainOn
+ <fs' ds' b>4 \sustainOff
+ <e' cs'>4
+ |
+ <ds' bs gs>2
+ <cs' a>2 ) \sustainOn
+ |
+ \clef bass
+ \slurDown
+ <ds' b! a fs>2 ( \sustainOff
+ <e' b gs>4
+ <fs' cs' a>4 \sustainOn
+ |
+ \clef treble
+ \voiceOne
+ <<
+ {
+ <gs' e'>2
+ <fs' ds'>2 )
+ }
+ \new Voice {
+ \voiceTwo
+ b1 \sustainOff
+ }
+ >>
+ \oneVoice
+ |
+ %\break
+ \clef bass
+ <gs e>2 (
+ <fs ds b,>4
+ <e cs>4
+ |
+ <ds bs, gs,>2
+ <cs a,>2 ) \sustainOn
+ |
+ <b,! b,,!>1 ( \sustainOff
+ |
+ <e e,>4 )
+ r4 r2
+ }
+
+>>
-\version "2.17.6"
+\version "2.17.18"
\header {
lsrtags = "rhythms, tweaks-and-overrides"
% in all voices to avoid multiple instances being printed
\compressFullBarRests
<<
- \revert MultiMeasureRest.staff-position
+ \revert MultiMeasureRest.direction
{ R1*3 }
\\
- \revert MultiMeasureRest.staff-position
+ \revert MultiMeasureRest.direction
{ R1*3 }
>>
}
--- /dev/null
+\version "2.17.27"
+
+\header {
+ lsrtags = "spacing, tweaks-and-overrides, workaround"
+
+ texidoc = "
+All @code{DynamicLineSpanner} objects (hairpins and dynamic texts) are
+placed with their reference line at least @code{'staff-padding} from
+the staff, unless other notation forces them to be farther.
+Setting @code{'staff-padding} to a sufficiently large value aligns the
+dynamics.
+
+The same idea, together with @code{\\textLengthOn}, is used to align
+the text scripts along their baseline.
+
+"
+ doctitle = "Vertically aligned dynamics and textscripts"
+}
+\markup \vspace #1 %avoid LSR-bug
+
+music = \relative c' {
+ a'2\p b\f
+ e4\p f\f\> g, b\p
+ c2^\markup { \huge gorgeous } c^\markup { \huge fantastic }
+}
+
+{
+ \music
+ \break
+ \override DynamicLineSpanner.staff-padding = #3
+ \textLengthOn
+ \override TextScript.staff-padding = #1
+ \music
+}
-%% DO NOT EDIT this file manually; it is automatically
-%% generated from LSR http://lsr.dsi.unimi.it
-%% Make any changes in LSR itself, or in Documentation/snippets/new/ ,
-%% and then run scripts/auxiliar/makelsr.py
-%%
-%% This file is in the public domain.
-\version "2.17.25"
+% 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.17.27
+\version "2.17.27"
\header {
lsrtags = "headword"
% RH Voice 2
\new Voice {
\voiceTwo
- \override Staff.DynamicLineSpanner.staff-padding = #2.5
+ \override Staff.DynamicLineSpanner.staff-padding = #3
<e'' b'>2 \p
<ds'' a'>4
<cs'' gs'>4
<bs' fs'>2
e'2
|
- \once \override TextScript.staff-padding = #2.5
- <b'! a'>2 _ \markup \italic { cresc. }
+ <b'! a'>2 -\tweak #'style #'none \cresc
b'4
<e'' cs''>4
|
% LH Staff
\new Staff {
- \override Staff.SustainPedalLineSpanner.staff-padding = #5
+ \override Staff.SustainPedalLineSpanner.staff-padding = #6
<gs' e'>2 ( \sustainOn
<fs' ds' b>4 \sustainOff
<e' cs'>4
% and then run scripts/auxiliar/makelsr.py
%
% This file is in the public domain.
-%% Note: this file works from version 2.17.6
-\version "2.17.6"
+%% Note: this file works from version 2.17.18
+\version "2.17.18"
\header {
lsrtags = "rhythms, tweaks-and-overrides"
% in all voices to avoid multiple instances being printed
\compressFullBarRests
<<
- \revert MultiMeasureRest.staff-position
+ \revert MultiMeasureRest.direction
{ R1*3 }
\\
- \revert MultiMeasureRest.staff-position
+ \revert MultiMeasureRest.direction
{ R1*3 }
>>
}
-%% DO NOT EDIT this file manually; it is automatically
-%% generated from LSR http://lsr.dsi.unimi.it
-%% Make any changes in LSR itself, or in Documentation/snippets/new/ ,
-%% and then run scripts/auxiliar/makelsr.py
-%%
-%% This file is in the public domain.
-\version "2.17.25"
+% 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.17.27
+\version "2.17.27"
\header {
lsrtags = "spacing, tweaks-and-overrides, workaround"
texidoc = "
-By setting the @code{'Y-extent} property to a suitable value, all
-@code{DynamicLineSpanner} objects (hairpins and dynamic texts) can be
-aligned to a common reference point, regardless of their actual extent.
-This way, every element will be vertically aligned, thus producing a
-more pleasing output.
+All @code{DynamicLineSpanner} objects (hairpins and dynamic texts) are
+placed with their reference line at least @code{'staff-padding} from
+the staff, unless other notation forces them to be farther.
+Setting @code{'staff-padding} to a sufficiently large value aligns the
+dynamics.
The same idea, together with @code{\\textLengthOn}, is used to align
the text scripts along their baseline.
{
\music
\break
- \override DynamicLineSpanner.staff-padding = #2.0
- \override DynamicLineSpanner.Y-extent = #'(-1.5 . 1.5)
+ \override DynamicLineSpanner.staff-padding = #3
\textLengthOn
- \override TextScript.Y-extent = #'(-1.5 . 1.5)
+ \override TextScript.staff-padding = #1
\music
}
STEPMAKE_TEMPLATES=documentation tex texinfo topdocs
LOCALSTEPMAKE_TEMPLATES=lilypond ly
-OUT_TEXI_FILES = $(TELY_FILES:%.tely=$(outdir)/%.texi)
+OUT_TEXI_FILES = $(TEXI_FILES:%.texi=$(outdir)/%.texi) $(TELY_FILES:%.tely=$(outdir)/%.texi)
HTML_FILES=$(TEXI_FILES:%.texi=$(outdir)/%.html) $(TELY_FILES:%.tely=$(outdir)/%.html)
README_TOP_FILES=NEWS AUTHORS INSTALL README
OUTTXT_FILES= $(outdir)/NEWS.txt
include $(depth)/make/stepmake.make
+DOCUMENTATION_INCLUDES += -I $(outdir) \
+ -I $(top-src-dir)/Documentation
+
# FIXME ad-hoc file copy?
$(outdir)/NEWS.tely: $(top-src-dir)/Documentation/changes.tely
cp -f $< $@
AC_DEFUN(STEPMAKE_TEXMF, [
STEPMAKE_PROGS(METAFONT, mf-nowin mf mfw mfont, $1)
STEPMAKE_PROGS(METAPOST, mpost, $1)
+ if test "$METAPOST" != ""; then
+ ver=`STEPMAKE_GET_VERSION($METAPOST)`
+ num=`STEPMAKE_NUMERIC_VERSION($ver)`
+ # Avoid buggy metapost versions: 1.600 <= x < 1.803
+ if test "$num" -ge "1600000" -a "$num" -lt "1803000"; then
+ STEPMAKE_ADD_ENTRY($1, ["mpost (due to a bug in metapost, versions 1.600 <= x < 1.803 are not supported; installed: $ver)"])
+ fi
+ fi
AC_MSG_CHECKING(for working metafont mode)
modelist='ljfour lj4 lj3 lj2 ljet laserjet'
-\version "2.16.0"
+\version "2.17.27"
\header {
texidoc = "
\score {
\new TabStaff
\with {
- stringTunings = \stringTuning \notemode { <a d' f' a' d'' f''> }
+ stringTunings = \stringTuning <a d' f' a' d'' f''>
tablatureFormat = #fret-letter-tablature-format
}
\new TabVoice {
--- /dev/null
+\version "2.17.20"
+
+\header
+{
+ texidoc = "
+Slur placement in complementary tablatures should not be affected by
+either automatic or manual beaming.
+"
+}
+
+guitarSolo = {
+ \time 3/4
+ \set Timing.beamExceptions = #'((end . (((1 . 8) . (4 2)))))
+ <<
+ {bes'2( aes'8-. r)} \\
+ {r8 cis(-\tag #'beam [ b f'-\tag #'beam ]) <d f'>-. r}
+ >>
+ \bar "|."
+}
+
+guitarSolos = {
+ \tempo "Manual beams"
+ \guitarSolo
+ \tempo "Automatic beams"
+ \removeWithTag #'beam \guitarSolo
+}
+
+\score {
+ <<
+ \new StaffGroup <<
+ \new Staff { \clef "treble_8" \guitarSolos }
+ \new TabStaff \guitarSolos
+ >>
+ \new TabStaff \with { \tabFullNotation } \guitarSolos
+ >>
+}
return SCM_BOOL_T;
}
-/* Return upper and lower skylines for VerticalAxisGroup g. If the extent
- is non-empty but there is no skyline available (or pure is true), just
+/* for each grob, find its upper and lower skylines. If the grob has
+ an empty extent, delete it from the list instead. If the extent is
+ non-empty but there is no skyline available (or pure is true), just
create a flat skyline from the bounding box */
// TODO(jneem): the pure and non-pure parts seem to share very little
// code. Split them into 2 functions, perhaps?
-static Skyline_pair
-get_skylines (Grob *g,
+static void
+get_skylines (Grob *me,
+ vector<Grob *> *const elements,
Axis a,
- Grob *other_common,
- bool pure, int start, int end)
+ bool pure, int start, int end,
+ vector<Skyline_pair> *const ret)
{
- Skyline_pair skylines;
+ Grob *other_common = common_refpoint_of_array (*elements, me, other_axis (a));
- if (!pure)
+ for (vsize i = elements->size (); i--;)
{
- Skyline_pair *skys = Skyline_pair::unsmob (g->get_property (a == Y_AXIS
- ? "vertical-skylines"
- : "horizontal-skylines"));
- if (skys)
- skylines = *skys;
-
- /* This skyline was calculated relative to the grob g. In order to compare it to
- skylines belonging to other grobs, we need to shift it so that it is relative
- to the common reference. */
- Real offset = g->relative_coordinate (other_common, other_axis (a));
- skylines.shift (offset);
- }
- else if (Hara_kiri_group_spanner::request_suicide (g, start, end))
- return skylines;
- else
- {
- assert (a == Y_AXIS);
- Interval extent = g->pure_height (g, start, end);
-
- // This is a hack to get better accuracy on the pure-height of VerticalAlignment.
- // It's quite common for a treble clef to be the highest element of one system
- // and for a low note (or lyrics) to be the lowest note on another. The two will
- // never collide, but the pure-height stuff only works with bounding boxes, so it
- // doesn't know that. The result is a significant over-estimation of the pure-height,
- // especially on systems with many staves. To correct for this, we build a skyline
- // in two parts: the part we did above contains most of the grobs (note-heads, etc.)
- // while the bit we're about to do only contains the breakable grobs at the beginning
- // of the system. This way, the tall treble clefs are only compared with the treble
- // clefs of the other staff and they will be ignored if the staff above is, for example,
- // lyrics.
- if (Axis_group_interface::has_interface (g))
+ Grob *g = (*elements)[i];
+ Skyline_pair skylines;
+
+ if (!pure)
{
- extent = Axis_group_interface::rest_of_line_pure_height (g, start, end);
- Interval begin_of_line_extent = Axis_group_interface::begin_of_line_pure_height (g, start);
- if (!begin_of_line_extent.is_empty ())
+ Skyline_pair *skys = Skyline_pair::unsmob (g->get_property (a == Y_AXIS
+ ? "vertical-skylines"
+ : "horizontal-skylines"));
+ if (skys)
+ skylines = *skys;
+
+ /* This skyline was calculated relative to the grob g. In order to compare it to
+ skylines belonging to other grobs, we need to shift it so that it is relative
+ to the common reference. */
+ Real offset = g->relative_coordinate (other_common, other_axis (a));
+ skylines.shift (offset);
+ }
+ else
+ {
+ assert (a == Y_AXIS);
+ Interval extent = g->pure_height (g, start, end);
+
+ // This is a hack to get better accuracy on the pure-height of VerticalAlignment.
+ // It's quite common for a treble clef to be the highest element of one system
+ // and for a low note (or lyrics) to be the lowest note on another. The two will
+ // never collide, but the pure-height stuff only works with bounding boxes, so it
+ // doesn't know that. The result is a significant over-estimation of the pure-height,
+ // especially on systems with many staves. To correct for this, we build a skyline
+ // in two parts: the part we did above contains most of the grobs (note-heads, etc.)
+ // while the bit we're about to do only contains the breakable grobs at the beginning
+ // of the system. This way, the tall treble clefs are only compared with the treble
+ // clefs of the other staff and they will be ignored if the staff above is, for example,
+ // lyrics.
+ if (Axis_group_interface::has_interface (g)
+ && !Hara_kiri_group_spanner::request_suicide (g, start, end))
+ {
+ extent = Axis_group_interface::rest_of_line_pure_height (g, start, end);
+ Interval begin_of_line_extent = Axis_group_interface::begin_of_line_pure_height (g, start);
+ if (!begin_of_line_extent.is_empty ())
+ {
+ Box b;
+ b[a] = begin_of_line_extent;
+ b[other_axis (a)] = Interval (-infinity_f, -1);
+ skylines.insert (b, other_axis (a));
+ }
+ }
+
+ if (!extent.is_empty ())
{
Box b;
- b[a] = begin_of_line_extent;
- b[other_axis (a)] = Interval (-infinity_f, -1);
+ b[a] = extent;
+ b[other_axis (a)] = Interval (0, infinity_f);
skylines.insert (b, other_axis (a));
}
}
- if (!extent.is_empty ())
- {
- Box b;
- b[a] = extent;
- b[other_axis (a)] = Interval (0, infinity_f);
- skylines.insert (b, other_axis (a));
- }
+ if (skylines.is_empty ())
+ elements->erase (elements->begin () + i);
+ else
+ ret->push_back (skylines);
}
- return skylines;
+ reverse (*ret);
}
vector<Real>
// else centered dynamics will break when there is a fixed alignment).
vector<Real>
Align_interface::internal_get_minimum_translations (Grob *me,
- vector<Grob *> const &elems,
+ vector<Grob *> const &all_grobs,
Axis a,
bool include_fixed_spacing,
bool pure, int start, int end)
Direction stacking_dir = robust_scm2dir (me->get_property ("stacking-dir"),
DOWN);
+ vector<Grob *> elems (all_grobs); // writable copy
+ vector<Skyline_pair> skylines;
- Grob *other_common = common_refpoint_of_array (elems, me, other_axis (a));
+ get_skylines (me, &elems, a, pure, start, end, &skylines);
Real where = 0;
Real default_padding = robust_scm2double (me->get_property ("padding"), 0.0);
vector<Real> translates;
Skyline down_skyline (stacking_dir);
- Grob *last_nonempty_element = 0;
Real last_spaceable_element_pos = 0;
Grob *last_spaceable_element = 0;
Skyline last_spaceable_skyline (stacking_dir);
Real dy = 0;
Real padding = default_padding;
- Skyline_pair skyline = get_skylines (elems[j], a, other_common, pure, start, end);
-
- if (skyline.is_empty ())
- dy = 0.0;
- else if (!last_nonempty_element)
- dy = skyline[-stacking_dir].max_height () + padding;
+ if (j == 0)
+ dy = skylines[j][-stacking_dir].max_height () + padding;
else
{
- SCM spec = Page_layout_problem::get_spacing_spec (last_nonempty_element, elems[j], pure, start, end);
+ SCM spec = Page_layout_problem::get_spacing_spec (elems[j - 1], elems[j], pure, start, end);
Page_layout_problem::read_spacing_spec (spec, &padding, ly_symbol2scm ("padding"));
- dy = down_skyline.distance (skyline[-stacking_dir]) + padding;
+ dy = down_skyline.distance (skylines[j][-stacking_dir]) + padding;
Real spec_distance = 0;
if (Page_layout_problem::read_spacing_spec (spec, &spec_distance, ly_symbol2scm ("minimum-distance")))
Page_layout_problem::read_spacing_spec (spec,
&spaceable_padding,
ly_symbol2scm ("padding"));
- dy = max (dy, (last_spaceable_skyline.distance (skyline[-stacking_dir])
+ dy = max (dy, (last_spaceable_skyline.distance (skylines[j][-stacking_dir])
+ stacking_dir * (last_spaceable_element_pos - where) + spaceable_padding));
Real spaceable_min_distance = 0;
}
}
+ if (isinf (dy)) /* if the skyline is empty, maybe max_height is infinity_f */
+ dy = 0.0;
+
dy = max (0.0, dy);
down_skyline.raise (-stacking_dir * dy);
- down_skyline.merge (skyline[stacking_dir]);
+ down_skyline.merge (skylines[j][stacking_dir]);
where += stacking_dir * dy;
translates.push_back (where);
last_spaceable_element_pos = where;
last_spaceable_skyline = down_skyline;
}
- if (!skyline.is_empty ())
- last_nonempty_element = elems[j];
+ }
+
+ // So far, we've computed the translates for all the non-empty elements.
+ // Here, we set the translates for the empty elements: an empty element
+ // gets the same translation as the last non-empty element before it.
+ vector<Real> all_translates;
+ if (!translates.empty ())
+ {
+ Real w = translates[0];
+ for (vsize i = 0, j = 0; j < all_grobs.size (); j++)
+ {
+ if (i < elems.size () && all_grobs[j] == elems[i])
+ w = translates[i++];
+ all_translates.push_back (w);
+ }
}
if (pure)
{
SCM mta = me->get_property ("minimum-translations-alist");
mta = scm_cons (scm_cons (scm_cons (scm_from_int (start), scm_from_int (end)),
- ly_floatvector2scm (translates)),
+ ly_floatvector2scm (all_translates)),
mta);
me->set_property ("minimum-translations-alist", mta);
}
- return translates;
+ return all_translates;
}
void
{
if (finished_beam_)
{
- if (!finished_beam_->get_bound (RIGHT))
- finished_beam_->set_bound (RIGHT, finished_beam_->get_bound (LEFT));
- if (forced_direction_)
+ Grob *stem = finished_beam_->get_bound (RIGHT);
+ if (!stem)
{
- Grob *stem = finished_beam_->get_bound (RIGHT);
- set_grob_direction (stem, forced_direction_);
- forced_direction_ = CENTER;
+ stem = finished_beam_->get_bound (LEFT);
+ if (stem)
+ finished_beam_->set_bound (RIGHT, stem);
}
+
+ if (stem && forced_direction_)
+ set_grob_direction (stem, forced_direction_);
+
+ forced_direction_ = CENTER;
finished_beam_info_->beamify (finished_beaming_options_);
Beam::set_beaming (finished_beam_, finished_beam_info_);
if (!valid_start_point ())
return;
+ // It's suboptimal that we don't support callbacks returning ##f,
+ // but this makes beams have no effect on "stems" reliably in
+ // TabStaff when \tabFullNotation is switched off: the real stencil
+ // callback for beams is called quite late in the process, and we
+ // don't want to trigger it early.
+ if (scm_is_false (beam_->get_property_data ("stencil")))
+ return;
+
Item *stem = dynamic_cast<Item *> (info.grob ());
if (Stem::get_beam (stem))
return;
if (scm_is_number (conc))
return scm_to_double (conc);
- if (is_knee_)
+ if (is_knee_ || is_xstaff_)
return 0.0;
Direction beam_dir = CENTER;
warning (_f ("cannot find or create: `%s'", name.c_str ()));
t = unsmob_context_def (this->definition_);
}
-
- Context *tg = create_context (t, context_id, SCM_EOL);
- return tg->get_default_interpreter (context_id);
+ if (scm_is_symbol (t->get_default_child (SCM_EOL)))
+ {
+ Context *tg = create_context (t, "\\new", SCM_EOL);
+ return tg->get_default_interpreter (context_id);
+ }
+ return create_context (t, context_id, SCM_EOL);
+ }
+ else if (!context_id.empty () && context_id != id_string ())
+ {
+ if (daddy_context_ && !dynamic_cast<Global_context *> (daddy_context_))
+ return daddy_context_->get_default_interpreter (context_id);
+ warning (_f ("cannot find or create new Bottom = \"%s\"",
+ context_id.c_str ()));
}
return this;
}
else if (!r && !l)
{
/*
- This is a isolated dynamic apparently, and does not even have
+ This is an isolated dynamic apparently, and does not even have
any interesting support item.
*/
Grob *cc = unsmob_grob (get_property ("currentMusicalColumn"));
#include <set>
/*
- The definition of a interpretation context as given in the
+ The definition of an interpretation context as given in the
input. The lists are stored in order of definition.
*/
struct Context_def
#include "simple-music-iterator.hh"
/**
- Walk through a Event_chord
+ Walk through an Event_chord
*/
class Event_chord_iterator : public Simple_music_iterator
{
#include "grob-info.hh"
#include "translator.hh"
-/* Convert a music definition into a audio representation.
+/* Convert a music definition into an audio representation.
A baseclass. */
class Performer : public Translator
{
}
/**
- Item copy ctor. Copy nothing: everything should be a elt property
+ Item copy ctor. Copy nothing: everything should be an elt property
or a special purpose pointer (such as broken_to_drul_[]) */
Item::Item (Item const &s)
: Grob (s)
{
LexerError (_ ("Unfinished main input").c_str ());
do {
- pop_state ();
+ yy_pop_state ();
} while (YYSTATE != maininput);
}
- pop_state ();
+ extra_tokens_ = SCM_EOL;
+ yy_pop_state ();
}
if (!close_input () || !is_main_input_)
/* Returns YY_NULL */
if (YYSTATE == notes || YYSTATE == chords)
pitchname_tab_stack_ = scm_cdr (pitchname_tab_stack_);
- yy_pop_state ();
+ // don't cross the maininput threshold
+ if (YYSTATE != maininput)
+ yy_pop_state ();
if (extra) {
hidden_state_ = YYSTATE;
embedded_lilypond:
/* empty */
{
+ // FIXME: @$ does not contain a useful source location
+ // for empty rules, and the only token in the whole
+ // production, EMBEDDED_LILY, is synthetic and also
+ // contains no source location.
$$ = MAKE_SYNTAX ("void-music", @$);
}
| identifier_init
CONTEXT '{' context_def_spec_body '}'
{
$$ = $3;
+ unsmob_context_def ($$)->origin ()->set_spot (@$);
}
;
context_def_spec_body:
/**/ {
$$ = Context_def::make_scm ();
- unsmob_context_def ($$)->origin ()->set_spot (@$);
}
| CONTEXT_DEF_IDENTIFIER {
$$ = $1;
- unsmob_context_def ($$)->origin ()->set_spot (@$);
}
| context_def_spec_body context_mod {
if (!SCM_UNBNDP ($2))
book_block:
BOOK '{' book_body '}' {
$$ = $3;
+ unsmob_book ($$)->origin ()->set_spot (@$);
pop_paper (parser);
parser->lexer_->set_identifier (ly_symbol2scm ("$current-book"), SCM_BOOL_F);
}
{
Book *book = new Book;
init_papers (parser);
- book->origin ()->set_spot (@$);
book->paper_ = dynamic_cast<Output_def*> (unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultpaper"))->clone ());
book->paper_->unprotect ();
push_paper (parser, book->paper_);
parser->lexer_->set_identifier (ly_symbol2scm ("$current-book"), $$);
}
| BOOK_IDENTIFIER {
- unsmob_book ($1)->origin ()->set_spot (@$);
parser->lexer_->set_identifier (ly_symbol2scm ("$current-book"), $1);
}
| book_body paper_block {
bookpart_block:
BOOKPART '{' bookpart_body '}' {
$$ = $3;
+ unsmob_book ($$)->origin ()->set_spot (@$);
parser->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), SCM_BOOL_F);
}
;
bookpart_body:
{
Book *book = new Book;
- book->origin ()->set_spot (@$);
$$ = book->unprotect ();
parser->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), $$);
}
| BOOK_IDENTIFIER {
- unsmob_book ($1)->origin ()->set_spot (@$);
parser->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), $1);
}
| bookpart_body paper_block {
music_or_context_def:
music_arg
- {
- parser->lexer_->pop_state ();
- }
- | CONTEXT
- {
- parser->lexer_->pop_state ();
- } '{' context_def_spec_body '}'
- {
- $$ = $4;
- }
+ | context_def_spec_block
;
output_def_body:
parser->lexer_->push_note_state (nn);
} music_or_context_def
{
+ parser->lexer_->pop_state ();
if (unsmob_context_def ($3))
assign_context_def (unsmob_output_def ($1), $3);
else {
;
context_modification:
- WITH { parser->lexer_->push_initial_state (); } '{' context_mod_list '}'
+ WITH
+ {
+ SCM nn = parser->lexer_->lookup_identifier ("pitchnames");
+ parser->lexer_->push_note_state (nn);
+ } '{' context_mod_list '}'
{
parser->lexer_->pop_state ();
$$ = $4;
{
$$ = $1;
}
- | WITH embedded_scm_closed
+ | WITH context_modification_arg
{
+ if (unsmob_music ($2)) {
+ SCM proc = parser->lexer_->lookup_identifier ("context-mod-music-handler");
+ $2 = scm_call_2 (proc, parser->self_scm (), $2);
+ }
if (unsmob_context_mod ($2))
$$ = $2;
else {
}
;
+context_modification_arg:
+ embedded_scm_closed
+ | MUSIC_IDENTIFIER
+ ;
+
optional_context_mod:
/**/ {
$$ = SCM_EOL;
}
/*
- Maintain a minimum distance to the staff. This is similar to side
- position with padding, but it will put adjoining objects on a row if
+ Ensure 'staff-padding' from my refpoint to the staff. This is similar to
+ side-position with padding, but it will put adjoining objects on a row if
stuff sticks out of the staff a little.
*/
Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
Real staff_position = staff->maybe_pure_coordinate (common, Y_AXIS, pure, start, end);
Interval staff_extent = staff->maybe_pure_extent (staff, a, pure, start, end);
Real diff = (dir * staff_extent[dir] + staff_padding
- - dir * (total_off + iv[-dir])
+ - dir * total_off
+ dir * (staff_position - parent_position));
total_off += dir * max (diff, 0.0);
}
/*
TODO:
- Should insert a adjustable space here? For excercises, you might want to
+ Should insert an adjustable space here? For exercises, you might want to
use a staff without a clef in the beginning.
*/
{
Spanner *me = dynamic_cast<Spanner *> (me_grob);
- if (me->get_bound (LEFT)->break_status_dir ()
- || me->get_bound (RIGHT)->break_status_dir ())
+ Item *left = me->get_bound (LEFT);
+ Item *right = me->get_bound (RIGHT);
+ if (!left || left->break_status_dir ()
+ || !right || right->break_status_dir ())
return 0;
Drul_array<Grob *> stems (Note_column::get_stem (cols[0]),
tuplets_.pop_back ();
}
else if (!to_boolean (get_property ("skipTypesetting")))
- ev->origin ()->warning (_ ("No tuplet to end"));
+ ev->origin ()->debug_output (_ ("No tuplet to end"));
}
else
ev->origin ()->programming_error ("direction tuplet-span-event_ invalid.");
stopped_tuplets_[i].bracket_->get_bound (LEFT));
}
else
- programming_error ("stopped tuplet bracket has neither left nor right bound");
+ {
+ warning ("omitting tuplet bracket with neither left nor right bound");
+ continue;
+ }
}
// todo: scrap last_tuplets_, use stopped_tuplets_ only.
// clear stopped_tuplets_ at start_translation_timestep
{
if (prev_prefix_set & VIRGA)
/*
- * After a virga, make a an additional small space such that the
+ * After a virga, make an additional small space such that the
* appendix on the right side of the head does not touch the
* following head.
*/
if ((context_info & FLEXA_LEFT) && ! (context_info & PES_UPPER))
/*
- * Before a flexa (but not within a torculus), make a an
+ * Before a flexa (but not within a torculus), make an
* additional small space such that the appendix on the left side
* of the flexa does not touch the this head.
*/
%%%% You should have received a copy of the GNU General Public License
%%%% along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
-\version "2.17.11"
+\version "2.17.14"
%%
%% setup for Request->Element conversion.
.SUFFIXES: .html .info .texi .texinfo
# Explicitly list the dependencies on generated content
-$(outdir)/web.texi: $(outdir)/weblinks.itexi
+$(outdir)/web.texi: $(outdir)/we-wrote.itexi $(outdir)/others-did.itexi $(outdir)/weblinks.itexi $(outdir)/version.itexi
$(top-build-dir)/Documentation/$(outdir)/%/index.$(ISOLANG).html: $(outdir)/%/index.html $(TRANSLATION_LILY_IMAGES)
mkdir -p $(dir $@)
$(MASTER_TEXI_FILES): $(ITELY_FILES) $(ITEXI_FILES) $(outdir)/pictures
$(outdir)/pictures:
- $(MAKE) -C $(top-build-dir)/Documentation/pictures WWW-1
+ $(MAKE) -C $(top-build-dir)/Documentation/pictures out=www WWW-1
ln -sf $(top-build-dir)/Documentation/pictures/$(outdir) $@
$(TRANSLATION_LILY_IMAGES): $(MASTER_TEXI_FILES)
ifeq ($(out),www)
ifneq ($(NO_PDF_FILES),)
-local-WWW-1: $(OUT_TEXINFO_MANUALS) $(MASTER_TEXI_FILES) $(XREF_MAPS_FILES)
+local-WWW-1: $(OUT_TEXINFO_MANUALS) $(MASTER_TEXI_FILES) $(XREF_MAPS_FILES) $(TRANSLATION_LILY_IMAGES)
endif
ifeq ($(NO_PDF_FILES),)
-local-WWW-1: $(OUT_TEXINFO_MANUALS) $(MASTER_TEXI_FILES) $(PDF_FILES) $(XREF_MAPS_FILES)
+local-WWW-1: $(OUT_TEXINFO_MANUALS) $(MASTER_TEXI_FILES) $(PDF_FILES) $(XREF_MAPS_FILES) $(TRANSLATION_LILY_IMAGES)
endif
local-WWW-2: $(DEEP_HTML_FILES) $(BIG_PAGE_HTML_FILES) $(DOCUMENTATION_LOCALE_TARGET)
ITELY_FILES := $(call src-wildcard,*.itely)
ITEXI_FILES := $(call src-wildcard,*.itexi)
-DOCUMENTATION_INCLUDES = \
+DOCUMENTATION_INCLUDES += \
+ -I $(top-build-dir)/Documentation/$(outdir) \
+ -I $(top-build-dir)/Documentation/snippets/out \
-I $(top-src-dir)/Documentation/$(ISOLANG)/included \
+ -I $(top-src-dir)/Documentation/included \
-I $(top-src-dir)/Documentation \
- -I $(top-build-dir)/Documentation/$(outdir)
+ -I $(top-src-dir)/input/regression
-LILYPOND_BOOK_INCLUDES += $(DOCUMENTATION_INCLUDES)
MAKEINFO_FLAGS += --enable-encoding $(DOCUMENTATION_INCLUDES)
MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS)
CONVERT_LY = $(script-dir)/convert-ly.py
LILYPOND_BOOK = $(script-dir)/lilypond-book.py
-LILYPOND_BOOK_INCLUDES = -I $(outdir) -I $(src-dir) -I $(input-dir) \
- -I $(top-src-dir)/Documentation -I $(top-build-dir)/Documentation/snippets/out \
- -I $(input-dir)/regression/ -I $(top-src-dir)/Documentation/included/ \
- -I $(top-build-dir)/mf/$(outconfbase)/ \
- -I $(top-build-dir)/mf/out/ \
- -I $(top-src-dir)/Documentation/pictures \
- -I $(top-build-dir)/Documentation/pictures/$(outdir)
+LILYPOND_BOOK_INCLUDES = -I $(src-dir) $(DOCUMENTATION_INCLUDES)
## override from cmd line to speed up.
ANTI_ALIAS_FACTOR=2
install-out
LOCALSTEPMAKE_TEMPLATES = lilypond
-# We don't use $(MF_FILES), because there's more .mf cruft here
+# These are the main .mf files. We don't use $(MF_FILES) here,
+# because there are more .mf files, input'ed into the main files.
FETA_MF_FILES = $(call src-wildcard,feta[0-9]*.mf) \
$(call src-wildcard,feta-braces-[a-z].mf) \
$(call src-wildcard,feta-alphabet*[0-9].mf) \
SVG_FILES = $(OTF_FILES:%.otf=%.svg)
WOFF_FILES = $(OTF_FILES:%.otf=%.woff)
-FC_FIND = $(shell $(FCLIST) --verbose 'Century Schoolbook L:style=$(1)' \
- | grep 'file:' \
- | sed 's/.*"\([^"]*\)".*/\1/g')
-
NCSB_OTFS = $(addprefix $(outdir)/,CenturySchL-Ital.otf \
CenturySchL-BoldItal.otf \
CenturySchL-Roma.otf \
CenturySchL-Bold.otf)
-NCSB_INSTALL_DIR = $(local_lilypond_datadir)/fonts/otf
LOG_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.log)
LISP_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.lisp)
$< --dir=$(outdir)
-# Make tfm files first, log files last,
-# so that normally log files aren't made twice
-ALL_GEN_FILES = $(LOG_FILES) \
+# Generate emmentaler-*.pe scripts first, and *.otf, *.svg, *.woff files last,
+# so that normally these files aren't regenerated on a subsequent call to make.
+ALL_GEN_FILES = $(PE_SCRIPTS) \
+ $(LOG_FILES) \
$(ENC_FILES) \
$(LISP_FILES) \
$(OTF_TABLES) \
enddef;
-def draw_neomensural_black_head (expr width, height) =
+def draw_neomensural_black_head (expr width, height, concaveness) =
save head_width, head_height, stem_width;
save ne, nw, ne_dist, nw_dist;
pair ne, nw, ne_dist, nw_dist;
ne_dist := (nw rotated -90) * blot_diameter / 2;
fill lft z1
- .. (z1 + nw_dist)
- -- (z2 + nw_dist)
+ .. (z1 + nw_dist){ ne rotated -concaveness }
+ .. { ne rotated concaveness }(z2 + nw_dist)
.. top z2
- .. (z2 + ne_dist)
- -- (z3 + ne_dist)
+ .. (z2 + ne_dist){ nw rotated (180 - concaveness) }
+ .. { nw rotated (180 + concaveness) }(z3 + ne_dist)
.. rt z3
- .. (z3 - nw_dist)
- -- (z4 - nw_dist)
+ .. (z3 - nw_dist){ ne rotated (180 - concaveness) }
+ .. { ne rotated (180 + concaveness) }(z4 - nw_dist)
.. bot z4
- .. (z4 - ne_dist)
- -- (z1 - ne_dist)
+ .. (z4 - ne_dist){ nw rotated -concaveness }
+ .. { nw rotated concaveness }(z1 - ne_dist)
.. cycle;
labels (1, 2, 3, 4);
enddef;
-def draw_neomensural_open_head (expr width, height)=
- draw_neomensural_black_head (width, height);
+def draw_neomensural_open_head (expr width, height, concaveness)=
+ draw_neomensural_black_head (width, height, concaveness);
save headNW, headSW, stem_width;
nm_height := noteheight#;
nm_width := staff_space#;
fet_beginchar ("Neo-mensural semibrevis head", "s0neomensural");
- draw_neomensural_open_head (nm_width, nm_height);
+ draw_neomensural_open_head (nm_width, nm_height, 0);
fet_endchar;
fet_beginchar ("Neo-mensural minima head", "s1neomensural");
- draw_neomensural_open_head (nm_width, nm_height);
+ draw_neomensural_open_head (nm_width, nm_height, 0);
fet_endchar;
fet_beginchar ("Neo-mensural semiminima head", "s2neomensural");
- draw_neomensural_black_head (nm_width, nm_height);
+ draw_neomensural_black_head (nm_width, nm_height, 0);
fet_endchar;
%%%%%%%%
%
fet_beginchar ("Harmonic notehead (Neo-mensural open)", "s0harmonic");
- draw_neomensural_open_head (1.3 staff_space#, 1.3 noteheight#);
+ draw_neomensural_open_head (1.3 staff_space#, 1.3 noteheight#, 5);
charwx := head_width#;
charwy := 0;
fet_endchar;
fet_beginchar ("Harmonic notehead (Neo-mensural black)", "s2harmonic");
- draw_neomensural_black_head (1.3 staff_space#, 1.3 noteheight#);
+ draw_neomensural_black_head (1.3 staff_space#, 1.3 noteheight#, 5);
charwx := head_width#;
charwy := 0;
fet_endchar;
petrucci_width := .72 petrucci_height;
fet_beginchar ("Petrucci semibrevis head", "s0petrucci");
- draw_neomensural_open_head (petrucci_width, petrucci_height);
+ draw_neomensural_open_head (petrucci_width, petrucci_height, 0);
fet_endchar;
fet_beginchar ("Petrucci minima head", "s1petrucci");
- draw_neomensural_open_head (petrucci_width, petrucci_height);
+ draw_neomensural_open_head (petrucci_width, petrucci_height, 0);
fet_endchar;
fet_beginchar ("Petrucci semiminima head", "s2petrucci");
- draw_neomensural_black_head (petrucci_width, petrucci_height);
+ draw_neomensural_black_head (petrucci_width, petrucci_height, 0);
fet_endchar;
%
fet_beginchar ("Petrucci colored semibrevis head", "s0blackpetrucci");
- draw_neomensural_black_head (petrucci_width, petrucci_height);
+ draw_neomensural_black_head (petrucci_width, petrucci_height, 0);
fet_endchar;
fet_beginchar ("Petrucci colored minima head", "s1blackpetrucci");
- draw_neomensural_black_head (petrucci_width, petrucci_height);
+ draw_neomensural_black_head (petrucci_width, petrucci_height, 0);
fet_endchar;
fet_beginchar ("Petrucci colored semiminima head", "s2blackpetrucci");
- draw_neomensural_black_head (petrucci_width, petrucci_height);
+ draw_neomensural_black_head (petrucci_width, petrucci_height, 0);
fet_endchar;
r"\1/\2", str)
return str
+@rule((2, 17, 14), r"\accepts ... -> \accepts ... \defaultchild ...")
+def conv(str):
+ def matchaccepts(m):
+ # First weed out definitions starting from an existing
+ # definition: we assume that the inherited \defaultchild is
+ # good enough for our purposes. Heuristic: starts with a
+ # backslash and an uppercase letter.
+ if re.match (r"\s*\\[A-Z]", m.group (1)):
+ return m.group (0)
+ # existing defaultchild obviously trumps all
+ if re.search (r"\\defaultchild[^-_a-zA-Z]", m.group (1)):
+ return m.group (0)
+ # take the first \\accepts if any and replicate it
+ return re.sub ("(\r?\n[ \t]*|[ \t]+)"
+ + r"""\\accepts(\s+(?:#?".*?"|[-_a-zA-Z]+))""",
+ r"\g<0>\1\\defaultchild\2",
+ m.group (0), 1)
+
+ str = re.sub (r"\\context\s*@?\{(" + brace_matcher (20) + ")\}",
+ matchaccepts, str)
+ return str
+
@rule((2, 17, 15), r"""#(ly:set-option 'old-relative)
\relative -> \relative c'""")
def conv(str):
str = re.sub (words + "|" + matchstring, wordreplace, str)
return str
+@rule((2, 17, 27), r'''\stringTuning \notemode -> \stringTuning''')
+def conv(str):
+ str = re.sub (r"\\stringTuning\s*\\notemode(\s*)@?\{\s*(.*?)\s*@?}",
+ r"\\stringTuning\1\2", str)
+ if re.search (r'\bstaff-padding\b', str):
+ stderr_write (NOT_SMART % "staff-padding")
+ stderr_write (_ ("Staff-padding now controls the distance to the baseline, not the nearest point."))
+ 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,
;; the size of the staff lines is evaluated as 0, which results in a
;; solid span bar line with faulty y coordinate.
;;
-;; This routine was originally by Juergen Reuter, but it was a on the
+;; This routine was originally by Juergen Reuter, but it was on the
;; bulky side. Rewritten by Han-Wen. Ported from c++ to Scheme by Marc Hohl.
(define-public (ly:span-bar::print grob)
"The print routine for span bars."
(color . ,(grob::inherit-parent-property
X 'color))
(self-alignment-X . ,CENTER)
- (staff-padding . 0.2)
+ (staff-padding . 0.7)
(stencil . ,ly:text-interface::print)
(X-offset . ,(ly:make-simple-closure
`(,+
(positioning-done . ,ly:script-interface::calc-positioning-done)
(right-padding . 0.5)
(self-alignment-X . ,CENTER)
- (self-alignment-Y . ,CENTER)
(stencil . ,ly:text-interface::print)
(vertical-skylines . ,grob::always-vertical-skylines-from-stencil)
(Y-extent . ,grob::always-Y-extent-from-stencil)
(X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
- (Y-offset . ,self-alignment-interface::y-aligned-on-self)
+ (Y-offset . ,(scale-by-font-size -0.6)) ; center on an 'm'
(meta . ((class . Item)
(interfaces . (dynamic-interface
dynamic-text-interface
(outside-staff-priority . 400)
(padding . 0.5)
(shorten-pair . (0.0 . -0.6))
- (staff-padding . 1.0)
+ (staff-padding . 2.0)
(stencil . ,ly:ottava-bracket::print)
(style . dashed-line)
(vertical-skylines . ,grob::unpure-vertical-skylines-from-stencil)
"
@cindex drawing oval around text
-Draw a oval around @var{arg}. Use @code{thickness},
+Draw an oval around @var{arg}. Use @code{thickness},
@code{x-padding}, @code{x-padding} and @code{font-size} properties to determine
line thickness and padding around the markup.
(lambda (x) (apply music-property-description x))
`(
(absolute-octave ,integer?
- "The absolute octave for a octave check note.")
+ "The absolute octave for an octave check note.")
(alteration ,number? "Alteration for figured bass.")
(alternative-dir ,ly:dir? "Indicates if an AlternativeMusic is the
First (-1), Middle (0), or Last (1) of group of alternate endings.")
(pitch ,ly:pitch? "The pitch of this note.")
(pitch-alist ,list? "A list of pitches jointly forming the scale
of a key signature.")
- (pop-first ,boolean? "Do a revert before we try to do a override
+ (pop-first ,boolean? "Do a revert before we try to do an override
on some grob property.")
(prob-property ,symbol? "The symbol of the prob property to set.")
(procedure ,procedure? "The function to run with @code{\\applycontext}.
))
(AlternativeEvent
- . ((description . "Create a alternative event.")
+ . ((description . "Create an alternative event.")
(types . (general-music event alternative-event))
))
;;; Commentary:
;;; This file provides the support routines for a guile debugger called
-;;; from a environment controlled by LilyPond. It works in conjunction
+;;; from an environment controlled by LilyPond. It works in conjunction
;;; with file guile-debugger.ly.
;;; Code:
(define-public interpret-markup ly:text-interface::interpret-markup)
(define-public (interpret-markup-list layout props markup-list)
- ;; This relies on the markup list returned by a markup list command
- ;; to be modifiable
- (reverse!
- (fold
- (lambda (m prev)
- (if (markup-command-list? m)
- (reverse! (apply (car m) layout props (cdr m)) prev)
- (cons (interpret-markup layout props m) prev)))
- '()
- markup-list)))
+ (fold-right
+ (lambda (m prev)
+ (if (markup-command-list? m)
+ (append (apply (car m) layout props (cdr m)) prev)
+ (cons (interpret-markup layout props m) prev)))
+ '()
+ markup-list))
(define-public (prepend-alist-chain key val chain)
(cons (acons key val (car chain)) (cdr chain)))
predicates, to be used in case of a type error in arguments or
result."
+ (define (currying-lambda args doc-string? body)
+ (if (and (pair? args)
+ (pair? (car args)))
+ (currying-lambda (car args) doc-string?
+ `((lambda ,(cdr args) ,@body)))
+ (if doc-string?
+ `(lambda ,args ,doc-string? ,@body)
+ `(lambda ,args ,@body))))
+
(set! signature (map (lambda (pred)
(if (pair? pred)
`(cons ,(car pred)
,(and (pair? (cdr pred)) (cadr pred)))
pred))
(cons type signature)))
- (if (and (pair? body) (pair? (car body)) (eqv? '_i (caar body)))
- ;; When the music function definition contains a i10n doc string,
- ;; (_i "doc string"), keep the literal string only
- (let ((docstring (cadar body))
- (body (cdr body)))
- `(ly:make-music-function (list ,@signature)
- (lambda ,args
- ,docstring
- ,@body)))
- `(ly:make-music-function (list ,@signature)
- (lambda ,args
- ,@body))))
+
+ (let ((docstring
+ (and (pair? body) (pair? (cdr body))
+ (if (string? (car body))
+ (car body)
+ (and (pair? (car body))
+ (eq? '_i (caar body))
+ (pair? (cdar body))
+ (string? (cadar body))
+ (null? (cddar body))
+ (cadar body))))))
+ ;; When the music function definition contains an i10n doc string,
+ ;; (_i "doc string"), keep the literal string only
+ `(ly:make-music-function
+ (list ,@signature)
+ ,(currying-lambda args docstring (if docstring (cdr body) body)))))
(defmacro-public define-music-function rest
"Defining macro returning music functions.
the previous calculated offset value."
prev-offset)
+(define-public (scale-by-font-size x)
+ (ly:make-unpure-pure-container
+ (lambda (grob)
+ (* x (magstep (ly:grob-property grob 'font-size 0))))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
(make-vcenter-markup
(format #f "~a" fret-number)))
-;; The 5-string banjo has got a extra string, the fifth (duh), which
+;; The 5-string banjo has got an extra string, the fifth (duh), which
;; starts at the fifth fret on the neck. Frets on the fifth string
;; are referred to relative to the other frets:
;; the "first fret" on the fifth string is really the sixth fret
return str (val2);
class tempo_formatter (formatter):
def format_vals (self, val1, val2):
- return str (val2) + " msec/quarter"
+ return str (ord (val2[0])*65536 + ord (val2[1])*256 + ord (val2[2])) \
+ + " msec/quarter"
class time_signature_formatter (formatter):
def format_vals (self, val1, val2 = ""):
- return str (val2) # TODO
+ from fractions import Fraction
+ # if there are more notated 32nd notes per midi quarter than 8,
+ # we display a fraction smaller than 1 as scale factor.
+ r = Fraction(8, ord (val2[3]))
+ if r == 1:
+ ratio =""
+ else:
+ ratio = " *" + str (r)
+ return str (ord (val2[0])) + "/" + str(1 << ord (val2[1])) + ratio \
+ + ", metronome " + str (Fraction (ord (val2[2]), 96))
class key_signature_formatter (formatter):
def format_vals (self, val1, val2):
key_names = ['F', 'C', 'G', 'D', 'A', 'E', 'B']
%.gz: %
gzip -c9 $< > $@
-
-$(outdir)/%.css: $(CSS_DIRECTORY)/%.css
- ln -f $< $@
-.PHONY : all clean bin-clean default dist exe help html lib TAGS\
+.PHONY : all clean bin-clean default dist exe help html lib man TAGS\
po doc doc-stage-1 WWW-1 WWW-2 WWW-post local-WWW-1 local-WWW-2\
- log-clean
+ local-all local-clean local-bin-clean local-doc log-clean
-all: default
+all: default
$(LOOP)
+local-all: default
+
man:
$(LOOP)
@echo "Targets specific to current directory:"
help: generic-help local-help
- @echo "Generic targets that recurse into subdirectories*:"
+ @echo "Generic targets that recurse into subdirectories:"
@echo " all update everything except documentation with images"
+ @echo " (same as the empty target)"
@echo " clean remove all generated stuff in $(outdir)"
@echo " bin-clean same as clean, except that mf/out is preserved"
@echo " doc update documentation with images in directory \`out-www'"
@echo " any of the above commands to the current directory."
@echo
@echo "Other generic targets:"
- @echo " default same as the empty target"
+ @echo " default same as \`make all', but restricted to the current directory"
@echo " exe update all executables"
@echo " help this help"
@echo " lib update all libraries"
# we want to see botched results as well.
$(outdir)/%.dvi: %.mf
- -MFINPUTS=$(src-dir) $(METAFONT) "\scrollmode; input $<;"
+ -$(DO_MF_DEP) MFINPUTS=$(src-dir) $(METAFONT) "\scrollmode; input $<;"
gftodvi $(basename $<)
mv $(basename $<).dvi $(outdir)
rm $(basename $<).*gf
$(outdir)/%.tfm $(outdir)/%.log: %.mf
- MFINPUTS=$(src-dir) $(METAFONT) "\mode:=$(MFMODE); nonstopmode; input $<;" $(METAFONT_QUIET)
+ $(DO_MF_DEP) MFINPUTS=$(src-dir) $(METAFONT) "\mode:=$(MFMODE); nonstopmode; input $<;" $(METAFONT_QUIET)
# Let's keep this log output, it saves another mf run.
mv $(basename $(@F)).log $(basename $(@F)).tfm $(outdir)
rm -f $(basename $(@F)).*gf $(basename $(@F)).*pk
# the soft link for mf2pt1.mp is for recent mpost versions
# which no longer dump a .mem file
$(outdir)/%.pfb: %.mf $(outdir)/mf2pt1.mem $(outdir)/%.log
- TMP=`mktemp -d $(outdir)/pfbtemp.$*.XXXXXXXXX` \
+ $(DO_MF_DEP) TMP=`mktemp -d $(outdir)/pfbtemp.$*.XXXXXXXXX` \
&& ( cd $$TMP \
&& ln -s ../mf2pt1.mem . \
&& ln -s ../../mf2pt1.mp . \
else
METAFONT_QUIET =
endif
+
+# Find the metafont file $(1) within the source dirs and return its path.
+# If not found, return $(outdir)/$(1) assuming that it is a generated file.
+find-mf = \
+$(firstword \
+ $(wildcard $(src-dir)/$(1)) \
+ $(wildcard $(top-src-dir)/mf/$(1)) \
+ $(outdir)/$(1) \
+)
+
+# Recursively scan the metafont .mf file $(1) for "input X;"
+# and return all dependencies.
+scan-mf = \
+$(foreach f, $(shell test -f $(1) && sed -ne "/^[[:space:]]*input[[:space:]]/s/^[[:space:]]*input\([^.;]*\)\(.mf;\|;\)/\1.mf/p" $(1)), \
+ $(call find-mf,$(f)) \
+ $(call scan-mf,$(call find-mf,$(f))) \
+)
+
+# Find dependencies for the target $@, based on the metafont source file $<,
+# and write the dependencies to a .dep file.
+DO_MF_DEP = ( echo ./$@: $(call scan-mf,$<) > $(basename $@).dep ) &&
touch $@
# Copy files while tracking their dependencies.
-$(outdir)/%.texi: %.texi
+$(outdir)/%.texi: %.texi $(outdir)/version.itexi
mkdir -p $(dir $@)
$(DO_TEXI_DEP) cp -f $< $@
# Recursively scan the file $(1) for @include, search for included files
# within the texinfo include dirs, and return all dependencies.
scan-texi = \
-$(foreach f, $(shell sed -ne "/^@include[[:space:]]/s/@include//p" $(1)), \
+$(foreach f, $(shell test -f $(1) && sed -ne "/^@include[[:space:]]/s/@include//p" $(1)), \
$(call find-texi,$(f)) \
$(call scan-texi,$(call find-texi,$(f))) \
)
TEXINFO_PAPERSIZE_OPTION= $(if $(findstring $(PAPERSIZE),a4),,-t @afourpaper)
-DOCUMENTATION_INCLUDES += -I $(top-src-dir)/Documentation
-
MAKEINFO_FLAGS += --enable-encoding --error-limit=0 $(DOCUMENTATION_INCLUDES)
MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS)
TO_TOP_FILES=$(addprefix $(outdir)/, $(addsuffix .txt, $(README_TOP_FILES)))
-DOCUMENTATION_INCLUDES +=\
- -I $(top-src-dir)/Documentation/usage\
- -I $(top-src-dir)/Documentation/contributor\
-
#