5.3.6 Modificación de las listas-A
Ciertas propiedades configurables por parte del usuario se representan internamente como listas-A (listas asociativas), que almacenan duplas de claves y valores. La estructura de una lista-A es la siguiente:
'((clave1 . valor1) (clave2 . valor2) (clave3 . valor3) …)
Si una lista-A es una propiedad de un grob o una variable de
\paper
, sus claves se pueden modificar individualmente sin que
afecte a las otras claves.
Por ejemplo, para reducir el espacio entre pentagramas adyacentes
dentro de un grupo, use la propiedad staff-staff-spacing
del grob StaffGrouper
. La propiedad es una lista-A con cuatro
claves: padding
(relleno), space
(espacio),
minimum-distance
(distancia mínima) y stretchability
(ampliabilidad). Tres de las cuatro claves tienen valores
predeterminados en el inicio; éstos se relacionan en la sección
“Backend” de la Referencia de Funcionamiento Interno
(véase
StaffGrouper):
‘scm/define-grobs.scm’:
'((basic-distance . 9) (minimum-distance . 7) (padding . 1))
Una forma de acercar los pentagramas entre sí es reducir el valor de
la clave space
(9
) para que se corresponda con el valor
de minimum-distance
(7
). Para modificar una única clave
de forma individual, utilice una declaración anidada:
% default space between staves \new PianoStaff << \new Staff { \clef treble c''1 } \new Staff { \clef bass c1 } >> % reduced space between staves \new PianoStaff \with { % this is the nested declaration \override StaffGrouper #'staff-staff-spacing #'basic-distance = #7 } << \new Staff { \clef treble c''1 } \new Staff { \clef bass c1 } >>
La utilización de una declaración anidada actualiza la clave
especificada (como space
en el ejemplo anterior) sin alterar ninguna
de las otras claves que ya se habían establecido para la misma
propiedad.
Ahora, supongamos que deseamos que los pentagramas estén tan próximos como sea posible sin que se superpongan. La manera más sencilla de hacerlo es establecer las cuatro claves de la lista-A a cero. Sin embargo, no es necesario escribir cuatro declaraciones anidadas, una por cada clave. En lugar de eso, se puede redefinir completamente la propiedad con una sola declaración, como una lista-A:
\new PianoStaff \with { \override StaffGrouper #'staff-staff-spacing = #'((padding . 0) (basic-distance . 0) (minimum-distance . 0) (stretchability . 0)) } << \new Staff { \clef treble c''1 } \new Staff { \clef bass c1 } >>
Observe que cualquier clave que no haya sido relacionada
explícitamente en la definición de la lista-A, será reiniciada a sus
valores predeterminados si no se han fijado. En el caso de
staff-staff-spacing
, el valor de cualquier clave no fijada se
reiniciaría a cero (excepto stretchability
, que toma el valor
de space
si no se fija). Así, las dos declaraciones siguientes
son equivalentes:
\override StaffGrouper #'staff-staff-spacing = #'((basic-distance . 7)) \override StaffGrouper #'staff-staff-spacing = #'((padding . 0) (basic-distance . 7) (minimum-distance . 0) (stretchability . 7))
Una consecuencia de esto (posiblemente no intencionada) es la
eliminación de cualquier valor predeterminado inicializado que
se establezca en un archivo de inicio y que se carga cada vez que se
compila un archivo de entrada. En el ejemplo anterior, los valores
predeterminados inicializados para padding
y
minimum-distance
(definidos en ‘scm/define-grobs.scm’) se
reinician a sus valores predeterminados si no se han fijado (cero para
las dos claves). La definición de una propiedad o variable como una
lista-A (de cualquier tamaño) siempre reinicia todos los valores de
clave no establecidos a sus valores predeterminados si no se han
fijado. Ano ser que este sea el resultado deseado, es más seguro
actualizar los valores de clave inddividualmente con una declaración
anidada.
Nota: Las declaraciones anidadas no funcionan para las listas-A de
propiedades de contexto (como beamExceptions
,
keySignature
, timeSignatureSettings
, etc.). Estas
propiedades sólo se pueden modificar redefiniéndolas completamente
como listas-A.