-\version "2.12.0"
+\version "2.13.54"
\header {
+ tagline = ##f
texidoc = "Text that can spread over pages is entered with the
-@code{\\markuplines} command."
+@code{\\markuplines} command. Widowed and orphaned lines are avoided
+at the begininng and end of a @code{\\markuplines} containing more
+than one line."
}
-#(set-default-paper-size "a6")
+#(set-default-paper-size "a7")
#(define-markup-list-command (paragraph layout props args) (markup-list?)
(interpret-markup-list layout props
(make-justified-lines-markup-list (cons (make-hspace-markup 2) args))))
-
-%% Candide, Voltaire
-\markuplines \override-lines #'(baseline-skip . 2.5) {
- \paragraph {
- Il y avait en Westphalie, dans le château de M. le baron de
- Thunder-ten-tronckh, un jeune garçon à qui la nature avait donné
- les mœurs les plus douces. Sa physionomie annonçait son âme.
- Il avait le jugement assez droit, avec l'esprit le plus simple ;
- c'est, je crois, pour cette raison qu'on le nommait Candide. Les
- anciens domestiques de la maison soupçonnaient qu'il était fils
- de la sœur de monsieur le baron et d'un bon et honnête
- gentilhomme du voisinage, que cette demoiselle ne voulut jamais
- épouser parce qu'il n'avait pu prouver que soixante et onze
- quartiers, et que le reste de son arbre généalogique avait été
- perdu par l'injure du temps.
+\book {
+ \markuplines {} % Empty list is handled gracefully
+ %% Candide, Voltaire
+ \markuplines \override-lines #'(baseline-skip . 3.0) {
+ \paragraph { % The final two lines are placed on page 2.
+ Il y avait en Westphalie, dans le château de M. le baron de
+ Thunder-ten-tronckh, un jeune garçon à qui la nature avait donné
+ les mœurs les plus douces. Sa physionomie annonçait son âme.
+ Il avait le jugement assez droit, avec l'esprit le plus simple ;
+ c'est, je crois, pour cette raison qu'on le nommait Candide. Les
+ anciens domestiques de la maison soupçonnaient qu'il était fils
+ de la sœur de monsieur le baron et d'un bon et honnête
+ gentilhomme du voisinage, que cette demoiselle ne voulut jamais
+ épouser parce qu'il n'avait pu prouver que soixante et onze
+ quartiers, et que le reste de son arbre généalogique avait été
+ perdu par l'injure du temps. (not orphaned)
+ }
+ }
+ \markuplines \override-lines #'(baseline-skip . 3.9) {
+ \paragraph {
+ Monsieur le baron était un des plus puissants seigneurs de la
+ Westphalie, car son château avait une porte et des fenêtres. Sa
+ grande salle même était ornée d'une tapisserie. Tous les chiens
+ de ses basses-cours composaient une meute dans le besoin ; ses
+ palefreniers étaient ses piqueurs; le vicaire du village était
+ son grand-aumônier. Ils l'appelaient tous monseigneur, et ils
+ riaient quand il faisait des contes.
+ }
}
- \paragraph {
- Monsieur le baron était un des plus puissants seigneurs de la
- Westphalie, car son château avait une porte et des fenêtres. Sa
- grande salle même était ornée d'une tapisserie. Tous les chiens
- de ses basses-cours composaient une meute dans le besoin ; ses
- palefreniers étaient ses piqueurs; le vicaire du village était
- son grand-aumônier. Ils l'appelaient tous monseigneur, et ils
- riaient quand il faisait des contes.
+ \markuplines {
+ \paragraph { % A single-line paragraph may be orphaned
+ Madame la ... (may be orphaned)
+ }
}
}
paper_->self_scm (),
page_properties,
scm_car (s));
- Prob *ps;
- SCM list;
- for (list = texts ; scm_is_pair (list) ; list = scm_cdr (list))
+ Prob *first = 0;
+ Prob *last = 0;
+ for (SCM list = texts; scm_is_pair (list); list = scm_cdr (list))
{
SCM t = scm_car (list);
// TODO: init props
- ps = make_paper_system (SCM_EOL);
+ Prob *ps = make_paper_system (SCM_EOL);
ps->set_property ("page-break-permission",
ly_symbol2scm ("allow"));
ps->set_property ("page-turn-permission",
ly_symbol2scm ("allow"));
ps->set_property ("last-markup-line", SCM_BOOL_F);
- ps->set_property ("first-markup-line",
- list == texts? SCM_BOOL_T : SCM_BOOL_F);
+ ps->set_property ("first-markup-line", SCM_BOOL_F);
paper_system_set_stencil (ps, *unsmob_stencil (t));
SCM footnotes = get_footnotes (unsmob_stencil (t)->expr ());
ps->set_property ("footnotes", footnotes);
ps->set_property ("is-title", SCM_BOOL_T);
- if (list != texts)
- /* For each markup other than the first, place it as closely as
- possible to the previous markup and don't allow stretching. */
- ps->set_property ("tight-spacing", SCM_BOOL_T);
-
+ if (list == texts)
+ first = ps;
+ else
+ {
+ // last line so far, in a multi-line paragraph
+ last = ps;
+ //Place closely to previous line, no stretching.
+ ps->set_property ("tight-spacing", SCM_BOOL_T);
+ }
system_specs = scm_cons (ps->self_scm (), system_specs);
ps->unprotect ();
// FIXME: figure out penalty.
//set_system_penalty (ps, scores_[i].header_);
}
- // We may want to place a check here, for whether the line is too short
- if (list == texts)
- {
- // if there is only one line in the paragraph,
- // do not try to avoid orphans
- ps->set_property ("last-markup-line", SCM_BOOL_F);
- ps->set_property ("first-markup-line", SCM_BOOL_F);
- }
- else
- {
- ps->set_property ("last-markup-line", SCM_BOOL_T);
+ /* Set properties to avoid widowed/orphaned lines.
+ Single-line markup_lists are excluded, but in future
+ we may want to add the case of a very short, single line. */
+ if (first && last)
+ {
+ last->set_property ("last-markup-line", SCM_BOOL_T);
+ first->set_property ("first-markup-line", SCM_BOOL_T);
}
}
else