5.5.6 Contenedores unpure-pure
Los contenedores ‘unpure-pure’ (pura y no pura) son útiles para la
sobreescritura de los cálculos del espaciado en el eje Y
(concretamente Y-offset
e Y-extent
) con una función de
Scheme en lugar de un literal, es decir, un número o una pareja de
números.
Para ciertos objetos gráficos, las dimensiones Y-extent
están
basadas en la propiedad stencil
, la sobreescritura de la
propiedad de sello de éstos requiere una sobreescritura adicional de
Y-extent
con un contenedor unpure-pure. Cuando una función
sobreescribe una dimensión Y-offset
y/o Y-extent
se
supone que esto dispara los cálculos de los saltos de línea
prematuramente durante la compilación. Así pues, la función no se
evalúa en absoluto (devolviendo por lo general un valor de ‘0’ o
‘'(0 . 0)’) lo que puede dar lugar a colisiones. Una función
‘pura’ no afecta a las propiedades, objetos o suicidios de grobs, y
por ello siempre ven sus valores relacionados con el eje Y evaluados
correctamente.
Actualmente hay unas treinta funciones que ya se consideran ‘puras’ y los contenedores Unpure-pure son una manera de establecer funciones que no están en esta lista como ‘puras’. La función ‘pura’ se evalúa antes de cualquier salto de línea y así el espaciado horizontal se puede ajustar ‘a tiempo’. La función ‘impura’ se evalúa entonces después del salto de línea.
Nota: Dado que es difícil saber siempre qué funciones están en esta
lista, recomendamos que cualquier función ‘pura’ que estemos creando
no utilice los grobs Beam
o VerticalAlignment
.
Un contenedor ‘unpure-pure’ se contruye de la manera siguiente:
(ly:make-unpure-pure-container f0 f1)
donde f0
es una función que toma n argumentos (n >=
1) y el primer argumento siempre debe ser el grob. Ésta es la
función que da el resultado real. f1 es la función que se
etiqueta como ‘pura’ que toma n + 2 argumentos. De nuevo, el
primer argumento debe ser siempre el grob pero los argumentos segundo
y tercero son argumentos de ‘inicio’ y de ‘final’.
inicio y final son, a todos los efectos, valores mudos que
sólo tienen importancia para los objetos de extensión
(o sea:
Hairpin
, regulador, o Beam
, barra), que pueden devolver
distintas estimaciones de altura basadas en una columna de inicio y
una de final.
El resto son los otros argumentos para la primera función (que puede no ser ninguno si n = 1).
El resultado de la segunda función se usa como una aproximación del valor necesario, que se usa entonces por la primera función para obtener el valor real que se usa a continuación para el ajuste de precisión mucho más tardío durante el proceso de espaciado.
#(define (square-line-circle-space grob) (let* ((pitch (ly:event-property (ly:grob-property grob 'cause) 'pitch)) (notename (ly:pitch-notename pitch))) (if (= 0 (modulo notename 2)) (make-circle-stencil 0.5 0.0 #t) (make-filled-box-stencil '(0 . 1.0) '(-0.5 . 0.5))))) squareLineCircleSpace = { \override NoteHead.stencil = #square-line-circle-space } smartSquareLineCircleSpace = { \squareLineCircleSpace \override NoteHead.Y-extent = #(ly:make-unpure-pure-container ly:grob::stencil-height (lambda (grob start end) (ly:grob::stencil-height grob))) } \new Voice \with { \remove "Stem_engraver" } \relative c'' { \squareLineCircleSpace cis4 ces disis d \smartSquareLineCircleSpace cis4 ces disis d }
En el primer compás, sin el contenedor unpure-pure, el motor de espaciado no conoce la anchura de la cabeza de la nota y permite que colisione con las alteraciones accidentales. En el segundo compás, el motor de espaciado conoce la anchura de las cabezas de las notas y evita la colisión mediante el alargamiento de la línea en la medida adecuada.
Normalmente, para cálculos simples se pueden usar funciones casi idénticas tanto para las partes ‘no pura’ y ‘pura’, simplemente cambiando el número de argumentos que se pasan a, y el ámbito de, la función.
Nota: Si una función está caracterizada como ‘pura’ y resulta que no lo es, el resultado puede ser inesperado.
Otros idiomas: English, deutsch, français, italiano, 日本語.
Acerca de la selección automática del idioma.