summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kastrup <dak@gnu.org>2013-03-03 12:24:32 +0100
committerDavid Kastrup <dak@gnu.org>2013-03-08 18:28:38 +0100
commitc2f316e714d49e8d9557a7148f92b53ff96db21b (patch)
treea8fbf91f0bd09ac51a4e8d0e76d179ae15fdefd1
parent692b4e4ed7c1aae4d4d53ad59c26c22f2dd2d90f (diff)
Issue 1334: A \score-lines markup list command for multi-lines embedded scores
Like the \score markup, this is not usually called by users directly as it would require something awkward along the lines of \score-lines ##{ \score { ... } #} to get this through. Instead, using \score in contexts where only markup lists are allowed will pass the action to the \score-lines markup list command. Note that there are as of yet no user-level commands spacing a markup list in a way similar to the spacing inside of a \score markup.
-rw-r--r--lily/parser.yy35
-rwxr-xr-xscm/define-markup-commands.scm45
2 files changed, 52 insertions, 28 deletions
diff --git a/lily/parser.yy b/lily/parser.yy
index 3f4faf5d7c..478d053775 100644
--- a/lily/parser.yy
+++ b/lily/parser.yy
@@ -3236,7 +3236,7 @@ full_markup:
;
markup_top:
- markup_list {
+ simple_markup_list {
$$ = scm_list_2 (ly_lily_module_constant ("line-markup"), $1);
}
| markup_head_1_list simple_markup {
@@ -3262,7 +3262,7 @@ markup_scm:
;
-markup_list:
+simple_markup_list:
markup_composed_list {
$$ = $1;
}
@@ -3278,6 +3278,24 @@ markup_list:
}
;
+markup_list:
+ simple_markup_list
+ | markup_score
+ {
+ $$ = scm_list_1 (scm_list_2 (ly_lily_module_constant ("score-lines-markup-list"), $1));
+ }
+ ;
+
+markup_score:
+ SCORE {
+ SCM nn = parser->lexer_->lookup_identifier ("pitchnames");
+ parser->lexer_->push_note_state (nn);
+ } '{' score_body '}' {
+ $$ = $4;
+ parser->lexer_->pop_state ();
+ }
+ ;
+
markup_composed_list:
markup_head_1_list markup_braced_list {
$$ = scm_call_2 (ly_lily_module_constant ("map-markup-command-list"), $1, $2);
@@ -3296,7 +3314,7 @@ markup_braced_list_body:
| markup_braced_list_body markup {
$$ = scm_cons ($2, $1);
}
- | markup_braced_list_body markup_list {
+ | markup_braced_list_body simple_markup_list {
$$ = scm_reverse_x ($2, $1);
}
;
@@ -3345,13 +3363,6 @@ simple_markup:
STRING {
$$ = make_simple_markup ($1);
}
- | SCORE {
- SCM nn = parser->lexer_->lookup_identifier ("pitchnames");
- parser->lexer_->push_note_state (nn);
- } '{' score_body '}' {
- $$ = scm_list_2 (ly_lily_module_constant ("score-markup"), $4);
- parser->lexer_->pop_state ();
- }
| MARKUP_FUNCTION markup_command_basic_arguments {
$$ = scm_cons ($1, scm_reverse_x ($2, SCM_EOL));
}
@@ -3359,6 +3370,10 @@ simple_markup:
{
$$ = $2;
}
+ | markup_score
+ {
+ $$ = scm_list_2 (ly_lily_module_constant ("score-markup"), $1);
+ }
;
markup:
diff --git a/scm/define-markup-commands.scm b/scm/define-markup-commands.scm
index d3ad150ff6..251415d85b 100755
--- a/scm/define-markup-commands.scm
+++ b/scm/define-markup-commands.scm
@@ -961,6 +961,31 @@ samplePath =
X-extent
Y-extent)))
+(define-markup-list-command (score-lines layout props score)
+ (ly:score?)
+ "
+This is the same as the @code{\\score} markup but delivers its
+systems as a list of lines. This is not usually called directly by
+the user. Instead, it is called when the parser encounters
+@code{\\score} in a context where only markup lists are allowed. When
+used as the argument of a toplevel @code{\\markuplist}, the result can
+be split across pages."
+ (let ((output (ly:score-embedded-format score layout)))
+
+ (if (ly:music-output? output)
+ (map
+ (lambda (paper-system)
+ ;; shift such that the refpoint of the bottom staff of
+ ;; the first system is the baseline of the score
+ (ly:stencil-translate-axis
+ (paper-system-stencil paper-system)
+ (- (car (paper-system-staff-extents paper-system)))
+ Y))
+ (vector->list (ly:paper-score-paper-systems output)))
+ (begin
+ (ly:warning (_"no systems found in \\score markup, does it have a \\layout block?"))
+ '()))))
+
(define-markup-command (score layout props score)
(ly:score?)
#:category music
@@ -1013,24 +1038,8 @@ baseline.
}
}
@end lilypond"
- (let ((output (ly:score-embedded-format score layout)))
-
- (if (ly:music-output? output)
- (let ((paper-systems
- (vector->list
- (ly:paper-score-paper-systems output))))
- (if (pair? paper-systems)
- ;; shift such that the refpoint of the bottom staff of
- ;; the first system is the baseline of the score
- (ly:stencil-translate-axis
- (stack-stencils Y DOWN baseline-skip
- (map paper-system-stencil paper-systems))
- (- (car (paper-system-staff-extents (car paper-systems))))
- Y)
- empty-stencil))
- (begin
- (ly:warning (_"no systems found in \\score markup, does it have a \\layout block?"))
- empty-stencil))))
+ (stack-stencils Y DOWN baseline-skip
+ (score-lines-markup-list layout props score)))
(define-markup-command (null layout props)
()