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