From: Joe Neeman Date: Wed, 16 Jun 2010 11:28:09 +0000 (+0300) Subject: Fix 884. X-Git-Tag: release/2.13.25-1~20 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=436440663fe93a8bb94776a3363376ee5c7c57af;p=lilypond.git Fix 884. Change page-count so that you specify a list of page-counts, with each element of the list referring to the number of pages between two successive forced page breaks. --- diff --git a/input/regression/page-breaking-page-count-forced-breaks.ly b/input/regression/page-breaking-page-count-forced-breaks.ly new file mode 100644 index 0000000000..1d4174d7d3 --- /dev/null +++ b/input/regression/page-breaking-page-count-forced-breaks.ly @@ -0,0 +1,18 @@ +\version "2.13.23" + +#(set-default-paper-size "a6") + +\book { + \header { + texidoc = "When specifying page-count together with manual \pageBreaks, +page-count must be a list with one more element than the number of +\pageBreaks and each element refers to the number of pages between the +appropriate consecutive \pageBreaks." + } + + \paper { + page-count = #'(1 2) + } + + { c'1 c'1 \pageBreak c'1 c'1 c'1} +} \ No newline at end of file diff --git a/lily/include/optimal-page-breaking.hh b/lily/include/optimal-page-breaking.hh index 2c52fb974b..1f943a45bb 100644 --- a/lily/include/optimal-page-breaking.hh +++ b/lily/include/optimal-page-breaking.hh @@ -32,7 +32,7 @@ public: virtual ~Optimal_page_breaking (); private: - vector solve_chunk (vsize); + vector solve_chunk (vsize, SCM); }; #endif /* OPTIMAL_PAGE_BREAKING_HH */ diff --git a/lily/optimal-page-breaking.cc b/lily/optimal-page-breaking.cc index a043075d76..31771e70e2 100644 --- a/lily/optimal-page-breaking.cc +++ b/lily/optimal-page-breaking.cc @@ -47,11 +47,10 @@ extern bool debug_page_breaking_scoring; // ENDth \pageBreak. // Returns a vector of systems per page for the pages within this chunk. vector -Optimal_page_breaking::solve_chunk (vsize end) +Optimal_page_breaking::solve_chunk (vsize end, SCM forced_page_count) { vsize max_sys_count = max_system_count (end-1, end); 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 (end-1, end); @@ -198,10 +197,36 @@ Optimal_page_breaking::solve () { vector systems_per_page; + SCM forced_page_counts = book_->paper_->c_variable ("page-count"); + if (scm_is_integer (forced_page_counts)) + forced_page_counts = scm_list_1 (forced_page_counts); + + bool is_forced_page_counts = false; + if (scm_to_bool (scm_list_p (forced_page_counts))) + { + int len = scm_to_int (scm_length (forced_page_counts)); + if (len != (int)last_break_position ()) + { + warning (_f ("page-count has length %d, but it should have length %d " + "(one more than the number of forced page breaks)", + len, (int)last_break_position ())); + } + else + is_forced_page_counts = true; + } + + message (_f ("Solving %d page-breaking chunks...", last_break_position ())); for (vsize end = 1; end <= last_break_position (); ++end) { - vector chunk_systems = solve_chunk (end); + SCM page_count = SCM_EOL; + if (is_forced_page_counts) + { + page_count = scm_car (forced_page_counts); + forced_page_counts = scm_cdr (forced_page_counts); + } + + vector chunk_systems = solve_chunk (end, page_count); systems_per_page.insert (systems_per_page.end (), chunk_systems.begin (), chunk_systems.end ()); }