5.3.7 Modificació de les llistes-A

Certes propietats configurables per part de l’usuari es representen internament com llistes-A (llistes associatives), que emmagatzemen duples de claves i valors. L’estructura d’una llista-A és la següent:

'((clave1 . valor1)
  (clave2 . valor2)
  (clave3 . valor3)
  …)

Si una llista-A és una propietat d’un grob o una variable de \paper, les seves claus es poden modificar individualment sense que afecti a les altres claus.

Per exemple, per reduir l’espai entre pentagrames adjacents dins d’un grup, useu la propietat staff-staff-spacing del grob StaffGrouper. La propietat és una llista-A amb quatre claus: basic-distance (distància bàsica), minimum-distance (distància mínima), padding (farcit) i stretchability (ampliabilitat). Els ajustaments estàndard per a aquesta propietat es relacionen a la secció “Backend” de la Referència de Funcionament Intern (vegeu StaffGrouper):

'((basic-distance . 9)
  (minimum-distance . 7)
  (padding . 1)
  (stretchability . 5))

Una forma d’apropar els pentagrames entre sí és reduir el valor de la clau basic-distance (9) perquè es correspongui amb el valor de minimum-distance (7). Per modificar una única clau de forma individual, utilitzeu una declaració niuada:

% espai predeterminat entre pentagrames
\new PianoStaff <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

% espai reduït entre pentagrames
\new PianoStaff \with {
  % aquesta és la declaració niuada
  \override StaffGrouper.staff-staff-spacing.basic-distance = #7
} <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

[image of music]

La utilització d’una declaració niuada actualitza la clau especificada (com basic-distance a l’exemple anterior) sense alterar cap de les altres claus que ja s’havien establert per a la mateixa propietat.

Ara suposem que desitgem que els pentagrames estiguin tan propers com sigui possible sense que es superposin. La manera més senzilla de fer-lo és establir les quatre claus de la llista-A a zero. Malgrat això, no cal escriure quatre declaracions niuades, una per cada clau. En lloc d’això, es pot redefinir completament la propietat amb una sola declaració, com una llista-A:

\new PianoStaff \with {
  \override StaffGrouper.staff-staff-spacing =
    #'((basic-distance . 0)
       (minimum-distance . 0)
       (padding . 0)
       (stretchability . 0))
} <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

[image of music]

Observeu que qualsevol clau que no hagi estat relacionada explícitament a la definició de la llista-A, serà reiniciada als seus valors predeterminats si no s’han fixat. En el cas de staff-staff-spacing, el valor de qualsevol clau no fixada es reiniciaria a zero (excepte stretchability, que agafa el valor de basic-distance si no es fixa). Aixi, les dues declaracions següents són equivalents:

\override StaffGrouper.staff-staff-spacing =
  #'((basic-distance . 7))

\override StaffGrouper.staff-staff-spacing =
  #'((basic-distance . 7)
     (minimum-distance . 0)
     (padding . 0)
     (stretchability . 7))

Una conseqüència d’això (possiblement no intencionada) és l’eliminació de qualsevol valor estàndard que s’estableixi en un fitxer d’inici i que es carrega cada cop que es compila un fitxer d’entrada. A l’exemple anterior, els ajustaments estàndard per a padding i minimum-distance (definits a scm/define-grobs.scm) es reinicien al seus valors predeterminats si no s’han fixat (zero per a les dues claus). La definició d’una propietat o variable com una llista-A (de qualsevol mida) sempre reinicia tots els valors de clau no establertes als seus valors predeterminats si no s’han fixat. A no ser que aquest sigui el resultat desitjat, és més segur actualitzar els valors de clau individualment amb una declaració niuada.

Nota: Les declaracions niuades no funcionen per a les llists-A de propietats de context (com beamExceptions, keyAlterations, timeSignatureSettings, etc.). Aquestes propietats sols es poden modificar redefinint-les completament com a llistes-A.


Referència de la notació del GNU LilyPond v2.25.22 (development-branch).