#(set-default-paper-size "a6")
+\book {
-%% top-level paper, which is inherited by all children bookparts
-\paper {
- id = "\nbook level paper\n"
- ragged-last-bottom = ##t
- %% Page footer: add a different part-tagline at part last page
- oddFooterMarkup = \markup {
- \column {
- \fill-line {
- %% Copyright header field only on book first page.
- \on-the-fly #first-page \fromproperty #'header:copyright
- }
- \fill-line {
- %% Part tagline header field only on each part last page.
- \on-the-fly #part-last-page \fromproperty #'header:parttagline
- }
- \fill-line {
- %% Tagline header field only on book last page.
- \on-the-fly #last-page \fromproperty #'header:tagline
+ %% book paper, which is inherited by all children bookparts
+ \paper {
+ id = "\nbook level paper\n"
+ ragged-last-bottom = ##t
+ %% Page footer: add a different part-tagline at part last page
+ oddFooterMarkup = \markup {
+ \column {
+ \fill-line {
+ %% Copyright header field only on book first page.
+ \on-the-fly #first-page \fromproperty #'header:copyright
+ }
+ \fill-line {
+ %% Part tagline header field only on each part last page.
+ \on-the-fly #part-last-page \fromproperty #'header:parttagline
+ }
+ \fill-line {
+ %% Tagline header field only on book last page.
+ \on-the-fly #last-page \fromproperty #'header:tagline
+ }
}
}
}
-}
-
-%% top-level header, which is inherited by the first bookpart
-\header {
- title = "Book title"
- copyright = "Copyright line on book first page"
- parttagline = "Part tagline"
- tagline = "Book tagline"
-}
-
-\book {
+ %% book header, which is inherited by the first bookpart
+ \header {
+ title = "Book title"
+ copyright = "Copyright line on book first page"
+ parttagline = "Part tagline"
+ tagline = "Book tagline"
+ }
+
\bookpart {
%% a different page breaking function may be used on each part
- %\paper { #(define page-breaking optimal-page-breaks) }
+ \paper { #(define page-breaking optimal-page-breaks) }
\header { subtitle = "First part" }
\markup { The first book part }
\markup { a page break }
Output_def *get_layout (Lily_parser *parser);
Output_def *get_midi (Lily_parser *parser);
Output_def *get_paper (Lily_parser *parser);
+void init_papers (Lily_parser *parser, Output_def *default_paper);
+void stack_paper (Lily_parser *parser, Output_def *paper);
+void unstack_paper (Lily_parser *parser);
+void set_paper (Lily_parser *parser, Output_def *paper);
SCM get_header (Lily_parser *parser);
#endif /* LILY_PARSER_HH */
return layout;
}
+/* Return a copy of the top of $papers stack */
Output_def *
get_paper (Lily_parser *parser)
{
- SCM id = parser->lexer_->lookup_identifier ("$defaultpaper");
- Output_def *layout = unsmob_output_def (id);
-
+ SCM papers = parser->lexer_->lookup_identifier ("$papers");
+ Output_def *layout = (papers == SCM_UNDEFINED || scm_is_null (papers)) ?
+ 0 : unsmob_output_def (scm_car (papers));
layout = layout ? dynamic_cast<Output_def *> (layout->clone ()) : new Output_def;
layout->set_variable (ly_symbol2scm ("is-paper"), SCM_BOOL_T);
return layout;
}
+/* Initialize $papers stack with the default paper */
+void
+init_papers (Lily_parser *parser, Output_def *default_paper)
+{
+ parser->lexer_->set_identifier (ly_symbol2scm ("$papers"),
+ scm_list_1 (default_paper->self_scm ()));
+}
+
+/* Stack a paper on top of $papers */
+void
+stack_paper (Lily_parser *parser, Output_def *paper)
+{
+ parser->lexer_->set_identifier (ly_symbol2scm ("$papers"),
+ scm_cons (paper->self_scm (),
+ parser->lexer_->lookup_identifier ("$papers")));
+}
+
+/* Unstack a paper from $papers */
+void
+unstack_paper (Lily_parser *parser)
+{
+ parser->lexer_->set_identifier (ly_symbol2scm ("$papers"),
+ scm_cdr (parser->lexer_->lookup_identifier ("$papers")));
+}
+
+/* Change the paper on top of $papers */
+void
+set_paper (Lily_parser *parser, Output_def *paper)
+{
+ scm_set_car_x (parser->lexer_->lookup_identifier ("$papers"), paper->self_scm ());
+}
+
SCM
get_header (Lily_parser *parser)
{
Output_def * od = $1;
if ($1->c_variable ("is-paper") == SCM_BOOL_T)
+ {
id = ly_symbol2scm ("$defaultpaper");
+ init_papers (PARSER, od);
+ }
else if ($1->c_variable ("is-midi") == SCM_BOOL_T)
id = ly_symbol2scm ("$defaultmidi");
else if ($1->c_variable ("is-layout") == SCM_BOOL_T)
book_block:
BOOK '{' book_body '}' {
$$ = $3;
+ unstack_paper (PARSER);
}
;
$$->origin ()->set_spot (@$);
$$->paper_ = dynamic_cast<Output_def*> (unsmob_output_def (PARSER->lexer_->lookup_identifier ("$defaultpaper"))->clone ());
$$->paper_->unprotect ();
+ stack_paper (PARSER, $$->paper_);
$$->header_ = PARSER->lexer_->lookup_identifier ("$defaultheader");
}
| BOOK_IDENTIFIER {
| book_body paper_block {
$$->paper_ = $2;
$2->unprotect ();
+ set_paper (PARSER, $2);
}
| book_body bookpart_block {
Book *bookpart = $2;