From: Nicolas Sceaux Date: Sat, 18 Oct 2008 15:07:58 +0000 (+0200) Subject: Book parts: take account of http://codereview.appspot.com/4848 review X-Git-Tag: release/2.11.65-1~51^2~2^2~15 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f455506b0a4a32cea2c596a3a6e3f364e7ea5a90;p=lilypond.git Book parts: take account of http://codereview.appspot.com/4848 review --- diff --git a/input/new/book-parts.ly b/input/new/book-parts.ly new file mode 100644 index 0000000000..ce0c11ce04 --- /dev/null +++ b/input/new/book-parts.ly @@ -0,0 +1,29 @@ +\version "2.11.63" + +\header { + lsrtags = "paper-and-layout" + texidocs = "@code{\\bookpart} can be used to split a book into several parts. +Each part last page can be affected by @code{ragged-bottom-last}. +" + doctitle = "Book parts" +} + +#(set-default-paper-size "a6") + +\book { + %% book-level paper, which is inherited by all bookparts + \paper { ragged-last-bottom = ##t } + %% book-level header, which is inherited by the first bookpart + \header { title = "Book title" } + %% first book part + \bookpart { + \header { subtitle = "First part" } + \markup { The first book part } + \markup \wordwrap { with ragged-last-bottom (see the space below this text) } + } + %% an other book part + \bookpart { + \header { subtitle = "Second part" } + { c' } + } +} diff --git a/input/regression/bookparts.ly b/input/regression/bookparts.ly index da5300f02f..a612a0fe8b 100644 --- a/input/regression/bookparts.ly +++ b/input/regression/bookparts.ly @@ -1,4 +1,4 @@ -\version "2.11.55" +\version "2.11.63" \header { texidoc = "A book can be split into several parts with different paper settings, diff --git a/lily/book.cc b/lily/book.cc index 8b71cc3f71..96243e1b95 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -130,17 +130,23 @@ Book::set_parent (Book *parent) /* If this part is the first child of parent, copy its header */ if (ly_is_module (parent->header_) && (scm_is_null (parent->bookparts_))) { - header_ = ly_make_anonymous_module (false); - ly_module_copy (header_, parent->header_); + SCM tmp_header = ly_make_anonymous_module (false); + ly_module_copy (tmp_header, parent->header_); + if (ly_is_module (header_)) + ly_module_copy (tmp_header, header_); + header_ = tmp_header; } } +/* Before an explicit \bookpart is encountered, scores are added to the book. + * But once a bookpart is added, the previous scores shall be collected into + * a new bookpart. + */ void -Book::add_bookpart () +Book::add_scores_to_bookpart () { if (scm_is_pair (scores_)) { - warning ("add_bookpart"); /* If scores have been added to this book, add them to a child * book part */ Book *part = new Book; @@ -155,7 +161,7 @@ Book::add_bookpart () void Book::add_bookpart (SCM b) { - add_bookpart (); + add_scores_to_bookpart (); Book *part = unsmob_book (b); part->set_parent (this); bookparts_ = scm_cons (b, bookparts_); @@ -184,6 +190,53 @@ Book::process (Output_def *default_paper, return process (default_paper, default_layout, 0); } +void +Book::process_bookparts (Paper_book *output_paper_book, Output_def *paper, Output_def *layout) +{ + add_scores_to_bookpart (); + for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p)) + { + if (Book *book = unsmob_book (scm_car (p))) + { + Paper_book *paper_book_part = book->process (paper, layout, output_paper_book); + if (paper_book_part) + output_paper_book->add_bookpart (paper_book_part->self_scm ()); + } + } +} + +void +Book::process_score (SCM s, Paper_book *output_paper_book, Output_def *layout) +{ + if (Score *score = unsmob_score (scm_car (s))) + { + SCM outputs = score + ->book_rendering (output_paper_book->paper_, layout); + + while (scm_is_pair (outputs)) + { + Music_output *output = unsmob_music_output (scm_car (outputs)); + + if (Performance *perf = dynamic_cast (output)) + output_paper_book->add_performance (perf->self_scm ()); + else if (Paper_score *pscore = dynamic_cast (output)) + { + if (ly_is_module (score->get_header ())) + output_paper_book->add_score (score->get_header ()); + output_paper_book->add_score (pscore->self_scm ()); + } + + outputs = scm_cdr (outputs); + } + } + else if (Text_interface::is_markup_list (scm_car (s)) + || unsmob_page_marker (scm_car (s))) + output_paper_book->add_score (scm_car (s)); + else + assert (0); + +} + /* Concatenate all score or book part outputs into a Paper_book */ Paper_book * @@ -214,51 +267,16 @@ Book::process (Output_def *default_paper, if (scm_is_pair (bookparts_)) { /* Process children book parts */ - add_bookpart (); - for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p)) - { - if (Book *book = unsmob_book (scm_car (p))) - { - Paper_book *paper_book_part = book - ->process (paper, default_layout, paper_book); - if (paper_book_part) - paper_book->add_bookpart (paper_book_part->self_scm ()); - } - } + process_bookparts (paper_book, paper, default_layout); } else { /* Process scores */ - /* Render in order of parsing. */ + /* Render in order of parsing. */ for (SCM s = scm_reverse (scores_); scm_is_pair (s); s = scm_cdr (s)) - { - if (Score *score = unsmob_score (scm_car (s))) - { - SCM outputs = score - ->book_rendering (paper_book->paper_, default_layout); - - while (scm_is_pair (outputs)) - { - Music_output *output = unsmob_music_output (scm_car (outputs)); - - if (Performance *perf = dynamic_cast (output)) - paper_book->add_performance (perf->self_scm ()); - else if (Paper_score *pscore = dynamic_cast (output)) - { - if (ly_is_module (score->get_header ())) - paper_book->add_score (score->get_header ()); - paper_book->add_score (pscore->self_scm ()); - } - - outputs = scm_cdr (outputs); - } - } - else if (Text_interface::is_markup_list (scm_car (s)) - || unsmob_page_marker (scm_car (s))) - paper_book->add_score (scm_car (s)); - else - assert (0); - } + { + process_score (s, paper_book, default_layout); + } } return paper_book; diff --git a/lily/include/book.hh b/lily/include/book.hh index 82eef1a3ab..a29cb07449 100644 --- a/lily/include/book.hh +++ b/lily/include/book.hh @@ -32,16 +32,24 @@ public: VIRTUAL_COPY_CONSTRUCTOR(Book, Book); Book (); void add_score (SCM); - void add_bookpart (); void add_bookpart (SCM); - void set_parent (Book *parent); - bool error_found (); Paper_book *process (Output_def *def_paper, Output_def *def_layout); Paper_book *process (Output_def *default_paper, Output_def *default_layout, Paper_book *parent_part); void set_keys (); + +protected: + void set_parent (Book *parent); + void add_scores_to_bookpart (); + bool error_found (); + void process_score (SCM score, + Paper_book *output_paper_book, + Output_def *layout); + void process_bookparts (Paper_book *output_paper_book, + Output_def *paper, + Output_def *layout); }; DECLARE_UNSMOB (Book, book); diff --git a/lily/include/paper-book.hh b/lily/include/paper-book.hh index 936194a5c7..d06f8fdd7c 100644 --- a/lily/include/paper-book.hh +++ b/lily/include/paper-book.hh @@ -52,15 +52,16 @@ public: Stencil book_title (); Stencil score_title (SCM); + void classic_output (SCM output_channel); + void output (SCM output_channel); + +protected: void classic_output_aux (SCM output, int *first_performance_number); - void classic_output (SCM output_channel); void output_aux (SCM output_channel, - bool is_first, bool is_last, int *first_page_number, int *first_performance_number); - void output (SCM output_channel); }; DECLARE_UNSMOB (Paper_book, paper_book) diff --git a/lily/minimal-page-breaking.cc b/lily/minimal-page-breaking.cc index 0826e18190..870340f83d 100644 --- a/lily/minimal-page-breaking.cc +++ b/lily/minimal-page-breaking.cc @@ -40,7 +40,7 @@ Minimal_page_breaking::solve () break_into_pieces (0, end, current_configuration (0)); message (_ ("Computing page breaks...")); - vsize first_page_num = robust_scm2int (book_->paper_->c_variable ("part-first-page-number"), 1); + vsize first_page_num = robust_scm2int (book_->paper_->c_variable ("first-page-number"), 1); Page_spacing_result res = pack_systems_on_least_pages (0, first_page_num); SCM lines = systems (); return make_pages (res.systems_per_page_, lines); diff --git a/lily/optimal-page-breaking.cc b/lily/optimal-page-breaking.cc index 9d395a1b50..3c26c9abe0 100644 --- a/lily/optimal-page-breaking.cc +++ b/lily/optimal-page-breaking.cc @@ -38,7 +38,7 @@ Optimal_page_breaking::solve () { vsize end = last_break_position (); vsize max_sys_count = max_system_count (0, end); - vsize first_page_num = robust_scm2int (book_->paper_->c_variable ("part-first-page-number"), 1); + vsize first_page_num = robust_scm2int (book_->paper_->c_variable ("first-page-number"), 1); SCM forced_page_count = book_->paper_->c_variable ("page-count"); set_to_ideal_line_configuration (0, end); diff --git a/lily/page-breaking.cc b/lily/page-breaking.cc index 1bc13ffc5f..10a428de5b 100644 --- a/lily/page-breaking.cc +++ b/lily/page-breaking.cc @@ -253,7 +253,7 @@ Page_breaking::make_pages (vector lines_per_page, SCM systems) SCM book = book_->self_scm (); int first_page_number - = robust_scm2int (book_->paper_->c_variable ("part-first-page-number"), 1); + = robust_scm2int (book_->paper_->c_variable ("first-page-number"), 1); bool last_part = ly_scm2bool (book_->paper_->c_variable ("part-is-last")); SCM ret = SCM_EOL; SCM label_page_table = book_->top_paper ()->c_variable ("label-page-table"); diff --git a/lily/page-turn-page-breaking.cc b/lily/page-turn-page-breaking.cc index d2e501cb65..75e1a3bbf2 100644 --- a/lily/page-turn-page-breaking.cc +++ b/lily/page-turn-page-breaking.cc @@ -122,7 +122,7 @@ Page_turn_page_breaking::calc_subproblem (vsize ending_breakpoint) if (start > 0 && best.demerits_ < state_[start-1].demerits_) continue; - int p_num = robust_scm2int (book_->paper_->c_variable ("part-first-page-number"), 1); + int p_num = robust_scm2int (book_->paper_->c_variable ("first-page-number"), 1); if (start > 0) { /* except possibly for the first page, enforce the fact that first_page_number_ @@ -260,7 +260,7 @@ Page_turn_page_breaking::make_pages (vector const &soln, SCM systems /* this should only actually modify first-page-number if auto-first-page-number was true. */ - book_->paper_->set_variable (ly_symbol2scm ("part-first-page-number"), + book_->paper_->set_variable (ly_symbol2scm ("first-page-number"), scm_from_int (soln[0].first_page_number_)); return Page_breaking::make_pages (lines_per_page, systems); } diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 1962f3b2ec..0887f9312e 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -110,7 +110,6 @@ Paper_book::add_performance (SCM s) void Paper_book::output_aux (SCM output_channel, - bool is_first, bool is_last, int *first_page_number, int *first_performance_number) @@ -128,27 +127,22 @@ Paper_book::output_aux (SCM output_channel, if (scm_is_pair (bookparts_)) { - bool is_first_part = is_first; for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p)) if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) { bool is_last_part = (is_last && !scm_is_pair (scm_cdr (p))); pbookpart->output_aux (output_channel, - is_first_part, is_last_part, first_page_number, first_performance_number); - is_first_part = false; } } else { if (scores_ == SCM_EOL) return; - paper_->set_variable (ly_symbol2scm ("part-first-page-number"), + paper_->set_variable (ly_symbol2scm ("first-page-number"), scm_long2num (*first_page_number)); - paper_->set_variable (ly_symbol2scm ("part-is-first"), - ly_bool2scm (is_first)); paper_->set_variable (ly_symbol2scm ("part-is-last"), ly_bool2scm (is_last)); /* Generate all stencils to trigger font loads. */ @@ -162,7 +156,6 @@ Paper_book::output (SCM output_channel) int first_page_number = robust_scm2int (paper_->c_variable ("first-page-number"), 1); int first_performance_number = 0; output_aux (output_channel, - true, true, &first_page_number, &first_performance_number);