Hallo infranator,
schau mal, ob Du mit dem folgenden klar kommst. Kommentare im Code:
\version "2.18.0"
#(define*
((format-mark-barnumbers-plus-text reverse? #:optional (text #f)) mark context)
;; Formats @code{RehearsalMark}
;; Printing the @code{BarNumber} bold in a box, the optional @var{text} is
;; printed left or right of the @code{BarNumber}, depending on @var{reverse?}
(let* ((bar-number-markup
(make-box-markup
(make-bold-markup
(number->string
(ly:context-property context 'currentBarNumber)))))
(text-markup (if text text ""))
(mrkp-ls (list bar-number-markup text-markup)))
(make-line-markup (if reverse? (reverse mrkp-ls) mrkp-ls))))
barnumberRehearsalMarkPlusText =
#(define-music-function (parser location reverse? mrkp)((boolean? #f) markup?)
"
Sets the @code{markFormatter} to
@proc{(format-mark-barnumbers-plus-text reverse? mrkp)} and centers the
@code{BarNumber}-part of the @code{RehearsalMark} on the @code{BarLine}.
@var{reverse?} determines if @var{mrkp} is printed to the left or to the right.
Uugh, for unknown reasons @code{reverse?} must be explicitely stated, if
@var{mrkp} is not a simple string, but a markup, although it is made optional.
"
(define (center-rehearsal-mark-at-barnumber reverse? mrkp)
;; Sets @code{'self-alignment-X}
;; The @code{RehearsalMark} is printed with the @code{BarNumber} centered on
;; the @code{BarLine}.
;; @code{reverse?} determines if the @code{BarNumber} is supposed to be on
;; the left or right side in the @code{RehearsalMark}
(lambda (grob)
(let* ((txt-stil (grob-interpret-markup grob mrkp))
(txt-length (interval-length (ly:stencil-extent txt-stil X)))
(stil (ly:grob-property grob 'stencil))
(stil-length (interval-length (ly:stencil-extent stil X)))
(layout (ly:grob-layout grob))
(props
(ly:grob-alist-chain
grob
(ly:output-def-lookup layout 'text-font-defaults)))
(word-space
(if (= 0 txt-length)
0
(ly:chain-assoc-get 'word-space props)))
(break-dir (ly:item-break-dir grob)))
(ly:grob-set-property! grob 'self-alignment-X
(if (or reverse? (= break-dir -1))
(/ (+ txt-length word-space) stil-length)
(/ (+ txt-length word-space) (- stil-length)))))))
#{
\once \set Score.markFormatter =
#(format-mark-barnumbers-plus-text reverse? mrkp)
\once \override Score.RehearsalMark.before-line-breaking =
#(center-rehearsal-mark-at-barnumber reverse? mrkp)
#})
%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%
%% Print bold, boxed BarNumbers as RehearsalMark as default
\layout {
\set Score.markFormatter = #format-mark-box-barnumbers
indent = 0
}
\relative c' {
c1
\barnumberRehearsalMarkPlusText "Text"
\mark\default
d
\mark\default
e
\barnumberRehearsalMarkPlusText "mehr Text"
\mark\default
f
fis
%% If a line-break and the ReheasalMark at end-of-line is wanted, ##t should
%% be used.
%% Always needed to specify, if the additional text uses \markup
g
\break
\once \override Score.RehearsalMark.break-visibility = ##(#t #f #f)
\barnumberRehearsalMarkPlusText ##t
\markup \with-color #red "\"Zeilenumbruch\""
\mark\default
a
\barnumberRehearsalMarkPlusText ##t
\markup
\fontsize #-3
\override #'(baseline-skip . 2)
\dir-column {
"links der BarNumber"
"in einer column"
\fontsize #-4 \scale #'(2 . 1) \italic "irgendein Text"
}
\mark\default
b
\barnumberRehearsalMarkPlusText ##f
\markup
\fontsize #-3
\override #'(baseline-skip . 2)
\dir-column {
"rechts der BarNumber"
"in einer column"
\fontsize #-4 \scale #'(2 . 1) \italic "irgendein Text"
}
\mark\default
c
\bar "|."
}
HTH,
Harm