+ vector<Beam_stem_segment> segs = (*i).second;
+ vector_sort (segs, less<Beam_stem_segment> ());
+
+ Beam_segment current;
+
+ int vertical_count = (*i).first;
+ for (vsize j = 0; j < segs.size (); j++)
+ {
+ /*
+ event_dir == LEFT: left edge of a beamsegment.
+ */
+ Direction event_dir = LEFT;
+ do
+ {
+ bool on_bound = (event_dir == LEFT) ? j == 0 :
+ j == segs.size() - 1;
+
+ bool inside_stem = (event_dir == LEFT)
+ ? segs[j].stem_index_ > 0
+ : segs[j].stem_index_ < stems.size () - 1;
+
+ bool event = on_bound
+ || abs (segs[j].rank_ - segs[j+event_dir].rank_) > 1
+ || (abs (vertical_count) >= segs[j].max_connect_
+ || abs (vertical_count) >= segs[j + event_dir].max_connect_);
+
+ if (!event)
+ continue;
+
+ current.vertical_count_ = vertical_count;
+ current.horizontal_[event_dir] = segs[j].stem_x_;
+ if (segs[j].dir_ == event_dir)
+ {
+ if (on_bound
+ && me->get_bound (event_dir)->break_status_dir ())
+ {
+ current.horizontal_[event_dir]
+ = (me->get_bound (event_dir)->extent (commonx, X_AXIS)[RIGHT]
+ + event_dir * break_overshoot[event_dir]);
+ }
+ else
+ {
+ Real notehead_width =
+ Stem::duration_log (segs[j].stem_) == 1
+ ? 1.98
+ : 1.32; // URG.
+
+
+ if (inside_stem)
+ {
+ Grob *neighbor_stem = stems[segs[j].stem_index_ + event_dir];
+ Real neighbor_stem_x = neighbor_stem->relative_coordinate (commonx, X_AXIS);
+
+ notehead_width = min (notehead_width,
+ fabs (neighbor_stem_x - segs[j].stem_x_)/2);
+ }
+ current.horizontal_[event_dir] += event_dir * notehead_width;
+ }
+ }
+ else
+ {
+ current.horizontal_[event_dir] += event_dir * segs[j].width_/2;
+ if (segs[j].gapped_)
+ current.horizontal_[event_dir] -= event_dir * gap_length;
+ }
+
+ if (event_dir == RIGHT)
+ {
+ segments.push_back (current);
+ current = Beam_segment();
+ }
+ }
+ while (flip (&event_dir) != LEFT);
+ }
+
+ }
+
+ return segments;
+}
+
+MAKE_SCHEME_CALLBACK(Beam, print, 1);
+SCM
+Beam::print (SCM grob)
+{
+ Spanner *me = unsmob_spanner (grob);
+ Grob *commonx = 0;
+ vector<Beam_segment> segments = get_beam_segments (me, &commonx);
+
+ Interval span;
+ if (normal_stem_count (me))
+ {
+ span[LEFT] = first_normal_stem (me)->relative_coordinate (commonx, X_AXIS);
+ span[RIGHT] = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS);