Extender LilyPond: B.8 Trucos difíciles

## 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 callback `after-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 con `Hairpin`, se debe llamar también a `ly:spanner::kill-zero-spanned-time`.

- Algunos objetos no se pueden cambiar con `\override` por razones técnicas. Son ejemplos `NonMusicalPaperColumn` y `PaperColumn`. 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 a `NonMusicalPaperColumn` y a `PaperColumn`, aún funciona como se espera dentro de los bloques `\context`.

#### LilyPond — Extender v2.24.4 (rama estable).