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