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