vsize page_count = robust_scm2int (forced_page_count, 1);
Line_division ideal_line_division;
Line_division best_division;
- vsize min_sys_count = 0;
+ vsize min_sys_count = 1;
vsize ideal_sys_count = system_count ();
if (!scm_is_integer (forced_page_count))
assert (n >= min_page_count (configuration, first_page_num));
cache_line_details (configuration);
- if (n > cached_line_details_.size ())
- return Page_spacing_result ();
- if (n == 1)
+
+ if (n == 1 && n <= cached_line_details_.size ())
ret = space_systems_on_1_page (cached_line_details_,
page_height (first_page_num, is_last ()),
ragged () || (is_last () && ragged_last ()));
- else if (n == 2)
+ else if (n == 2 && n <= cached_line_details_.size ())
ret = space_systems_on_2_pages (configuration, first_page_num);
else
{
resize (page_count);
Page_spacing_result ret;
- ret.force_.resize (page_count);
- ret.systems_per_page_.resize (page_count);
vsize system = lines_.size () - 1;
- vsize tack_onto_the_end = 0;
+ vsize extra_systems = 0;
+ vsize extra_pages = 0;
if (isinf (state_.at (system, page_count-1).demerits_))
{
if (i)
{
- tack_onto_the_end = system - i;
+ extra_systems = system - i;
system = i;
}
else
- return Page_spacing_result (); /* couldn't salvage it -- probably going to crash */
+ {
+ /* try chopping off pages from the end */
+ vsize j;
+ for (j = page_count; j && isinf (state_.at (system, j-1).demerits_); j--)
+ ;
+
+ if (j)
+ {
+ extra_pages = page_count - j;
+ page_count = j;
+ }
+ else
+ return Page_spacing_result (); /* couldn't salvage it -- probably going to crash */
+ }
}
+ ret.force_.resize (page_count);
+ ret.systems_per_page_.resize (page_count);
ret.penalty_ = state_.at (system, page_count-1).penalty_
+ lines_.back ().page_penalty_ + lines_.back ().turn_penalty_;
if (p == 0)
ret.systems_per_page_[p] = system + 1;
else
- ret.systems_per_page_[p] = system - ps.prev_ + tack_onto_the_end;
+ ret.systems_per_page_[p] = system - ps.prev_;
system = ps.prev_;
}
+
+ if (extra_systems)
+ {
+ ret.systems_per_page_.back () += extra_systems;
+ ret.demerits_ += 200000;
+ }
+ if (extra_pages)
+ {
+ ret.force_.insert (ret.force_.end (), extra_pages, 200000);
+ ret.systems_per_page_.insert (ret.systems_per_page_.end (), extra_pages, 0);
+ ret.demerits_ += 200000;
+ }
+
+
ret.demerits_ += ret.penalty_;
return ret;
}