+ if (!line_starter && to_boolean (col->get_property ("keep-inside-line")))
+ description.keep_inside_line_ = col->extent (col, X_AXIS);
+
+ description.break_permission_ = col->get_property ("line-break-permission");
+ return description;
+}
+
+vector<Real>
+get_line_forces (vector<Grob*> const &columns,
+ Real line_len, Real indent, bool ragged)
+{
+ vector<vsize> breaks;
+ vector<Real> force;
+ vector<Grob*> non_loose;
+ vector<Column_description> cols;
+ SCM force_break = ly_symbol2scm ("force");
+
+ for (vsize i = 0; i < columns.size (); i++)
+ if (!is_loose (columns[i]) || Paper_column::is_breakable (columns[i]))
+ non_loose.push_back (columns[i]);
+
+ breaks.clear ();
+ breaks.push_back (0);
+ cols.push_back (Column_description ());
+ for (vsize i = 1; i + 1 < non_loose.size (); i++)
+ {
+ if (Paper_column::is_breakable (non_loose[i]))
+ breaks.push_back (cols.size ());
+
+ cols.push_back (get_column_description (non_loose, i, false));
+ }
+ breaks.push_back (cols.size ());
+ force.resize (breaks.size () * breaks.size (), infinity_f);
+
+ for (vsize b = 0; b + 1 < breaks.size (); b++)