+void
+Paper_book::add_performance (SCM s)
+{
+ performances_ = scm_cons (s, performances_);
+}
+
+int
+Paper_book::output_aux (SCM output_channel,
+ bool is_last,
+ int *first_page_number,
+ int *first_performance_number)
+{
+ int page_nb = 0;
+ if (scm_is_pair (performances_))
+ {
+ SCM proc = ly_lily_module_constant ("write-performances-midis");
+
+ scm_call_3 (proc,
+ performances (),
+ output_channel,
+ scm_long2num (*first_performance_number));
+ *first_performance_number += scm_ilength (performances_);
+ }
+
+ if (scm_is_pair (bookparts_))
+ {
+ for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p))
+ if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p)))
+ {
+ bool is_last_part = (is_last && !scm_is_pair (scm_cdr (p)));
+ page_nb += pbookpart->output_aux (output_channel,
+ is_last_part,
+ first_page_number,
+ first_performance_number);
+ }
+ }
+ else
+ {
+ if (scores_ == SCM_EOL)
+ return 0;
+ paper_->set_variable (ly_symbol2scm ("first-page-number"),
+ scm_long2num (*first_page_number));
+ paper_->set_variable (ly_symbol2scm ("is-last-bookpart"),
+ ly_bool2scm (is_last));
+ /* Generate all stencils to trigger font loads. */
+ page_nb = scm_ilength (pages ());
+ *first_page_number += page_nb;
+ }
+ return page_nb;
+}
+
+void
+Paper_book::output (SCM output_channel)
+{
+ int first_page_number
+ = robust_scm2int (paper_->c_variable ("first-page-number"), 1);
+ int first_performance_number = 0;
+
+ /* FIXME: We need a line-width for ps output (framework-ps.scm:92).
+ If we don't have any, we take the paper-width unless we know
+ better which line-width to choose (e.g. if there are \bookparts
+ with different line-widths) and why we need it at all.
+ */
+
+ if (paper_->c_variable ("line-width") == SCM_UNDEFINED)
+ paper_->set_variable (ly_symbol2scm ("line-width"),
+ paper_->c_variable ("paper-width"));
+
+ if (!output_aux (output_channel,
+ true,
+ &first_page_number,
+ &first_performance_number))
+ return;