B.8 Trucos difíciles
Hay un cierto número de tipos de ajustes difíciles.
- Un tipo de ajuste difícil es la apariencia de los objetos de
extensión, como las ligaduras de expresión y de unión.
Inicialmente, sólo se crea uno de estos objetos, y pueden
ajustarse con el mecanismo normal. Sin embargo, en ciertos casos
los objetos extensores cruzan los saltos de línea. Si esto
ocurre, estos objetos se clonan. Se crea un objeto distinto por
cada sistema en que se encuentra. Éstos son clones del objeto
original y heredan todas sus propiedades, incluidos los
\override
s.En otras palabras, un
\override
siempre afecta a todas las piezas de un objeto de extensión fragmentado. Para cambiar sólo una parte de un extensor en el salto de línea, es necesario inmiscuirse en el proceso de formateado. El callbackafter-line-breaking
contiene el procedimiento Scheme que se llama después de que se han determinado los saltos de línea, y los objetos de presentación han sido divididos sobre los distintos sistemas.En el ejemplo siguiente, definimos un procedimiento
my-callback
. Este procedimiento- determina si hemos sido divididos por los saltos de línea
- en caso afirmativo, reúne todos los objetos divididos
- comprueba si somos el último de los objetos divididos
- en caso afirmativo, establece
extra-offset
.
Este procedimiento se instala en Tie (ligadura de unión), de forma que la última parte de la ligadura dividida se traslada hacia arriba.
#(define (my-callback grob) (let* ( ;; have we been split? (orig (ly:grob-original grob)) ;; if yes, get the split pieces (our siblings) (siblings (if (ly:grob? orig) (ly:spanner-broken-into orig) '()))) (if (and (>= (length siblings) 2) (eq? (car (last-pair siblings)) grob)) (ly:grob-set-property! grob 'extra-offset '(1 . -4))))) \relative { \override Tie.after-line-breaking = #my-callback c''1 ~ \break c2 ~ 2 }
Al aplicar este truco, la nueva función de callback
after-line-breaking
también debe llamar a la antigua, si existe este valor predeterminado. Por ejemplo, si se usa conHairpin
, se debe llamar también aly:spanner::kill-zero-spanned-time
. - Algunos objetos no se pueden cambiar con
\override
por razones técnicas. Son ejemplosNonMusicalPaperColumn
yPaperColumn
. Se pueden cambiar con la función\overrideProperty
que funciona de forma similar a\once \override
, pero usa una sintaxis distinta.\overrideProperty Score.NonMusicalPaperColumn % Nombre del grob . line-break-system-details % Nombre de la propiedad . next-padding % Nombre de la subpropiedad, opcional #20 % Valor
Observe, sin embargo, que
\override
, aplicado aNonMusicalPaperColumn
y aPaperColumn
, aún funciona como se espera dentro de los bloques\context
.