- {
- SCM between = loose->get_object ("between-cols");
- if (!scm_is_pair (between))
- break;
-
- Item *le = dynamic_cast<Item *> (unsmob_grob (scm_car (between)));
- Item *re = dynamic_cast<Item *> (unsmob_grob (scm_cdr (between)));
-
- if (! (le && re))
- break;
-
- if (!left && le)
- {
- left = le->get_column ();
- if (!left->get_system ())
- left = left->find_prebroken_piece (RIGHT);
-
- clique.push_back (left);
- }
-
- clique.push_back (loose);
-
- divide_over++;
- loose = right = re->get_column ();
- }
-
- if (!right->get_system ())
- right = right->find_prebroken_piece (LEFT);
+ {
+ SCM between = loose->get_object ("between-cols");
+ if (!scm_is_pair (between))
+ break;
+
+ /* If the line was broken at one of the loose columns, split
+ the clique at that column. */
+ if (!loose->get_system ())
+ break;
+
+ Paper_column *le = dynamic_cast<Paper_column *> (unsmob_grob (scm_car (between)));
+ Paper_column *re = dynamic_cast<Paper_column *> (unsmob_grob (scm_cdr (between)));
+
+ if (! (le && re))
+ break;
+
+ if (!left && le)
+ {
+ left = le->get_column ();
+ if (!left->get_system ())
+ left = left->find_prebroken_piece (RIGHT);
+
+ clique.push_back (left);
+ }
+
+ clique.push_back (loose);
+
+ divide_over++;
+ loose = right = re->get_column ();
+ }
+
+ if (!right)
+ {
+ programming_error ("Can't attach loose column sensibly. Attaching to end of system.");
+ right = which->get_bound (RIGHT);
+ }
+
+ if (right->get_system ())
+ ; /* do nothing */
+ else if (right->find_prebroken_piece (LEFT)
+ && right->find_prebroken_piece (LEFT)->get_system () == which)
+ right = right->find_prebroken_piece (LEFT);
+ else if (Paper_column::get_rank (which->get_bound (RIGHT)) < Paper_column::get_rank (right))
+ right = which->get_bound (RIGHT);
+ else
+ {
+ clique.back ()->programming_error ("Loose column does not have right side to attach to.");
+ System *base_system = dynamic_cast<System *> (which->original ());
+ int j = Paper_column::get_rank (clique.back ()) + 1;
+ int end_rank = Paper_column::get_rank (which->get_bound (RIGHT));
+ extract_grob_set (base_system, "columns", base_cols);
+ for (; j < end_rank; j++)
+ {
+ if (base_cols[j]->get_system () == which)
+ right = dynamic_cast<Item *> ((Grob *)base_cols[j]);
+ }
+ }