]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/de/extending/programming-interface.itely
257ec972a64fb0d90f1dbfe8503dbbb25cbfe992
[lilypond.git] / Documentation / de / extending / programming-interface.itely
1 @c -*- coding: utf-8; mode: texinfo; -*-
2
3 @ignore
4     Translation of GIT committish: 8cbb38db1591ab95a178643e7bf41db018aa22c0
5
6     When revising a translation, copy the HEAD committish of the
7     version that you are working on.  For details, see the Contributors'
8     Guide, node Updating translation committishes..
9 @end ignore
10
11 @c \version "2.14.0"
12
13 @c Translators: Till Paala
14
15 @node Schnittstellen für Programmierer
16 @chapter Schnittstellen für Programmierer
17 @translationof Interfaces for programmers
18
19 Fortgeschrittene Anpassungen können mithilfe der Programmiersprache
20 Scheme vorgenommen werden.  Wenn Sie Scheme nicht kennen, gibt
21 es eine grundlegende Einleitung in LilyPonds
22 @ref{Scheme-Übung}.
23
24 @menu
25 * Musikalische Funktionen::
26 * Textbeschriftungsfunktionen::
27 * Kontexte für Programmierer::
28 * Callback-Funktionen::
29 * Scheme-Code innerhalb LilyPonds::
30 * Schwierige Korrekturen::
31 @end menu
32
33
34 @node Musikalische Funktionen
35 @section Musikalische Funktionen
36 @translationof Music functions
37
38 Dieser Abschnitt behandelt die Erstellung von musikalischen Funktionen
39 innerhalb von LilyPond. @emph{Musikalische Funktionen} sind Scheme-Prozeduren,
40 die musikalische Ausdrücke automatisch erstellen können und dadurch die
41 Eingabedatei maßgeblich vereinfachen können.
42
43 @menu
44 * Syntax der musikalischen Funktionen::
45 * Einfache Ersetzungsfunktionen::
46 * Mittlere Ersetzungsfunktionen::
47 * Mathematik in Funktionen::
48 * Funktionen ohne Argumente::
49 * Leere Funktionen::
50 @end menu
51
52 @node Syntax der musikalischen Funktionen
53 @subsection Syntax der musikalischen Funktionen
54 @translationof Music function syntax
55
56 Die allgemeine Form von musikalischen Funktionen ist:
57
58 @example
59 function =
60 #(define-music-function
61      (parser location @var{Arg1} @var{Arg2} @dots{})
62      (@var{Typ1?} @var{Typ2?} @dots{})
63    @var{Noten})
64 @end example
65
66 @noindent
67 wobei
68
69 @multitable @columnfractions .33 .66
70 @item @var{ArgN}
71 @tab das @var{n}te Argument
72
73 @item @var{TypN?}
74 @tab ein Scheme-Typenprädikat (engl. type predicate), für welches
75 @code{@var{ArgN}} @code{#t} ausgeben muss.  Einige dieser Prädikate
76 werden durch den Parser gesondert erkannt, sodass die entsprechenden
77 Werte als LilyPond-Syntx gelesen werden und nicht als Scheme-Syntax.
78 Diese Prädikate sind gegenwärtig @code{ly:music?}, @code{markup?}, @code{ly:pitch?}
79 und @code{ly:duration?}.  Nicht alle Kombinationen sind erlaubt:
80 man kann z. B. nicht eine Dauer nach den Noten suchen, denn Noten
81 können @emph{optional} mit einer Dauer enden.
82
83 Wenn Sie wirklich einige dieser Elemente als Scheme- und nicht als
84 LilyPond-Ausdruck einsetzen wollen, können Sie sie in einen Aufruf
85 von @code{ly:export} einfügen.
86
87 @item @var{...Noten...}
88 @tab ein musikalischer Ausdruck, optional in Scheme geschrieben, mit allem
89 LilyPond-Code in Raute/geschweifte Klammer eingeschlossen
90 (@tie{}@w{@code{#@{@dots{}#@}}}@tie{}).  Innerhalb der LilyPond-Codeumgebungen
91 wird @code{$} eingesetzt, um auf Funktionsargumente zu verweisen (etwa
92 @samp{$Arg1}), oder ein neuer Scheme-Ausdruck muss begonnen werden,
93 der die Funktionsargumente enthält (etwa @w{@samp{$(cons Arg1 Arg2)}}).
94
95 @end multitable
96
97 Eine Liste der möglichen Typenprädikate findet sich in
98 @ruser{Vordefinierte Typenprädikate}.  Durch den Benutzer definierte
99 Typenprädikate sind auch erlaubt.
100
101 @seealso
102
103 Notationsreferenz:
104 @ruser{Vordefinierte Typenprädikate}.
105
106 Installierte Dateien:
107 @file{lily/music-scheme.cc},
108 @file{scm/c++.scm},
109 @file{scm/lily.scm}.
110
111
112 @node Einfache Ersetzungsfunktionen
113 @subsection Einfache Ersetzungsfunktionen
114 @translationof Simple substitution functions
115
116 Einfache Ersetzungsfunktionen sind musikalische Funktionen, deren
117 musikalische Ausgabe-Funktion im LilyPond-Format geschrieben ist
118 und Funktionsargumente in der Ausgabefunktion enthält.  Sie werden
119 beschrieben in @ruser{Beispiele der Ersetzungsfunktionen}
120
121
122 @node Mittlere Ersetzungsfunktionen
123 @subsection Mittlere Ersetzungsfunktionen
124 @translationof Intermediate substitution functions
125
126 Mittlere Ersetzungsfunktionen setzen sich aus einer Mischung von
127 Scheme-Code und LilyPond-Code in der musikalischen Ausgabe-Funktion
128 zusammen.
129
130 Einige @code{\override}-Befehle benötigen ein Zahlenpaar
131 (als @code{cons}-Zelle in Scheme bezeichnet).
132
133 Das Paar kann direkt an die musikalische Funktion
134 mit der Variable @code{pair?} weitergeleitet werden:
135
136 @example
137 manualBeam =
138 #(define-music-function
139      (parser location beg-end)
140      (pair?)
141    #@{
142      \once \override Beam #'positions = $beg-end
143    #@})
144
145 \relative c' @{
146   \manualBeam #'(3 . 6) c8 d e f
147 @}
148 @end example
149
150 Anstelle dessen können auch die Zahlen, aus denen das Paar besteht,
151 einzeln als eigenständige Argumente weitergeleitet und der
152 Scheme-Code, der das Paar erstellt, in die musikalische Funktion
153 augenommen werden:
154
155 @lilypond[quote,verbatim,ragged-right]
156 manualBeam =
157 #(define-music-function
158      (parser location beg end)
159      (number? number?)
160    #{
161      \once \override Beam #'positions = $(cons beg end)
162    #})
163
164 \relative c' {
165   \manualBeam #3 #6 c8 d e f
166 }
167 @end lilypond
168
169
170 @node Mathematik in Funktionen
171 @subsection Mathematik in Funktionen
172 @translationof Mathematics in functions
173
174 Musikalische Funktionen können neben einfachen Ersetzungen
175 auch Scheme-Programmcode enthalten:
176
177 @lilypond[quote,verbatim,ragged-right]
178 AltOn =
179 #(define-music-function
180      (parser location mag)
181      (number?)
182    #{
183      \override Stem #'length = $(* 7.0 mag)
184      \override NoteHead #'font-size =
185        $(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
186    #})
187
188 AltOff = {
189   \revert Stem #'length
190   \revert NoteHead #'font-size
191 }
192
193 \relative c' {
194   c2 \AltOn #0.5 c4 c
195   \AltOn #1.5 c c \AltOff c2
196 }
197 @end lilypond
198
199 @noindent
200 Dieses Beispiel kann auch umformuliert werden, um musikalische Ausdrücke
201 zu integrieren:
202
203 @lilypond[quote,verbatim,ragged-right]
204 withAlt =
205 #(define-music-function
206      (parser location mag music)
207      (number? ly:music?)
208    #{
209      \override Stem #'length = $(* 7.0 mag)
210      \override NoteHead #'font-size =
211        $(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
212      $music
213      \revert Stem #'length
214      \revert NoteHead #'font-size
215    #})
216
217 \relative c' {
218   c2 \withAlt #0.5 { c4 c }
219   \withAlt #1.5 { c c } c2
220 }
221 @end lilypond
222
223
224 @node Funktionen ohne Argumente
225 @subsection Funktionen ohne Argumente
226 @translationof Functions without arguments
227
228 In den meisten Fällen sollten Funktionen ohne Argumente mit einer
229 Variable notiert werden:
230
231 @example
232 dolce = \markup@{ \italic \bold dolce @}
233 @end example
234
235 In einigen wenigen Fällen kann es aber auch sinnvoll sein, eine
236 musikalische Funktion ohne Argumente zu erstellen:
237
238 @example
239 displayBarNum =
240 #(define-music-function
241      (parser location)
242      ()
243    (if (eq? #t (ly:get-option 'display-bar-numbers))
244        #@{ \once \override Score.BarNumber #'break-visibility = ##f #@}
245        #@{#@}))
246 @end example
247
248 Damit auch wirklich Taktzahlen angezeigt werden, wo die
249 Funktion eingesetzt wurde, muss @command{lilypond} mit
250 der Option
251
252 @example
253 lilypond -d display-bar-numbers Dateiname.ly
254 @end example
255
256 @noindent
257 aufgerufen werden.
258
259
260
261 @node Leere Funktionen
262 @subsection Leere Funktionen
263 @translationof Void functions
264
265 Eine musikalische Funktion muss einen musikalischen Ausdruck
266 ausgeben, aber in manchen Fällen müssen Funktionen erstellt werden,
267 die keine Noten enthalten (wie etwa eine Funktion, mit der
268 man @qq{Point and Click} ausschalten kann).  Um das vornehmen zu
269 können, wird ein @code{leere}r musikalischer Ausdruck ausgegeben.
270
271 Das ist der Grund, warum die Form, die ausgegeben wird,
272 @w{@code{(make-music @dots{})}} heißt.  Wird die Eigenschaft
273 @code{'void} (engl. für @qq{leer}) auf @code{#t} gesetzt, wird der
274 Parser angewiesen, den ausgegebenen musikalischen Ausdruck zu ignorieren.
275 Der maßgebliche Teil der @code{'void}-Funktion ist also die Verarbeitung,
276 die die Funktion vornimmt, nicht der musikalische Ausdruck, der ausgegeben
277 wird.
278
279 @example
280 noPointAndClick =
281 #(define-music-function
282      (parser location)
283      ()
284    (ly:set-option 'point-and-click #f)
285    (make-music 'SequentialMusic 'void #t))
286 ...
287 \noPointAndClick   % Point and Click ausschalten
288 @end example
289
290
291
292 @node Textbeschriftungsfunktionen
293 @section Textbeschriftungsfunktionen
294 @translationof Markup functions
295
296 Textbeschriftungselemente sind als besondere Scheme-Funktionen
297 definiert, die ein @code{Stencil}-Objekt erstellen, dem eine Anzahl
298 an Argumenten übergeben wird.
299
300 @menu
301 * Beschriftungskonstruktionen in Scheme::
302 * Wie Beschriftungen intern funktionieren::
303 * Neue Definitionen von Beschriftungsbefehlen::
304 * Neue Definitionen von Beschriftungslistenbefehlen::
305 @end menu
306
307
308 @node Beschriftungskonstruktionen in Scheme
309 @subsection Beschriftungskonstruktionen in Scheme
310 @translationof Markup construction in Scheme
311
312 @cindex Textbeschriftungsbefehle, definieren
313 @cindex Textbeschriftung, eigene Befehle
314 @cindex eigene Befehle, Textbeschriftung
315 @cindex markup, eigene Befehle
316 @cindex Befehle definieren, Textbeschriftung
317
318 Das @code{markup}-(Textbeschriftungs)Makro erstellt Textbeschriftungs-Ausdrücke
319 in Scheme, wobei eine LilyPond-artige Syntax benutzt wird.  Beispielsweise
320 ist
321
322 @example
323 (markup #:column (#:line (#:bold #:italic "hello" #:raise 0.4 "world")
324                   #:larger #:line ("foo" "bar" "baz")))
325 @end example
326
327 @noindent
328 identisch mit
329
330 @example
331 \markup \column @{ \line @{ \bold \italic "hello" \raise #0.4 "world" @}
332                   \larger \line @{ foo bar baz @} @}
333 @end example
334
335 @noindent
336 Dieses Beispiel zeigt die hauptsächlichen Übersetzungsregeln
337 zwischen normaler Textbeschriftungssyntax von LilyPond und der
338 Textbeschriftungssyntax in Scheme.
339
340 @quotation
341 @multitable @columnfractions .3 .3
342 @item @b{LilyPond} @tab @b{Scheme}
343 @item @code{\markup Text1} @tab @code{(markup Text1)}
344 @item @code{\markup @{ Text1 Text2 ... @}} @tab
345         @code{(markup Text1 Text2 ... )}
346 @item @code{\Beschriftungsbefehl} @tab @code{#:Beschriftungsbefehl}
347 @item @code{\Variable} @tab @code{Variable}
348 @item @code{\center-column @{ ... @}} @tab @code{#:center-column ( ... )}
349 @item @code{Zeichenkette} @tab @code{"Zeichenkette"}
350 @item @code{#scheme-Arg} @tab @code{scheme-Arg}
351 @end multitable
352 @end quotation
353
354 Die gesamte Scheme-Sprache ist innerhalb des @code{markup}-Makros
355 zugänglich.  Man kann also beispielsweise Funktionen innerhalb
356 eines @code{markup} aufrufen, um Zeichenketten zu manipulieren.
357 Das ist nützlich, wenn neue Beschriftungsbefehle definiert werden
358 sollen (siehe auch
359 @ref{Neue Definitionen von Beschriftungsbefehlen}).
360
361
362 @knownissues
363
364 Das Beschriftungslistenargument von Befehlen wie @code{#:line},
365 @code{#:center} und @code{#:column} kann keine Variable oder
366 das Resultat eines Funktionsaufrufen sein.
367
368 @lisp
369 (markup #:line (Funktion-die-Textbeschriftung-ausgibt))
370 @end lisp
371
372 @noindent
373 ist ungültig.  Man sollte anstatt dessen die Funktionen
374 @code{make-line-markup}, @code{make-center-markup} oder
375 @code{make-column-markup} benutzen:
376
377 @lisp
378 (markup (make-line-markup (Funktion-die-Textbeschriftung-ausgibt)))
379 @end lisp
380
381
382 @node Wie Beschriftungen intern funktionieren
383 @subsection Wie Beschriftungen intern funktionieren
384 @translationof How markups work internally
385
386 In einer Textbeschriftung wie
387
388 @example
389 \raise #0.5 "Textbeispiel"
390 @end example
391
392 @noindent
393 ist @code{\raise} unter der Haube durch die @code{raise-markup}-Funktion
394 repräsentiert.  Der Beschriftungsausdruck wird gespeichert als
395
396 @example
397 (list raise-markup 0.5 (list simple-markup "Textbeispiel"))
398 @end example
399
400 Wenn die Beschriftung in druckbare Objekte (Stencils) umgewandelt ist,
401 wir die @code{raise-markup}-Funktion folgendermaßen aufgerufen:
402
403 @example
404 (apply raise-markup
405        @var{\layout object}
406        @var{Liste der Eigenschafts-alists}
407        0.5
408        @var{die "Textbeispiel"-Beschriftung})
409 @end example
410
411 Die @code{raise-markup}-Funktion erstellt zunächst den Stencil für die
412 @code{Textbeispiel}-Beschriftung und verschiebt dann diesen Stencil
413 um 0.5 Notenlinienzwischenräume nach oben.  Das ist ein einfaches
414 Beispiel.  Weitere, kompliziertere Beispiele finden sich nachfolgend
415 in diesem Abschnitt und in der Datei
416 @file{scm/define-markup-commands.scm}.
417
418
419 @node Neue Definitionen von Beschriftungsbefehlen
420 @subsection Neue Definitionen von Beschriftungsbefehlen
421 @translationof New markup command definition
422
423 Dieser Abschnitt behandelt die Definition von neuen Textbeschriftungsbefehlen.
424
425 @menu
426 * Syntax der Definition von Textbeschriftungsbefehlen::
427 * Über Eigenschaften::
428 * Ein vollständiges Bespiel::
429 * Eingebaute Befehle anpassen::
430 @end menu
431
432 @node Syntax der Definition von Textbeschriftungsbefehlen
433 @unnumberedsubsubsec Syntax der Definition von Textbeschriftungsbefehlen
434 @translationof Markup command definition syntax
435
436 Neue Textbeschriftungsbefehle können mit dem
437 @code{define-markup-command}-Scheme-Makro definiert werden.
438
439 @lisp
440 (define-markup-command (@var{befehl-bezeichnung} @var{layout} @var{props} @var{Arg1} @var{Arg2} ...)
441             (@var{Arg1-typ?} @var{Arg2-typ?} ...)
442     [ #:properties ((@var{Eigenschaft1} @var{Standard-Wert1})
443                     ...) ]
444   ..Befehlkörper..)
445 @end lisp
446
447 Die Argumente sind:
448
449 @table @var
450 @item @var{befehl-bezeichnung}
451 die Bezeichnung des Befehls
452
453 @item @var{layout}
454 die @q{layout}-Definition
455
456 @item props
457 eine Liste an  assoziativen Listen, in der alle aktiven Eigenschaften enthalten sind
458
459 @item @var{argi}
460 das @var{i}te Befehlsargument
461
462 @item @var{argi-type?}
463 eine Eigenschaft für das @var{i}te Argument
464 @end table
465
466 Wenn der Befehl Eigenschaften des @code{props}-Arguments benutzt,
467 kann das @code{#:properties}-Schlüsselwort benutzt werden um zu
468 bestimmen, welche Eigenschaften mit welchen Standard-Werten benutzt
469 werden.
470
471 Argumente werden nach ihrem Typ unterschieden:
472
473 @itemize
474 @item eine Textbeschriftung entspricht einem Typenprädikat @code{markup?};
475 @item eine Textbeschriftungsliste entspricht einem Typenprädikat
476 @code{markup-list?};
477 @item jedes andere Scheme-Objekt entspricht Typenprädikaten wie etwa
478 @code{list?}, @code{number?}, @code{boolean?}, usw.
479 @end itemize
480
481 Es gibt keine Einschränkung in der Reihenfolge der Argumente (nach
482 den Standard-Argumenten @code{layout} und @code{props}).  Textbeschriftungsfunktionen,
483 die als letztes Argument eine Textbeschriftung haben, haben die
484 Besonderheit, dass sie auf Textbeschriftungslisten angewendet werden
485 können, und das Resultat ist eine Textbeschriftungsliste, in der
486 die Textbeschriftungsfuktion (mit den angegebenen Argumenten am Anfang)
487 auf jedes Element der originalen Textbeschriftungsliste angewendet
488 wurde.
489
490 Da das Wiederholen der Argumente am Anfang bei der Anwendung einer
491 Textbeschriftungsfunktion auf eine Textbeschriftungsliste for allem
492 für Scheme-Argumente sparsam ist, kann man Leistungseinbußen vermeiden,
493 indem man nur Scheme-Argumente für die Argumente am Anfang einsetzt,
494 wenn es sich um Textbeschriftungsfunktionen handelt, die eine Textbeschriftung
495 als letztes Argument haben.
496
497
498 @node Über Eigenschaften
499 @unnumberedsubsubsec Über Eigenschaften
500 @translationof On properties
501
502 Die @code{layout}- und @code{props}-Argumente der Textbeschriftungsbefehle
503 bringen einen Kontext für die Interpretation der Beschriftung:
504 Schriftgröße, Zeilenlänge usw.
505
506 Das @code{layout}-Argument greift auf Eigenschaften zu, die in der
507 @code{paper}-Umgebung definiert werden, indem man die @code{ly:output-def-lookup}-Funktion
508 benutzt.  Beispielsweise liest man die Zeilenlänge (die gleiche, die auch in
509 Partituren benutzt wird) aus mit:
510
511 @example
512 (ly:output-def-lookup layout 'line-width)
513 @end example
514
515 Das @code{props}-Argument stellt einige Eigenschaften für die Textbeschriftungsbefehle
516 zur Verfügung.  Beispielsweise wenn der Überschrifttext einer
517 @code{book}-Umgebung interpretiert wird, werden alle Variablen, die
518 in der @code{\header}-Umgebung definiert werden, automatisch zu @code{props}
519 hinzugefügt, sodass die Beschriftung auf Titel, Komponist usw. der
520 @code{book}-Umgebung zugreifen kann.  Das ist auch eine Möglichkeit, das
521 Verhalten eines Beschriftungsbefehls zu konfigurieren: Wenn etwa ein
522 Befehl die Schriftgröße während der Verarbeitung einsetzt, wird die
523 Schriftgröße aus den @code{props} ausgelesen und nicht mit einem eigenen
524 @code{font-size}-Argument definiert.  Beim Aufruf des Beschriftungsbefehls
525 kann der Wert der Schriftgröße geändert werden, womit sich auch das Verhalten
526 des Befehls verändert.  Benutzen Sie das @code{#:properties}-Schlüsselwort
527 von @code{define-markup-command} um zu definieren, welche Eigenschaften aus den
528 @code{props}-Argumenten ausgelesen werden sollen.
529
530 Das Beispiel im nächsten Abschnitt illustriert, wie man auf Eigenschaften
531 in einem Beschriftungsbefehl zugreifen und sie verändern kann.
532
533
534 @node Ein vollständiges Bespiel
535 @unnumberedsubsubsec Ein vollständiges Bespiel
536 @translationof A complete example
537
538 Das folgende Beispiel definiert einen Beschriftungsbefehl, der einen
539 doppelten Kasten um einen Text zeichnet.
540
541 Zuerst wollen wir ein annäherndes Ergebnis mit Textbeschriftungen definieren.
542 Nach Stöbern in @ruser{Textbeschriftungsbefehle} finden wir den Befehl
543 @code{\box}:
544
545 @lilypond[quote,verbatim,ragged-right]
546 \markup \box \box HELLO
547 @end lilypond
548
549 Wir wollen aber etwas mehr Abstand (engl. padding) zwischen dem Text und dem Kasten.
550 Nach der Dokumentation von @code{\box} hat der Befehl eine
551 @code{box-padding}-Eigenschaft, die den Standardwert von 0.2 hat.  Die
552 Dokumentation zeit auch, wir man den Wert verändert:
553
554 @lilypond[quote,verbatim,ragged-right]
555 \markup \box \override #'(box-padding . 0.6) \box A
556 @end lilypond
557
558 Auch der Abstand zwischen den zwei Kästen ist uns zu klein und soll auch
559 vergrößert werden:
560
561 @lilypond[quote,verbatim,ragged-right]
562 \markup \override #'(box-padding . 0.4) \box \override #'(box-padding . 0.6) \box A
563 @end lilypond
564
565 Diese lange Textbeschriftung immer wieder schreiben zu müssen, ist
566 anstrengend.  Hier kömmt ein Textbeschriftungsbefehl ins Spiel.  Wir
567 schreiben uns alle einen @code{double-box}-Beschriftungsbefehl, der
568 ein Argument annimmt (den Text).  Er zeichnet zwei Kästen mit genügend Abstand:
569
570 @lisp
571 #(define-markup-command (double-box layout props text) (markup?)
572   "Draw a double box around text."
573   (interpret-markup layout props
574     (markup #:override '(box-padding . 0.4) #:box
575             #:override '(box-padding . 0.6) #:box text)))
576 @end lisp
577
578 @code{text} ist die Bezeichnung des Arguments dieses Befehls,
579 und @code{markup?} ist seine Art: hiermit wird der Befehl als
580 Beschriftungsbefehl identifiziert.  Die @code{interpret-markup}-Funktion
581 wird in den meisten Beschriftungsbefehlen benutzt: sie erstellt einen
582 Stencil, wobei @code{layout}, @code{props} und eine Beschriftung benutzt
583 werden.  In unserem Fall wird diese Beschriftung durch das
584 @code{markup}-Scheme-Makro erstellt, siehe auche @ref{Beschriftungskonstruktionen in Scheme}.
585 Die Transformation des @code{\markup}-Ausdrucks in einen
586 Scheme-Beschriftungsausdruck geschieht durch umschreiben des LilyPond-Codes
587 in Scheme-Code.
588
589 Der neue Befehl kann wie folgt benutzt werden:
590
591 @example
592 \markup \double-box A
593 @end example
594
595 Es wäre schön, den @code{double-box}-Befehl noch konfigurierbar zu gestalten:
596 in unserem Fall sind die Werte von @code{box-padding} direkt definiert und
597 können nicht mehr vom Benutzer verändert werden.  Es wäre auch besser, wenn
598 der Abstand zwischen den beiden Kästen vom Abstand zwischen dem inneren Kasten
599 und dem Text unterschieden werden könnte.  Eine neue Eigenschaft muss also
600 definiert werden: @code{inter-box-padding} für den Abstand zwischen den Kästen.
601 @code{box-padding} wird für den inneren Abstand benutzt.  Der neue Befehl wird
602 so definiert:
603
604 @lisp
605 #(define-markup-command (double-box layout props text) (markup?)
606   #:properties ((inter-box-padding 0.4)
607                 (box-padding 0.6))
608   "Draw a double box around text."
609   (interpret-markup layout props
610     (markup #:override `(box-padding . ,inter-box-padding) #:box
611             #:override `(box-padding . ,box-padding) #:box text)))
612 @end lisp
613
614 In diesem Code wird das @code{#:properties}-Schlüsselwort benutzt, sodass
615 die Eigenschaften @code{inter-box-padding} und @code{box-padding} aus dem
616 @code{props}-Argument ausgelesen werden, und Standardwerte werden gegeben,
617 falls die Eigenschaften nicht definiert sein sollten.
618
619 Dann werden diese Werte benutzt, um die @code{box-padding}-Eigenschaft
620 zu verändert, die von beiden @code{\box}-Befehlen benutzt wird.  Beachten
621 Sie Akzent und das Komma des @code{\override}-Arguments: hiermit kann man
622 einen Variablenwert in einen wörtlichen Ausdruck überführen.
623
624 Jetzt kann der Befehl in Beschriftungen benutzt werden und der Abstand
625 der Kästen kann angepasst werden:
626
627 @lilypond[quote,verbatim,ragged-right]
628 #(define-markup-command (double-box layout props text) (markup?)
629   #:properties ((inter-box-padding 0.4)
630                 (box-padding 0.6))
631   "Draw a double box around text."
632   (interpret-markup layout props
633     (markup #:override `(box-padding . ,inter-box-padding) #:box
634             #:override `(box-padding . ,box-padding) #:box text)))
635
636 \markup \double-box A
637 \markup \override #'(inter-box-padding . 0.8) \double-box A
638 \markup \override #'(box-padding . 1.0) \double-box A
639 @end lilypond
640
641 @node Eingebaute Befehle anpassen
642 @unnumberedsubsubsec Eingebaute Befehle anpassen
643 @translationof Adapting builtin commands
644
645 Ein guter Weg, einen neuen Beschriftungsbefehl zu schreiben, ist es, als Vorbild
646 einen existierenden zu nehmen.  Die meisten Beschriftungsbefehle, die
647 LilyPond mitbringt, finden sich in der Datei
648 @file{scm/define-markup-commands.scm}.
649
650 Man könnte beispielsweise den Befehl @code{\draw-line}, der eine Linie
651 zeichnet, anpassen, sodass er eine Doppellinie zeichnet.  Der
652 Befehl @code{\draw-line} ist wie folgend definiert (Dokumentation entfernt):
653
654 @lisp
655 (define-markup-command (draw-line layout props dest)
656   (number-pair?)
657   #:category graphic
658   #:properties ((thickness 1))
659   "..documentation.."
660   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
661                thickness))
662         (x (car dest))
663         (y (cdr dest)))
664     (make-line-stencil th 0 0 x y)))
665 @end lisp
666
667 Um einen neuen Befehl, der auf einem existierenden basiert, zu definieren,
668 wird die Befehlsdefinition kopiert und die Bezeichnung des Befehls
669 geändert.  Das @code{#:category}-Schlagwort kann entfernt werden,
670 weil es nur zur Erstellung der LilyPond-Dokumentation eingesetzt wird
671 und keine Bedeutung für selbstdefinierte Befehle hat.
672
673 @lisp
674 (define-markup-command (draw-double-line layout props dest)
675   (number-pair?)
676   #:properties ((thickness 1))
677   "..documentation.."
678   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
679                thickness))
680         (x (car dest))
681         (y (cdr dest)))
682     (make-line-stencil th 0 0 x y)))
683 @end lisp
684
685 Dann braucht man eine Eigenschaft, um den Abstand zwischen den zwei
686 Linien zu definieren, als @code{line-gap} bezeichnet und etwa mit
687 dem Standardwert 0.6:
688
689 @lisp
690 (define-markup-command (draw-double-line layout props dest)
691   (number-pair?)
692   #:properties ((thickness 1)
693                 (line-gap 0.6))
694   "..documentation.."
695   ...
696 @end lisp
697
698 Schließlich wird der Code, der die zwei Linien zeichnet, hinzugefügt.
699 Zwei Aufrufe an @code{make-line-stencil} werden benutzt, um beide Linien
700 zu zeichnen, und die beiden sich daraus ergebenden Stencils werden mit
701 @code{ly:stencil-add} kombiniert:
702
703 @lilypond[quote,verbatim,ragged-right]
704 #(define-markup-command (my-draw-line layout props dest)
705   (number-pair?)
706   #:properties ((thickness 1)
707                 (line-gap 0.6))
708   "..documentation.."
709   (let* ((th (* (ly:output-def-lookup layout 'line-thickness)
710                 thickness))
711          (dx (car dest))
712          (dy (cdr dest))
713          (w (/ line-gap 2.0))
714          (x (cond ((= dx 0) w)
715                   ((= dy 0) 0)
716                   (else (/ w (sqrt (+ 1 (* (/ dx dy) (/ dx dy))))))))
717          (y (* (if (< (* dx dy) 0) 1 -1)
718                (cond ((= dy 0) w)
719                      ((= dx 0) 0)
720                      (else (/ w (sqrt (+ 1 (* (/ dy dx) (/ dy dx))))))))))
721      (ly:stencil-add (make-line-stencil th x y (+ dx x) (+ dy y))
722                      (make-line-stencil th (- x) (- y) (- dx x) (- dy y)))))
723
724 \markup \my-draw-line #'(4 . 3)
725 \markup \override #'(line-gap . 1.2) \my-draw-line #'(4 . 3)
726 @end lilypond
727
728
729
730 @node Neue Definitionen von Beschriftungslistenbefehlen
731 @subsection Neue Definitionen von Beschriftungslistenbefehlen
732 @translationof New markup list command definition
733
734 Beschriftungslistenbefehle können mit dem Scheme-Makro
735 @code{define-markup-list-command} definiert werden, welches
736 sich ähnlich verhält wie das
737 @code{define-markup-command}-Makro, das schon beschrieben
738 wurde in @ref{Neue Definitionen von Beschriftungsbefehlen}.  Ein Unterschied
739 ist, dass bei diesem Listen-Makro eine ganze Liste an
740 Stencils ausgegeben wird.
741
742 Im folgenden Beispiel wird ein @code{\paragraph}-Beschriftungslistenbefehl
743 definiert, welcher eine Liste von Zeilen im Blocksatz ausgibt, von
744 denen die erste Zeile eingerückt ist.  Der Einzug wird aus dem
745 @code{props}-Argument entnommen.
746
747 @example
748 #(define-markup-list-command (paragraph layout props args) (markup-list?)
749    (let ((indent (chain-assoc-get 'par-indent props 2)))
750      (interpret-markup-list layout props
751        (make-justified-lines-markup-list (cons (make-hspace-markup indent)
752                                                args)))))
753 @end example
754
755 Neben den üblichen @code{layout} und @code{props}-Argumenten nimmt der
756 @code{paragraph}-Beschriftungslistenbefehl als Argument eine Beschriftungsliste,
757 die @code{args} genannt wird.  Das Prädikat für Beschriftungslisten ist
758 @code{markup-list?}.
759
760 Zuerst errechnet die Funktion die Breite des Einzugs, eine Eigenschaft
761 mit der Bezeichnung @code{par-indent} anhand der Eigenschaftsliste
762 @code{props}.  Wenn die Eigenschaft nicht gefunden wird, ist der
763 Standardwert @code{2}.  Danach wird eine Liste von Zeilen im Blocksatz
764 erstellt, wobei die @code{make-justified-lines-markup-list}-Funktion
765 eingesetzt wird, die verwandt ist mit dem eingebauten
766 @code{\justified-lines}-Beschriftungslistenbefehl.  Horizontaler
767 Platz wird zu Beginn eingefügt mit der @code{make-hspace-markup}-Funktion.
768 Zuletzt wird die Beschriftungsliste ausgewertet durch die
769 @code{interpret-markup-list}-Funktion.
770
771 Dieser neue Beschriftungslistenbefehl kann wie folgt benutzt werden:
772
773 @example
774 \markuplines @{
775   \paragraph @{
776     Die Kunst des Notensatzes wird auch als \italic @{Notenstich@} bezeichnet. Dieser
777     Begriff stammt aus dem traditionellen Notendruck. Noch bis vor etwa
778     20 Jahren wurden Noten erstellt, indem man sie in eine Zink- oder
779     Zinnplatte schnitt oder mit Stempeln schlug.
780   @}
781   \override-lines #'(par-indent . 4) \paragraph @{
782     Diese Platte wurde dann mit Druckerschwärze versehen, so dass sie
783     in den geschnittenen und gestempelten Vertiefungen blieb. Diese
784     Vertiefungen schwärzten dann ein auf die Platte gelegtes Papier.
785     Das Gravieren wurde vollständig von Hand erledigt.
786   @}
787 @}
788 @end example
789
790
791
792 @node Kontexte für Programmierer
793 @section Kontexte für Programmierer
794 @translationof Contexts for programmers
795
796 @menu
797 * Kontextauswertung::
798 * Eine Funktion auf alle Layout-Objekte anwenden::
799 @end menu
800
801 @node Kontextauswertung
802 @subsection Kontextauswertung
803 @translationof Context evaluation
804
805 @cindex Aufrufen von Code während der Interpretation
806 @cindex On-the-fly Code ausführen
807
808 @funindex \applyContext
809
810 Kontexte können während ihrer Interpretation mit Scheme-Code
811 modifiziert werden.  Die Syntax hierfür ist
812
813 @example
814 \applyContext @var{function}
815 @end example
816
817 @var{function} sollte eine Scheme-Funktion sein, die ein
818 einziges Argument braucht, welches der Kontext ist, auf den
819 sie ausgeführt werden soll.  Der folgende Code schreibt
820 die aktuelle Taktzahl in die Standardausgabe
821 während der Kompilation.
822
823 @example
824 \applyContext
825   #(lambda (x)
826     (format #t "\nWe were called in barnumber ~a.\n"
827      (ly:context-property x 'currentBarNumber)))
828 @end example
829
830
831
832 @node Eine Funktion auf alle Layout-Objekte anwenden
833 @subsection Eine Funktion auf alle Layout-Objekte anwenden
834 @translationof Running a function on all layout objects
835
836
837 @cindex Aufruf von Code für Layoutobjekte
838
839 @funindex \applyOutput
840
841 Der vielfältigste Weg, ein Objekt zu beeinflussen, ist
842 @code{\applyOutput}.  Das funktioniert, indem ein musikalisches
843 Ereignis in den angegebenen Kontext eingefügt wird
844 (@rinternals{ApplyOutputEvent}).  Die Syntax lautet:
845
846 @example
847 \applyOutput @var{Kontext} @var{proc}
848 @end example
849
850 @noindent
851 wobei @var{proc} eine Scheme-Funktion ist, die drei Argumente
852 benötigt.
853
854 Während der Interpretation wird die Funktion @code{@var{proc}} für
855 jedes Layoutobjekt aufgerufen, dass im Kontext @code{@var{Kontext}}
856 vorgefunden wird, und zwar mit folgenden Argumenten:
857
858 @itemize
859 @item dem Layoutobjekt
860 @item dem Kontext, in dem das Objekt erstellt wurde
861 @item dem Kontext, in welchem @code{\applyOutput} bearbeitet wird.
862 @end itemize
863
864 Zusätzlich findet sich der Grund für das Layoutobjekt, etwa
865 der musikalische Ausdruck oder das Objekt, das für seine Erstellung
866 verantwortlich war, in der Objekteigenschaft @code{cause}.
867 Für einen Notenkopf beispielsweise ist das ein
868 @rinternals{NoteHead}-Ereignis, und für einen Notenhals ist es
869 ein @rinternals{Stem}-Objekt.
870
871 Hier ist eine Funktion, die mit @code{\applyOutput} benutzt
872 werden kann; sie macht Notenköpfe auf und neben der Mittellinie unsichtbar:
873
874 @lilypond[quote,verbatim,ragged-right]
875 #(define (blanker grob grob-origin context)
876    (if (and (memq 'note-head-interface (ly:grob-interfaces grob))
877             (< (abs (ly:grob-property grob 'staff-position)) 2))
878        (set! (ly:grob-property grob 'transparent) #t)))
879
880 \relative c' {
881   a'4 e8 <<\applyOutput #'Voice #blanker a c d>> b2
882 }
883 @end lilypond
884
885
886 @node Callback-Funktionen
887 @section Callback-Funktionen
888 @translationof Callback functions
889
890 Eigenschaften (wie Dicke (@code{thickness}), Richtung (@code{direction})
891 usw.) können mit @code{\override} auf feste Werte gesetzt werden, etwa:
892
893 @example
894 \override Stem #'thickness = #2.0
895 @end example
896
897 Eigenschaften können auch auf eine Scheme-Prozedur gesetzt werden:
898
899 @lilypond[fragment,verbatim,quote,relative=2]
900 \override Stem #'thickness = #(lambda (grob)
901     (if (= UP (ly:grob-property grob 'direction))
902         2.0
903         7.0))
904 c b a g b a g b
905 @end lilypond
906
907 @noindent
908 In diesem Fall wird die Prozedur ausgeführt, sobald der Wert der
909 Eigenschaft während das Formatierungsprozesses angefordert wird.
910
911 Der größte Teil der Satzmaschinierie funktioniert mit derartigen
912 Callbacks.  Eigenschaften, die üblicherweise Callbacks
913 benutzen, sind u. A.:
914
915 @table @code
916 @item stencil
917   Die Druckfunktion, die eine Ausgabe des Symbols hervorruft
918 @item X-offset
919   Die Funktion, die die horizontale Position setzt
920 @item X-extent
921   Die Funktion, die die Breite eines Objekts errechnet
922 @end table
923
924 Die Funktionen brauchen immer ein einziges Argument, das der
925 Grob ist.
926
927 Wenn Funktionen mit mehreren Argumenten aufgerufen werden müssen,
928 kann der aktuelle Grob mit einer Grob-Einschließung
929 eingefügt werden.  Hier eine Einstellung aus
930 @code{AccidentalSuggestion}:
931
932 @example
933 (X-offset .
934   ,(ly:make-simple-closure
935     `(,+
936         ,(ly:make-simple-closure
937            (list ly:self-alignment-interface::centered-on-x-parent))
938       ,(ly:make-simple-closure
939            (list ly:self-alignment-interface::x-aligned-on-self)))))
940 @end example
941
942 @noindent
943 In diesem Beispiel werden sowohl @code{ly:self-alignment-interface::x-aligned-on-self}
944 als auch @code{ly:self-alignment-interface::centered-on-x-parent}
945 mit dem Grob als Argument aufgerufen.  Die Resultate werden mit der
946 @code{+}-Funktion addiert.  Um sicherzugehen, dass die Addition
947 richtig ausgeführt wird, wird das ganze Konstrukt in
948 @code{ly:make-simple-closure} eingeschlossen.
949
950 In der Tat ist die Benutzung einer einzelnen Funktion als
951 Eigenschaftswert äquivalent zu
952
953 @example
954 (ly:make-simple-closure (ly:make-simple-closure (list @var{proc})))
955 @end example
956
957 @noindent
958 Das innere @code{ly:make-simple-closure} stellt den Grob als Argument
959 für @var{proc} zur Verfügung, das äußere stellt sicher, dass das
960 Resultat der Funktion ausgegeben wird und nicht das
961 @code{simple-closure}-Objekt.
962
963 Aus dem Callback heraus kann man eine Beschriftung am einfachsten mit
964 @code{grob-interpret-markup} auswerten.  Beispielsweise:
965
966 @example
967 mein-callback = #(lambda (grob)
968                  (grob-interpret-markup grob (markup "foo")))
969 @end example
970
971
972
973
974
975
976 @node Scheme-Code innerhalb LilyPonds
977 @section Scheme-Code innerhalb LilyPonds
978 @translationof Inline Scheme code
979
980 Der hauptsächliche Nachteil von @code{\tweak} ist seine
981 syntaktische Inflexibilität.  Folgender Code beispielsweise
982 ergibt einen Syntaxfehler:
983
984 @example
985 F = \tweak #'font-size #-3 -\flageolet
986
987 \relative c'' @{
988   c4^\F c4_\F
989 @}
990 @end example
991
992 @noindent
993 Anders gesagt verhält sich @code{\tweak} nicht wie eine Artikulation
994 und kann auch nicht deren Syntax verwenden: man kann es nicht
995 mit @code{^} oder @code{_} anfügen.
996
997 Durch die Verwendung von Scheme kann dieses Problem umgangen werden.
998 Der Weg zum Resultat wird gezeigt in
999 @ref{Artikulationszeichen zu Noten hinzufügen (Beispiel)}, insbesondere
1000 wie @code{\displayMusic} benutzt wird, hilft hier weiter.
1001
1002 @example
1003 F = #(let ((m (make-music 'ArticulationEvent
1004                           'articulation-type "flageolet")))
1005        (set! (ly:music-property m 'tweaks)
1006              (acons 'font-size -3
1007                     (ly:music-property m 'tweaks)))
1008        m)
1009
1010 \relative c'' @{
1011   c4^\F c4_\F
1012 @}
1013 @end example
1014
1015 @noindent
1016 In diesem Beispiel werden die @code{tweaks}-Eigenschaften
1017 des Flageolet-Objekts @code{m} (mit @code{make-music} erstellt)
1018 werden mit @code{ly:music-property} ausgelesen, ein neues
1019 Schlüssel-Wert-Paar, um die Schriftgröße zu ändern, wird
1020 der Eigenschaftenliste mithilfe der @code{acons}-Schemefunktion
1021 vorangestellt, und das Resultat wird schließlich mit
1022 @code{set!} zurückgeschrieben.  Das letzte Element des
1023 @code{let}-Blocks ist der Wiedergabewert, @code{m}.
1024
1025
1026
1027 @node Schwierige Korrekturen
1028 @section Schwierige Korrekturen
1029 @translationof Difficult tweaks
1030
1031 Hier finden sich einige Klassen an schwierigeren Anpassungen.
1032
1033 @itemize
1034
1035 @item
1036 Ein Typ der schwierigen Anpassungen ist die Erscheinung von
1037 Strecker-Objekten wie Binde- oder Legatobögen.  Zunächst wird
1038 nur eins dieser Objekte erstellt, und sie können mit dem
1039 normalen Mechanismus verändert werden.  In einigen Fällen
1040 reichen die Strecker jedoch über Zeilenumbrüche.  Wenn das
1041 geschieht, werden diese Objekte geklont.  Ein eigenes
1042 Objekt wird für jedes System erstellt, in dem es sich befindet.
1043 Sie sind Klone des originalen Objektes und erben alle
1044 Eigenschaften, auch @code{\override}-Befehle.
1045
1046 Anders gesagt wirkt sich ein @code{\override} immer auf alle
1047 Stücke eines geteilten Streckers aus.  Um nur einen Teil eines
1048 Streckers bei einem Zeilenumbruch zu verändern, ist es notwendig,
1049 in den Formatierungsprozess einzugreifen.  Das Callback
1050 @code{after-line-breaking} enthält die Schemefunktion, die
1051 aufgerufen wird, nachdem Zeilenumbrüche errechnet worden sind
1052 und die Layout-Objekte über die unterschiedlichen Systeme verteilt
1053 wurden.
1054
1055 Im folgenden Beispiel wird die Funktion
1056 @code{my-callback} definiert.  Diese Funktion
1057
1058 @itemize
1059 @item
1060 bestimmt, ob das Objekt durch Zeilenumbrüche geteilt ist,
1061 @item
1062 wenn ja, ruft sie alle geteilten Objekte auf,
1063 @item
1064 testet, ob es sich um das letzte der geteilten Objekte handelt,
1065 @item
1066 wenn ja, wird @code{extra-offset} gesetzt.
1067 @end itemize
1068
1069 Diese Funktion muss in @rinternals{Tie} (Bindebogen) installiert
1070 werden, damit der letzte Teil eines gebrochenen Bindebogens
1071 neu ausgerichtet wird.
1072
1073 @lilypond[quote,verbatim,ragged-right]
1074 #(define (my-callback grob)
1075   (let* (
1076          ; have we been split?
1077          (orig (ly:grob-original grob))
1078
1079          ; if yes, get the split pieces (our siblings)
1080          (siblings (if (ly:grob? orig)
1081                      (ly:spanner-broken-into orig) '() )))
1082
1083    (if (and (>= (length siblings) 2)
1084              (eq? (car (last-pair siblings)) grob))
1085      (ly:grob-set-property! grob 'extra-offset '(-2 . 5)))))
1086
1087 \relative c'' {
1088   \override Tie #'after-line-breaking =
1089   #my-callback
1090   c1 ~ \break c2 ~ c
1091 }
1092 @end lilypond
1093
1094 @noindent
1095 Wenn man diesen Trick anwendet, sollte das neue @code{after-line-breaking}
1096 auch das alte @code{after-line-breaking}-Callback aufrufen,
1097 wenn es vorhanden ist.  Wenn diese Funktion etwa mit
1098 @code{Hairpin} (Crescendo-Klammer) eingesetzt wird, sollte auch
1099 @code{ly:spanner::kill-zero-spanned-time} aufgerufen werden.
1100
1101
1102 @item
1103 Manche Objekte können aus technischen Gründen nicht mit @code{\override}
1104 verändert werden.  Beispiele hiervon sind @code{NonMusicalPaperColumn}
1105 und @code{PaperColumn}.  Sie können mit der
1106 @code{\overrideProperty}-Funktion geändert werden, die ähnlich wie
1107 @code{\once \override} funktioniert, aber eine andere Syntax einsetzt.
1108
1109 @example
1110 \overrideProperty
1111 #"Score.NonMusicalPaperColumn"  % Grob-Bezeichnung
1112 #'line-break-system-details     % Eigenschaftsbezeichnung
1113 #'((next-padding . 20))         % Wert
1114 @end example
1115
1116 Es sollte angemerkt werden, dass @code{\override}, wenn man es auf
1117 @code{NonMusicalPaperColumn} und @code{PaperColumn} anwendet, immer noch
1118 innerhalb der @code{\context}-Umgebung funktioniert.
1119
1120 @end itemize
1121
1122
1123
1124 @node LilyPond Scheme-Schnittstellen
1125 @chapter LilyPond Scheme-Schnittstellen
1126 @translationof LilyPond Scheme interfaces
1127
1128 Dieses Kapitel behandelt die verschiedenen Werkzeuge, die LilyPond als
1129 Hilfe für Scheme-Programmierer zur Verfügung stellt, um Information in
1130 den Musik-Stream zu senden und aus ihm herauszubekommen.
1131
1132 TODO: was gehört hier eigentlich hin?