]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/es/extending/programming-interface.itely
Merge branch '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: 4c8bedcc234393e8ca02726bf677de707858261b
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.12.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 * Funciones musicales::
23 * Funciones de marcado::
24 * Contextos para programadores::
25 * Funciones de callback::
26 * Código de Scheme en línea::
27 * Trucos difíciles::
28 @end menu
29
30 @node Funciones musicales
31 @section Funciones musicales
32 @translationof Music functions
33
34 Las funciones musicales son funciones de Scheme que se utilizan para
35 crear automáticamente expresiones musicales.  Se pueden usar para
36 simplificar enormemente el archivo de entrada.
37
38 @menu
39 * Sintaxis de las funciones musicales::
40 * Funciones de sustitución sencillas::
41 * Funciones de sustitución intermedias::
42 * Matemáticas dentro de las funciones::
43 * Funciones vacías::
44 * Funciones sin argumentos::
45 @end menu
46
47 @node Sintaxis de las funciones musicales
48 @subsection Sintaxis de las funciones musicales
49 @translationof Music function syntax
50
51 La sintaxis general de una función musical es:
52
53 @example
54 miFuncion =
55 #(define-music-function (parser location @var{var_1} @var{var_2}...@var{var_n})
56                         (@var{var_1-type?} @var{var_2-type?}...@var{var_n-type?})
57     @var{...expresión musical válida...})
58 @end example
59
60 @noindent
61 donde
62
63 @multitable @columnfractions .33 .66
64 @item @var{var_i}         @tab @var{i}-ésima variable
65 @item @var{var_i-type?}   @tab tipo de la @var{i}-ésima variable
66 @item @var{...expresión musical válida...}  @tab expresión que devuelve
67 música válida, generalmente en la forma de una expresión de Scheme.
68 También hay una sintaxis especial que permite la existencia de código
69 de entrada de LilyPond dentro de esta expresión musical.
70 @end multitable
71
72 Los comprobadores de tipo de variable son procedimientos de Scheme que
73 devuelven @code{#t} si una variable es de un tipo dado.  Se muestran
74 algunos tipos comunes en la tabla de abajo.  Hay más tipos en los
75 archivos @file{lily/music-scheme.cc} y @file{scm/c++.scm}.  La lista
76 completa de los comprobadores de tipo con nombre para LilyPond está en
77 la lista @var{type-p-name-alist} de @file{scm/lily.scm}.
78
79 @c TODO -- automatically document type-p-name-alist
80
81 @multitable @columnfractions .33 .66
82 @headitem Tipo de entrada          @tab notación de @var{vari-type?}
83 @item Entero                  @tab @code{integer?}
84 @item Flotante (número decimal)  @tab @code{number?}
85 @item Cadena de texto         @tab @code{string?}
86 @item Marcado                 @tab @code{markup?}
87 @item Expresión musical       @tab @code{ly:music?}
88 @item Pareja de variables     @tab @code{pair?}
89 @end multitable
90
91 Los argumentos @code{parser} y @code{location} son obligatorios.  El
92 argumento @code{parser} se usa en el cuerpo de la función para tener
93 acceso al valor de otra variable de LilyPond.  El argumento
94 @code{location} se usa para establecer el @q{origen} de la expresión
95 musical que se construye por parte de la función musical, de forma que
96 en caso de un error de sintaxis LilyPond pueda comunicar al usuario el
97 lugar adecuado del archivo de entrada en que buscar.
98
99
100 @node Funciones de sustitución sencillas
101 @subsection Funciones de sustitución sencillas
102 @translationof Simple substitution functions
103
104 Una función de sustitución sencilla es una función musical cuya
105 expresión musical de salida está escrita en código de LilyPond, pero
106 con una variable de entrada sustituida en el código de LilyPond.  La
107 forma general de estas funciones es:
108
109 @example
110 miFuncion =
111 #(define-music-function (parser location @var{var1})
112                         (@var{var1-type?})
113   #@{
114     @emph{... código de entrada de LilyPond con} @code{#$var1} @emph{para sustituir ...}
115   #@})
116 @end example
117
118 Observe que los caracteres especiales @code{#@{} y @code{#@}}
119 encierran la música de LilyPond.
120
121 @multitable @columnfractions .33 .66
122 @item @var{vari}         @tab @var{i}-ésima variable
123 @item @var{vari-type?}   @tab tipo de la @var{i}-ésima variable
124 @item @var{...música...}  @tab código de entrada normal de LilyPond, que utiliza variables como @code{#$var1}, etc.
125 @end multitable
126
127 Por ejemplo, se puede definir una función que simplifique el
128 establecimiento de un relleno para un guión de texto TextScript:
129
130 @lilypond[quote,verbatim,ragged-right]
131 padText = #(define-music-function (parser location padding) (number?)
132   #{
133     \once \override TextScript #'padding = #$padding
134   #})
135
136 \relative c''' {
137   c4^"piu mosso" b a b
138   \padText #1.8
139   c4^"piu mosso" d e f
140   \padText #2.6
141   c4^"piu mosso" fis a g
142 }
143 @end lilypond
144
145 Además de números, podemos usar expresiones musicales, como por
146 ejemplo notas, como argumentos de las funciones musicales:
147
148 @lilypond[quote,verbatim,ragged-right]
149 custosNote = #(define-music-function (parser location note)
150                                      (ly:music?)
151   #{
152     \once \override Voice.NoteHead #'stencil =
153       #ly:text-interface::print
154     \once \override Voice.NoteHead #'text =
155       \markup \musicglyph #"custodes.mensural.u0"
156     \once \override Voice.Stem #'stencil = ##f
157     $note
158   #})
159 @end lilypond
160
161
162 @node Funciones de sustitución intermedias
163 @subsection Funciones de sustitución intermedias
164 @translationof Intermediate substitution functions
165
166 Algo más complicadas que las funciones de sustitución sencillas, las
167 funciones de sustitución intermedias contienen una mezcla de código de
168 Scheme y de LilyPond dentro de la expresión musical que se devuelve.
169
170 Algunas instrucciones @code{\override} requieren un argumento que
171 consiste en una pareja de números (llamada una @code{célula cons} en
172 Scheme).
173
174 La pareja se puede pasar directamente dentro de la función musical,
175 usando una variable @code{pair?}:
176
177 @quotation
178 @example
179 barraManual =
180 #(define-music-function (parser location principio-final)
181                         (pair?)
182 #@{
183   \once \override Beam #'positions = #$principio-final
184 #@})
185
186 \relative c' @{
187   \barraManual #'(3 . 6) c8 d e f
188 @}
189 @end example
190 @end quotation
191
192 De forma alternativa, los números que componen la pareja se pueden
193 pasar como argumentos separados, y el código de Scheme que se ha usado
194 para crear la pareja se puede incluir dentro de la expresión musical:
195
196 @lilypond[quote,verbatim,ragged-right]
197 manualBeam =
198 #(define-music-function (parser location beg end)
199                         (number? number?)
200 #{
201   \once \override Beam #'positions = #(cons $beg $end)
202 #})
203
204 \relative c' {
205   \manualBeam #3 #6 c8 d e f
206 }
207 @end lilypond
208
209
210 @node Matemáticas dentro de las funciones
211 @subsection Matemáticas dentro de las funciones
212 @translationof Mathematics in functions
213
214 Las funciones musicales pueden contar con programación de Scheme
215 además de la simple sustitución:
216
217 @lilypond[quote,verbatim,ragged-right]
218 AltOn = #(define-music-function (parser location mag) (number?)
219   #{ \override Stem #'length = #$(* 7.0 mag)
220      \override NoteHead #'font-size =
221        #$(inexact->exact (* (/ 6.0 (log 2.0)) (log mag))) #})
222
223 AltOff = {
224   \revert Stem #'length
225   \revert NoteHead #'font-size
226 }
227
228 { c'2 \AltOn #0.5 c'4 c'
229   \AltOn #1.5 c' c' \AltOff c'2 }
230 @end lilypond
231
232 @noindent
233 Este ejemplo se puede reescribir de forma que pase expresiones
234 musicales:
235
236 @lilypond[quote,verbatim,ragged-right]
237 withAlt = #(define-music-function (parser location mag music) (number? ly:music?)
238   #{ \override Stem #'length = #$(* 7.0 mag)
239      \override NoteHead #'font-size =
240        #$(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
241      $music
242      \revert Stem #'length
243      \revert NoteHead #'font-size #})
244
245 { c'2 \withAlt #0.5 {c'4 c'}
246   \withAlt #1.5 {c' c'} c'2 }
247 @end lilypond
248
249
250 @node Funciones vacías
251 @subsection Funciones vacías
252 @translationof Void functions
253
254 Una función musical debe devolver una expresión musical, pero a veces
255 podemos necesitar una función en la que no hay música en juego (como
256 la desactivación de la funcionalidad Apuntar y Pulsar).  Para hacerlo,
257 devolvemos una expresión musical @code{void} (vacía).
258
259 Este es el motivo por el que la forma que se devuelve es
260 @code{(make-music ...)}.  Con el valor de la propiedad @code{'void}
261 establecido a @code{#t}, le decimos al analizador que descarte la
262 expresión musical devuelta.  así, la parte importante de la función
263 musical vacía es el proceso realizado por la función, no la expresión
264 musical que se devuelve.
265
266 @example
267 noApuntarYPulsar =
268 #(define-music-function (parser location) ()
269    (ly:set-option 'point-and-click #f)
270    (make-music 'SequentialMusic 'void #t))
271 ...
272 \noApuntarYPulsar   % desactivar la funcionalidad Apuntar y Pulsar.
273 @end example
274
275
276 @node Funciones sin argumentos
277 @subsection Funciones sin argumentos
278 @translationof Functions without arguments
279
280 En casi todos los casos, una función sin argumentos se debe escribir
281 con una variable:
282
283 @example
284 dolce = \markup@{ \italic \bold dolce @}
285 @end example
286
287 Sin embargo, en raras ocasiones puede ser de utilidad crear una
288 función musical sin argumentos:
289
290 @example
291 mostrarNumeroDeCompas =
292 #(define-music-function (parser location) ()
293    (if (eq? #t (ly:get-option 'display-bar-numbers))
294        #@{ \once \override Score.BarNumber #'break-visibility = ##f #@}
295        #@{#@}))
296 @end example
297
298 Para la impresión real de los números de compás donde se llama a esta
299 función, invoque a @command{lilypond} con
300
301 @example
302 lilypond -d display-bar-numbers ARCHIVO.ly
303 @end example
304
305
306 @node Funciones de marcado
307 @section Funciones de marcado
308 @translationof Markup functions
309
310 Los elementos de marcado están implementados como funciones de Scheme
311 especiales que producen un objeto @code{Stencil} dada una serie de
312 argumentos.
313
314
315 @menu
316 * Construcción de elementos de marcado en Scheme::
317 * Cómo funcionan internamente los elementos de marcado::
318 * Definición de una instrucción de marcado nueva::
319 * Definición de nuevas instrucciones de lista de marcado::
320 @end menu
321
322 @node Construcción de elementos de marcado en Scheme
323 @subsection Construcción de elementos de marcado en Scheme
324 @translationof Markup construction in Scheme
325
326 @cindex marcado, definir instrucciones de
327
328 El macro @code{markup} construye expresiones de marcado en Scheme,
329 proporcionando una sintaxis similar a la de LilyPond.  Por ejemplo:
330
331 @example
332 (markup #:column (#:line (#:bold #:italic "hola" #:raise 0.4 "mundo")
333                   #:larger #:line ("fulano" "fulanito" "menganito")))
334 @end example
335
336 @noindent
337 equivale a:
338 @example
339 \markup \column @{ \line @{ \bold \italic "hola" \raise #0.4 "mundo" @}
340                   \larger \line @{ fulano fulanito menganito @} @}
341 @end example
342
343 @noindent
344 Este ejemplo muestra las principales reglas de traducción entre la
345 sintaxis del marcado normal de LilyPond y la sintaxis del marcado de
346 Scheme.
347
348 @quotation
349 @multitable @columnfractions .3 .3
350 @item @b{LilyPond} @tab @b{Scheme}
351 @item @code{\markup marcado1} @tab @code{(markup marcado1)}
352 @item @code{\markup @{ marcado1 marcado2 ... @}} @tab
353         @code{(markup marcado1 marcado2 ... )}
354 @item @code{\instruccion} @tab @code{#:instruccion}
355 @item @code{\variable} @tab @code{variable}
356 @item @code{\center-column @{ ... @}} @tab @code{#:center-column ( ... )}
357 @item @code{cadena} @tab @code{"cadena"}
358 @item @code{#argumento-de-scheme} @tab @code{argumento-de-scheme}
359 @end multitable
360 @end quotation
361
362 Todo el lenguaje Scheme está accesible dentro del macro @code{markup}.
363 Por ejemplo, podemos usar llamadas a funciones dentro de @code{markup}
364 para así manipular cadenas de caracteres.  Esto es útil si se están
365 definiendo instrucciones de marcado nuevas (véase @ref{Definición de una instrucción de marcado nueva}).
366
367
368 @knownissues
369
370 El argumento markup-list de instrucciones como @code{#:line},
371 @code{#:center} y @code{#:column} no puede ser una variable ni el
372 resultado de la llamada a una función.
373
374 @lisp
375 (markup #:line (funcion-que-devuelve-marcados))
376 @end lisp
377
378 @noindent
379 no es válido.  Hay que usar las funciones @code{make-line-markup},
380 @code{make-center-markup} o @code{make-column-markup} en su lugar:
381
382 @lisp
383 (markup (make-line-markup (funcion-que-devuelve-marcados)))
384 @end lisp
385
386
387 @node Cómo funcionan internamente los elementos de marcado
388 @subsection Cómo funcionan internamente los elementos de marcado
389 @translationof How markups work internally
390
391 En un elemento de marcado como
392
393 @example
394 \raise #0.5 "ejemplo de texto"
395 @end example
396
397 @noindent
398 @code{\raise} se representa en realidad por medio de la función
399 @code{raise-markup}.  La expresión de marcado se almacena como
400
401 @example
402 (list raise-markup 0.5 (list simple-markup "ejemplo de texto"))
403 @end example
404
405 Cuando el marcado se convierte en objetos imprimibles (Stencils o
406 sellos), se llama la función @code{raise-markup} como
407
408 @example
409 (apply raise-markup
410        @var{\objeto de marcado}
411        @var{lista de listas asociativas de propiedades}
412        0.5
413        @var{el marcado "ejemplo de texto"})
414 @end example
415
416 Primero la función @code{raise-markup} crea el sello para la cadena
417 @code{ejemplo de texto}, y después eleva el sello Stencil en 0.5
418 espacios de pentagrama.  Este es un ejemplo bastante simple; en el
419 resto de la sección podrán verse ejemplos más complejos, así como en
420 @file{scm/@/define@/-markup@/-commands@/.scm}.
421
422
423 @node Definición de una instrucción de marcado nueva
424 @subsection Definición de una instrucción de marcado nueva
425 @translationof New markup command definition
426
427 Esta sección trata sobre la definición de nuevas instrucciones de
428 marcado.
429
430
431 @menu
432 * Sintaxis de la definición de instrucciones de marcado::
433 * Acerca de las propiedades::
434 * Un ejemplo completo::
435 * Adaptación de instrucciones incorporadas::
436 @end menu
437
438 @node Sintaxis de la definición de instrucciones de marcado
439 @unnumberedsubsubsec Sintaxis de la definición de instrucciones de marcado
440 @translationof Markup command definition syntax
441
442 Se pueden definir instrucciones de marcado nuevas usando el macro de
443 Scheme @code{define-markup-command}, en el nivel sintáctico superior.
444
445 @lisp
446 (define-markup-command (@var{nombre-de-la-instruccion} @var{layout} @var{props} @var{arg1} @var{arg2} ...)
447     (@var{tipo-de-arg1?} @var{tipo-de-arg2?} ...)
448     [ #:properties ((@var{propiedad1} @var{valor-predeterminado1})
449                     ...) ]
450   ..command body..)
451 @end lisp
452
453 Los argumentos son
454
455 @table @var
456 @item nombre-de-la-instruccion
457 nombre de la instrucción de marcado
458 @item layout
459 la definición de @q{layout} (disposición).
460 @item props
461 una lista de listas asociativas, que contienen todas las propiedades
462 activas.
463 @item argi
464 argumento @var{i}-ésimo de la instrucción
465 @item tipo-de-argi?
466 predicado de tipo para el argumento @var{i}-ésimo
467 @end table
468
469 Si la instrucción utiliza propiedades de los argumentos @var{props},
470 se puede usar la palabra clave @code{#:properties} para especificar
471 qué propiedades se usan, y sus valores predeterminados.
472
473 @knownissues
474 Existen algunas restricciones sobre los argumentos posibles de una
475 instrucción de marcado.
476
477 Los argumentos se distinguen según su tipo:
478 @itemize
479 @item un marcado, que corresponde al predicado de tipo @code{markup?};
480 @item una lista de marcados, que corresponde al predicado de tipo
481 @code{markup-list?};
482 @item cualquier otro objeto de Scheme, que corresponde a predicados de tipo como
483 @code{list?}, @code{number?}, @code{boolean?}, etc.
484 @end itemize
485
486 Actualmente las combinaciones de argumentos que hay disponibles
487 (después de los argumentos estándar @var{layout} y @var{props}) para
488 una instrucción de marcado definida con @code{define-markup-command}
489 se limitan a la siguiente lista:
490
491 @table @asis
492 @item (sin argumentos)
493 @itemx @var{markup-list}
494 @itemx @var{markup}
495 @itemx @var{markup markup}
496 @itemx @var{scheme}
497 @itemx @var{scheme markup}
498 @itemx @var{scheme scheme}
499 @itemx @var{scheme scheme markup}
500 @itemx @var{scheme scheme markup markup}
501 @itemx @var{scheme markup markup}
502 @itemx @var{scheme scheme scheme}
503 @end table
504
505 @noindent
506 Esto significa que no es posible definir con p.ej. tres argumentos de
507 Scheme y un argumento de marcado, como:
508
509 @example
510 #(define-markup-command (fulanito layout props
511                          num1    num2    lista  marcado)
512                         (number? number? list?  markup?)
513   ...)
514 @end example
515
516 @noindent
517 Si la aplicamos como, digamos,
518
519 @example
520 \markup \fulanito #1 #2 #'(mengano zutano) Loquesea
521 @end example
522
523 @cindex firma de Scheme
524 @cindex Scheme, firma de
525 @noindent
526 @command{lilypond} protesta diciendo que no puede analizar
527 @code{fulanito} debido a su firma de Scheme desconocida.
528
529
530 @node Acerca de las propiedades
531 @unnumberedsubsubsec Acerca de las propiedades
532 @translationof On properties
533
534 Los argumentos @code{layout} y @code{props} de las instrucciones de
535 marcado traen a escena un contexto para la interpretación del marcado:
536 tamaño de la tipografía, grueso de línea, etc.
537
538 El argumento @code{layout} permite el acceso a las propiedades
539 definidas en los bloques @code{paper}, usando la función
540 @code{ly:output-def-lookup}.  Por ejemplo, el grueso de línea (el
541 mismo que el que se usa en las partituras) se lee usando:
542
543 @example
544 (ly:output-def-lookup layout 'line-width)
545 @end example
546
547 El argumento @code{props} hace accesibles algunas propiedades a las
548 instrucciones de marcado.  Por ejemplo, cuando se interpreta el
549 marcado del título de un libro, todas las variables definidas dentro
550 del bloque @code{\header} se añaden automáticamente a @code{props}, de
551 manera que el marcado del título del libro puede acceder al título del
552 libro, el autor, etc.  También es una forma de configurar el
553 comportamiento de una instrucción de marcado: por ejemplo, cuando una
554 instrucción utiliza tamaños de tipografía durante el procesado, el
555 tamaño se lee de @code{props} en vez de tener un argumento
556 @code{font-size}.  El que llama a una instrucción de marcado puede
557 cambiar el valor de la propiedad del tamaño de la tipografía con el
558 objeto de modificar el comportamiento.  Utilice la palabra clave
559 @code{#:properties} de @code{define-markup-command} para especificar
560 qué propiedades se deben leer a partir de los argumentos de
561 @code{props}.
562
563 El ejemplo de la sección siguiente ilustra cómo acceder y
564 sobreescribir las propiedades de una instrucción de marcado.
565
566
567 @node Un ejemplo completo
568 @unnumberedsubsubsec Un ejemplo completo
569 @translationof A complete example
570
571 El ejemplo siguiente define una instrucción de marcado para trazar un
572 rectángulo doble alrededor de un fragmento de texto.
573
574 En primer lugar, necesitamos construir un resultado aproximado
575 utilizando marcados.  Una consulta a @ruser{Text markup commands} nos
576 muestra que es útil la instrucción @code{\box}:
577
578 @lilypond[quote,verbatim,ragged-right]
579 \markup \box \box HELLO
580 @end lilypond
581
582 Ahora, consideramos que es preferible tener más separación entre el
583 texto y los rectángulos.  Según la documentación de @code{\box}, esta
584 instrucción usa una propiedad @code{box-padding}, cuyo valor
585 predeterminado es 0.2.  La documentación también menciona cómo
586 sobreescribir este valor:
587
588 @lilypond[quote,verbatim,ragged-right]
589 \markup \box \override #'(box-padding . 0.6) \box A
590 @end lilypond
591
592 Después, el relleno o separación entre los dos rectángulos nos parece
593 muy pequeño, así que lo vamos a sobreescribir también:
594
595 @lilypond[quote,verbatim,ragged-right]
596 \markup \override #'(box-padding . 0.4) \box \override #'(box-padding . 0.6) \box A
597 @end lilypond
598
599 Repetir esta extensa instrucción de marcado una y otra vez sería un
600 quebradero de cabeza.  Aquí es donde se necesita una instrucción de
601 marcado.  Así pues, escribimos una instrucción de marcado
602 @code{double-box}, que toma un argumento (el texto).  Dibuja los dos
603 rectángulos y añade una separación.
604
605 @lisp
606 #(define-markup-command (double-box layout props text) (markup?)
607   "Trazar un rectángulo doble rodeando el texto."
608   (interpret-markup layout props
609     (markup #:override '(box-padding . 0.4) #:box
610             #:override '(box-padding . 0.6) #:box text)))
611 @end lisp
612
613 @code{text} es el nombre del argumento de la instrucción, y
614 @code{markup?} es el tipo: lo identifica como un elemento de marcado.
615 La función @code{interpret-markup} se usa en casi todas las
616 instrucciones de marcado: construye un sello, usando @code{layout},
617 @code{props}, y un elemento de marcado.  Aquí, la marca se construye
618 usando el macro de Scheme @code{markup}, véase @ref{Construcción de
619 elementos de marcado en Scheme}.  La transformación de una expresión
620 @code{\markup} en una expresión de marcado de Scheme es directa.
621
622 La instrucción nueva se puede usar como sigue:
623
624 @example
625 \markup \double-box A
626 @end example
627
628 Sería buen hacer que la instrucción @code{double-box} fuera
629 personalizable: aquí, los valores de relleno @code{box-padding} son
630 fijos, y no se pueden cambiar por parte del usuario.  Además, sería
631 mejor distinguir la separación entre los dos rectángulos, del relleno
632 entre el rectángulo interno y el texto.  Así pues, introducimos una
633 nueva propiedad, @code{inter-box-padding}, para el relleno entre los
634 rectángulos.  El @code{box-padding} se usará para el relleno interno.
635 Ahora el código nuevo es como se ve a continuación:
636
637 @lisp
638 #(define-markup-command (double-box layout props text) (markup?)
639   #:properties ((inter-box-padding 0.4)
640                 (box-padding 0.6))
641   "Trazar un rectángulo doble rodeando el texto."
642   (interpret-markup layout props
643     (markup #:override `(box-padding . ,inter-box-padding) #:box
644             #:override `(box-padding . ,box-padding) #:box text)))
645 @end lisp
646
647 Aquí, la palabra clave @code{#:properties} se usa de manera que las
648 propiedades @code{inter-box-padding} y @code{box-padding} se leen a
649 partir del argumento @code{props}, y se les proporcionan unos valores
650 predeterminados si las propiedades no están definidas.
651
652 Después estos valores se usan para sobreescribir las propiedades
653 @code{box-padding} usadas por las dos instrucciones @code{\box}.
654 Observe el apóstrofo invertido y la coma en el argumento de
655 @code{\override}: nos permiten introducir un valor de variable dentro
656 de una expresión literal.
657
658 Ahora, la instrucción se puede usar dentro de un elemento de marcado,
659 y el relleno de los rectángulos se puede personalizar:
660
661 @lilypond[quote,verbatim,ragged-right]
662 #(define-markup-command (double-box layout props text) (markup?)
663   #:properties ((inter-box-padding 0.4)
664                 (box-padding 0.6))
665   "Draw a double box around text."
666   (interpret-markup layout props
667     (markup #:override `(box-padding . ,inter-box-padding) #:box
668             #:override `(box-padding . ,box-padding) #:box text)))
669
670 \markup \double-box A
671 \markup \override #'(inter-box-padding . 0.8) \double-box A
672 \markup \override #'(box-padding . 1.0) \double-box A
673 @end lilypond
674
675
676 @node Adaptación de instrucciones incorporadas
677 @unnumberedsubsubsec Adaptación de instrucciones incorporadas
678 @translationof Adapting builtin commands
679
680 Una buena manera de comenzar a escribir una instrucción de marcado
681 nueva, es seguir el ejemplo de otra instrucción ya incorporada.  Casi
682 todas las instrucciones de marcado que están incorporadas en LilyPond
683 se pueden encontrar en el archivo
684 @file{scm/@/define@/-markup@/-commands@/.scm}.
685
686 Por ejemplo, querríamos adaptar la instrucción @code{\draw-line}, para
687 que trace una línea doble.  La instrucción @code{\draw-line} está
688 definida como sigue (se han suprimido los comentarios de
689 documentación):
690
691 @lisp
692 (define-markup-command (draw-line layout props dest)
693   (number-pair?)
694   #:category graphic
695   #:properties ((thickness 1))
696   "...documentación..."
697   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
698                thickness))
699         (x (car dest))
700         (y (cdr dest)))
701     (make-line-stencil th 0 0 x y)))
702 @end lisp
703
704 Para definir una instrucción nueva basada en otra existente, copie la
705 definición y cámbiele el nombre.  La palabra clave @code{#:category}
706 se puede eliminar sin miedo, pues sólo se utiliza para generar
707 documentación de LilyPond, y no tiene ninguna utilidad para las
708 instrucciones de marcado definidas por el usuario.
709
710 @lisp
711 (define-markup-command (draw-double-line layout props dest)
712   (number-pair?)
713   #:properties ((thickness 1))
714   "...documentación..."
715   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
716                thickness))
717         (x (car dest))
718         (y (cdr dest)))
719     (make-line-stencil th 0 0 x y)))
720 @end lisp
721
722 A continuación se añade una propiedad para establecer la separación
723 entre las dos líneas, llamada @code{line-gap}, con un valor
724 predeterminado de p.ej. 0.6:
725
726 @lisp
727 (define-markup-command (draw-double-line layout props dest)
728   (number-pair?)
729   #:properties ((thickness 1)
730                 (line-gap 0.6))
731   "...documentación..."
732   ...
733 @end lisp
734
735 Finalmente, se añade el código para trazar las dos líneas.  Se usan
736 dos llamadas a @code{make-line-stencil} para trazar las líneas, y los
737 sellos resultantes se combinan usando @code{ly:stencil-add}:
738
739 @lilypond[quote,verbatim,ragged-right]
740 #(define-markup-command (my-draw-line layout props dest)
741   (number-pair?)
742   #:properties ((thickness 1)
743                 (line-gap 0.6))
744   "..documentation.."
745   (let* ((th (* (ly:output-def-lookup layout 'line-thickness)
746                 thickness))
747          (dx (car dest))
748          (dy (cdr dest))
749          (w (/ line-gap 2.0))
750          (x (cond ((= dx 0) w)
751                   ((= dy 0) 0)
752                   (else (/ w (sqrt (+ 1 (* (/ dx dy) (/ dx dy))))))))
753          (y (* (if (< (* dx dy) 0) 1 -1)
754                (cond ((= dy 0) w)
755                      ((= dx 0) 0)
756                      (else (/ w (sqrt (+ 1 (* (/ dy dx) (/ dy dx))))))))))
757      (ly:stencil-add (make-line-stencil th x y (+ dx x) (+ dy y))
758                      (make-line-stencil th (- x) (- y) (- dx x) (- dy y)))))
759
760 \markup \my-draw-line #'(4 . 3)
761 \markup \override #'(line-gap . 1.2) \my-draw-line #'(4 . 3)
762 @end lilypond
763
764
765 @node Definición de nuevas instrucciones de lista de marcado
766 @subsection Definición de nuevas instrucciones de lista de marcado
767 @translationof New markup list command definition
768
769 Las instrucciones de listas de marcado se definen con el macro de
770 Scheme @code{define-markup-list-command}, que es similar al macro
771 @code{define-markup-command} descrito en @ref{Definición de una
772 instrucción de marcado nueva}, excepto que donde éste devuelve un
773 sello único, aquél devuelve una lista de sellos.
774
775 En el siguiente ejemplo se define una instrucción de lista de marcado
776 @code{\paragraph}, que devuelve una lista de líneas justificadas,
777 estando la primera de ellas sangrada.  La anchura del sangrado se toma
778 del argumento @code{props}.
779
780 @example
781 #(define-markup-list-command (paragraph layout props args) (markup-list?)
782    #:properties ((par-indent 2))
783    (interpret-markup-list layout props
784      (make-justified-lines-markup-list (cons (make-hspace-markup par-indent)
785                                              args))))
786 @end example
787
788 Aparte de los argumentos usuales @code{layout} y @code{props}, la
789 instrucción de lista de marcados @code{paragraph} toma un argumento de
790 lista de marcados, llamado @code{args}.  El predicado para listas de
791 marcados es @code{markup-list?}.
792
793 En primer lugar, la función toma el ancho del sangrado, una propiedad
794 llamada aquí @code{par-indent}, de la lista de propiedades
795 @code{props}.  Si no se encuentra la propiedad, el valor
796 predeterminado es @code{2}.  Después, se hace una lista de líneas
797 justificadas usando la función
798 @code{make-justified-lines-markup-list}, que está relacionada con la
799 instrucción incorporada de lista de marcados @code{\justified-lines}.
800 Se añade un espacio horizontal al principio usando la función
801 @code{make-hspace-markup}.  Finalmente, la lista de marcados se
802 interpreta usando la función @code{interpret-markup-list}.
803
804 Esta nueva instrucción de lista de marcados se puede usar como sigue:
805
806 @example
807 \markuplines @{
808   \paragraph @{
809     El arte de la tipografía musical se llama  \italic @{grabado (en plancha).@}
810     El término deriva del proceso tradicional de impresión de música.
811     hace sólo algunas décadas, las partituras se hacían cortando y estampando
812     la música en una plancha de zinc o lata en una imagen invertida.
813   @}
814   \override-lines #'(par-indent . 4) \paragraph @{
815     La plancha se tenía que entintar, y las depresiones causadas por los cortes
816     y estampados retienen la tinta.  Se formaba una imagen presionando el papel
817     contra la plancha.  El estampado y cortado se hacía completamente
818     a mano.
819   @}
820 @}
821 @end example
822
823
824 @node Contextos para programadores
825 @section Contextos para programadores
826 @translationof Contexts for programmers
827
828 @menu
829 * Evaluación de contextos::
830 * Ejecutar una función sobre todos los objetos de la presentación::
831 @end menu
832
833 @node Evaluación de contextos
834 @subsection Evaluación de contextos
835 @translationof Context evaluation
836
837 @cindex código, llamadas durante la interpretación
838 @funindex \applyContext
839
840 Se pueden modificar los contextos durante la interpretación con código
841 de Scheme.  La sintaxis para esto es
842
843 @example
844 \applyContext @var{función}
845 @end example
846
847 @var{función} debe ser una función de Scheme que toma un único
848 argumento, que es el contexto al que aplicarla.  El código siguiente
849 imprime el número del compás actual sobre la salida estándar durante
850 la compilación:
851
852 @example
853 \applyContext
854   #(lambda (x)
855     (format #t "\nSe nos ha llamado en el compás número ~a.\n"
856      (ly:context-property x 'currentBarNumber)))
857 @end example
858
859
860 @node Ejecutar una función sobre todos los objetos de la presentación
861 @subsection Ejecutar una función sobre todos los objetos de la presentación
862 @translationof Running a function on all layout objects
863
864 @cindex código, llamar sobre objetos de presentación
865 @funindex \applyOutput
866
867
868 La manera más versátil de realizar el ajuste fino de un objeto es
869 @code{\applyOutput}.  Su sintaxis es
870
871 @example
872 \applyOutput @var{contexto} @var{proc}
873 @end example
874
875 @noindent
876 donde @var{proc} es una función de Scheme, que toma tres argumentos.
877
878 Al interpretarse, la función @var{proc} se llama para cada objeto de
879 presentación que se encuentra en el contexto @var{contexto}, con los
880 siguientes argumentos:
881
882 @itemize
883 @item el propio objeto de presentación,
884 @item el contexto en que se creó el objeto de presentación, y
885 @item el contexto en que se procesa @code{\applyOutput}.
886 @end itemize
887
888
889 Además, la causa del objeto de presentación, es decir el objeto o
890 expresión musical que es responsable de haberlo creado, está en la
891 propiedad @code{cause} del objeto.  Por ejemplo, para la cabeza de una
892 nota, éste es un evento @rinternals{NoteHead}, y para un objeto
893 @rinternals{Stem} (plica), éste es un objeto @rinternals{Stem}.
894 @c Impossible - changed to Stem --FV
895
896 He aquí una función que usar para @code{\applyOutput}; borra las
897 cabezas de las notas que están sobre la línea central:
898
899 @lilypond[quote,verbatim,ragged-right]
900 #(define (blanker grob grob-origin context)
901    (if (and (memq 'note-head-interface (ly:grob-interfaces grob))
902             (eq? (ly:grob-property grob 'staff-position) 0))
903        (set! (ly:grob-property grob 'transparent) #t)))
904
905 \relative c' {
906   e4 g8 \applyOutput #'Voice #blanker b d2
907 }
908 @end lilypond
909
910
911 @node Funciones de callback
912 @section Funciones de callback
913 @translationof Callback functions
914
915 Las propiedades (como @code{thickness} (grosor), @code{direction}
916 (dirección), etc.) se pueden establecer a valores fijos con \override,
917 p. ej.:
918
919 @example
920 \override Stem #'thickness = #2.0
921 @end example
922
923 Las propiedades pueden fijarse también a un procedimiento de scheme,
924
925 @lilypond[fragment,verbatim,quote,relative=2]
926 \override Stem #'thickness = #(lambda (grob)
927     (if (= UP (ly:grob-property grob 'direction))
928         2.0
929         7.0))
930 c b a g b a g b
931 @end lilypond
932
933 @noindent
934 En este caso, el procedimiento se ejecuta tan pronto como el valor de
935 la propiedad se reclama durante el proceso de formateo.
936
937 Casi todo el motor de tipografiado está manejado por estos
938 @emph{callbacks}.  Entre las propiedades que usan normalmente
939 @emph{callbacks} están
940
941 @table @code
942 @item stencil
943   La rutina de impresión, que construye un dibujo para el símbolo
944 @item X-offset
945   La rutina que establece la posición horizontal
946 @item X-extent
947   La rutina que calcula la anchura de un objeto
948 @end table
949
950 El procedimiento siempre toma un argumento único, que es el grob (el
951 objeto gráfico).
952
953 Si se deben llamar rutinas con varios argumentos, el grob actual se
954 puede insertar con una cerradura de grob.  He aquí un ajuste
955 procedente de @code{AccidentalSuggestion},
956
957 @example
958 `(X-offset .
959   ,(ly:make-simple-closure
960     `(,+
961         ,(ly:make-simple-closure
962            (list ly:self-alignment-interface::centered-on-x-parent))
963       ,(ly:make-simple-closure
964            (list ly:self-alignment-interface::x-aligned-on-self)))))
965 @end example
966
967 @noindent
968 En este ejemplo, tanto
969 @code{ly:self-alignment-interface::x-aligned-on-self} como
970 @code{ly:self-alignment-interface::centered-on-x-parent} se llaman con
971 el grob como argumento.  El resultado se añade con la función
972 @code{+}.  Para asegurar que esta adición se ejecuta adecuadamente,
973 todo ello se encierra dentro de @code{ly:make-simple-closure}.
974
975 De hecho, usar un solo procedimiento como valor de una propiedad
976 equivale a
977
978 @example
979 (ly:make-simple-closure (ly:make-simple-closure (list @var{proc})))
980 @end example
981
982 @noindent
983 El @code{ly:make-simple-closure} interior aporta el grob como
984 argumento de @var{proc}, el exterior asegura que el resultado de la
985 función es lo que se devuelve, en lugar del objeto
986 @code{simple-closure}.
987
988 Desde dentro de un callback, el método más fácil para evaluar un
989 elemento de marcado es usar grob-interpret-markup.  Por ejemplo:
990
991 @example
992 mi-callback = #(lambda (grob)
993                  (grob-interpret-markup grob (markup "fulanito")))
994 @end example
995
996
997 @node Código de Scheme en línea
998 @section Código de Scheme en línea
999 @translationof Inline Scheme code
1000
1001 La principal desventaja de @code{\tweak} es su inflexibilidad
1002 sintáctica.  Por ejemplo, lo siguiente produce un error de sintaxis.
1003
1004 @example
1005 F = \tweak #'font-size #-3 -\flageolet
1006
1007 \relative c'' @{
1008   c4^\F c4_\F
1009 @}
1010 @end example
1011
1012 @noindent
1013 En otras palabras, @code{\tweak} no se comporta como una articulación
1014 en cuando a la sintaxis; concretamente, no se puede adjuntar con
1015 @code{^} y @code{_}.
1016
1017 Usando Scheme, se puede dar un rodeo a este problema.  La ruta hacia
1018 el resultado se da en @ref{Añadir articulaciones a las notas
1019 (ejemplo)}, especialmente cómo usar @code{\displayMusic} como guía de
1020 ayuda.
1021
1022 @example
1023 F = #(let ((m (make-music 'ArticulationEvent
1024                           'articulation-type "flageolet")))
1025        (set! (ly:music-property m 'tweaks)
1026              (acons 'font-size -3
1027                     (ly:music-property m 'tweaks)))
1028        m)
1029
1030 \relative c'' @{
1031   c4^\F c4_\F
1032 @}
1033 @end example
1034
1035 @noindent
1036 Aquí, las propiedades @code{tweaks} del objeto flageolet @code{m}
1037 (creado con @code{make-music}) se extraen con
1038 @code{ly:music-property}, se antepone un nuevo par clave-valor para
1039 cambiar el tamaño de la tipografía a la lista de propiedades con la
1040 función de Scheme @code{acons}, y finalmente el resultado se escribe
1041 de nuevo con @code{set!}.  El último elemento del bloque @code{let} es
1042 el valor de retorno, el propio @code{m}.
1043
1044
1045 @node Trucos difíciles
1046 @section Trucos difíciles
1047 @translationof Difficult tweaks
1048
1049 Hay un cierto número de tipos de ajustes difíciles.
1050
1051 @itemize
1052
1053
1054 @item
1055 Un tipo de ajuste difícil es la apariencia de los objetos de
1056 extensión, como las ligaduras de expresión y de unión.  Inicialmente,
1057 sólo se crea uno de estos objetos, y pueden ajustarse con el mecanismo
1058 normal.  Sin embargo, en ciertos casos los objetos extensores cruzan
1059 los saltos de línea.  Si esto ocurre, estos objetos se clonan.  Se
1060 crea un objeto distinto por cada sistema en que se encuentra.  Éstos
1061 son clones del objeto original y heredan todas sus propiedades,
1062 incluidos los @code{\override}s.
1063
1064 En otras palabras, un @code{\override} siempre afecta a todas las
1065 piezas de un objeto de extensión fragmentado.  Para cambiar sólo una
1066 parte de un extensor en el salto de línea, es necesario inmiscuirse en
1067 el proceso de formateado.  El @emph{callback}
1068 @code{after-line-breaking} contiene el procedimiento Scheme que se
1069 llama después de que se han determinado los saltos de línea, y los
1070 objetos de presentación han sido divididos sobre los distintos
1071 sistemas.
1072
1073 En el ejemplo siguiente, definimos un procedimiento
1074 @code{my-callback}.  Este procedimiento
1075
1076 @itemize
1077 @item
1078 determina si hemos sido divididos por los saltos de línea
1079 @item
1080 en caso afirmativo, reúne todos los objetos divididos
1081 @item
1082 comprueba si somos el último de los objetos divididos
1083 @item
1084 en caso afirmativo, establece @code{extra-offset}.
1085 @end itemize
1086
1087 Este procedimiento se instala en @rinternals{Tie} (ligadura de unión),
1088 de forma que la última parte de la ligadura dividida se traslada hacia
1089 arriba.
1090
1091 @lilypond[quote,verbatim,ragged-right]
1092 #(define (my-callback grob)
1093   (let* (
1094          ; have we been split?
1095          (orig (ly:grob-original grob))
1096
1097          ; if yes, get the split pieces (our siblings)
1098          (siblings (if (ly:grob? orig)
1099                      (ly:spanner-broken-into orig) '() )))
1100
1101    (if (and (>= (length siblings) 2)
1102              (eq? (car (last-pair siblings)) grob))
1103      (ly:grob-set-property! grob 'extra-offset '(-2 . 5)))))
1104
1105 \relative c'' {
1106   \override Tie #'after-line-breaking =
1107   #my-callback
1108   c1 ~ \break c2 ~ c
1109 }
1110 @end lilypond
1111
1112 @noindent
1113 Al aplicar este truco, la nueva función de callback
1114 @code{after-line-breaking} también debe llamar a la antigua
1115 @code{after-line-breaking}, si existe.  Por ejemplo, si se usa con
1116 @code{Hairpin}, se debe llamar también a
1117 @code{ly:hairpin::after-line-breaking}.
1118
1119
1120 @item Algunos objetos no se pueden cambiar con @code{\override} por
1121 razones técnicas.  Son ejemplos @code{NonMusicalPaperColumn} y
1122 @code{PaperColumn}.  Se pueden cambiar con la función
1123 @code{\overrideProperty} que funciona de forma similar a @code{\once
1124 \override}, pero usa una sintaxis distinta.
1125
1126 @example
1127 \overrideProperty
1128 #"Score.NonMusicalPaperColumn"  % Nombre del grob
1129 #'line-break-system-details     % Nombre de la propiedad
1130 #'((next-padding . 20))         % Valor
1131 @end example
1132
1133 Observe, sin embargo, que @code{\override}, aplicado a
1134 @code{NonMusicalPaperColumn} y a @code{PaperColumn}, aún funciona
1135 como se espera dentro de los bloques @code{\context}.
1136
1137 @end itemize
1138
1139
1140 @node Interfaces de Scheme de LilyPond
1141 @chapter Interfaces de Scheme de LilyPond
1142 @translationof LilyPond Scheme interfaces
1143
1144 Este capítulo cubre las diversas herramientas proporcionadas por
1145 LilyPond como ayuda a los programadores de Scheme a extraer e
1146 introducir información de los flujos musicales.
1147
1148 HACER @c TODO -- figure out what goes in here and how to organize it