Hallo zusammen,
Problem:
Ich würde gerne eine Klammer und eine Linie als markup so darstellen, daß beide dieselbe Länge haben und den selben Eingabewert für die Bestimmung der Länge benutzen. Das Ganze soll auch mit unterschiedlichen staff-sizes bzw global-staff-sizes funktionieren.
Die Klammer ist als \markup \left-brace #... erhältlich.
Die Linie natürlich als \markup \draw-line #...
Allerdings benutzt \left-brace pt als Einheit und gibt somit eine absolute Größe zurück, während \draw-line staff-spaces als Einheit benutzt und also relative ist.
Ich muß also einige Berechnungen durchführen damit das klappt. Dazu brauche ich die Einheiten pt und staff-height.
Diese scheinen jedoch nur in \paper erhältlich zu sein.
Folgender Code funktioniert auch
\paper {
#(display "\n\t\tpt\t\t ")
#(write pt)
#(display "\n\t\tstaff-height\t ")
#(write staff-height)
}allerdings nur, solange man sich innerhalb von \paper bewegt.
Sobald man außerhalb von \paper auf top-level #(write pt) versucht gibts einen error wegen "Unbound variable: pt"
Ich habe auch versucht aus einem markup-command heraus mittels einer rekursiven Prozedur diese Werte aus dem absoluten top-level-layout auszulesen, bekam aber nur die relativen, d.h. schon skalierten Werte (siehe das dummy-markup-command unten).
Mein derzeitiger workaround:
Ich definiere my-pt, my-staff-height und my-line-thickness als leere Listen und redefiniere diese aus \paper heraus.
Das markup-command `dummy" macht zwei Dinge (oder eben nicht)
a) Es sollte pt, staff-height etc auslesen. Funktioniert aber nicht wie erwartet. s.o.
b) Es benutzt my-pt, my-staff-height und my-line-thickness um eine Klammer und eine Linie auszugeben.
(Da die Klammern nicht in jeder Größe erhältlich sind, gibt es manchmal kleinere, im Moment akzeptable Unterschiede.
\version "2.16.2"
% Must be before \paper !!
#(set-global-staff-size 20)
#(define my-pt '())
#(define my-staff-height '())
#(define my-line-thickness '())
\paper {
#(display "\n\t\tpt\t\t ")
#(write pt)
#(display "\n\t\tstaff-height\t ")
#(write staff-height)
#(display "\n\n\t\ttest:")
#(display "\n\t\t(* pt 20)\t ")
#(write (* pt 20))
#(display "\n\t\tline-thickness\t ")
#(write line-thickness)
#(set! my-pt pt)
#(set! my-staff-height staff-height)
#(set! my-line-thickness line-thickness)
}
#(define (looking-up layout props symbol)
(define (ancestor layout)
"Return the topmost layout ancestor"
(let ((parent (ly:output-def-parent layout)))
(if (not (ly:output-def? parent))
layout
(ancestor parent))))
(ly:output-def-lookup (ancestor layout) symbol))
#(define-markup-command (dummy layout props size)
(number?)
"
A dummy.
Returns nearly equal sized brace and line.
(Sometimes the brace is a little taller. That's ok.)
Should display pt, staff-height, blot-diameter and line-thickness
from paper.
Though, it returns already scaled values.
"
(let* ((paper-pt (looking-up layout props 'pt))
(paper-staff-height (looking-up layout props 'staff-height))
(blot-diameter (looking-up layout props 'blot-diameter))
(line-thickness (looking-up layout props 'line-thickness))
(first-page-number (looking-up layout props 'first-page-number))
(factor (* 2 my-pt my-staff-height))
(mrkp (markup
;#:box
#:left-brace (* (+ (* my-line-thickness 2) size) factor)
#:vcenter
;#:box
#:draw-line `(0 . ,size)))
)
(display "\n\n\t======================================================\n")
(display "\n\t\tpaper-pt\t\t ")(write paper-pt)
(display "\n\t\tpaper-staff-height\t ")(write paper-staff-height)
(display "\n\t\t(* paper-pt 20)\t\t ")(write (* paper-pt 20))
(display "\n\t\tblot-diameter\t\t ")(write blot-diameter)
(display "\n\t\tline-thickness\t\t ")(write line-thickness)
(display "\n\t\tfirst-page-number\t ")(write first-page-number)
(interpret-markup layout props mrkp)))
\markup {
\dummy #5
bla bla bla
}
Das beste was man sagen kann: Es funktioniert.
Ich nenn sowas allerdings Fischertechnik.
Hat jemand eine Idee, wie man das besser hinbekommt?
Gruß,
Harm