struct Break_position
{
/*
- index in system_spec_index_, if VPOS start of book.
+ index into system_specs_, if this is VPOS, the Break_position represents the
+ start of the book.
*/
vsize system_spec_index_;
- /* if system_spec_index_ is a score, then we start at the score_brk_'th possible
- page-break in the score */
+ /* if system_spec_index_ indexes a score, then we start at the score_brk_'th
+ possible page-break in the score */
vsize score_break_;
- /* if system_spec_index_ is a score, this points to the broken column */
+ /* if system_spec_index_ indexes a score, this points to the broken column */
Grob *col_;
bool score_ender_;
}
else
{
+ /* If systems-per-page and page-count are both specified, we know exactly
+ how many systems should be present. */
+ if (systems_per_page () > 0)
+ {
+ ideal_sys_count = systems_per_page () * page_count;
+
+ if (ideal_sys_count > max_system_count (0, end)
+ || ideal_sys_count < min_system_count (0, end))
+ {
+ warning (_ ("could not satisfy systems-per-page and page-count at the same time, ignoring systems-per-page"));
+ ideal_sys_count = best.system_count ();
+ min_sys_count = page_count;
+ }
+ else
+ {
+ set_current_breakpoints (0, end, ideal_sys_count);
+ min_sys_count = max_sys_count = ideal_sys_count;
+ ideal_line_division = best_division = current_configuration (0);
+ }
+ }
+ else
+ min_sys_count = page_count;
+
/* TODO: the following line will spit out programming errors if the
ideal line spacing doesn't fit on PAGE_COUNT pages */
- /* TODO: the interaction between systems_per_page and page_count needs to
- be considered. */
best = space_systems_on_n_pages (0, page_count, first_page_num);
- min_sys_count = page_count;
}
if (page_count == 1)
/* try a smaller number of systems than the ideal number for line breaking */
Line_division bound = ideal_line_division;
- for (vsize sys_count = ideal_sys_count; --sys_count >= min_sys_count;)
+ for (vsize sys_count = ideal_sys_count + 1; --sys_count >= min_sys_count;)
{
Page_spacing_result best_for_this_sys_count;
set_current_breakpoints (0, end, sys_count, Line_division (), bound);
return ret;
}
+// Returns the minimum number of _non-title_ lines.
vsize
Page_breaking::min_system_count (vsize start, vsize end)
{
return ret;
}
+// Returns the maximum number of _non-title_ lines.
vsize
Page_breaking::max_system_count (vsize start, vsize end)
{
return ret;
}
+// The numbers returned by this function represent either
+// the maximum or minimum number of _non-title_ lines
+// per chunk.
Page_breaking::Line_division
Page_breaking::system_count_bounds (vector<Break_position> const &chunks,
bool min)
assert (chunks.size () >= 2);
Line_division ret;
- ret.resize (chunks.size () - 1, 1);
+ ret.resize (chunks.size () - 1, 0);
for (vsize i = 0; i + 1 < chunks.size (); i++)
{
div.push_back (line_breaking_[sys].best_solution (start, end).size ());
}
else
- div.push_back (1);
+ div.push_back (0);
system_count_ += div.back ();
}
}
else
{
- assert (div[i] == 1);
+ assert (div[i] == 0);
uncompressed_line_details_.push_back (system_specs_[sys].prob_
? Line_details (system_specs_[sys].prob_, book_->paper_)
: Line_details ());
int real_min = max ((int) min_sys[my_index], (int) system_count - others_max);
int real_max = min ((int) max_sys[my_index], (int) system_count - others_min);
- if (real_min > real_max || real_min <= 0)
+ if (real_min > real_max || real_min < 0)
{
/* this should never happen within a recursive call. If it happens
at all, it means that we were called with an unsolvable problem