+ Real cycle = max_pos - min_pos;
+
+ Interval ledger_fill;
+ ledger_fill.add_point (nearest_line + 0.5 * dir);
+ ledger_fill.add_point (pos + 0.5 * dir + ledger_extra * dir);
+
+ // fill the Interval ledger_fill with ledger lines
+ int n = (int) floor ((ledger_fill[DOWN] - min_pos) / cycle);
+ Real current;
+ SCM s = scm_cdr (ledger_positions);
+ if (!scm_is_pair (s) || cycle < 0.1)
+ return values;
+ do
+ {
+ s2 = scm_car (s);
+ if (scm_is_number (s2))
+ {
+ current = scm_to_double (s2) + n * cycle;
+ if (ledger_fill.contains (current))
+ values.push_back (current);
+ }
+ else
+ // grouped ledger lines, either add all or none
+ {
+ do
+ {
+ current = scm_to_double (scm_car (s2)) + n * cycle;
+ if (ledger_fill.contains (current))
+ {
+ s2 = scm_car (s);
+ do
+ {
+ current = scm_to_double (scm_car (s2)) + n * cycle;
+ values.push_back (current);
+ s2 = scm_cdr (s2);
+ }
+ while (scm_is_pair (s2));
+ }
+ else
+ s2 = scm_cdr (s2);
+ }
+ while (scm_is_pair (s2));
+ }
+ s = scm_cdr (s);
+ if (!scm_is_pair (s))
+ {
+ s = scm_cdr (ledger_positions);
+ n++;
+ }
+ }
+ while (current <= ledger_fill[UP]);
+ }
+ else
+ // normal ledger lines
+ {
+ int ledger_count = (int) floor ((abs (nearest_line - pos) + ledger_extra) / 2);
+ values.resize (ledger_count);
+ for (int i = 0; i < ledger_count; i++)
+ {
+ values[i] = nearest_line + dir * (ledger_count - i) * 2;
+ }
+ }
+ return values;