| [ << Tweaks and overrides ] | [Top][Contents] | [ Workaround >> ] |
| [ < Mostrar corchete o llave en grupos de un solo pentagrama ] | [ Up: Tweaks and overrides ] | [ Armónicos con puntillo > ] |
Imprimir el árbol genealógico de un grob
Al trabajar con los callbacks de un grob, puede ser de mucha ayuda entender el árbol genealógico de un grob. La mayor parte de los grobs tienen padres que influyen en el posicionamiento del grob. los padres X e Y influyen en las posiciones horizontal y vertical del grob, respectivamente. Además, cada pade puede tener padres a su vez.
Por desgracia, existen varios aspectos de la genealogía de un grob que pueden llevar a confusión:
- Los tipos de padre que tiene un grob pueden depender del contexto.
- Para ciertos grobs, los padres X e Y son el mismo.
- Un ancestro concreto puede estar relacionado con un grob de más de una manera.
- El concepto de generaciones es engañoso.
Por ejemplo, el grob System puede ser tanto un padre (sobre
el lado Y) como un abuelo (dos veces en el lado X) de un grob
VerticalAlignment.
El macro definido en este fragmento de código imprime en la consola una representación textual de la genealogía de un grob. Por ejemplo, la llamada
{
\once \override NoteHead.before-line-breaking = #display-ancestry
c
}
genera la siguiente salida.
------------------------------------
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
Como consecuencia, tenemos que ejecutar el código del fragmento de código por nosotros mismos, porque el archivo de salida no muestra los datos que nos interesan.
#(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 }
| [ << Tweaks and overrides ] | [Top][Contents] | [ Workaround >> ] |
| [ < Mostrar corchete o llave en grupos de un solo pentagrama ] | [ Up: Tweaks and overrides ] | [ Armónicos con puntillo > ] |