B.8 Ajustaments difícils (Extender LilyPond)

### B.8 Ajustaments difícils

Hi ha un cert nombre de tipus d’ajustament difícils.

- Un tipus d’ajustament difícil és l’aparença dels objectes d’extensió, com les lligadures d’expressió i d’unió. Inicialment, sols es crea un d’aquests objectes, i poden ajustar-se amb el mecanisme normal. No obstant, en certs caos els objectes extensors creuen els salts de línia. Si això passa, aquests objectes es clonen. Es crea un objecte diferent per cada sistema en el qual es troba. Aquests són clons de l’objecte original i hereten totes les seves propietats, inclosos els `\override`s.

  En altres paraules, un `\override` sempre afecta a totes les peces d’un objecte d’extensió fragmentat. Per canviar sols una part d’un extensor en el salt de línia, cal inspeccionar el procés de formatat. El callback `after-line-breaking` conté el procediment Scheme que es crida després que s’han determinat els salts de línia, i els objectes de presentació han estat dividits sobre els diferents sistemes.

  A l’exemple següent definim un procediment `my-callback`. Aquest procediment

  - determina si hem estat dividits pels salts de línia
  - en cas afrimatiu, reuneix tots els objectes dividits
  - comprova si som l’últim dels objectes dividits
  - en cas afirmatiu, estableix `extra-offset`.

  Aquest procediment s’instal·la en Tie (lligadura d’unió), de forma que l’última part de la lligadura dividida es trasllada cap a dalt.

  >     #(define (my-callback grob)
  >        (let* (
  >               ;; hem estat dividits?
  >               (orig (ly:grob-original grob))

  >               ;; si és sí, obté les parts dividides (els nostres bessons)
  >               (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
  >     }

  En aplicar aquest ajustament, la nova funció de callback `after-line-breaking` també ha de cridar a l’antiga, si existeix aquest valor predeterminat. Per exemple, si s’usa amb `Hairpin`, s’ha de cridar també a `ly:spanner::kill-zero-spanned-time`.

- Algunes objectes no es poden canviar amb `\override` per raons tècnics. Són exemples `NonMusicalPaperColumn` i `PaperColumn`. Es poden canviar amb la funció `\overrideProperty` que funciona de forma similar a `\once \override`, però usa una sintaxi diferent.

      \overrideProperty
      Score.NonMusicalPaperColumn      % Nom del grob
        . line-break-system-details    % Nom de la propietat
        . next-padding                 % Nom de la subpropietat, opcional
        #20                            % Valor

  Observeu, no obstant, que `\override`, aplicat a `NonMusicalPaperColumn` i a `PaperColumn`, encara funciona com s’espera dins dels blocs `\context`.

#### Extender LilyPond v2.26.0 (stable-branch).

- Appendix A Tutorial de l’Scheme
  - A.1 Introducció a l’Scheme
    - A.1.1 Banc de sorra de l’Scheme
    - A.1.2 Variables de l’Scheme
    - A.1.3 Tipus de dades simples de l’Scheme
    - A.1.4 Tipus de dades compostes de l’Scheme
      - Parelles
      - Llistes
      - Llistes associatives (llistes-A)
      - Taules de hash
    - A.1.5 Càlculs a l’Scheme
    - A.1.6 Procediments de l’Scheme
      - Definició de procediments
      - Predicats
      - Valors de retorn
    - A.1.7 Condicionals de l’Scheme
      - if
      - cond
  - A.2 Scheme dins del LilyPond
    - A.2.1 Sintaxi de l’Scheme del LilyPond
    - A.2.2 Variables del LilyPond
    - A.2.3 Variables d’entrada i l’Scheme
    - A.2.4 Importació de l’Scheme dins del LilyPond
    - A.2.5 Propietats dels objectes
    - A.2.6 Variables del LilyPond compostes
      - Desplaçaments
      - Fraccions
      - Dimensions
      - Llistes-A de propietats
      - Cadenes de llistes-A
    - A.2.7 Representació interna de la música
  - A.3 Construcció de funcions complicades
    - A.3.1 Presentació de les expressions musicals
    - A.3.2 Propietats musicals
    - A.3.3 Duplicació una nota amb lligadures (exemple)
    - A.3.4 Afegir articulacions a les notes (exemple)
- B Interfícies per a programadors
  - B.1 Blocs de codi del LilyPond
  - B.2 Funcions de l’Scheme
    - B.2.1 Definició de funcions de l’Scheme
    - B.2.2 Ús de les funcions de l’Scheme
    - B.2.3 Funcions de l’Scheme buides
  - B.3 Funcions musicals
    - B.3.1 Definicions de funcions musicals
    - B.3.2 Ús de les funcions musicals
    - B.3.3 Funcions de substitució senzilles
    - B.3.4 Funcions de substitució intermèdies
    - B.3.5 Matemàtiques dins de les funcions
    - B.3.6 Funcions sense arguments
    - B.3.7 Funcions musicals buides
  - B.4 Funcions d’esdeveniments
  - B.5 Funcions de marcatge
    - B.5.1 Construcció d’elements de marcatge a l’Scheme
    - B.5.2 Com funcionen internament els elements de marcatge
    - B.5.3 Definició d’una ordre nova de marcatge
      - Sintaxi de la definició d’ordre de marcatge
      - Quant a les propietats
      - Un exemple complet
      - Adaptació d’ordres incorporades
    - B.5.4 Definició de noves ordres de llista de marcatge
  - B.6 Contextos per a programadors
    - B.6.1 Avaluació de contextos
    - B.6.2 Execució d’una funció sobre tots els objectes de la presentació
  - B.7 Funcions de callback
  - B.8 Ajustaments difícils
- C Interfícies de l’Scheme del LilyPond
- Appendix D GNU Free Documentation License
- Appendix E Índex del LilyPond