Hallo kae,
\parenthesize ist öfter mal ein Problem. Wenn Du
hier hinschaust siehst Du die derzeit offenen issues zum Thema.
Hintergrund.
Es gibt zwei verschieden gelagerte, aber gleichnamige Definitionen für \parenthesize.
Die eine ist ein markup-command bei dem { ... } funktionieren kann.
Z.B.
\markup \parenthesize \line { Alles wird eingeklammert }
Aber nur weil ich \line benutzt und damit aus der markup-list ein einzelnes markup gemacht habe, welches von \parenthesize dann eingeklammert wird. (Ansonsten würde jedes Wort einzeln eingeklammert werden.)
Die andere ist eine Musikfunktion. Sie ist ihrem Typ nach einem \tweak sehr ähnlich. (Und tweaks wirken per se nur einmal). Wenn dieses \parenthesize vor einem Object steht so wird dieses eingeklammert und nur dieses. \parenthesize kann aber auch benutzt werden um Artikulationen, Fingersätze etc einzuklammern. Dann muß man -\parenthesize schreiben.
Z.B.
{ \parenthesize c''-1-| } für den Notenkopf
{ c''-\parenthesize -1-| } für den Fingersatz
{ c''-1-\parenthesize-| } für die Artikulation
Grundsätzlich haben beide Definitionen also die Eigenschaft nur für jeweils ein Objekt zu wirken.
Nun kann man mit verschieden Methoden zwar nur eine Klammer aufrufen, Du wirst Dich aber damit abfinden müsse, daß zwei Befehlsaufrufe nötig werden.
So wird es ja auch in dem snippet zu dem ding-dong verlinkt hat gemacht (obwohl ich denke, daß der Ansatz aus diesem snippet hier nicht zielführend sein wird, da das BreathingSign überschrieben wird und das finde ich in ChordNames fehl am Platze).
In den
Regressiontests ist noch ein anderes Beispiel bei dem der 'stencil verändert wird. Suche nach `stencil-hacking.ly'.
Ich habe zwei Lösngsmöglichkeiten für Dich.
Die erste und auch am einfachsten zu verstehende ist ein 'stencil-override mit einfachem Text. Das führt zu:
pl =
\once \override ChordName #'stencil =
#(lambda (grob)
(let* ((stil (ly:text-interface::print grob))
(par-left-stil (grob-interpret-markup grob (markup #:concat ("(" #:stencil stil))))
)
par-left-stil))
pr =
\once \override ChordName #'stencil =
#(lambda (grob)
(let* ((stil (ly:text-interface::print grob))
(par-left-stil (grob-interpret-markup grob (markup #:concat (#:stencil stil ")" ))))
)
par-left-stil))
\new ChordNames
\chordmode {
\pl f1:maj7 f:7 \pr g
}Nachteil: die Größe der Klammer ist nicht einstellbar.
Vorteil: Sehr simpel. Und die Klammer ist an der baseline ausgerichtet.
Zweite Möglichkeit:
Ich habe die relevanten Definitionen für das ParenthesesItem aus /scm/output-lib.scm ins file kopiert und verändert.
Das führt zu:
#(define (parenthesize-some-elements dir grob . rest)
(let* ((refp (if (null? rest)
grob
(car rest)))
(elts (ly:grob-object grob 'elements))
(x-ext (ly:relative-group-extent elts refp X))
(stencils (ly:grob-property grob 'stencils))
(lp (if (eq? dir -1) (car stencils) point-stencil))
(rp (if (eq? dir 1) (cadr stencils) point-stencil))
(padding (ly:grob-property grob 'padding 0.1)))
(ly:stencil-add
(ly:stencil-translate-axis lp (- (car x-ext) padding) X)
(ly:stencil-translate-axis rp (+ (cdr x-ext) padding) X))))
#(define-public ((parentheses-items::print dir) me)
(let* ((elts (ly:grob-object me 'elements))
(y-ref (ly:grob-common-refpoint-of-array me elts Y))
(x-ref (ly:grob-common-refpoint-of-array me elts X))
(stencil (parenthesize-some-elements dir me x-ref))
(elt-y-ext (ly:relative-group-extent elts y-ref Y))
(y-center (interval-center elt-y-ext)))
(ly:stencil-translate
stencil
(cons
(- (ly:grob-relative-coordinate me x-ref X))
(- y-center (ly:grob-relative-coordinate me y-ref Y))))))
parLeft =
#(define-music-function (parser location mus)(ly:music?)
#{
\once\override Score.ParenthesesItem #'stencil = #(parentheses-items::print LEFT)
\once\override Score.ParenthesesItem #'font-size = #0
\parenthesize $mus
#})
parRight =
#(define-music-function (parser location mus)(ly:music?)
#{
\once\override Score.ParenthesesItem #'stencil = #(parentheses-items::print RIGHT)
\once\override Score.ParenthesesItem #'font-size = #0
\parenthesize $mus
#})
\score {
\new ChordNames {
\chordmode {
\parLeft f1:maj7 f:7 \parRight bes:7 \parLeft f \parRight e
}
}
}
Vorteil: Man hat alle Einstellmöglichkeiten, die für das ParenthesesItem vorgesehen sind.
Nachteil: Das ParenthesesItem ist ausgerichtet auf das Zentrum der Y-Länge des Objektes und die ist bei F-Dur nun mal eine ander als bei Fmaj7. Und so ist die baseline nicht gewahrt.
Beide Vorschläge funktionieren mit 2.14.2 und auch mit den neueren devel-Versionen.
HTH,
Harm