]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/es/extending/programming-interface.itely
20ec32f4116eb1013a8410c3b668e702c82e7035
[lilypond.git] / Documentation / es / extending / programming-interface.itely
1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*-
2 @c This file is part of extending.tely
3 @ignore
4     Translation of GIT committish: b24aaf5d1e10c5ea055043ce6b2c3d50d2a9c943
5
6     When revising a translation, copy the HEAD committish of the
7     version that you are working on.  See TRANSLATION for details.
8 @end ignore
9
10 @c \version "2.17.6"
11
12 @node Interfaces para programadores
13 @chapter Interfaces para programadores
14 @translationof Interfaces for programmers
15
16 Se pueden realizar trucos avanzados mediante el uso de Scheme.  Si no
17 está familiarizado con Scheme, le conviene leer nuestro tutorial de
18 Scheme, @ref{Tutorial de Scheme}.
19
20
21 @menu
22 * Bloques de código de LilyPond::
23 * Funciones de Scheme::
24 * Funciones musicales::
25 * Funciones de eventos::
26 * Funciones de marcado::
27 * Contextos para programadores::
28 * Funciones de callback::
29 * Código de Scheme en línea::
30 * Trucos difíciles::
31 @end menu
32
33 @node Bloques de código de LilyPond
34 @section Bloques de código de LilyPond
35 @translationof Lilypond code blocks
36
37 Los bloques de código de LilyPond tienen el siguiente aspecto:
38 @example
39   #@{ @var{código de LilyPond} #@}
40 @end example
41 Se pueden usar en cualquier lugar en el que se pueda escribir código
42 de Scheme: el lector de Scheme en efecto se modifica para que pueda
43 incorporar bloques de código de LilyPond y pueda ocuparse de las
44 expresiones de Scheme incrustadas que comienzan por @code{$} y@w{ }@code{#}.
45
46 Extrae el bloque de código de LilyPond y genera una llamada al
47 @code{parser} o analizador sintáctico de LilyPond, que corre en
48 tiempo de ejecución para interpretar el bloque de código de
49 LilyPond.  Cualquier expresión de Scheme que se halle incrustada
50 se ejecuta en el entorno léxico del bloque de código de LilyPond,
51 de manera que tenemos acceso a las variables locales y a los
52 parámetros de función en el punto en que se encuentra escrito el
53 bloque de código de LilyPond.  Si @code{location} se refiere a una
54 posición de entrada válida (como lo hace normalmente dentro de las
55 funciones musicales o de Scheme), toda la música generada dentro
56 del bloque de código tiene su @samp{origin} establecido a
57 @code{location}.
58
59 Un bloque de código de LilyPond puede contener cualquier cosa que
60 podríamos utilizar en la parte derecha de una asignación.  Además, un
61 bloque de LilyPond vacío corresponde a una expresión musical vacía, y
62 un bloque de LilyPond que contiene varios eventos musicales se
63 convierte en una expresión de música secuencial.
64
65 @node Funciones de Scheme
66 @section Funciones de Scheme
67 @translationof Scheme functions
68 @cindex Scheme, funciones de (sintaxis de LilyPond)
69
70 Las @emph{funciones de Scheme} son procedimientos de Scheme que pueden
71 crear expresiones de Scheme a partir de código de entrada escrito en
72 la sintaxis de LilyPond.  Se pueden llamar desde prácticamente
73 cualquier lugar en el que se permita el uso de @code{#} para la
74 especificación de un valor en sintaxis de Scheme.  Mientras que Scheme
75 tiene funciones propias, este capítulo se ocupa de las funciones
76 @emph{sintácticas}, funciones que reciben argumentos especificados en
77 la sintaxis de LilyPond.
78
79 @menu
80 * Definición de funciones de Scheme::
81 * Uso de las funciones de Scheme::
82 * Funciones de Scheme vacías::
83 @end menu
84
85 @node Definición de funciones de Scheme
86 @subsection Definición de funciones de Scheme
87 @translationof Scheme function definitions
88 @funindex define-scheme-function
89
90 La forma general de la definición de una función de Scheme es:
91
92 @example
93 funcion =
94 #(define-scheme-function
95      (parser location @var{arg1} @var{arg2} @dots{})
96      (@var{tipo1?} @var{tipo2?} @dots{})
97    @var{cuerpo})
98 @end example
99
100 @noindent
101 donde
102
103 @multitable @columnfractions .33 .66
104 @item @code{parser}
105 @tab tiene que ser literalmente @code{parser} para dar a los bloques de código
106 de LilyPond (@code{#@{}@dots{}@code{#@}}) acceso al analizador
107 sintáctico.
108
109 @item @code{@var{argN}}
110 @tab @var{n}-ésimo argumento
111
112 @item @code{@var{typeN?}}
113 @tab un @emph{predicado de tipo} de Scheme para el que @code{@var{argN}}
114 debe devolver @code{#t}.  Algunos de estos predicados se reconocen de
115 forma especial por parte del analizador, véase más abajo.  También
116 existe una forma especial @code{(@emph{predicate?} @emph{default})}
117 para especificar argumentos opcionales.  Si el argumento actual no
118 está presente cuando se ll  ama a la función, el valor predeterminado se
119 emplea en sustitución.  Los valores predeterminados se evalúan en
120 tiempo de definición (¡incluyendo los bloques de código de LilyPond!),
121 de manera que se necesitamos un valor por omisión calculado en tiempo
122 de ejecución, debemos escribir en su lugar un valor especial que
123 podamos reconocer fácilmente.  Si escribimos el predicado entre
124 paréntesis pero no lo seguimos por el valor predeterminado, se usa
125 @code{#f} como valor por omisión.  Los valores por omisión no se
126 verifican con @emph{predicate?} en tiempo de definición ni en tiempo
127 de ejecución: es nuestra responsabilidad tratar con los valores que
128 especifiquemos.  Los valores por omisión que son expresiones musicales
129 se copian mientras se establece @code{origin} al parámetro
130 @code{location}.
131
132 @item @code{@var{cuerpo}}
133 @tab una secuencia de formas de Scheme que se evalúan ordenadamente; la
134 última forma de la secuencia se usa como el valor de retorno de la
135 función de Scheme. Puede contener bloques de código de LilyPond
136 encerrados entre llaves con almohadillas
137 (@tie{}@w{@code{#@{@dots{}#@}}}@tie{}), como se describe en
138 @ref{Bloques de código de LilyPond}.  Dentro de los bloques de código
139 de LilyPond, use el símbolo @code{#} para hacer referencia a
140 argumentos de función (p.ej. @samp{#arg1}) o para iniciar una
141 expresión en línea de Scheme que contenga argumentos de función
142 (p.ej. @w{@samp{#(cons arg1 arg2)}}).  Donde las expresiones de Scheme
143 normales que usan @code{#} no funcionan, podríamos necesitar volver a
144 expresiones de Scheme inmediatas que usan @code{$}, como por ejemplo
145 @samp{$music}.
146
147 Si nuestra función devuelve una expresión musical, recibe un valor
148 @code{origin} útil.
149 @end multitable
150
151 @noindent
152 Ciertos predicados de tipo se manejan de forma especial por parte del
153 analizador sintáctico ya que de otro modo éste no es capaz de
154 reconocer los argumentos eficientemente.  Actualmente son
155 @code{ly:pitch?} y @code{ly:duration?}.
156
157 La idoneidad de lpos argumentos para el resto de los predicados viene
158 determinada mediante llamadas reales al predicado después de que
159 LilyPond ya las ha convertido en una expresión de Scheme.  Como
160 consecuencia, el argumento se puede especificar en la sintaxis de
161 Scheme si se desea (precedido de @code{#} o como resultado de haber
162 llamado a una función de Scheme), pero LilyPond también convierte
163 algunas construcciones de LilyPond en Scheme antes de hacer
164 efectivamente la comprobación del predicado sobre ellas.  Actualmente
165 se encuentran entre ellas la música, los post-eventos, las cadenas
166 simples (entrecomilladas o no), los números, los elementos de marcado
167 y de listas de marcado, score (partitura), book (libro), bookpart
168 (parte de libro), las definiciones de contexto y los bloques de
169 definición de salida.
170
171 Para ciertos tipos de expresión (como la mayor parte de la música que
172 no está encerrada entre llaves) LilyPond necesita más allá de la
173 expresión misma para poder determinar su final.  Si tal expresión se
174 considerase un argumento opcional mediante la evaluación de su
175 predicado, LilyPond no podría recuperarse después de decidir que la
176 expresión no se corresponde con el parámetro.  Así, ciertas formas de
177 música necesitan ir encerradas entre llaves para que LilyPond pueda
178 aceptarlas.  Existen también otras ambigüedades que LilyPond resuelve
179 mediante la comprobación con funciones de predicado: ¿es @samp{-3} un
180 post-evento de digitación o un nnúmero negativo?  ¿Es @code{"a" 4} en
181 el modo de letra una cadena seguida por un número, o un evento de
182 letra con la duración @code{4}?  LilyPond lo decide preguntándole a
183 los predicados.  Ello significa que un debemos evitar los
184 predicados permisivos como @code{scheme?} si tenemos en mente
185 un uso particular en vez de una función de uso general.
186
187 Para ver una lista de los predicados de tipo disponibles, consulte
188 @ruser{Predicados de tipo predefinidos}.
189
190 @seealso
191
192 Referencia de la notación:
193 @ruser{Predicados de tipo predefinidos}.
194
195 Archivos instalados:
196 @file{lily/music-scheme.cc},
197 @file{scm/c++.scm},
198 @file{scm/lily.scm}.
199
200
201 @node Uso de las funciones de Scheme
202 @subsection Uso de las funciones de Scheme
203 @translationof Scheme function usage
204
205 Las funciones de Scheme se pueden llamar casi desde cualquier lugar en
206 que puede escribirse una expresión de Scheme que comience con la
207 almohadilla@tie{}@code{#}.  Llamamos a una función de Scheme
208 escribiendo su nombre precedido de la barra invertida@tie{}@code{\}, y
209 seguido por sus argumentos.  Una vez que un argumento opcional no
210 corresponde a ningún argumento, LilyPond se salta este argumento y
211 todos los que le siguen, sustituyéndolos por su valor por omisión
212 especificado, y @q{recupera} el argumento que no correspondía al lugar
213 del siguiente argumento obligatorio.  Dado que el argumento recuperado
214 necesita ir a algún lugar, los argumentos opcionales no se consideran
215 realmente opcionales a no ser que vayan seguidos de un argumento
216 obligatorio.
217
218 Existe una excepción: si escribimos @code{\default} en el lugar de un
219 argumento opcional, este argumento y todos los argumentos opcionales
220 que le siguen se saltan y se sustituyen por sus valores
221 predeterminados.  Esto funciona incluso si no sigue ningún argumento
222 obligatorio porque @code{\default} no necesita recuperarse.  Las
223 instrucciones @code{mark} y @code{key} hacen uso de este truco para
224 ofrecer su comportamiento predeterminado cuando van seguidas solamente
225 por @code{\default}.
226
227 Aparte de los lugares en que se requiere un valor de Scheme hay
228 ciertos sitios en que se aceptan expresiones de almohadilla @code{#} y
229 se evalúan por sus efectos secundarios, pero por lo demás se ignoran.
230 Son, mayormente, los lugares en que también sería aceptable colocar
231 una asignación.
232
233 Dado que no es buena idea devolver valores que puedan malinterpretarse
234 en algún contexto, debería usar funciones de Scheme normales solo para
235 los casos en que siempre se devuelve un valor útil, y usar funciones
236 de Scheme vacías (@pxref{Funciones de Scheme vacías}) en caso
237 contrario.
238
239
240 @node Funciones de Scheme vacías
241 @subsection Funciones de Scheme vacías
242 @translationof Void scheme functions
243 @funindex define-void-function
244 @funindex \void
245
246 En ocasiones, un procedimiento se ejecuta con el objeto de llevar a
247 cabo alguna acción más que para devolver un valor.  Algunos lenguajes
248 de programación (como C y Scheme) usan las funciones para los dos
249 conceptos y se limitan a descartar el valor devuelto (usualmente
250 haciendo que cualquier expresión pueda actuar como instrucción,
251 ignorando el resultado devuelto).  Esto puede parecer inteligente pero
252 es propenso a errores: casi todos los compiladores de C de hoy en día
253 emiten advertencias cuando se descarta una expresión no vacía.  Para
254 muchas funciones que ejecutan una acción, los estándares de Scheme
255 declaran que el valor de retorno sea no especificado.  Guile, el
256 intérprete de Scheme de LilyPond, tiene un valor único
257 @code{*unspecified*} que en tales casos devuelve de forma usual (como
258 cuando se usa directamente @code{set!} sobre una variable), pero
259 desgraciadamente no de forma consistente.
260
261 Definir una función de LilyPond con @code{define-void-function}
262 asegura que se devuelve este valor especial, el único valor que
263 satisface el predicado @code{void?}.
264
265 @example
266 noApuntarYPulsar =
267 #(define-void-function
268      (parser location)
269      ()
270    (ly:set-option 'point-and-click #f))
271 ...
272 \noApuntarYPulsar   % desactivar la función de apuntar y pulsar
273 @end example
274
275 Si queremos evaluar una expresión sólo por su efecto colateral y no
276 queremos que se interprete ningún valor que pueda devolver, podemos
277 hacerlo anteponiendo el prefijo @code{\void}:
278
279 @example
280 \void #(hashq-set! some-table some-key some-value)
281 @end example
282
283 De esta forma podemos asegurar que LilyPond no asignará ningún
284 significado al valor devuelto, independientemente de dónde lo
285 encuentre.  También funciona para funciones musicales como
286 @code{\displayMusic}.
287
288 @node Funciones musicales
289 @section Funciones musicales
290 @translationof Music functions
291
292 @cindex funciones musicales
293
294 Las @emph{funciones musicales} son procedimientos de Scheme que pueden
295 crear automáticamente expresiones musicales, y se pueden usar para
296 simplificar enormemente el archivo de entrada.
297
298 @menu
299 * Definiciones de funciones musicales::
300 * Uso de las funciones musicales::
301 * Funciones de sustitución sencillas::
302 * Funciones de sustitución intermedias::
303 * Matemáticas dentro de las funciones::
304 * Funciones sin argumentos::
305 * Funciones musicales vacías::
306 @end menu
307
308
309 @node Definiciones de funciones musicales
310 @subsection Definiciones de funciones musicales
311 @translationof Music function definitions
312 @cindex definición de funciones musicales
313 @funindex define-music-function
314
315 La forma general para definir funciones musicales es:
316
317 @example
318 funcion =
319 #(define-music-function
320      (parser location @var{arg1} @var{arg2} @dots{})
321      (@var{tipo1?} @var{tipo2?} @dots{})
322    @var{cuerpo})
323 @end example
324
325 @noindent
326 de forma bastante análoga a @ref{Definición de funciones de Scheme}.
327 Lo más probable es que el @var{cuerpo} sea un
328 @ref{Bloques de código de LilyPond,bloque de código de LilyPond}.
329
330 Para ver una lista de los predicados de tipo disponibles, consulte
331 @ruser{Predicados de tipo predefinidos}.
332
333 @seealso
334
335 Referencia de la notación:
336 @ruser{Predicados de tipo predefinidos}.
337
338 Archivos de inicio:
339 @file{lily/music-scheme.cc},
340 @file{scm/c++.scm},
341 @file{scm/lily.scm}.
342
343
344 @node Uso de las funciones musicales
345 @subsection Uso de las funciones musicales
346 @translationof Music function usage
347
348 Las funciones musicales se pueden actualmente utilizar en varios
349 lugares.  Dependiendo de dónde se usan, son de aplicación ciertas
350 restricciones para que sea posible su análisis sintáctico de forma
351 no ambigua.  El resultado que devuelve una función musical debe ser
352 compatible con el contexto desde el que se la llama.
353
354 @itemize
355 @item
356 En el nivel superior dentro de una expresión musical.  Aquí
357 no se aplica ninguna restricción.
358
359 @item
360 Como un post-evento, que comienza explícitamente con un indicador de
361 dirección (a elegir entre @code{-}, @code{^} @w{y @code{_}}).
362 Observe que se puede aceptar la devolución de un
363 post-evento por parte de las funciones musicales que se llaman como
364 música normal, lo que lleva a un resultado aproximadamente equivalente
365 a
366 @example
367 s 1*0-\fun
368 @end example
369
370 En este caso, no podemos usar una expresión musical @emph{abierta}
371 como último argumento, que terminaría en una expresión musical
372 capaz de aceptar post-eventos adicionales.
373
374 @item
375 Como componente de un acorde.  La expresión devuelta debe ser
376 del tipo @code{rhythmic-event}, probablemente un @code{NoteEvent}.
377 @end itemize
378
379 @noindent
380 Las reglas especiales para los argumentos del final hacen posible
381 escribir funciones polimórficas como @code{\tweak} que se pueden
382 aplicar a construcciones distintas.
383
384 @node Funciones de sustitución sencillas
385 @subsection Funciones de sustitución sencillas
386 @translationof Simple substitution functions
387
388 Una función de sustitución sencilla es una función musical cuya
389 expresión musical de salida está escrita en código de LilyPond
390 y contiene argumentos de la función en la expresión de salida.
391 Están descritas en @ruser{Ejemplos de funciones de sustitución}.
392
393
394 @node Funciones de sustitución intermedias
395 @subsection Funciones de sustitución intermedias
396 @translationof Intermediate substitution functions
397
398 Las funciones de sustitución intermedias contienen una
399 mezcla de código de Scheme y de LilyPond
400 dentro de la expresión musical que se devuelve.
401
402 Algunas instrucciones @code{\override} requieren un argumento que
403 consiste en una pareja de números (llamada una @emph{célula cons} en
404 Scheme).
405
406 La pareja se puede pasar directamente dentro de la función musical,
407 usando una variable @code{pair?}:
408
409 @example
410 barraManual =
411 #(define-music-function
412      (parser location principio-final)
413      (pair?)
414    #@{
415      \once \override Beam.positions = #principio-final
416    #@})
417
418 \relative c' @{
419   \barraManual #'(3 . 6) c8 d e f
420 @}
421 @end example
422
423 De forma alternativa, los números que componen la pareja se pueden
424 pasar como argumentos separados, y el código de Scheme que se ha usado
425 para crear la pareja se puede incluir dentro de la expresión musical:
426
427 @lilypond[quote,verbatim,ragged-right]
428 manualBeam =
429 #(define-music-function
430      (parser location beg end)
431      (number? number?)
432    #{
433      \once \override Beam.positions = #(cons beg end)
434    #})
435
436 \relative c' {
437   \manualBeam #3 #6 c8 d e f
438 }
439 @end lilypond
440
441
442 @node Matemáticas dentro de las funciones
443 @subsection Matemáticas dentro de las funciones
444 @translationof Mathematics in functions
445
446 Las funciones musicales pueden contar con programación de Scheme
447 además de la simple sustitución:
448
449 @lilypond[quote,verbatim,ragged-right]
450 AltOn =
451 #(define-music-function
452      (parser location mag)
453      (number?)
454    #{
455      \override Stem.length = #(* 7.0 mag)
456      \override NoteHead.font-size =
457        #(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
458    #})
459
460 AltOff = {
461   \revert Stem.length
462   \revert NoteHead.font-size
463 }
464
465 \relative c' {
466   c2 \AltOn #0.5 c4 c
467   \AltOn #1.5 c c \AltOff c2
468 }
469 @end lilypond
470
471 @noindent
472 Este ejemplo se puede reescribir de forma que pase expresiones
473 musicales:
474
475 @lilypond[quote,verbatim,ragged-right]
476 withAlt =
477 #(define-music-function
478      (parser location mag music)
479      (number? ly:music?)
480    #{
481      \override Stem.length = #(* 7.0 mag)
482      \override NoteHead.font-size =
483        #(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
484      #music
485      \revert Stem.length
486      \revert NoteHead.font-size
487    #})
488
489 \relative c' {
490   c2 \withAlt #0.5 { c4 c }
491   \withAlt #1.5 { c c } c2
492 }
493 @end lilypond
494
495
496 @node Funciones sin argumentos
497 @subsection Funciones sin argumentos
498 @translationof Functions without arguments
499
500 En casi todos los casos, una función sin argumentos se debe escribir
501 con una variable:
502
503 @example
504 dolce = \markup@{ \italic \bold dolce @}
505 @end example
506
507 Sin embargo, en raras ocasiones puede ser de utilidad crear una
508 función musical sin argumentos:
509
510 @example
511 mostrarNumeroDeCompas =
512 #(define-music-function
513      (parser location)
514      ()
515    (if (eq? #t (ly:get-option 'display-bar-numbers))
516        #@{ \once \override Score.BarNumber.break-visibility = ##f #@}
517        #@{#@}))
518 @end example
519
520 Para la impresión real de los números de compás donde se llama a esta
521 función, invoque a @command{lilypond} con
522
523 @example
524 lilypond -d display-bar-numbers ARCHIVO.ly
525 @end example
526
527
528 @node Funciones musicales vacías
529 @subsection Funciones musicales vacías
530 @translationof Void music functions
531
532 Una función musical debe devolver una expresión musical.  Si quiere
533 ejecutar una función exclusivamente por sus efectos secundarios,
534 debería usar @code{define-void-function}.  Pero
535 puede haber casos en los que a veces queremos producir una expresión
536 musical, y a veces no (como en el ejemplo anterior).  Devolver una
537 expresión musical @code{void} (vacía) por medio de @code{#@{ #@}} lo
538 hace posible.
539
540
541 @node Funciones de eventos
542 @section Funciones de eventos
543 @translationof Event functions
544 @funindex define-event-function
545 @cindex event functions
546
547 Para usar una función musical en el lugar de un evento, tenemos que
548 escribir un indicador de dirección antes de ella.  Pero a veces, ello
549 hace que se pierda la correspondencia con la sintaxis de las
550 construcciones que queremos sustituir.  Por ejemplo, si queremos
551 escribir instrucciones de matiz dinámico, éstos se adjuntan
552 habitualmente sin indicador de dirección, como @code{c'\pp}.  He aquí
553 una forma de escribir indicaciones dinámicas arbitrarias:
554
555 @lilypond[quote,verbatim,ragged-right]
556 dyn=#(define-event-function (parser location arg) (markup?)
557          (make-dynamic-script arg))
558 \relative c' { c\dyn pfsss }
559 @end lilypond
560
561 Podríamos hacer lo mismo usando una función musical, pero entonces
562 tendríamos que escribir siempre un indicador de dirección antes de
563 llamarla, como @code{@w{c-\dyn pfsss}}.
564
565
566 @node Funciones de marcado
567 @section Funciones de marcado
568 @translationof Markup functions
569
570 Los elementos de marcado están implementados como funciones de Scheme
571 especiales que producen un objeto @code{Stencil} dada una serie de
572 argumentos.
573
574
575 @menu
576 * Construcción de elementos de marcado en Scheme::
577 * Cómo funcionan internamente los elementos de marcado::
578 * Definición de una instrucción de marcado nueva::
579 * Definición de nuevas instrucciones de lista de marcado::
580 @end menu
581
582 @node Construcción de elementos de marcado en Scheme
583 @subsection Construcción de elementos de marcado en Scheme
584 @translationof Markup construction in Scheme
585
586 @cindex marcado, definir instrucciones de
587
588 El macro @code{markup} construye expresiones de marcado en Scheme,
589 proporcionando una sintaxis similar a la de LilyPond.  Por ejemplo:
590
591 @example
592 (markup #:column (#:line (#:bold #:italic "hola" #:raise 0.4 "mundo")
593                   #:larger #:line ("fulano" "fulanito" "menganito")))
594 @end example
595
596 @noindent
597 equivale a:
598 @example
599 #@{ \markup \column @{ \line @{ \bold \italic "hola" \raise #0.4 "mundo" @}
600                   \larger \line @{ fulano fulanito menganito @} @} #@}
601 @end example
602
603 @noindent
604 Este ejemplo muestra las principales reglas de traducción entre la
605 sintaxis del marcado normal de LilyPond y la sintaxis del marcado de
606 Scheme.  La utilización de @code{#@{ @dots{} #@}} para escribir en la
607 sintaxis de LilyPond será con frecuencia lo más conveniente, pero
608 explicamos cómo usar la macro @code{markup} para obtener una solución
609 sólo con Scheme.
610
611 @quotation
612 @multitable @columnfractions .3 .3
613 @item @b{LilyPond} @tab @b{Scheme}
614 @item @code{\markup marcado1} @tab @code{(markup marcado1)}
615 @item @code{\markup @{ marcado1 marcado2 ... @}} @tab
616         @code{(markup marcado1 marcado2 ... )}
617 @item @code{\instruccion} @tab @code{#:instruccion}
618 @item @code{\variable} @tab @code{variable}
619 @item @code{\center-column @{ ... @}} @tab @code{#:center-column ( ... )}
620 @item @code{cadena} @tab @code{"cadena"}
621 @item @code{#argumento-de-scheme} @tab @code{argumento-de-scheme}
622 @end multitable
623 @end quotation
624
625 Todo el lenguaje Scheme está accesible dentro del macro @code{markup}.
626 Por ejemplo, podemos usar llamadas a funciones dentro de @code{markup}
627 para así manipular cadenas de caracteres.  Esto es útil si se están
628 definiendo instrucciones de marcado nuevas (véase
629 @ref{Definición de una instrucción de marcado nueva}).
630
631
632 @knownissues
633
634 El argumento markup-list de instrucciones como @code{#:line},
635 @code{#:center} y @code{#:column} no puede ser una variable ni el
636 resultado de la llamada a una función.
637
638 @lisp
639 (markup #:line (funcion-que-devuelve-marcados))
640 @end lisp
641
642 @noindent
643 no es válido.  Hay que usar las funciones @code{make-line-markup},
644 @code{make-center-markup} o @code{make-column-markup} en su lugar:
645
646 @lisp
647 (markup (make-line-markup (funcion-que-devuelve-marcados)))
648 @end lisp
649
650
651 @node Cómo funcionan internamente los elementos de marcado
652 @subsection Cómo funcionan internamente los elementos de marcado
653 @translationof How markups work internally
654
655 En un elemento de marcado como
656
657 @example
658 \raise #0.5 "ejemplo de texto"
659 @end example
660
661 @noindent
662 @code{\raise} se representa en realidad por medio de la función
663 @code{raise-markup}.  La expresión de marcado se almacena como
664
665 @example
666 (list raise-markup 0.5 (list simple-markup "ejemplo de texto"))
667 @end example
668
669 Cuando el marcado se convierte en objetos imprimibles (Stencils o
670 sellos), se llama la función @code{raise-markup} como
671
672 @example
673 (apply raise-markup
674        @var{\objeto de marcado}
675        @var{lista de listas asociativas de propiedades}
676        0.5
677        @var{el marcado "ejemplo de texto"})
678 @end example
679
680 Primero la función @code{raise-markup} crea el sello para la cadena
681 @code{ejemplo de texto}, y después eleva el sello Stencil en 0.5
682 espacios de pentagrama.  Este es un ejemplo bastante simple; en el
683 resto de la sección podrán verse ejemplos más complejos, así como en
684 @file{scm/define-markup-commands.scm}.
685
686
687 @node Definición de una instrucción de marcado nueva
688 @subsection Definición de una instrucción de marcado nueva
689 @translationof New markup command definition
690
691 Esta sección trata sobre la definición de nuevas instrucciones de
692 marcado.
693
694
695 @menu
696 * Sintaxis de la definición de instrucciones de marcado::
697 * Acerca de las propiedades::
698 * Un ejemplo completo::
699 * Adaptación de instrucciones incorporadas::
700 @end menu
701
702 @node Sintaxis de la definición de instrucciones de marcado
703 @unnumberedsubsubsec Sintaxis de la definición de instrucciones de marcado
704 @translationof Markup command definition syntax
705
706 Se pueden definir instrucciones de marcado nuevas usando el macro de
707 Scheme @code{define-markup-command}, en el nivel sintáctico superior.
708
709 @lisp
710 (define-markup-command (@var{nombre-de-la-instruccion} @var{layout} @var{props} @var{arg1} @var{arg2} ...)
711     (@var{tipo-de-arg1?} @var{tipo-de-arg2?} ...)
712     [ #:properties ((@var{propiedad1} @var{valor-predeterminado1})
713                     ...) ]
714   ..command body..)
715 @end lisp
716
717 Los argumentos son
718
719 @table @code
720 @item @var{nombre-de-la-instruccion}
721 nombre de la instrucción de marcado
722 @item layout
723 la definición de @q{layout} (disposición).
724 @item props
725 una lista de listas asociativas, que contienen todas las propiedades
726 activas.
727 @item @var{argi}
728 argumento @var{i}-ésimo de la instrucción
729 @item @var{tipo-de-argi?}
730 predicado de tipo para el argumento @var{i}-ésimo
731 @end table
732
733 Si la instrucción utiliza propiedades de los argumentos @code{props},
734 se puede usar la palabra clave @code{#:properties} para especificar
735 qué propiedades se usan, así como sus valores predeterminados.
736
737 Los argumentos se distinguen según su tipo:
738 @itemize
739 @item un marcado, que corresponde al predicado de tipo @code{markup?};
740 @item una lista de marcados, que corresponde al predicado de tipo
741 @code{markup-list?};
742 @item cualquier otro objeto de Scheme, que corresponde a predicados de tipo como
743 @code{list?}, @code{number?}, @code{boolean?}, etc.
744 @end itemize
745
746 No existe ninguna limitación en el orden de los argumentos (después de
747 los argumentos estándar @code{layout} y @code{props}).  Sin embargo, las
748 funciones de marcado que toman un elemento de marcado como su último
749 argumento son un poco especiales porque podemos aplicarlas a una lista
750 de marcados y el resultado es una lista de marcados donde la función
751 de marcado (con los argumentos antecedentes especificados) se ha
752 aplicado a todos los elementos de la lista de marcados original.
753
754 Dado que la replicación de los argumentos precedentes para aplicar una
755 función de marcado a una lista de marcados es poco costosa
756 principalmente por los argumentos de Scheme, se evitan las caídas de
757 rendimiento simplemente mediante la utilización de argumentos de
758 Scheme para los argumentos antecedentes de las funciones de marcado
759 que toman un marcado como su último argumento.
760
761 @node Acerca de las propiedades
762 @unnumberedsubsubsec Acerca de las propiedades
763 @translationof On properties
764
765 Los argumentos @code{layout} y @code{props} de las instrucciones de
766 marcado traen a escena un contexto para la interpretación del marcado:
767 tamaño de la tipografía, grueso de línea, etc.
768
769 El argumento @code{layout} permite el acceso a las propiedades
770 definidas en los bloques @code{paper}, usando la función
771 @code{ly:output-def-lookup}.  Por ejemplo, el grueso de línea (el
772 mismo que el que se usa en las partituras) se lee usando:
773
774 @example
775 (ly:output-def-lookup layout 'line-width)
776 @end example
777
778 El argumento @code{props} hace accesibles algunas propiedades a las
779 instrucciones de marcado.  Por ejemplo, cuando se interpreta el
780 marcado del título de un libro, todas las variables definidas dentro
781 del bloque @code{\header} se añaden automáticamente a @code{props}, de
782 manera que el marcado del título del libro puede acceder al título del
783 libro, el autor, etc.  También es una forma de configurar el
784 comportamiento de una instrucción de marcado: por ejemplo, cuando una
785 instrucción utiliza tamaños de tipografía durante el procesado, el
786 tamaño se lee de @code{props} en vez de tener un argumento
787 @code{font-size}.  El que llama a una instrucción de marcado puede
788 cambiar el valor de la propiedad del tamaño de la tipografía con el
789 objeto de modificar el comportamiento.  Utilice la palabra clave
790 @code{#:properties} de @code{define-markup-command} para especificar
791 qué propiedades se deben leer a partir de los argumentos de
792 @code{props}.
793
794 El ejemplo de la sección siguiente ilustra cómo acceder y
795 sobreescribir las propiedades de una instrucción de marcado.
796
797
798 @node Un ejemplo completo
799 @unnumberedsubsubsec Un ejemplo completo
800 @translationof A complete example
801
802 El ejemplo siguiente define una instrucción de marcado para trazar un
803 rectángulo doble alrededor de un fragmento de texto.
804
805 En primer lugar, necesitamos construir un resultado aproximado
806 utilizando marcados.  Una consulta a @ruser{Instrucciones de marcado
807 de texto} nos muestra que es útil la instrucción @code{\box}:
808
809 @lilypond[quote,verbatim,ragged-right]
810 \markup \box \box HELLO
811 @end lilypond
812
813 Ahora, consideramos que es preferible tener más separación entre el
814 texto y los rectángulos.  Según la documentación de @code{\box}, esta
815 instrucción usa una propiedad @code{box-padding}, cuyo valor
816 predeterminado es 0.2.  La documentación también menciona cómo
817 sobreescribir este valor:
818
819 @lilypond[quote,verbatim,ragged-right]
820 \markup \box \override #'(box-padding . 0.6) \box A
821 @end lilypond
822
823 Después, el relleno o separación entre los dos rectángulos nos parece
824 muy pequeño, así que lo vamos a sobreescribir también:
825
826 @lilypond[quote,verbatim,ragged-right]
827 \markup \override #'(box-padding . 0.4) \box
828      \override #'(box-padding . 0.6) \box A
829 @end lilypond
830
831 Repetir esta extensa instrucción de marcado una y otra vez sería un
832 quebradero de cabeza.  Aquí es donde se necesita una instrucción de
833 marcado.  Así pues, escribimos una instrucción de marcado
834 @code{double-box}, que toma un argumento (el texto).  Dibuja los dos
835 rectángulos y añade una separación.
836
837 @lisp
838 #(define-markup-command (double-box layout props text) (markup?)
839   "Trazar un rectángulo doble rodeando el texto."
840   (interpret-markup layout props
841     #@{\markup \override #'(box-padding . 0.4) \box
842             \override #'(box-padding . 0.6) \box @{ #text @}#@}))
843 @end lisp
844
845 or, equivalently
846
847 @lisp
848 #(define-markup-command (double-box layout props text) (markup?)
849   "Trazar un rectángulo doble rodeando el texto."
850   (interpret-markup layout props
851     (markup #:override '(box-padding . 0.4) #:box
852             #:override '(box-padding . 0.6) #:box text)))
853 @end lisp
854
855 @code{text} es el nombre del argumento de la instrucción, y
856 @code{markup?} es el tipo: lo identifica como un elemento de marcado.
857 La función @code{interpret-markup} se usa en casi todas las
858 instrucciones de marcado: construye un sello, usando @code{layout},
859 @code{props}, y un elemento de marcado.  En el segundo caso, la marca
860 se construye usando el macro de Scheme @code{markup}, véase
861 @ref{Construcción de elementos de marcado en Scheme}.  La
862 transformación de una expresión @code{\markup} en una expresión de
863 marcado de Scheme es directa.
864
865 La instrucción nueva se puede usar como sigue:
866
867 @example
868 \markup \double-box A
869 @end example
870
871 Sería buen hacer que la instrucción @code{double-box} fuera
872 personalizable: aquí, los valores de relleno @code{box-padding} son
873 fijos, y no se pueden cambiar por parte del usuario.  Además, sería
874 mejor distinguir la separación entre los dos rectángulos, del relleno
875 entre el rectángulo interno y el texto.  Así pues, introducimos una
876 nueva propiedad, @code{inter-box-padding}, para el relleno entre los
877 rectángulos.  El @code{box-padding} se usará para el relleno interno.
878 Ahora el código nuevo es como se ve a continuación:
879
880 @lisp
881 #(define-markup-command (double-box layout props text) (markup?)
882   #:properties ((inter-box-padding 0.4)
883                 (box-padding 0.6))
884   "Trazar un rectángulo doble rodeando el texto."
885   (interpret-markup layout props
886     #@{\markup \override #`(box-padding . ,inter-box-padding) \box
887                \override #`(box-padding . ,box-padding) \box
888                @{ #text @} #@}))
889 @end lisp
890
891 De nuevo, la versión equivalente que utiliza la macro de marcado sería:
892
893 @lisp
894 #(define-markup-command (double-box layout props text) (markup?)
895   #:properties ((inter-box-padding 0.4)
896                 (box-padding 0.6))
897   "Trazar un rectángulo doble rodeando el texto."
898   (interpret-markup layout props
899     (markup #:override `(box-padding . ,inter-box-padding) #:box
900             #:override `(box-padding . ,box-padding) #:box text)))
901 @end lisp
902
903 Aquí, la palabra clave @code{#:properties} se usa de manera que las
904 propiedades @code{inter-box-padding} y @code{box-padding} se leen a
905 partir del argumento @code{props}, y se les proporcionan unos valores
906 predeterminados si las propiedades no están definidas.
907
908 Después estos valores se usan para sobreescribir las propiedades
909 @code{box-padding} usadas por las dos instrucciones @code{\box}.
910 Observe el apóstrofo invertido y la coma en el argumento de
911 @code{\override}: nos permiten introducir un valor de variable dentro
912 de una expresión literal.
913
914 Ahora, la instrucción se puede usar dentro de un elemento de marcado,
915 y el relleno de los rectángulos se puede personalizar:
916
917 @lilypond[quote,verbatim,ragged-right]
918 #(define-markup-command (double-box layout props text) (markup?)
919   #:properties ((inter-box-padding 0.4)
920                 (box-padding 0.6))
921   "Draw a double box around text."
922   (interpret-markup layout props
923     #{\markup \override #`(box-padding . ,inter-box-padding) \box
924               \override #`(box-padding . ,box-padding) \box
925               { #text } #}))
926
927 \markup \double-box A
928 \markup \override #'(inter-box-padding . 0.8) \double-box A
929 \markup \override #'(box-padding . 1.0) \double-box A
930 @end lilypond
931
932
933 @node Adaptación de instrucciones incorporadas
934 @unnumberedsubsubsec Adaptación de instrucciones incorporadas
935 @translationof Adapting builtin commands
936
937 Una buena manera de comenzar a escribir una instrucción de marcado
938 nueva, es seguir el ejemplo de otra instrucción ya incorporada.  Casi
939 todas las instrucciones de marcado que están incorporadas en LilyPond
940 se pueden encontrar en el archivo
941 @file{scm/define-markup-commands.scm}.
942
943 Por ejemplo, querríamos adaptar la instrucción @code{\draw-line}, para
944 que trace una línea doble.  La instrucción @code{\draw-line} está
945 definida como sigue (se han suprimido los comentarios de
946 documentación):
947
948 @lisp
949 (define-markup-command (draw-line layout props dest)
950   (number-pair?)
951   #:category graphic
952   #:properties ((thickness 1))
953   "...documentación..."
954   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
955                thickness))
956         (x (car dest))
957         (y (cdr dest)))
958     (make-line-stencil th 0 0 x y)))
959 @end lisp
960
961 Para definir una instrucción nueva basada en otra existente, copie la
962 definición y cámbiele el nombre.  La palabra clave @code{#:category}
963 se puede eliminar sin miedo, pues sólo se utiliza para generar
964 documentación de LilyPond, y no tiene ninguna utilidad para las
965 instrucciones de marcado definidas por el usuario.
966
967 @lisp
968 (define-markup-command (draw-double-line layout props dest)
969   (number-pair?)
970   #:properties ((thickness 1))
971   "...documentación..."
972   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
973                thickness))
974         (x (car dest))
975         (y (cdr dest)))
976     (make-line-stencil th 0 0 x y)))
977 @end lisp
978
979 A continuación se añade una propiedad para establecer la separación
980 entre las dos líneas, llamada @code{line-gap}, con un valor
981 predeterminado de p.ej. 0.6:
982
983 @lisp
984 (define-markup-command (draw-double-line layout props dest)
985   (number-pair?)
986   #:properties ((thickness 1)
987                 (line-gap 0.6))
988   "...documentación..."
989   ...
990 @end lisp
991
992 Finalmente, se añade el código para trazar las dos líneas.  Se usan
993 dos llamadas a @code{make-line-stencil} para trazar las líneas, y los
994 sellos resultantes se combinan usando @code{ly:stencil-add}:
995
996 @lilypond[quote,verbatim,ragged-right]
997 #(define-markup-command (my-draw-line layout props dest)
998   (number-pair?)
999   #:properties ((thickness 1)
1000                 (line-gap 0.6))
1001   "..documentation.."
1002   (let* ((th (* (ly:output-def-lookup layout 'line-thickness)
1003                 thickness))
1004          (dx (car dest))
1005          (dy (cdr dest))
1006          (w (/ line-gap 2.0))
1007          (x (cond ((= dx 0) w)
1008                   ((= dy 0) 0)
1009                   (else (/ w (sqrt (+ 1 (* (/ dx dy) (/ dx dy))))))))
1010          (y (* (if (< (* dx dy) 0) 1 -1)
1011                (cond ((= dy 0) w)
1012                      ((= dx 0) 0)
1013                      (else (/ w (sqrt (+ 1 (* (/ dy dx) (/ dy dx))))))))))
1014      (ly:stencil-add (make-line-stencil th x y (+ dx x) (+ dy y))
1015                      (make-line-stencil th (- x) (- y) (- dx x) (- dy y)))))
1016
1017 \markup \my-draw-line #'(4 . 3)
1018 \markup \override #'(line-gap . 1.2) \my-draw-line #'(4 . 3)
1019 @end lilypond
1020
1021
1022 @node Definición de nuevas instrucciones de lista de marcado
1023 @subsection Definición de nuevas instrucciones de lista de marcado
1024 @translationof New markup list command definition
1025
1026 Las instrucciones de listas de marcado se definen con el macro de
1027 Scheme @code{define-markup-list-command}, que es similar al macro
1028 @code{define-markup-command} descrito en @ref{Definición de una
1029 instrucción de marcado nueva}, excepto que donde éste devuelve un
1030 sello único, aquél devuelve una lista de sellos.
1031
1032 En el siguiente ejemplo se define una instrucción de lista de marcado
1033 @code{\paragraph}, que devuelve una lista de líneas justificadas,
1034 estando la primera de ellas sangrada.  La anchura del sangrado se toma
1035 del argumento @code{props}.
1036
1037 @example
1038 #(define-markup-list-command (paragraph layout props args) (markup-list?)
1039    #:properties ((par-indent 2))
1040    (interpret-markup-list layout props
1041      #@{\markuplist \justified-lines @{ \hspace #par-indent #args @} #@}))
1042 @end example
1043
1044
1045 La versión que usa solamente Scheme es más compleja:
1046 @example
1047 #(define-markup-list-command (paragraph layout props args) (markup-list?)
1048    #:properties ((par-indent 2))
1049    (interpret-markup-list layout props
1050      (make-justified-lines-markup-list (cons (make-hspace-markup par-indent)
1051                                              args))))
1052 @end example
1053
1054 Aparte de los argumentos usuales @code{layout} y @code{props}, la
1055 instrucción de lista de marcados @code{paragraph} toma un argumento de
1056 lista de marcados, llamado @code{args}.  El predicado para listas de
1057 marcados es @code{markup-list?}.
1058
1059 En primer lugar, la función toma el ancho del sangrado, una propiedad
1060 llamada aquí @code{par-indent}, de la lista de propiedades
1061 @code{props}.  Si no se encuentra la propiedad, el valor
1062 predeterminado es @code{2}.  Después, se hace una lista de líneas
1063 justificadas usando la instrucción incorporada de lista de marcados
1064 @code{\justified-lines}, que está relacionada con la función
1065 @code{make-justified-lines-markup-list}.  Se añade un espacio
1066 horizontal al principio usando @code{\hspace} (o la función
1067 @code{make-hspace-markup}).  Finalmente, la lista de marcados se
1068 interpreta usando la función @code{interpret-markup-list}.
1069
1070 Esta nueva instrucción de lista de marcados se puede usar como sigue:
1071
1072 @example
1073 \markuplist @{
1074   \paragraph @{
1075     El arte de la tipografía musical se llama  \italic @{grabado (en plancha).@}
1076     El término deriva del proceso tradicional de impresión de música.
1077     hace sólo algunas décadas, las partituras se hacían cortando y estampando
1078     la música en una plancha de zinc o lata en una imagen invertida.
1079   @}
1080   \override-lines #'(par-indent . 4) \paragraph @{
1081     La plancha se tenía que entintar, y las depresiones causadas por los cortes
1082     y estampados retienen la tinta.  Se formaba una imagen presionando el papel
1083     contra la plancha.  El estampado y cortado se hacía completamente
1084     a mano.
1085   @}
1086 @}
1087 @end example
1088
1089
1090 @node Contextos para programadores
1091 @section Contextos para programadores
1092 @translationof Contexts for programmers
1093
1094 @menu
1095 * Evaluación de contextos::
1096 * Ejecutar una función sobre todos los objetos de la presentación::
1097 @end menu
1098
1099 @node Evaluación de contextos
1100 @subsection Evaluación de contextos
1101 @translationof Context evaluation
1102
1103 @cindex código, llamadas durante la interpretación
1104 @funindex \applyContext
1105
1106 Se pueden modificar los contextos durante la interpretación con código
1107 de Scheme.  La sintaxis para esto es
1108
1109 @example
1110 \applyContext @var{función}
1111 @end example
1112
1113 @code{@var{función}} debe ser una función de Scheme que toma un único
1114 argumento, que es el contexto al que aplicarla.  El código siguiente
1115 imprime el número del compás actual sobre la salida estándar durante
1116 la compilación:
1117
1118 @example
1119 \applyContext
1120   #(lambda (x)
1121     (format #t "\nSe nos ha llamado en el compás número ~a.\n"
1122      (ly:context-property x 'currentBarNumber)))
1123 @end example
1124
1125
1126 @node Ejecutar una función sobre todos los objetos de la presentación
1127 @subsection Ejecutar una función sobre todos los objetos de la presentación
1128 @translationof Running a function on all layout objects
1129
1130 @cindex código, llamar sobre objetos de presentación
1131 @funindex \applyOutput
1132
1133
1134 La manera más versátil de realizar el ajuste fino de un objeto es
1135 @code{\applyOutput}, que
1136 funciona insertando un evento dentro del contexto especificado
1137 (@rinternals{ApplyOutputEvent}).  Su sintaxis es
1138
1139 @example
1140 \applyOutput @var{Contexto} @var{proc}
1141 @end example
1142
1143 @noindent
1144 donde @code{@var{proc}} es una función de Scheme que toma tres argumentos.
1145
1146 Al interpretarse, la función @code{@var{proc}} se llama para cada objeto de
1147 presentación que se encuentra en el contexto @code{@var{Contexto}}
1148 en el tiempo actual, con los siguientes argumentos:
1149
1150 @itemize
1151 @item el propio objeto de presentación,
1152 @item el contexto en que se creó el objeto de presentación, y
1153 @item el contexto en que se procesa @code{\applyOutput}.
1154 @end itemize
1155
1156
1157 Además, la causa del objeto de presentación, es decir el objeto o
1158 expresión musical que es responsable de haberlo creado, está en la
1159 propiedad @code{cause} del objeto.  Por ejemplo, para la cabeza de una
1160 nota, éste es un evento @rinternals{NoteHead}, y para un objeto
1161 plica, éste es un objeto @rinternals{Stem}.
1162
1163 He aquí una función que usar para @code{\applyOutput}; borra las
1164 cabezas de las notas que están sobre la línea central y junto a ella:
1165
1166 @lilypond[quote,verbatim,ragged-right]
1167 #(define (blanker grob grob-origin context)
1168    (if (and (memq 'note-head-interface (ly:grob-interfaces grob))
1169             (< (abs (ly:grob-property grob 'staff-position)) 2))
1170        (set! (ly:grob-property grob 'transparent) #t)))
1171
1172 \relative c' {
1173   a'4 e8 <<\applyOutput #'Voice #blanker a c d>> b2
1174 }
1175 @end lilypond
1176
1177 Para que @var{función} se interprete en los niveles de @code{Score} o de @code{Staff}
1178 utilice estas formas:
1179
1180 @example
1181 \applyOutput #'Score #@var{función}
1182 \applyOutput #'Staff #@var{función}
1183 @end example
1184
1185
1186 @node Funciones de callback
1187 @section Funciones de callback
1188 @translationof Callback functions
1189
1190 Las propiedades (como @code{thickness} (grosor), @code{direction}
1191 (dirección), etc.) se pueden establecer a valores fijos con \override,
1192 p. ej.:
1193
1194 @example
1195 \override Stem.thickness = #2.0
1196 @end example
1197
1198 Las propiedades pueden fijarse también a un procedimiento de Scheme,
1199
1200 @lilypond[fragment,verbatim,quote,relative=2]
1201 \override Stem.thickness = #(lambda (grob)
1202     (if (= UP (ly:grob-property grob 'direction))
1203         2.0
1204         7.0))
1205 c b a g b a g b
1206 @end lilypond
1207
1208 @noindent
1209 En este caso, el procedimiento se ejecuta tan pronto como el valor de
1210 la propiedad se reclama durante el proceso de formateo.
1211
1212 Casi todo el motor de tipografiado está manejado por estos
1213 @emph{callbacks}.  Entre las propiedades que usan normalmente
1214 @emph{callbacks} están
1215
1216 @table @code
1217 @item stencil
1218   La rutina de impresión, que construye un dibujo para el símbolo
1219 @item X-offset
1220   La rutina que establece la posición horizontal
1221 @item X-extent
1222   La rutina que calcula la anchura de un objeto
1223 @end table
1224
1225 El procedimiento siempre toma un argumento único, que es el grob (el
1226 objeto gráfico).
1227
1228 Si se deben llamar rutinas con varios argumentos, el grob actual se
1229 puede insertar con una cerradura de grob.  He aquí un ajuste
1230 procedente de @code{AccidentalSuggestion},
1231
1232 @example
1233 `(X-offset .
1234   ,(ly:make-simple-closure
1235     `(,+
1236         ,(ly:make-simple-closure
1237            (list ly:self-alignment-interface::centered-on-x-parent))
1238       ,(ly:make-simple-closure
1239            (list ly:self-alignment-interface::x-aligned-on-self)))))
1240 @end example
1241
1242 @noindent
1243 En este ejemplo, tanto
1244 @code{ly:self-alignment-interface::x-aligned-on-self} como
1245 @code{ly:self-alignment-interface::centered-on-x-parent} se llaman con
1246 el grob como argumento.  El resultado se añade con la función
1247 @code{+}.  Para asegurar que esta adición se ejecuta adecuadamente,
1248 todo ello se encierra dentro de @code{ly:make-simple-closure}.
1249
1250 De hecho, usar un solo procedimiento como valor de una propiedad
1251 equivale a
1252
1253 @example
1254 (ly:make-simple-closure (ly:make-simple-closure (list @var{proc})))
1255 @end example
1256
1257 @noindent
1258 El @code{ly:make-simple-closure} interior aporta el grob como
1259 argumento de @var{proc}, el exterior asegura que el resultado de la
1260 función es lo que se devuelve, en lugar del objeto
1261 @code{simple-closure}.
1262
1263 Desde dentro de un callback, el método más fácil para evaluar un
1264 elemento de marcado es usar grob-interpret-markup.  Por ejemplo:
1265
1266 @example
1267 mi-callback = #(lambda (grob)
1268                  (grob-interpret-markup grob (markup "fulanito")))
1269 @end example
1270
1271
1272 @node Código de Scheme en línea
1273 @section Código de Scheme en línea
1274 @translationof Inline Scheme code
1275
1276 La principal desventaja de @code{\tweak} es su inflexibilidad
1277 sintáctica.  Por ejemplo, lo siguiente produce un error de sintaxis.
1278
1279 @example
1280 F = \tweak font-size #-3 -\flageolet
1281
1282 \relative c'' @{
1283   c4^\F c4_\F
1284 @}
1285 @end example
1286
1287 @noindent
1288 Usando Scheme, se puede dar un rodeo a este problema.  La ruta hacia
1289 el resultado se da en @ref{Añadir articulaciones a las notas
1290 (ejemplo)}, especialmente cómo usar @code{\displayMusic} como guía de
1291 ayuda.
1292
1293 @example
1294 F = #(let ((m (make-music 'ArticulationEvent
1295                           'articulation-type "flageolet")))
1296        (set! (ly:music-property m 'tweaks)
1297              (acons 'font-size -3
1298                     (ly:music-property m 'tweaks)))
1299        m)
1300
1301 \relative c'' @{
1302   c4^\F c4_\F
1303 @}
1304 @end example
1305
1306 @noindent
1307 Aquí, las propiedades @code{tweaks} del objeto flageolet @code{m}
1308 (creado con @code{make-music}) se extraen con
1309 @code{ly:music-property}, se antepone un nuevo par clave-valor para
1310 cambiar el tamaño de la tipografía a la lista de propiedades con la
1311 función de Scheme @code{acons}, y finalmente el resultado se escribe
1312 de nuevo con @code{set!}.  El último elemento del bloque @code{let} es
1313 el valor de retorno, el propio @code{m}.
1314
1315
1316 @node Trucos difíciles
1317 @section Trucos difíciles
1318 @translationof Difficult tweaks
1319
1320 Hay un cierto número de tipos de ajustes difíciles.
1321
1322 @itemize
1323
1324
1325 @item
1326 Un tipo de ajuste difícil es la apariencia de los objetos de
1327 extensión, como las ligaduras de expresión y de unión.  Inicialmente,
1328 sólo se crea uno de estos objetos, y pueden ajustarse con el mecanismo
1329 normal.  Sin embargo, en ciertos casos los objetos extensores cruzan
1330 los saltos de línea.  Si esto ocurre, estos objetos se clonan.  Se
1331 crea un objeto distinto por cada sistema en que se encuentra.  Éstos
1332 son clones del objeto original y heredan todas sus propiedades,
1333 incluidos los @code{\override}s.
1334
1335 En otras palabras, un @code{\override} siempre afecta a todas las
1336 piezas de un objeto de extensión fragmentado.  Para cambiar sólo una
1337 parte de un extensor en el salto de línea, es necesario inmiscuirse en
1338 el proceso de formateado.  El @emph{callback}
1339 @code{after-line-breaking} contiene el procedimiento Scheme que se
1340 llama después de que se han determinado los saltos de línea, y los
1341 objetos de presentación han sido divididos sobre los distintos
1342 sistemas.
1343
1344 En el ejemplo siguiente, definimos un procedimiento
1345 @code{my-callback}.  Este procedimiento
1346
1347 @itemize
1348 @item
1349 determina si hemos sido divididos por los saltos de línea
1350 @item
1351 en caso afirmativo, reúne todos los objetos divididos
1352 @item
1353 comprueba si somos el último de los objetos divididos
1354 @item
1355 en caso afirmativo, establece @code{extra-offset}.
1356 @end itemize
1357
1358 Este procedimiento se instala en @rinternals{Tie} (ligadura de unión),
1359 de forma que la última parte de la ligadura dividida se traslada hacia
1360 arriba.
1361
1362 @lilypond[quote,verbatim,ragged-right]
1363 #(define (my-callback grob)
1364    (let* (
1365           ;; have we been split?
1366           (orig (ly:grob-original grob))
1367
1368           ;; if yes, get the split pieces (our siblings)
1369           (siblings (if (ly:grob? orig)
1370                         (ly:spanner-broken-into orig)
1371                         '())))
1372
1373      (if (and (>= (length siblings) 2)
1374               (eq? (car (last-pair siblings)) grob))
1375          (ly:grob-set-property! grob 'extra-offset '(-2 . 5)))))
1376
1377 \relative c'' {
1378   \override Tie.after-line-breaking =
1379   #my-callback
1380   c1 ~ \break
1381   c2 ~ c
1382 }
1383 @end lilypond
1384
1385 @noindent
1386 Al aplicar este truco, la nueva función de callback
1387 @code{after-line-breaking} también debe llamar a la antigua,
1388 si existe este valor predeterminado.  Por ejemplo, si se usa con
1389 @code{Hairpin}, se debe llamar también a
1390 @code{ly:spanner::kill-zero-spanned-time}.
1391
1392
1393 @item Algunos objetos no se pueden cambiar con @code{\override} por
1394 razones técnicas.  Son ejemplos @code{NonMusicalPaperColumn} y
1395 @code{PaperColumn}.  Se pueden cambiar con la función
1396 @code{\overrideProperty} que funciona de forma similar a @code{\once
1397 \override}, pero usa una sintaxis distinta.
1398
1399 @example
1400 \overrideProperty
1401 Score.NonMusicalPaperColumn      % Nombre del grob
1402   . line-break-system-details    % Nombre de la propiedad
1403   . next-padding                 % Nombre de la subpropiedad, opcional
1404   #20                            % Valor
1405 @end example
1406
1407 Observe, sin embargo, que @code{\override}, aplicado a
1408 @code{NonMusicalPaperColumn} y a @code{PaperColumn}, aún funciona
1409 como se espera dentro de los bloques @code{\context}.
1410
1411 @end itemize
1412
1413
1414 @node Interfaces de Scheme de LilyPond
1415 @chapter Interfaces de Scheme de LilyPond
1416 @translationof LilyPond Scheme interfaces
1417
1418 Este capítulo cubre las diversas herramientas proporcionadas por
1419 LilyPond como ayuda a los programadores de Scheme a extraer e
1420 introducir información de los flujos musicales.
1421
1422 HACER @c TODO -- figure out what goes in here and how to organize it