1 %%% titling.ily -- commands for defining titles
3 %%% Author: Nicolas Sceaux <nicolas.sceaux@free.fr>
7 %%% use-rehearsal-numbers
8 %%% If #t, add rehearsal numbers to piece titles.
13 %%% (add-page-break parser)
14 %%% add a page break at the current point.
16 %%% (add-no-page-break parser)
17 %%% forbid page break at current point.
19 %%% (add-toplevel-markup parser text)
20 %%% add a markup at current point.
22 %%% (add-toc-item parser markup-symbol text [rehearsal-number])
23 %%% add an item in the table of content, using markup style
24 %%% `markup-symbol' and `text', referencing the page occuring
25 %%% at current point. Argument `rehearsal-number' is optional
27 %%% (rehearsal-number)
28 %%% return a new x.y rehearsal number.
30 %%% (increase-rehearsal-major-number)
31 %%% increase the major part of rehearsal numbers (ie the x in x.y)
32 %%% and reset the minor part.
38 %%% Markup command to be used for act titles
41 %%% Markup command to be used for scene titles
44 %%% Markup command to be used for piece titles
46 %%% \scene-desription <markup>
47 %%% Markup command to be used for entering a scene description.
49 %%% Table of contexts \paper variables
50 %%% ==================================
53 %%% a string used as the table of contents title
56 %%% markup used for pieces
59 %%% markup used for scene titles
62 %%% markup used for act titles
68 %%% \pieceToc <title-markup>
69 %%% add a piece title in the table of contents.
71 %%% \pieceTocTitle <title-string>
72 %%% add the piece title in the table of contents and at current
73 %%% point of the book (upper cased).
75 %%% \pieceTitle <title-string>
76 %%% add the upper cased piece title at the current point of the book.
78 %%% \pieceTocAndTitle <toc-markup> <title-markup>
79 %%% add a piece title in the table of content, and a different
80 %%% title at the current point of the book.
84 %%% \opusTitle <title-string>
86 %%% \ouverture <title-string>
87 %%% \act <title-string>
88 %%% \scene <title-string>
89 %%% \sceneDescription <description-markup>
92 %%% Print an act end text.
96 \include "common/fancy-headers.ily"
97 \include "common/markup.ily"
100 %%% Utilities for adding (no-)page breaks and toplevel markups
103 #(define-public (add-page-break parser)
107 'line-break-permission 'force
108 'page-break-permission 'force)))
110 #(define-public (add-no-page-break parser)
114 'page-break-permission 'forbid)))
116 #(define-public (add-no-page-turn parser)
120 'page-turn-permission 'forbid)))
122 #(define-public (add-page-turn parser)
126 'line-break-permission 'force
127 'page-break-permission 'force
128 'page-turn-permission 'force)))
130 #(define-public (add-allow-page-turn parser)
134 'line-break-permission 'force
135 'page-turn-permission 'allow)))
137 #(define-public (add-toplevel-markup parser text)
138 (add-text parser text))
140 #(define-public (add-toc-item parser markup-symbol text . rest)
142 (apply add-toc-item! markup-symbol text rest)))
145 %%% Rehearsal numbers
148 #(define-public rehearsal-number #f)
149 #(define-public increase-rehearsal-major-number #f)
150 #(let ((major-number 0)
152 (set! increase-rehearsal-major-number
154 (set! major-number (1+ major-number))
155 (set! minor-number 0)))
156 (set! rehearsal-number
158 (set! minor-number (1+ minor-number))
159 (format #f "~a-~a" major-number minor-number))))
165 #(define-markup-command (lead-sheet layout props arg) (markup?)
166 (interpret-markup layout props
171 #(define-markup-command (rehearsal-number layout props text) (string?)
172 (interpret-markup layout props
173 (markup #:huge #:bold text)))
175 #(define-markup-command (rehearsal-number-toc layout props num text) (string? markup?)
176 #:properties ((rehearsal-number-gauge "8-88")
177 (rehearsal-number-align RIGHT)
179 (let* ((line-width (or line-width (ly:output-def-lookup layout 'line-width)))
180 (gauge-stencil (interpret-markup layout props rehearsal-number-gauge))
181 (x-ext (ly:stencil-extent gauge-stencil X))
182 (y-ext (ly:stencil-extent gauge-stencil Y))
183 (num-stencil (interpret-markup layout props num))
184 (gap (max 0 (- (interval-length x-ext)
185 (interval-length (ly:stencil-extent num-stencil X)))))
186 (gap-stencil1 (ly:make-stencil "" (cons 0 gap) '(0 . 0)))
187 (gap-stencil2 (ly:make-stencil "" (cons 0 1) '(0 . 0)))
188 (text-stencil (interpret-markup layout
189 (cons `((line-width . ,(- line-width 1 gap)))
192 (interpret-markup layout props
193 (if (= rehearsal-number-align LEFT)
194 (markup #:concat (; num padding space text
195 #:stencil num-stencil
196 #:stencil gap-stencil1
197 #:stencil gap-stencil2
198 #:stencil text-stencil))
199 (markup #:concat (; padding num space text
200 #:stencil gap-stencil1
201 #:stencil num-stencil
202 #:stencil gap-stencil2
203 #:stencil text-stencil))))))
205 #(define-markup-command (act layout props arg) (markup?)
206 (interpret-markup layout props
208 (markup #:pad-markup 2 #:fill-line (#:fontsize 6 arg))
209 (markup #:column (#:vspace 3
210 #:pad-markup 3 #:fill-line (#:fontsize 6 arg))))))
212 #(define-markup-command (scene layout props arg) (markup?)
213 (interpret-markup layout props
215 (markup #:pad-markup 0.5 #:fill-line (#:fontsize 4 arg))
216 (markup #:column (#:vspace 1
217 #:fill-line (#:fontsize 4 arg)
220 #(define-markup-command (scene-description layout props arg) (markup?)
221 (interpret-markup layout props
224 (markup #:column (#:fill-line (#:override '(line-width . 80)
228 #(define-markup-command (title layout props arg) (markup?)
229 (interpret-markup layout props
230 (markup #:fill-line (#:override '(line-width . 80)
233 #(define-markup-command (small-title layout props arg) (markup?)
234 (interpret-markup layout props
235 (markup #:fill-line (#:override '(line-width . 80)
236 #:fontsize 0 #:italic arg))))
239 %%% Table of contents
241 #(define-markup-command (paper-prop layout props name default)
243 "Get the value of a \\paper property, or defaults to some value"
244 (let ((val (ly:output-def-lookup layout name)))
245 (interpret-markup layout props (if (markup? val)
249 tocTitleMarkup = \markup \column {
251 \fontsize #6 \fill-line { \paper-prop #'tocTitle "TABLE OF CONTENTS" }
254 tocPieceMarkup = \markup \fill-line {
255 \line-width-ratio #(if (< (*staff-size*) 18) 0.7 0.8) \fill-line {
256 \line { \fromproperty #'toc:text }
257 \fromproperty #'toc:page
260 tocBoldPieceMarkup = \markup \fill-line {
261 \line-width-ratio #(if (< (*staff-size*) 18) 0.7 0.8) \fill-line {
262 \line { \bold \fromproperty #'toc:text }
263 \bold \fromproperty #'toc:page
266 tocSceneMarkup = \markup \italic \column {
267 \fill-line { \fromproperty #'toc:text }
269 tocActMarkup = \markup \large \italic \column {
271 \fontsize #2 \fill-line { \fromproperty #'toc:text }
281 #(define-music-function (parser location title) (markup?)
282 (add-toc-item parser 'tocPieceMarkup title)
283 (make-music 'Music 'void #t))
287 #(define-music-function (parser location title) (markup?)
288 (let ((rehearsal (rehearsal-number)))
289 (add-toc-item parser 'tocPieceMarkup title rehearsal)
290 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
291 (if (eqv? #t (ly:get-option 'urtext))
295 (markup #:rehearsal-number rehearsal))
296 (add-no-page-break parser))
300 (markup #:rehearsal-number rehearsal #:hspace 1 #:huge title))
301 (add-no-page-break parser))))
302 (make-music 'Music 'void #t)))
305 #(define-music-function (parser location condition title) (boolean? markup?)
307 (let ((rehearsal (rehearsal-number)))
308 (add-toc-item parser 'tocPieceMarkup title rehearsal)
309 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
310 (if (eqv? #t (ly:get-option 'urtext))
314 (markup #:rehearsal-number rehearsal))
315 (add-no-page-break parser))
319 (markup #:rehearsal-number rehearsal #:hspace 1 #:huge title))
320 (add-no-page-break parser))))))
321 (make-music 'Music 'void #t))
324 #(define-music-function (parser location number title) (string? markup?)
325 (add-toc-item parser 'tocPieceMarkup title number)
326 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
327 (if (eqv? #t (ly:get-option 'urtext))
329 (add-toplevel-markup parser
330 (markup #:rehearsal-number number))
331 (add-no-page-break parser))
333 (add-toplevel-markup parser
334 (markup #:rehearsal-number number
337 (add-no-page-break parser))))
338 (make-music 'Music 'void #t))
341 #(define-music-function (parser location number title toc-title)
342 (markup? markup? markup?)
343 (add-toc-item parser 'tocPieceMarkup toc-title number)
344 (add-toplevel-markup parser
345 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
346 (markup #:rehearsal-number number
349 (markup #:title title)))
350 (add-no-page-break parser)
351 (make-music 'Music 'void #t))
353 pieceTocAndTitleNbCond =
354 #(define-music-function (parser location condition number title toc-title)
355 (boolean? markup? markup? markup?)
358 (add-toc-item parser 'tocPieceMarkup toc-title number)
361 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
362 (markup #:rehearsal-number number
365 (markup #:title title)))
366 (add-no-page-break parser)))
367 (make-music 'Music 'void #t))
370 #(define-music-function (parser location title) (markup?)
371 (let ((rehearsal (rehearsal-number)))
372 (add-toc-item! 'tocPieceMarkup title rehearsal)))
375 #(define-music-function (parser location title) (string?)
376 (let ((rehearsal (rehearsal-number)))
377 (add-toc-item parser 'tocPieceMarkup title rehearsal)
378 (add-toplevel-markup parser
379 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
380 (markup #:rehearsal-number rehearsal
383 (markup #:title (string-upper-case title))))
384 (add-no-page-break parser)
385 (make-music 'Music 'void #t)))
388 #(define-music-function (parser location condition title) (boolean? string?)
390 (let ((rehearsal (rehearsal-number)))
391 (add-toc-item parser 'tocPieceMarkup title rehearsal)
394 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
395 (markup #:rehearsal-number rehearsal
397 #:huge (string-upper-case title))
398 (markup #:title (string-upper-case title))))
399 (add-no-page-break parser)))
400 (make-music 'Music 'void #t))
403 #(define-music-function (parser location number title) (string? markup?)
404 (add-toc-item parser 'tocPieceMarkup title number)
405 (add-toplevel-markup parser
406 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
407 (markup #:rehearsal-number number
410 (markup #:title (if (string? title)
411 (string-upper-case title)
413 (add-no-page-break parser)
414 (make-music 'Music 'void #t))
417 #(define-music-function (parser location title) (string?)
418 (let ((rehearsal (rehearsal-number)))
419 (add-toplevel-markup parser
420 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
421 (markup #:rehearsal-number rehearsal
423 #:huge (string-upper-case title))
424 (markup #:title (string-upper-case title))))
425 (add-no-page-break parser)
426 (make-music 'Music 'void #t)))
429 #(define-music-function (parser location title) (string?)
430 (add-toplevel-markup parser
431 (markup #:title (string-upper-case title)))
432 (add-no-page-break parser)
433 (make-music 'Music 'void #t))
436 #(define-music-function (parser location title) (markup?)
437 (let ((rehearsal (rehearsal-number)))
438 (add-toplevel-markup parser
439 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
440 (markup #:rehearsal-number rehearsal
443 (markup #:small-title title)))
444 (add-no-page-break parser)
445 (make-music 'Music 'void #t)))
448 #(define-music-function (parser location title toc-title) (markup? markup?)
449 (let ((rehearsal (rehearsal-number)))
450 (add-toc-item parser 'tocPieceMarkup toc-title rehearsal)
451 (add-toplevel-markup parser
452 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
453 (markup #:rehearsal-number rehearsal
456 (markup #:title title)))
457 (add-no-page-break parser)
458 (make-music 'Music 'void #t)))
461 #(define-music-function (parser location) ()
462 (let ((rehearsal (rehearsal-number)))
463 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
465 (add-toplevel-markup parser (markup #:rehearsal-number rehearsal))
466 (add-no-page-break parser)))
467 (make-music 'Music 'void #t)))
470 #(use-modules (srfi srfi-39))
471 #(define-public *opus-title* (make-parameter ""))
472 #(define-public *act-title* (make-parameter ""))
476 #(define-music-function (parser location title) (markup?)
477 (add-page-break parser)
478 (add-toc-item parser 'tocPieceMarkup title)
479 (add-even-page-header-text parser (string-upper-case (*opus-title*)) #f)
481 (add-odd-page-header-text
483 (format #f "~a" (string-upper-case (*act-title*)))
485 (make-music 'Music 'void #t))
488 #(define-music-function (parser location title) (string?)
489 (*opus-title* (if (*part*)
490 (string-append title ", " (*part-name*))
492 (make-music 'Music 'void #t))
495 #(define-music-function (parser location title) (string?)
496 (let ((rehearsal (rehearsal-number)))
497 ;(add-page-break parser)
498 (add-toc-item parser 'tocPieceMarkup title rehearsal)
499 (add-even-page-header-text parser (string-upper-case (*opus-title*)) #f)
500 (add-odd-page-header-text parser (string-upper-case title) #f)
501 (add-toplevel-markup parser (markup #:act (string-upper-case title)))
502 (add-no-page-break parser)
503 (if (eqv? #t (ly:get-option 'use-rehearsal-numbers))
505 (add-toplevel-markup parser (markup #:rehearsal-number rehearsal))
506 (add-no-page-break parser))))
507 (make-music 'Music 'void #t))
510 #(define-music-function (parser location act-title) (string?)
511 (increase-rehearsal-major-number)
512 ;(add-page-break parser)
513 (add-toc-item parser 'tocActMarkup act-title)
514 (add-even-page-header-text parser (string-upper-case (*opus-title*)) #f)
515 (*act-title* act-title)
516 (add-odd-page-header-text
518 (format #f "~a" (string-upper-case (*act-title*)))
520 (add-toplevel-markup parser
521 (markup #:act (string-upper-case act-title)))
522 (add-no-page-break parser)
523 (make-music 'Music 'void #t))
526 #(define-music-function (parser location act-title) (string?)
527 (increase-rehearsal-major-number)
528 (add-toc-item parser 'tocActMarkup act-title)
529 (add-even-page-header-text parser (string-upper-case (*opus-title*)) #f)
530 (*act-title* act-title)
531 (add-odd-page-header-text
533 (format #f "~a" (string-upper-case (*act-title*)))
535 (make-music 'Music 'void #t))
538 #(define-music-function (parser location act-title) (string?)
539 ;(add-page-break parser)
540 (add-toc-item parser 'tocActMarkup act-title)
541 (add-even-page-header-text parser (string-upper-case (*opus-title*)) #f)
542 (*act-title* act-title)
543 (add-odd-page-header-text
545 (format #f "~a" (string-upper-case (*act-title*)))
547 (add-toplevel-markup parser
548 (markup #:act (string-upper-case act-title)))
549 (add-no-page-break parser)
550 (make-music 'Music 'void #t))
553 #(define-music-function (parser location title) (string?)
554 (add-toc-item parser 'tocActMarkup title)
555 (add-even-page-header-text parser (string-upper-case (*opus-title*)) #f)
557 (add-odd-page-header-text
559 (format #f "~a" (string-upper-case (*act-title*)))
561 (make-music 'Music 'void #t))
564 #(define-music-function (parser location text) (markup?)
565 (add-no-page-break parser)
566 (add-toplevel-markup parser (markup #:fontsize 4 #:fill-line (text)))
567 (add-no-page-break parser)
568 (add-toplevel-markup parser (markup #:null))
569 (make-music 'Music 'void #t))
572 #(define-music-function (parser location title toc-title) (string? markup?)
573 (add-toc-item parser 'tocSceneMarkup (if (and (string? toc-title)
574 (string-null? toc-title))
575 (string-upper-case title)
577 (add-odd-page-header-text
580 (string-upper-case (*act-title*))
581 (string-upper-case title))
583 (add-toplevel-markup parser
584 (markup #:scene (string-upper-case title)))
585 (add-no-page-break parser)
586 (make-music 'Music 'void #t))
589 #(define-music-function (parser location title toc-title) (string? markup?)
590 (add-toc-item parser 'tocSceneMarkup (if (and (string? toc-title)
591 (string-null? toc-title))
592 (string-upper-case title)
594 (add-odd-page-header-text
597 (string-upper-case (*act-title*))
598 (string-upper-case title))
600 (make-music 'Music 'void #t))
603 #(define-music-function (parser location title toc-title) (string? markup?)
604 (add-toc-item parser 'tocSceneMarkup toc-title)
605 (let ((label-music (make-music 'SimultaneousMusic
606 'elements (list (in-music-add-odd-page-header-text
608 (string-upper-case (*act-title*))
609 (string-upper-case title))
612 \once \override Score . RehearsalMark #'font-size = #0
613 \once \override Score . RehearsalMark #'self-alignment-X = #LEFT
614 \mark \markup \fontsize #4 $(string-upper-case title) #}))
616 inMusicSceneDescCond =
617 #(define-music-function (parser location cond title toc-title description)
618 (boolean? string? markup? markup?)
621 (add-toc-item parser 'tocSceneMarkup toc-title)
625 'elements (list (in-music-add-odd-page-header-text
627 (string-upper-case (*act-title*))
628 (string-upper-case title))
630 (description-markup (if (*part*)
632 (markup #:fontsize 2 description))))
634 \once \override Score . RehearsalMark #'font-size = #0
635 \once \override Score . RehearsalMark #'self-alignment-X = #LEFT
636 \mark \markup \left-align \center-column {
637 \fontsize #4 $(string-upper-case title)
641 (make-music 'Music 'void #t)))
644 #(define-music-function (parser location title description) (string? markup?)
645 (let ((label-music (make-music 'SimultaneousMusic
646 'elements (list (in-music-add-odd-page-header-text
648 (string-upper-case (*act-title*))
649 (string-upper-case title))
651 (add-toc-item! 'tocSceneMarkup title ""))))
652 (description-markup (if (*part*)
654 (markup #:fontsize 2 description))))
656 \once \override Score . RehearsalMark #'font-size = #0
657 \once \override Score . RehearsalMark #'self-alignment-X = #LEFT
658 \mark \markup \left-align \center-column {
659 \fontsize #4 $(string-upper-case title)
665 #(define-music-function (parser location description) (markup?)
668 (add-toplevel-markup parser
669 (markup #:scene-description description))
670 (add-no-page-break parser)))
671 (make-music 'Music 'void #t))
673 sceneDescriptionBottom =
674 #(define-music-function (parser location description) (markup?)
675 (add-toplevel-markup parser
676 (markup #:scene-description description))
677 (add-allow-page-turn parser)
678 (make-music 'Music 'void #t))
680 %%% Conditionnal page breaks
682 #(define-music-function (parser location parts) (list?)
683 (if (memq (*part*) parts)
684 (add-page-break parser))
685 (make-music 'Music 'void #t))
688 #(define-music-function (parser location parts) (list?)
689 (if (memq (*part*) parts)
690 (add-no-page-break parser))
691 (make-music 'Music 'void #t))
694 #(define-music-function (parser location parts) (list?)
695 (if (memq (*part*) parts)
697 (add-page-break parser)
698 (add-toplevel-markup parser (markup #:null))
699 (add-page-break parser)))
700 (make-music 'Music 'void #t))
703 #(define-music-function (parser location parts) (list?)
704 (if (or (and (symbol? (*part*)) (null? parts))
705 (memq (*part*) parts))
706 (add-no-page-turn parser))
707 (make-music 'Music 'void #t))
710 #(define-music-function (parser location parts) (list?)
711 (if (memq (*part*) parts)
712 (add-page-turn parser))
713 (make-music 'Music 'void #t))
717 #(define-music-function (parser location condition markp) (boolean? markup?)
719 (add-toplevel-markup parser markp))
720 (make-music 'Music 'void #t))