[ << Interfaces para programadores ] | [Top][Contents][Index] | [ Interfaces de Scheme de LilyPond >> ] |
[ < Funciones de callback ] | [ Up: Interfaces para programadores ] | [ Trucos difíciles > ] |
B.8 Contenedores Unpure-pure
Nota: Si bien esta subsección refleja la situación actual, el ejemplo dado es irrelevante y no muestra ningún efecto.
Los contenedores unpure-pure son útiles para sobreescribir los
cálculos de espaciado en Y-axis, el eje Y (específicamente
Y-offset
y Y-extent
) con una función de Scheme en
lugar de un valor literal, como un número o una pareja de números.
Para determinados objetos gráficos, las dimensiones verticales
Y-extent
están basadas en la propiedad stencil
(sello): la sobreescritura de la propiedad sello de uno de estos
objetos necesitaría otra sobreescritura de Y-extent
con un
contenedor unpure-pure. Cuando una función sobreescribe el
desplazamiento Y-offset
y/o las dimensiones verticales
Y-extent
, se supone que ello dispara los álculos de los
saltos de línea demasiado pronro durante la compilación. Por ello
la función no se evalúa en absoluto (devolviendo por lo general un
valor de ‘0’ o de ‘'(0 . 0)’) lo que puede dar
colisiones como resultado. Una función ‘pure’ no afecta a las
propiedades, los objetos se suicidan y por tanto siempre tendrán
evaluado correctamente su valor relacionado con el eje Y.
En este momento existen aproximadamente 30 funciones que ya se conbsideran ‘pure’ y los contenedores Unpure-pure son una manera de establecer como ‘pure’ funciones que no están en esta lista. La función ‘pure’ se evalúa antes de cualquier salto de línea y así el espaciado horizontal se puede ajustar ‘a tiempo’. La función ‘unpure’ se evalúa entonces después del salto de línea.
Nota: Dado que es difícil saber en todo momento qué funciones
están en esta lista, recomendamos que cualquier función ‘pure’
que usted cree, no utilicen los objetos gráficos Beam
ni
VerticalAlignment
.
Un contenedor unpure-pure se construye como sigue:
(ly:make-unpure-pure-container f0 f1)
donde f0
es una función que toma n argumentos (n
>= 1) y el primer argumento debe ser siempre el grob. Esta es la
función que da el resultado real. f1 es la función que se
está etiquetando como ‘pure’ que toma n + 2 argumentos.
De nuevo, el primer argumento siempre debe ser el grob, pero el
segundo y el tercero son los argumentos de ‘inicio’ y ‘fin’.
inicio y fin son, a todos los efectos, valores mudos
que solo tienen importancia para los objetos de extensión
(Spanners
como Hairpin
, reguladores, o Beam
,
barras), que pueden devolver diferentes estimaciones de altura
basadas en una columna de inicio y de final.
El resto son los otros argumentos para la primera función (que pueden no ser ninguno si n = 1).
Los resultados de la segunda función se usan como aproximación del valor requerido cuando se usa después por parte de la primera función para obtener el valor real que se usa entonces para el ajuste fino mucho tiempo después, 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 un contenedor unpure-pure, el motor de espaciado no conoce la anchura de la cabeza de la nota ydeja que choque con las alteraciones accidentales. En el segundo compás, con contenedores unpure-pure, el motor de espaciado conoce el ancho de las cabezas de nota y evita la colisión alargando la línea adecuadamente.
Normalmente, para cálculos sencillos se pueden usar funciones casi
idénticas para las dos partes ‘unpure’ y ‘pure’ , solo
cambiando el número de los argumentos que se pasan a, y el ámbito
de, la función. Este ejemplo de utilización es lo bastante
frecuente como para que ly:make-unpure-pure-container
construya una segunda función de forma predeterminada cuando se
llama con solo un argumento de función.
Nota: Si una función se etiqueta como ‘pure’ y después resulta que no lo es, los resultados pueden ser inesperados.
[ << Interfaces para programadores ] | [Top][Contents][Index] | [ Interfaces de Scheme de LilyPond >> ] |
[ < Funciones de callback ] | [ Up: Interfaces para programadores ] | [ Trucos difíciles > ] |