Displaying grob ancestry: Difference between revisions
m Fprmatting; send output to stdout |
mNo edit summary |
||
| Line 32: | Line 32: | ||
X,Y: System | X,Y: System | ||
Y: System | Y: System | ||
As a consequence, you have to execute the code in this snippet by yourself, since the generated output file doesn't show the data we are interested in. | |||
<lilypond version="2.24"> | <lilypond version="2.24"> | ||
Latest revision as of 10:51, 28 December 2025
When working with grob callbacks, it can be helpful to understand a grob's ancestry. Most grobs have parents which influence the positioning of the grob. X- and Y-parents influence the horizontal and vertical positions for the grob, respectively. Additionally, each parent may have parents of its own.
Unfortunately, there are several aspects of a grob's ancestry that can lead to confusion:
- The types of parents a grob has may depend on context.
- For some grobs, the X- and Y-parents are the same.
- A particular ancestor may be related to a grob in multiple ways.
- The concept of generations is misleading.
For example, the System grob can be both parent (on the Y-side) and grandparent (twice on the X-side) to a VerticalAlignment grob.
The macro defined in this snippet prints (to the console) a textual representation of a grob's ancestry. For example, the call
{
\once \override NoteHead.before-line-breaking = #display-ancestry
c
}
generates the following output.
------------------------------------
NoteHead
X,Y: NoteColumn
X: PaperColumn
X,Y: System
Y: VerticalAxisGroup
X: NonMusicalPaperColumn
X,Y: System
Y: VerticalAlignment
X: NonMusicalPaperColumn
X,Y: System
Y: System
As a consequence, you have to execute the code in this snippet by yourself, since the generated output file doesn't show the data we are interested in.
\version "2.24"
#(define (get-ancestry grob)
(if (not (null? (ly:grob-parent grob X)))
(list (grob::name grob)
(get-ancestry (ly:grob-parent grob X))
(get-ancestry (ly:grob-parent grob Y)))
(grob::name grob)))
#(define (format-ancestry lst padding)
(string-append
(symbol->string (car lst)) "\n"
(let ((X-ancestry (if (list? (cadr lst))
(format-ancestry (cadr lst) (+ padding 3))
(symbol->string (cadr lst))))
(Y-ancestry (if (list? (caddr lst))
(format-ancestry (caddr lst) (+ padding 3))
(symbol->string (caddr lst)))))
(if (equal? X-ancestry Y-ancestry)
(string-append (format #f "~&")
(make-string padding #\space)
"X,Y: "
(if (list? (cadr lst))
(format-ancestry (cadr lst) (+ padding 5))
(symbol->string (cadr lst))))
(string-append (format #f "~&")
(make-string padding #\space)
"X: " X-ancestry "\n"
(make-string padding #\space)
"Y: " Y-ancestry (format #f "~&"))))
(format #f "~&")))
#(define (display-ancestry grob)
(format (current-output-port)
"~2&~a~2%~a~&"
(make-string 36 #\-)
(if (ly:grob? grob)
(format-ancestry (get-ancestry grob) 0)
(format #f "~a is not a grob" grob))))
\relative c' {
\once \override NoteHead.before-line-breaking = #display-ancestry
f4
\once \override Accidental.before-line-breaking = #display-ancestry
\once \override Arpeggio.before-line-breaking = #display-ancestry
<f as c>4\arpeggio
}