]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/de/extending/programming-interface.itely
Fixed errors in Catalan translation
[lilypond.git] / Documentation / de / extending / programming-interface.itely
1 @c -*- coding: utf-8; mode: texinfo; -*-
2
3 @ignore
4     Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94
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.17.6"
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 * LilyPond-Codeabschnitte::
26 * Scheme-Funktionen::
27 * Musikalische Funktionen::
28 * Ereignisfunktionen::
29 * Textbeschriftungsfunktionen::
30 * Kontexte für Programmierer::
31 * Callback-Funktionen::
32 * Scheme-Code innerhalb LilyPonds::
33 * Schwierige Korrekturen::
34 @end menu
35
36
37 @node LilyPond-Codeabschnitte
38 @section LilyPond-Codeabschnitte
39 @translationof Lilypond code blocks
40
41 Codeabschnitte in LilyPond sehen etwa so aus:
42
43 @example
44   #@{ @var{Lilypond code} #@}
45 @end example
46
47 Sie können überall eingesetzt werden, wo man Scheme-Code schreiben
48 kann: der Scheme-Einleser wurde geändert, um LilyPond-Codeabschnitte
49 zu akzeptieren und kann mit eingebetteten Scheme-Ausdrücken umgehen,
50 die mit @code{$} und@w{ }@code{#} beginnen.
51
52 Er extrahiert den LilyPond-Codeabschnitt und erstellt einen Aufruf
53 zum LilyPond-Parser, welcher während der Prorammausführung zur
54 Interpretation des LilyPond-Codeabschnittes aufgerufen wird.  Alle
55 eingebetteten Scheme-Ausdrücke werden in der lokalen Umgebung des
56 LilyPond-Codeabschnittes ausgeführt, sodass man Zugruff auf lokale
57 Variablen und Funktionsparameter zu dem Zeitpunkt hat, an dem
58 der LilyPond-Codeabschnitt geschrieben wird.
59
60 Ein LilyPond-Codeabschnitt kann jeden Inhalt haben, den man auf
61 der rechten Seite einer Zuweisung einsetzt.  Zusätzlich entspricht
62 ein leerer LilyPond-Abschnitt einem gültigen musikalischen Ausdruck,
63 und ein LilyPond-Abschnitt, der mehrere musikalische Ereignisse enthält,
64 wird in einen sequenziellen musikalischen Ausdruck umgewandelt.
65
66
67 @node Scheme-Funktionen
68 @section Scheme-Funktionen
69 @translationof Scheme functions
70
71 @cindex Scheme-Funktionen (LilyPond syntax)
72
73 @emph{Scheme-Funktionen} sind Scheme-Prozeduren, die Scheme-Ausdrücke
74 aus einer Eingabe erstellen können, die in LilyPond-Syntax geschrieben
75 wurde.  Sie können in so gut wie allen Fällen aufgerufen werden, in
76 denen es erlaubt ist, @code{#} zur Angabe eines Wertes in Scheme-Syntax
77 einzusetzen.  Während Scheme auch eigene Funktionen besitzt, handelt
78 % dieses kapitel von @emph{syntaktischen} Funktionen, Funktionen, die
79 Argumente in LilyPond-Syntax annehmen.
80
81 @menu
82 * Definition von Scheme-Funktionen::
83 * Benutzung von Scheme-Funktionen::
84 * Leere Scheme-Funktionen::
85 @end menu
86
87 @node Definition von Scheme-Funktionen
88 @subsection Definition von Scheme-Funktionen
89 @translationof Scheme function definitions
90
91 @funindex define-scheme-function
92
93 Die übliche Form zur Definition von Scheme-Funktionen ist:
94
95 @example
96 function =
97 #(define-scheme-function
98      (parser location @var{Arg1} @var{Arg2} @dots{})
99      (@var{Typ1?} @var{Typ2?} @dots{})
100    @var{body})
101 @end example
102
103 @noindent
104 wobei
105
106 @multitable @columnfractions .33 .66
107 @item @code{parser}
108 @tab ganz genau das Wort @code{parser} sein muss, damit LilyPond
109 eine Umgebung (@code{#@{}@dots{}@code{#@}}) mit Zugriff
110 auf den Parser bekommt.
111
112 @item @code{@var{ArgN}}
113 @tab @var{n}te Argument
114
115 @item @code{@var{TypN?}}
116 @tab eine Scheme-@emph{Typenprädikat}, für welches @code{@var{argN}}
117 @code{#t} ausgeben muss.  Manche dieser Prädikate werden vom Parser
118 besonders erkannt, siehe unten.  Es gibt auch eine Spezialform
119 @code{(@emph{predicate?} @emph{default})}, um optionale Argumente
120 anzugeben.  Wenn das eigentlich Argument fehlt, während die Funktion
121 aufgerufen wird, wird der Standardwert anstelle eingesetzt.  Standardwerte
122 werden bei ihrer Definition evaluiert (gilt auch für
123 LilyPond-Codeabschnitte), so dass man besser einen speziellen Wert
124 schreibt, den man einfach erkennen kann, wenn der Wert während der
125 Ausführung der Position evaluiert weren soll.  Wenn man das Prädikat
126 in Klammern setzt, aber  kein Standardwert folt, wird @code{#f}
127 als Standard eingesetzt.  Standardwerte werden weder bei der Definition
128 noch bei der Ausführung mit @emph{predicate?} verifiziert, sodass
129 man selber verantworlich für funktionsfähige Werte ist.  Standardwerte,
130 die musikalische Ausdrücke darstellen, werden kopiert und @code{origin}
131 auf den Parameter @code{location} gesetzt.
132
133 @item @code{@var{body}}
134 @tab Eine Folge von Scheme-Formeln, die der Reihe nach ausgewertet
135 werden, wobei die letzte als Ausgabewert der Scheme-Funktion eingesetzt
136 wird.  Sie kann LilyPond-Codeabschnitte enthalten, eingeschlossen mit
137 Raute-Klammern (@tie{}@w{@code{#@{@dots{}#@}}}@tie{}), wie beschrieben
138 in @ref{LilyPond-Codeabschnitte}.  Innerhalb von LilyPond-Codeabschnitten
139 wird mit @code{#} auf Funktionsargumente (etwa @samp{#Arg1}) verwiesen
140 oder ein neuer Scheme-Ausdruck mit Funktionsargumenten begonnen
141 (etwa @w{@samp{#(cons Arg1 Arg2)}}).  Wo normale Scheme-Ausdrücke mit
142 @code{#} nicht funktionieren, kann man auf direkte Scheme-Ausdrücke
143 zurückgreifen, die mit @code{$} begonnen werden (etwa @samp{$music}).
144
145 Wenn die Funktion eine musikalische Funktion ausgibt, bekommt sie einen
146 Wert von @code{origin}. zugewiesen.
147 @end multitable
148
149 @noindent
150 Einige Typenprädikate werden vom Parser besonders behandelt, weil
151 er sonst die Argumente nicht zuverlässig erkennen könnte.  Im Moment
152 handelt es sich um @code{ly:pitch?} und @code{ly:duration?}.
153
154 Die Eignung der Argumente für alle anderen Prädikate wird festgestellt,
155 indem das Prädikat aufgerufen wird, nachdem LilyPond es schon in einen
156 Scheme-Ausdruck umgewandelt hat.  Demzufolge kann das Argument in
157 Scheme-Syntax angegeben werden, wenn nötig (beginnend mit @code{#} oder
158 als Result des Aufrufes einer Scheme-Funktion), aber LilyPond
159 konvertiert auch eine Reihe von LilyPond-Strukturen nach Scheme,
160 bevor dann tatsächlich die Prädikate überprüft werden.  Bei den
161 letzteren handelt es sich im Moment um music (Noten), postevents,
162 simple strings (einfache Zeichenketten mit oder ohne Anführungszeichen)
163 numbers (Zahlen), markup (Beschriftung) und markup lists
164 (Beschriftungslisten), score (Partitur), book (Buch), bookpart
165 (Buchteil), Kontextdefinitions- und Ausgabedefinitionsumgebungen.
166
167 Für einige Arten von Ausdrücken (wie die meisten Noten, die nicht
168 in Klammern geschrieben werden) muss LilyPond weiter nach vorne
169 schauen als der Ausdruck selber reicht, um das Ende des Ausdrucks
170 zu bestimmen.  Wenn solche Ausdrücke für optionale Argumente mit
171 einbezogen würden, indem ihre Prädikate ausgewählt würden, könnte
172 LilyPond nicht mehr zurückgehen, wenn es feststellt, dass der
173 Ausdruck nicht zu dem Parameter passt.  Darum müssen manche Formen
174 von Noten möglicherweise in Klammern eingeschlossen werden, damit
175 LilyPond sie akzeptiert.  Es gibt auch einige andere Mehrdeutigkeiten,
176 die LilyPond durch Testen von Prädikatfunktionen eingrenzt:
177 ist etwa @samp{-3} die Anmerkung für einen Fingersatz oder eine
178 negative Zahl? Ist @code{"a" 4} im Gesangskontext eine Zeichenkette
179 gefolgt von einer Zahl oder ein Gesangstextereignis mit der Dauer
180 @code{4}?  LilyPond entscheidet, indem es Prädaikate befragt.  Das
181 heißt, dass man zu durchlässige Prädikate wie @code{scheme?}
182 vermeiden sollte, wenn man eine bestimmmte Verwendung beabsichtigt
183 und nicht nur eine Funktion für die allgemeine Verwendung schreibt.
184
185 Eine Liste der möglichen vordefinierten Typenprädikte findet sich in
186 @ruser{Vordefinierte Typenprädikate}.
187
188 @seealso
189
190 Notationsreferenz
191 @ruser{Vordefinierte Typenprädikate}.
192
193 Installierte Dateien:
194 @file{lily/music-scheme.cc},
195 @file{scm/c++.scm},
196 @file{scm/lily.scm}.
197
198
199 @node Benutzung von Scheme-Funktionen
200 @subsection Benutzung von Scheme-Funktionen
201 @translationof Scheme function usage
202
203 Scheme-Funktionen können überall aufgerufen werden, wo ein
204 Scheme-Ausdruck beginnend mit @code{#} geschrieben werden kann.
205 Man kann eine Scheme-Funktion aufrufen, indem man ihrer Bezeichnung
206 @code{\} voranstellt und Argumente hinten anfügt.  Wenn ein optionales
207 Argumentenprädikat nicht mit einem Argument übereinstimmt, lässt
208 LilyPond dieses und alle folgenden Argumente aus und ersetzt sie
209 durch ihre Standardwerte und @qq{speichert} das Argument, das nicht
210 gepasst hat, bis zum nächsten zwingenden Argument.  Da das gespeicherte
211 Argument auch noch irgendwo untergebracht werden muss, werden
212 optionale Argumente nicht wirklich als optional angesehen, es sei denn,
213 sie werden von einem zwingenden Argument gefolgt.
214
215 Es gibt eine Ausnahme:  Wenn man @code{\default} anstelle eines optionalen
216 Arguments schreibt, wird dieses und alle folgenden Argumente ausgelassen
217 und durch ihre Standardwerte ersetzt.  Das funktioniert auch, wenn kein
218 zwingendes Argument folgt, weil @code{\default} nicht gespeichert werden
219 muss.  Die Befehle @code{mark} und @code{key} benützten diesen Trick,
220 um ihr Standardverhalten zur verfügung zu stellen, wenn sie
221 @code{\default} nachgestellt haben.
222
223 Abgesehen von Stellen, wo ein Scheme-Wert benötigt ist, gibt es
224 wenige Stellen, wo @code{#}-Ausdrücke zwar für ihre (Neben-)Wirkung
225 akzeptiert und ausgewertet, aber ansonsten ignoriert werden.  Meistens
226 handelt es sich dabei um Stellen, wo eine Zuweisung auch in Ordnung
227 wäre.
228
229 Weil es eine schlechte Idee ist, einen Wert auszugeben, der in einigen
230 Kontexten misinterpretiert werden könnte, sollte man Scheme-Funktionen
231 nur in den Fällen benutzen, in welchen sie immer einen sinnvollen
232 Wert ausgeben, und leere Scheme-Funktionen an anderen stellen
233 einsetzen.  Siehe auch @pxref{Leere Scheme-Funktionen}.
234
235
236 @node Leere Scheme-Funktionen
237 @subsection Leere Scheme-Funktionen
238 @translationof Void scheme functions
239
240 @funindex define-void-function
241 @funindex \void
242
243 Manchmal wird eine Prozedur ausgeführt, um eine Aktion zu machen und nicht,
244 um einen Wert auszugeben.  Einige Programmiersprachen (wie C oder Scheme)
245 setzen Funktionen für beide Konzepte ein und verwerfen einfach den
246 Rückgabewert (normalerweise, indem einem Ausdruck erlaubt wird, als
247 Aussage zu funktionieren und das Ergebnis ignoriert wird).  Das ist
248 klug, aber auch fehleranfällig:  die meisten C-Kompilierer haben heutzutage
249 Warnungen für verschiedene nicht-@qq{gültige} Ausdrücke, die verworfen
250 werden.  Viele Funktionen, die eine Aktion ausführen, werden von den
251 Scheme-Standards als Funktionen betrachtet, deren Wiedergabewert unspezifiert
252 ist.  Der Scheme-Interpreter von LilyPond, Guile, hat den eindeutigen
253 Wert @code{*unspecified*}, der normalerweise (etwa wenn man @code{set!}
254 direkt auf eine Variable anwendet), aber leider nicht konsistent in
255 diesen Fällen ausgegeben wird.
256
257 Indem man eine LilyPond-Funktion mit @code{define-void-function} definiert,
258 geht man sicher, dass dieser Spezialwert (der einzige Wert, der das
259 Prädikat @code{void?} erfüllt) wiedergegeben wird.
260
261 @example
262 noPointAndClick =
263 #(define-void-function
264      (parser location)
265      ()
266    (ly:set-option 'point-and-click #f))
267 ...
268 \noPointAndClick   % Point and Click deaktivieren
269 @end example
270
271 Wenn man einen Ausdruck nur wegen seiner Nebeneffekte evaluieren will
272 und keinen der möglicherweise ausgegebenen Werte interpretiert haben
273 will, kann man dem Ausdruck @code{\void} voranstellen:
274
275 @example
276 \void #(hashq-set! eine-Tabelle ein-Schlüssel ein-Wert)
277 @end example
278
279 Auf diese Weise kann man sicher sein, dass LilyPond dem ausgegebenen
280 Wert keine Bedeutung zuweist, unabhängig davon, wo er angetroffen wird.
281 Das funktioniert auch für musikalische Funktionen wie @code{\displayMusic}.
282
283
284 @node Musikalische Funktionen
285 @section Musikalische Funktionen
286 @translationof Music functions
287
288 @cindex musikalische Funktionen
289
290 @emph{Musikalische Funktionen} sind Scheme-Prozeduren,
291 die musikalische Ausdrücke automatisch erstellen können und dadurch die
292 Eingabedatei maßgeblich vereinfachen können.
293
294 @menu
295 * Definition der musikalischen Funktionen::
296 * Benutzung von musikalischen Funktionen::
297 * Einfache Ersetzungsfunktionen::
298 * Mittlere Ersetzungsfunktionen::
299 * Mathematik in Funktionen::
300 * Funktionen ohne Argumente::
301 * Leere musikalische Funktionen::
302 @end menu
303
304
305 @node Definition der musikalischen Funktionen
306 @subsection Definition der musikalischen Funktionen
307 @translationof Music function definitions
308
309 Die allgemeine Form zur Definition musikalischer Funktionen ist:
310
311 @example
312 function =
313 #(define-music-function
314      (parser location @var{Arg1} @var{Arg2} @dots{})
315      (@var{Typ1?} @var{Typ2?} @dots{})
316    @var{body})
317 @end example
318
319 @noindent
320 analot zu Scheme-Funktionen, siehe @ref{Definition von Scheme-Funktionen}.
321 In der Mehrzahl der Fälle ist @var{body} ein LilyPond-Codeabschnitt (siehe
322 @ref{LilyPond-Codeabschnitte}.
323
324 Eine Liste der möglichen Typenprädikate findet sich in
325 @ruser{Vordefinierte Typenprädikate}.
326
327 @seealso
328
329 Notationsreferenz:
330 @ruser{Vordefinierte Typenprädikate}.
331
332 Installierte Dateien:
333 @file{lily/music-scheme.cc},
334 @file{scm/c++.scm},
335 @file{scm/lily.scm}.
336
337
338 @node Benutzung von musikalischen Funktionen
339 @subsection Benutzung von musikalischen Funktionen
340 @translationof Music function usage
341
342 Musikalische Funktionen können zur Zeit an verschiedenen Stellen benützt
343 werden.  Abhängig davon, wo sie eingesetzt werden, gibt es Begrenzungen,
344 damit die Funktionen eindeutig interpretiert werden können.  Das Resultat,
345 das eine musikalische Funktion wiedergibt, muss mit dem Kontext kompatibel
346 sein, indem sie aufgerufen wird.
347
348 @itemize
349 @item
350 Auf höchster Ebene in einer musikalischen Funktion.  Keine Begrenzungen.
351
352 @item
353 Als ein Nach-Ereignis, explizit begonnen mit einem Richtungsindikator
354 (einer von @code{-}, @code{^}, @w{und @code{_}}).  Wichtig dabei ist,
355 dass musikalische Funktionen, die das Nachereignis ausgeben, als
356 normale Noten akzeptiert werden.  Dabei erhält man ein Resultat, das
357 etwa folgendem entspricht:
358
359 @example
360 s 1*0-\fun
361 @end example
362
363 In diesem Fall kann man keinen @emph{offenen} musikalischen Ausdruck als
364 letztes Argument einsetzen, also ein Argument, das in einem musikalischen
365 Ausdruck schließt, der weitere Nach-Ereignisse akzeptieren kann.
366
367 @item
368 Als Element eines Akkordes.  Der ausgegebene Ausdruck muss vom Typ
369 @code{rhythmic-event} sein, wahrscheinlich auch @code{NoteEvent}.
370
371 @end itemize
372
373 @noindent
374 Die besonderen Regeln für noch nicht abgearbeitete Argumente machen es
375 möglich, polymorphe Funktionen wie @code{\tweak} zu schreiben,
376 die auf unterschiedliche Konstruktionen angewendet werden können.
377
378
379 @node Einfache Ersetzungsfunktionen
380 @subsection Einfache Ersetzungsfunktionen
381 @translationof Simple substitution functions
382
383 Einfache Ersetzungsfunktionen sind musikalische Funktionen, deren
384 musikalische Ausgabe-Funktion im LilyPond-Format geschrieben ist
385 und Funktionsargumente in der Ausgabefunktion enthält.  Sie werden
386 beschrieben in @ruser{Beispiele der Ersetzungsfunktionen}
387
388
389 @node Mittlere Ersetzungsfunktionen
390 @subsection Mittlere Ersetzungsfunktionen
391 @translationof Intermediate substitution functions
392
393 Mittlere Ersetzungsfunktionen setzen sich aus einer Mischung von
394 Scheme-Code und LilyPond-Code in der musikalischen Ausgabe-Funktion
395 zusammen.
396
397 Einige @code{\override}-Befehle benötigen ein Zahlenpaar
398 (als @code{cons}-Zelle in Scheme bezeichnet).
399
400 Das Paar kann direkt an die musikalische Funktion
401 mit der Variable @code{pair?} weitergeleitet werden:
402
403 @example
404 manualBeam =
405 #(define-music-function
406      (parser location beg-end)
407      (pair?)
408    #@{
409      \once \override Beam.positions = #beg-end
410    #@})
411
412 \relative c' @{
413   \manualBeam #'(3 . 6) c8 d e f
414 @}
415 @end example
416
417 Anstelle dessen können auch die Zahlen, aus denen das Paar besteht,
418 einzeln als eigenständige Argumente weitergeleitet und der
419 Scheme-Code, der das Paar erstellt, in die musikalische Funktion
420 augenommen werden:
421
422 @lilypond[quote,verbatim,ragged-right]
423 manualBeam =
424 #(define-music-function
425      (parser location beg end)
426      (number? number?)
427    #{
428      \once \override Beam.positions = #(cons beg end)
429    #})
430
431 \relative c' {
432   \manualBeam #3 #6 c8 d e f
433 }
434 @end lilypond
435
436
437 @node Mathematik in Funktionen
438 @subsection Mathematik in Funktionen
439 @translationof Mathematics in functions
440
441 Musikalische Funktionen können neben einfachen Ersetzungen
442 auch Scheme-Programmcode enthalten:
443
444 @lilypond[quote,verbatim,ragged-right]
445 AltOn =
446 #(define-music-function
447      (parser location mag)
448      (number?)
449    #{
450      \override Stem.length = #(* 7.0 mag)
451      \override NoteHead.font-size =
452        #(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
453    #})
454
455 AltOff = {
456   \revert Stem.length
457   \revert NoteHead.font-size
458 }
459
460 \relative c' {
461   c2 \AltOn #0.5 c4 c
462   \AltOn #1.5 c c \AltOff c2
463 }
464 @end lilypond
465
466 @noindent
467 Dieses Beispiel kann auch umformuliert werden, um musikalische Ausdrücke
468 zu integrieren:
469
470 @lilypond[quote,verbatim,ragged-right]
471 withAlt =
472 #(define-music-function
473      (parser location mag music)
474      (number? ly:music?)
475    #{
476      \override Stem.length = #(* 7.0 mag)
477      \override NoteHead.font-size =
478        #(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
479      #music
480      \revert Stem.length
481      \revert NoteHead.font-size
482    #})
483
484 \relative c' {
485   c2 \withAlt #0.5 { c4 c }
486   \withAlt #1.5 { c c } c2
487 }
488 @end lilypond
489
490
491 @node Funktionen ohne Argumente
492 @subsection Funktionen ohne Argumente
493 @translationof Functions without arguments
494
495 In den meisten Fällen sollten Funktionen ohne Argumente mit einer
496 Variable notiert werden:
497
498 @example
499 dolce = \markup@{ \italic \bold dolce @}
500 @end example
501
502 In einigen wenigen Fällen kann es aber auch sinnvoll sein, eine
503 musikalische Funktion ohne Argumente zu erstellen:
504
505 @example
506 displayBarNum =
507 #(define-music-function
508      (parser location)
509      ()
510    (if (eq? #t (ly:get-option 'display-bar-numbers))
511        #@{ \once \override Score.BarNumber.break-visibility = ##f #@}
512        #@{#@}))
513 @end example
514
515 Damit auch wirklich Taktzahlen angezeigt werden, wo die
516 Funktion eingesetzt wurde, muss @command{lilypond} mit
517 der Option
518
519 @example
520 lilypond -d display-bar-numbers Dateiname.ly
521 @end example
522
523 @noindent
524 aufgerufen werden.
525
526
527 @node Leere musikalische Funktionen
528 @subsection Leere musikalische Funktionen
529 @translationof Void music functions
530
531 Eine musikalische Funktion muss einen musikalischen Ausdruck
532 ausgeben.  Wenn man eine Funktion nur für ihre Nebeneffekte
533 ausführt, sollte man @code{define-void-function} benützen.
534 Es kann aber auch Fälle geben, in denen man teilweise eine
535 musikalische Funktion erstellen will, teilweise aber nicht
536 (wie im vorherigen Beispiel).  Indem man eine leere (@code{void})
537 Funktion mit  @code{#@{ #@}} ausgibt, wird das erreicht.
538
539
540 @node Ereignisfunktionen
541 @section Ereignisfunktionen
542 @translationof Event functions
543
544 @funindex define-event-function
545 @cindex Ereignisfunktionen
546
547 Damit man eine musikalische Funktion anstelle eines Ereignisses benützen
548 kann, muss man ihr einen Richtungsindikator voranstellen.  Manchmal
549 entspricht dies jedoch nicht der Syntax der Konstruktionen, die man ersetzen
550 will.  Dynamikbefehle beispielsweise werden normalerweise ohne Richtungsangabe
551 angehängt, wie @code{c'\pp}.  Das Folgende ist eine Möglichkeit, beliebige
552 Dynamikbefehle zu schreiben:
553
554 @lilypond[quote,verbatim,ragged-right]
555 dyn=#(define-event-function (parser location arg) (markup?)
556          (make-dynamic-script arg))
557 \relative c' { c\dyn pfsss }
558 @end lilypond
559
560 Man kann das Gleiche auch mit einer musikalischen Funktion erreichen, aber dann
561 muss man immer einen Richtungsindikator voranstellen, wie @code{@w{c-\dyn pfsss}}.
562
563
564 @node Textbeschriftungsfunktionen
565 @section Textbeschriftungsfunktionen
566 @translationof Markup functions
567
568 Textbeschriftungselemente sind als besondere Scheme-Funktionen
569 definiert, die ein @code{Stencil}-Objekt erstellen, dem eine Anzahl
570 an Argumenten übergeben wird.
571
572 @menu
573 * Beschriftungskonstruktionen in Scheme::
574 * Wie Beschriftungen intern funktionieren::
575 * Neue Definitionen von Beschriftungsbefehlen::
576 * Neue Definitionen von Beschriftungslistenbefehlen::
577 @end menu
578
579
580 @node Beschriftungskonstruktionen in Scheme
581 @subsection Beschriftungskonstruktionen in Scheme
582 @translationof Markup construction in Scheme
583
584 @cindex Textbeschriftungsbefehle, definieren
585 @cindex Textbeschriftung, eigene Befehle
586 @cindex eigene Befehle, Textbeschriftung
587 @cindex markup, eigene Befehle
588 @cindex Befehle definieren, Textbeschriftung
589
590 Das @code{markup}-(Textbeschriftungs)Makro erstellt Textbeschriftungs-Ausdrücke
591 in Scheme, wobei eine LilyPond-artige Syntax benutzt wird.  Beispielsweise
592 ist
593
594 @example
595 (markup #:column (#:line (#:bold #:italic "hello" #:raise 0.4 "world")
596                   #:larger #:line ("foo" "bar" "baz")))
597 @end example
598
599 @noindent
600 identisch mit
601
602 @example
603 #@{ \markup \column @{ \line @{ \bold \italic "hello" \raise #0.4 "world" @}
604                   \larger \line @{ foo bar baz @} @} #@}
605 @end example
606
607 @noindent
608 Dieses Beispiel zeigt die hauptsächlichen Übersetzungsregeln
609 zwischen normaler Textbeschriftungssyntax von LilyPond und der
610 Textbeschriftungssyntax in Scheme.  Es ist meistens der beste
611 Weg, @code{#@{ @dots{} #@}} zur Eingabe von LilyPond-Syntax zu
612 benützen, aber es soll auch erklärt werden, wie man das
613 @code{markup}-Makro einsetzt, um eine Lösung nur in Scheme zu bekommen.
614
615 @quotation
616 @multitable @columnfractions .3 .3
617 @item @b{LilyPond} @tab @b{Scheme}
618 @item @code{\markup Text1} @tab @code{(markup Text1)}
619 @item @code{\markup @{ Text1 Text2 ... @}} @tab
620         @code{(markup Text1 Text2 ... )}
621 @item @code{\Beschriftungsbefehl} @tab @code{#:Beschriftungsbefehl}
622 @item @code{\Variable} @tab @code{Variable}
623 @item @code{\center-column @{ ... @}} @tab @code{#:center-column ( ... )}
624 @item @code{Zeichenkette} @tab @code{"Zeichenkette"}
625 @item @code{#scheme-Arg} @tab @code{scheme-Arg}
626 @end multitable
627 @end quotation
628
629 Die gesamte Scheme-Sprache ist innerhalb des @code{markup}-Makros
630 zugänglich.  Man kann also beispielsweise Funktionen innerhalb
631 eines @code{markup} aufrufen, um Zeichenketten zu manipulieren.
632 Das ist nützlich, wenn neue Beschriftungsbefehle definiert werden
633 sollen (siehe auch
634 @ref{Neue Definitionen von Beschriftungsbefehlen}).
635
636
637 @knownissues
638
639 Das Beschriftungslistenargument von Befehlen wie @code{#:line},
640 @code{#:center} und @code{#:column} kann keine Variable oder
641 das Resultat eines Funktionsaufrufen sein.
642
643 @lisp
644 (markup #:line (Funktion-die-Textbeschriftung-ausgibt))
645 @end lisp
646
647 @noindent
648 ist ungültig.  Man sollte anstatt dessen die Funktionen
649 @code{make-line-markup}, @code{make-center-markup} oder
650 @code{make-column-markup} benutzen:
651
652 @lisp
653 (markup (make-line-markup (Funktion-die-Textbeschriftung-ausgibt)))
654 @end lisp
655
656
657 @node Wie Beschriftungen intern funktionieren
658 @subsection Wie Beschriftungen intern funktionieren
659 @translationof How markups work internally
660
661 In einer Textbeschriftung wie
662
663 @example
664 \raise #0.5 "Textbeispiel"
665 @end example
666
667 @noindent
668 ist @code{\raise} unter der Haube durch die @code{raise-markup}-Funktion
669 repräsentiert.  Der Beschriftungsausdruck wird gespeichert als
670
671 @example
672 (list raise-markup 0.5 (list simple-markup "Textbeispiel"))
673 @end example
674
675 Wenn die Beschriftung in druckbare Objekte (Stencils) umgewandelt ist,
676 wir die @code{raise-markup}-Funktion folgendermaßen aufgerufen:
677
678 @example
679 (apply raise-markup
680        @var{\layout object}
681        @var{Liste der Eigenschafts-alists}
682        0.5
683        @var{die "Textbeispiel"-Beschriftung})
684 @end example
685
686 Die @code{raise-markup}-Funktion erstellt zunächst den Stencil für die
687 @code{Textbeispiel}-Beschriftung und verschiebt dann diesen Stencil
688 um 0.5 Notenlinienzwischenräume nach oben.  Das ist ein einfaches
689 Beispiel.  Weitere, kompliziertere Beispiele finden sich nachfolgend
690 in diesem Abschnitt und in der Datei
691 @file{scm/define-markup-commands.scm}.
692
693
694 @node Neue Definitionen von Beschriftungsbefehlen
695 @subsection Neue Definitionen von Beschriftungsbefehlen
696 @translationof New markup command definition
697
698 Dieser Abschnitt behandelt die Definition von neuen Textbeschriftungsbefehlen.
699
700 @menu
701 * Syntax der Definition von Textbeschriftungsbefehlen::
702 * Über Eigenschaften::
703 * Ein vollständiges Bespiel::
704 * Eingebaute Befehle anpassen::
705 @end menu
706
707 @node Syntax der Definition von Textbeschriftungsbefehlen
708 @unnumberedsubsubsec Syntax der Definition von Textbeschriftungsbefehlen
709 @translationof Markup command definition syntax
710
711 Neue Textbeschriftungsbefehle können mit dem
712 @code{define-markup-command}-Scheme-Makro definiert werden.
713
714 @lisp
715 (define-markup-command (@var{befehl-bezeichnung} @var{layout} @var{props} @var{Arg1} @var{Arg2} ...)
716             (@var{Arg1-typ?} @var{Arg2-typ?} ...)
717     [ #:properties ((@var{Eigenschaft1} @var{Standard-Wert1})
718                     ...) ]
719   ..Befehlkörper..)
720 @end lisp
721
722 Die Argumente sind:
723
724 @table @var
725 @item @var{befehl-bezeichnung}
726 die Bezeichnung des Befehls
727
728 @item @var{layout}
729 die @q{layout}-Definition
730
731 @item props
732 eine Liste an  assoziativen Listen, in der alle aktiven Eigenschaften enthalten sind
733
734 @item @var{argi}
735 das @var{i}te Befehlsargument
736
737 @item @var{argi-type?}
738 eine Eigenschaft für das @var{i}te Argument
739 @end table
740
741 Wenn der Befehl Eigenschaften des @code{props}-Arguments benutzt,
742 kann das @code{#:properties}-Schlüsselwort benutzt werden um zu
743 bestimmen, welche Eigenschaften mit welchen Standard-Werten benutzt
744 werden.
745
746 Argumente werden nach ihrem Typ unterschieden:
747
748 @itemize
749 @item eine Textbeschriftung entspricht einem Typenprädikat @code{markup?};
750 @item eine Textbeschriftungsliste entspricht einem Typenprädikat
751 @code{markup-list?};
752 @item jedes andere Scheme-Objekt entspricht Typenprädikaten wie etwa
753 @code{list?}, @code{number?}, @code{boolean?}, usw.
754 @end itemize
755
756 Es gibt keine Einschränkung in der Reihenfolge der Argumente (nach
757 den Standard-Argumenten @code{layout} und @code{props}).  Textbeschriftungsfunktionen,
758 die als letztes Argument eine Textbeschriftung haben, haben die
759 Besonderheit, dass sie auf Textbeschriftungslisten angewendet werden
760 können, und das Resultat ist eine Textbeschriftungsliste, in der
761 die Textbeschriftungsfuktion (mit den angegebenen Argumenten am Anfang)
762 auf jedes Element der originalen Textbeschriftungsliste angewendet
763 wurde.
764
765 Da das Wiederholen der Argumente am Anfang bei der Anwendung einer
766 Textbeschriftungsfunktion auf eine Textbeschriftungsliste for allem
767 für Scheme-Argumente sparsam ist, kann man Leistungseinbußen vermeiden,
768 indem man nur Scheme-Argumente für die Argumente am Anfang einsetzt,
769 wenn es sich um Textbeschriftungsfunktionen handelt, die eine Textbeschriftung
770 als letztes Argument haben.
771
772
773 @node Über Eigenschaften
774 @unnumberedsubsubsec Über Eigenschaften
775 @translationof On properties
776
777 Die @code{layout}- und @code{props}-Argumente der Textbeschriftungsbefehle
778 bringen einen Kontext für die Interpretation der Beschriftung:
779 Schriftgröße, Zeilenlänge usw.
780
781 Das @code{layout}-Argument greift auf Eigenschaften zu, die in der
782 @code{paper}-Umgebung definiert werden, indem man die @code{ly:output-def-lookup}-Funktion
783 benutzt.  Beispielsweise liest man die Zeilenlänge (die gleiche, die auch in
784 Partituren benutzt wird) aus mit:
785
786 @example
787 (ly:output-def-lookup layout 'line-width)
788 @end example
789
790 Das @code{props}-Argument stellt einige Eigenschaften für die Textbeschriftungsbefehle
791 zur Verfügung.  Beispielsweise wenn der Überschrifttext einer
792 @code{book}-Umgebung interpretiert wird, werden alle Variablen, die
793 in der @code{\header}-Umgebung definiert werden, automatisch zu @code{props}
794 hinzugefügt, sodass die Beschriftung auf Titel, Komponist usw. der
795 @code{book}-Umgebung zugreifen kann.  Das ist auch eine Möglichkeit, das
796 Verhalten eines Beschriftungsbefehls zu konfigurieren: Wenn etwa ein
797 Befehl die Schriftgröße während der Verarbeitung einsetzt, wird die
798 Schriftgröße aus den @code{props} ausgelesen und nicht mit einem eigenen
799 @code{font-size}-Argument definiert.  Beim Aufruf des Beschriftungsbefehls
800 kann der Wert der Schriftgröße geändert werden, womit sich auch das Verhalten
801 des Befehls verändert.  Benutzen Sie das @code{#:properties}-Schlüsselwort
802 von @code{define-markup-command} um zu definieren, welche Eigenschaften aus den
803 @code{props}-Argumenten ausgelesen werden sollen.
804
805 Das Beispiel im nächsten Abschnitt illustriert, wie man auf Eigenschaften
806 in einem Beschriftungsbefehl zugreifen und sie verändern kann.
807
808
809 @node Ein vollständiges Bespiel
810 @unnumberedsubsubsec Ein vollständiges Bespiel
811 @translationof A complete example
812
813 Das folgende Beispiel definiert einen Beschriftungsbefehl, der einen
814 doppelten Kasten um einen Text zeichnet.
815
816 Zuerst wollen wir ein annäherndes Ergebnis mit Textbeschriftungen definieren.
817 Nach Stöbern in @ruser{Textbeschriftungsbefehle} finden wir den Befehl
818 @code{\box}:
819
820 @lilypond[quote,verbatim,ragged-right]
821 \markup \box \box HELLO
822 @end lilypond
823
824 Wir wollen aber etwas mehr Abstand (engl. padding) zwischen dem Text und dem Kasten.
825 Nach der Dokumentation von @code{\box} hat der Befehl eine
826 @code{box-padding}-Eigenschaft, die den Standardwert von 0.2 hat.  Die
827 Dokumentation zeit auch, wir man den Wert verändert:
828
829 @lilypond[quote,verbatim,ragged-right]
830 \markup \box \override #'(box-padding . 0.6) \box A
831 @end lilypond
832
833 Auch der Abstand zwischen den zwei Kästen ist uns zu klein und soll auch
834 vergrößert werden:
835
836 @lilypond[quote,verbatim,ragged-right]
837 \markup \override #'(box-padding . 0.4) \box
838     \override #'(box-padding . 0.6) \box A
839 @end lilypond
840
841 Diese lange Textbeschriftung immer wieder schreiben zu müssen, ist
842 anstrengend.  Hier kömmt ein Textbeschriftungsbefehl ins Spiel.  Wir
843 schreiben uns alle einen @code{double-box}-Beschriftungsbefehl, der
844 ein Argument annimmt (den Text).  Er zeichnet zwei Kästen mit genügend Abstand:
845
846 @lisp
847 #(define-markup-command (double-box layout props text) (markup?)
848   "Draw a double box around text."
849   (interpret-markup layout props
850     #@{\markup \override #'(box-padding . 0.4) \box
851             \override #'(box-padding . 0.6) \box @{ #text @}#@}))
852 @end lisp
853
854 oder äquivalent
855
856 @lisp
857 #(define-markup-command (double-box layout props text) (markup?)
858   "Draw a double box around text."
859   (interpret-markup layout props
860     (markup #:override '(box-padding . 0.4) #:box
861             #:override '(box-padding . 0.6) #:box text)))
862 @end lisp
863
864 @code{text} ist die Bezeichnung des Arguments dieses Befehls,
865 und @code{markup?} ist seine Art: hiermit wird der Befehl als
866 Beschriftungsbefehl identifiziert.  Die @code{interpret-markup}-Funktion
867 wird in den meisten Beschriftungsbefehlen benutzt: sie erstellt einen
868 Stencil, wobei @code{layout}, @code{props} und eine Beschriftung benutzt
869 werden.  Im zweiten Fall wird diese Beschriftung durch das
870 @code{markup}-Scheme-Makro erstellt, siehe auche
871 @ref{Beschriftungskonstruktionen in Scheme}.
872 Die Transformation des @code{\markup}-Ausdrucks in einen
873 Scheme-Beschriftungsausdruck geschieht durch Umschreiben des LilyPond-Codes
874 in Scheme-Code.
875
876 Der neue Befehl kann wie folgt benutzt werden:
877
878 @example
879 \markup \double-box A
880 @end example
881
882 Es wäre schön, den @code{double-box}-Befehl noch konfigurierbar zu gestalten:
883 in unserem Fall sind die Werte von @code{box-padding} direkt definiert und
884 können nicht mehr vom Benutzer verändert werden.  Es wäre auch besser, wenn
885 der Abstand zwischen den beiden Kästen vom Abstand zwischen dem inneren Kasten
886 und dem Text unterschieden werden könnte.  Eine neue Eigenschaft muss also
887 definiert werden: @code{inter-box-padding} für den Abstand zwischen den Kästen.
888 @code{box-padding} wird für den inneren Abstand benutzt.  Der neue Befehl wird
889 so definiert:
890
891 @lisp
892 #(define-markup-command (double-box layout props text) (markup?)
893   #:properties ((inter-box-padding 0.4)
894                 (box-padding 0.6))
895   "Draw a double box around text."
896   (interpret-markup layout props
897     #@{\markup \override #`(box-padding . ,inter-box-padding) \box
898                \override #`(box-padding . ,box-padding) \box
899                @{ #text @} #@}))
900 @end lisp
901
902 Wiederum wäre die entsprechende Version mit dem @code{markup}-Makro
903 so aussehen:
904
905 @lisp
906 #(define-markup-command (double-box layout props text) (markup?)
907   #:properties ((inter-box-padding 0.4)
908                 (box-padding 0.6))
909   "Draw a double box around text."
910   (interpret-markup layout props
911     (markup #:override `(box-padding . ,inter-box-padding) #:box
912             #:override `(box-padding . ,box-padding) #:box text)))
913 @end lisp
914
915 In diesem Code wird das @code{#:properties}-Schlüsselwort benutzt, sodass
916 die Eigenschaften @code{inter-box-padding} und @code{box-padding} aus dem
917 @code{props}-Argument ausgelesen werden, und Standardwerte werden gegeben,
918 falls die Eigenschaften nicht definiert sein sollten.
919
920 Dann werden diese Werte benutzt, um die @code{box-padding}-Eigenschaft
921 zu verändert, die von beiden @code{\box}-Befehlen benutzt wird.  Beachten
922 Sie Akzent und das Komma des @code{\override}-Arguments: hiermit kann man
923 einen Variablenwert in einen wörtlichen Ausdruck überführen.
924
925 Jetzt kann der Befehl in Beschriftungen benutzt werden und der Abstand
926 der Kästen kann angepasst werden:
927
928 @lilypond[quote,verbatim,ragged-right]
929 #(define-markup-command (double-box layout props text) (markup?)
930   #:properties ((inter-box-padding 0.4)
931                 (box-padding 0.6))
932   "Draw a double box around text."
933   (interpret-markup layout props
934     #{\markup \override #`(box-padding . ,inter-box-padding) \box
935               \override #`(box-padding . ,box-padding) \box
936               { #text } #}))
937
938 \markup \double-box A
939 \markup \override #'(inter-box-padding . 0.8) \double-box A
940 \markup \override #'(box-padding . 1.0) \double-box A
941 @end lilypond
942
943 @node Eingebaute Befehle anpassen
944 @unnumberedsubsubsec Eingebaute Befehle anpassen
945 @translationof Adapting builtin commands
946
947 Ein guter Weg, einen neuen Beschriftungsbefehl zu schreiben, ist es, als Vorbild
948 einen existierenden zu nehmen.  Die meisten Beschriftungsbefehle, die
949 LilyPond mitbringt, finden sich in der Datei
950 @file{scm/define-markup-commands.scm}.
951
952 Man könnte beispielsweise den Befehl @code{\draw-line}, der eine Linie
953 zeichnet, anpassen, sodass er eine Doppellinie zeichnet.  Der
954 Befehl @code{\draw-line} ist wie folgend definiert (Dokumentation entfernt):
955
956 @lisp
957 (define-markup-command (draw-line layout props dest)
958   (number-pair?)
959   #:category graphic
960   #:properties ((thickness 1))
961   "..documentation.."
962   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
963                thickness))
964         (x (car dest))
965         (y (cdr dest)))
966     (make-line-stencil th 0 0 x y)))
967 @end lisp
968
969 Um einen neuen Befehl, der auf einem existierenden basiert, zu definieren,
970 wird die Befehlsdefinition kopiert und die Bezeichnung des Befehls
971 geändert.  Das @code{#:category}-Schlagwort kann entfernt werden,
972 weil es nur zur Erstellung der LilyPond-Dokumentation eingesetzt wird
973 und keine Bedeutung für selbstdefinierte Befehle hat.
974
975 @lisp
976 (define-markup-command (draw-double-line layout props dest)
977   (number-pair?)
978   #:properties ((thickness 1))
979   "..documentation.."
980   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
981                thickness))
982         (x (car dest))
983         (y (cdr dest)))
984     (make-line-stencil th 0 0 x y)))
985 @end lisp
986
987 Dann braucht man eine Eigenschaft, um den Abstand zwischen den zwei
988 Linien zu definieren, als @code{line-gap} bezeichnet und etwa mit
989 dem Standardwert 0.6:
990
991 @lisp
992 (define-markup-command (draw-double-line layout props dest)
993   (number-pair?)
994   #:properties ((thickness 1)
995                 (line-gap 0.6))
996   "..documentation.."
997   ...
998 @end lisp
999
1000 Schließlich wird der Code, der die zwei Linien zeichnet, hinzugefügt.
1001 Zwei Aufrufe an @code{make-line-stencil} werden benutzt, um beide Linien
1002 zu zeichnen, und die beiden sich daraus ergebenden Stencils werden mit
1003 @code{ly:stencil-add} kombiniert:
1004
1005 @lilypond[quote,verbatim,ragged-right]
1006 #(define-markup-command (my-draw-line layout props dest)
1007   (number-pair?)
1008   #:properties ((thickness 1)
1009                 (line-gap 0.6))
1010   "..documentation.."
1011   (let* ((th (* (ly:output-def-lookup layout 'line-thickness)
1012                 thickness))
1013          (dx (car dest))
1014          (dy (cdr dest))
1015          (w (/ line-gap 2.0))
1016          (x (cond ((= dx 0) w)
1017                   ((= dy 0) 0)
1018                   (else (/ w (sqrt (+ 1 (* (/ dx dy) (/ dx dy))))))))
1019          (y (* (if (< (* dx dy) 0) 1 -1)
1020                (cond ((= dy 0) w)
1021                      ((= dx 0) 0)
1022                      (else (/ w (sqrt (+ 1 (* (/ dy dx) (/ dy dx))))))))))
1023      (ly:stencil-add (make-line-stencil th x y (+ dx x) (+ dy y))
1024                      (make-line-stencil th (- x) (- y) (- dx x) (- dy y)))))
1025
1026 \markup \my-draw-line #'(4 . 3)
1027 \markup \override #'(line-gap . 1.2) \my-draw-line #'(4 . 3)
1028 @end lilypond
1029
1030
1031
1032 @node Neue Definitionen von Beschriftungslistenbefehlen
1033 @subsection Neue Definitionen von Beschriftungslistenbefehlen
1034 @translationof New markup list command definition
1035
1036 Beschriftungslistenbefehle können mit dem Scheme-Makro
1037 @code{define-markup-list-command} definiert werden, welches
1038 sich ähnlich verhält wie das
1039 @code{define-markup-command}-Makro, das schon beschrieben
1040 wurde in @ref{Neue Definitionen von Beschriftungsbefehlen}.  Ein Unterschied
1041 ist, dass bei diesem Listen-Makro eine ganze Liste an
1042 Stencils ausgegeben wird.
1043
1044 Im folgenden Beispiel wird ein @code{\paragraph}-Beschriftungslistenbefehl
1045 definiert, welcher eine Liste von Zeilen im Blocksatz ausgibt, von
1046 denen die erste Zeile eingerückt ist.  Der Einzug wird aus dem
1047 @code{props}-Argument entnommen.
1048
1049 @example
1050 #(define-markup-list-command (paragraph layout props args) (markup-list?)
1051    #:properties ((par-indent 2))
1052    (interpret-markup-list layout props
1053      #@{\markuplist \justified-lines @{ \hspace #par-indent #args @} #@}))
1054 @end example
1055
1056 Die Version nur in Scheme ist etwas komplexer:
1057
1058 @example
1059 #(define-markup-list-command (paragraph layout props args) (markup-list?)
1060    #:properties ((par-indent 2))
1061    (interpret-markup-list layout props
1062      (make-justified-lines-markup-list (cons (make-hspace-markup par-indent)
1063                                              args))))
1064 @end example
1065
1066 Neben den üblichen @code{layout} und @code{props}-Argumenten nimmt der
1067 @code{paragraph}-Beschriftungslistenbefehl als Argument eine Beschriftungsliste,
1068 die @code{args} genannt wird.  Das Prädikat für Beschriftungslisten ist
1069 @code{markup-list?}.
1070
1071 Zuerst errechnet die Funktion die Breite des Einzugs, eine Eigenschaft
1072 mit der Bezeichnung @code{par-indent} anhand der Eigenschaftsliste
1073 @code{props}.  Wenn die Eigenschaft nicht gefunden wird, ist der
1074 Standardwert @code{2}.  Danach wird eine Liste von Zeilen im Blocksatz
1075 erstellt, wobei der eingebaute @code{\justified-lines}-Beschriftungslistenbefehl
1076 eingesetzt wird, der verwandt ist mit der
1077 @code{make-justified-lines-markup-list}-Funktion.  Horizontaler
1078 Platz wird zu Beginn eingefügt mit @code{\hspace} (oder der
1079 @code{make-hspace-markup}-Funktion).  Zuletzt wird die Beschriftungsliste
1080 ausgewertet durch die @code{interpret-markup-list}-Funktion.
1081
1082 Dieser neue Beschriftungslistenbefehl kann wie folgt benutzt werden:
1083
1084 @example
1085 \markuplist @{
1086   \paragraph @{
1087     Die Kunst des Notensatzes wird auch als \italic @{Notenstich@} bezeichnet. Dieser
1088     Begriff stammt aus dem traditionellen Notendruck. Noch bis vor etwa
1089     20 Jahren wurden Noten erstellt, indem man sie in eine Zink- oder
1090     Zinnplatte schnitt oder mit Stempeln schlug.
1091   @}
1092   \override-lines #'(par-indent . 4) \paragraph @{
1093     Diese Platte wurde dann mit Druckerschwärze versehen, so dass sie
1094     in den geschnittenen und gestempelten Vertiefungen blieb. Diese
1095     Vertiefungen schwärzten dann ein auf die Platte gelegtes Papier.
1096     Das Gravieren wurde vollständig von Hand erledigt.
1097   @}
1098 @}
1099 @end example
1100
1101
1102 @node Kontexte für Programmierer
1103 @section Kontexte für Programmierer
1104 @translationof Contexts for programmers
1105
1106 @menu
1107 * Kontextauswertung::
1108 * Eine Funktion auf alle Layout-Objekte anwenden::
1109 @end menu
1110
1111 @node Kontextauswertung
1112 @subsection Kontextauswertung
1113 @translationof Context evaluation
1114
1115 @cindex Aufrufen von Code während der Interpretation
1116 @cindex On-the-fly Code ausführen
1117
1118 @funindex \applyContext
1119
1120 Kontexte können während ihrer Interpretation mit Scheme-Code
1121 modifiziert werden.  Die Syntax hierfür ist
1122
1123 @example
1124 \applyContext @var{function}
1125 @end example
1126
1127 @var{function} sollte eine Scheme-Funktion sein, die ein
1128 einziges Argument braucht, welches der Kontext ist, auf den
1129 sie ausgeführt werden soll.  Der folgende Code schreibt
1130 die aktuelle Taktzahl in die Standardausgabe
1131 während der Kompilation.
1132
1133 @example
1134 \applyContext
1135   #(lambda (x)
1136     (format #t "\nWe were called in barnumber ~a.\n"
1137      (ly:context-property x 'currentBarNumber)))
1138 @end example
1139
1140
1141
1142 @node Eine Funktion auf alle Layout-Objekte anwenden
1143 @subsection Eine Funktion auf alle Layout-Objekte anwenden
1144 @translationof Running a function on all layout objects
1145
1146
1147 @cindex Aufruf von Code für Layoutobjekte
1148
1149 @funindex \applyOutput
1150
1151 Der vielfältigste Weg, ein Objekt zu beeinflussen, ist
1152 @code{\applyOutput}.  Das funktioniert, indem ein musikalisches
1153 Ereignis in den angegebenen Kontext eingefügt wird
1154 (@rinternals{ApplyOutputEvent}).  Die Syntax lautet:
1155
1156 @example
1157 \applyOutput @var{Kontext} @var{proc}
1158 @end example
1159
1160 @noindent
1161 wobei @var{proc} eine Scheme-Funktion ist, die drei Argumente
1162 benötigt.
1163
1164 Während der Interpretation wird die Funktion @code{@var{proc}} für
1165 jedes Layoutobjekt aufgerufen, dass im Kontext @code{@var{Kontext}}
1166 vorgefunden wird, und zwar mit folgenden Argumenten:
1167
1168 @itemize
1169 @item dem Layoutobjekt
1170 @item dem Kontext, in dem das Objekt erstellt wurde
1171 @item dem Kontext, in welchem @code{\applyOutput} bearbeitet wird.
1172 @end itemize
1173
1174 Zusätzlich findet sich der Grund für das Layoutobjekt, etwa
1175 der musikalische Ausdruck oder das Objekt, das für seine Erstellung
1176 verantwortlich war, in der Objekteigenschaft @code{cause}.
1177 Für einen Notenkopf beispielsweise ist das ein
1178 @rinternals{NoteHead}-Ereignis, und für einen Notenhals ist es
1179 ein @rinternals{Stem}-Objekt.
1180
1181 Hier ist eine Funktion, die mit @code{\applyOutput} benutzt
1182 werden kann; sie macht Notenköpfe auf und neben der Mittellinie unsichtbar:
1183
1184 @lilypond[quote,verbatim,ragged-right]
1185 #(define (blanker grob grob-origin context)
1186    (if (and (memq 'note-head-interface (ly:grob-interfaces grob))
1187             (< (abs (ly:grob-property grob 'staff-position)) 2))
1188        (set! (ly:grob-property grob 'transparent) #t)))
1189
1190 \relative c' {
1191   a'4 e8 <<\applyOutput #'Voice #blanker a c d>> b2
1192 }
1193 @end lilypond
1194
1195
1196 @node Callback-Funktionen
1197 @section Callback-Funktionen
1198 @translationof Callback functions
1199
1200 Eigenschaften (wie Dicke (@code{thickness}), Richtung (@code{direction})
1201 usw.) können mit @code{\override} auf feste Werte gesetzt werden, etwa:
1202
1203 @example
1204 \override Stem.thickness = #2.0
1205 @end example
1206
1207 Eigenschaften können auch auf eine Scheme-Prozedur gesetzt werden:
1208
1209 @lilypond[fragment,verbatim,quote,relative=2]
1210 \override Stem.thickness = #(lambda (grob)
1211     (if (= UP (ly:grob-property grob 'direction))
1212         2.0
1213         7.0))
1214 c b a g b a g b
1215 @end lilypond
1216
1217 @noindent
1218 In diesem Fall wird die Prozedur ausgeführt, sobald der Wert der
1219 Eigenschaft während das Formatierungsprozesses angefordert wird.
1220
1221 Der größte Teil der Satzmaschinierie funktioniert mit derartigen
1222 Callbacks.  Eigenschaften, die üblicherweise Callbacks
1223 benutzen, sind u. A.:
1224
1225 @table @code
1226 @item stencil
1227   Die Druckfunktion, die eine Ausgabe des Symbols hervorruft
1228 @item X-offset
1229   Die Funktion, die die horizontale Position setzt
1230 @item X-extent
1231   Die Funktion, die die Breite eines Objekts errechnet
1232 @end table
1233
1234 Die Funktionen brauchen immer ein einziges Argument, das der
1235 Grob ist.
1236
1237 Wenn Funktionen mit mehreren Argumenten aufgerufen werden müssen,
1238 kann der aktuelle Grob mit einer Grob-Einschließung
1239 eingefügt werden.  Hier eine Einstellung aus
1240 @code{AccidentalSuggestion}:
1241
1242 @example
1243 (X-offset .
1244   ,(ly:make-simple-closure
1245     `(,+
1246         ,(ly:make-simple-closure
1247            (list ly:self-alignment-interface::centered-on-x-parent))
1248       ,(ly:make-simple-closure
1249            (list ly:self-alignment-interface::x-aligned-on-self)))))
1250 @end example
1251
1252 @noindent
1253 In diesem Beispiel werden sowohl @code{ly:self-alignment-interface::x-aligned-on-self}
1254 als auch @code{ly:self-alignment-interface::centered-on-x-parent}
1255 mit dem Grob als Argument aufgerufen.  Die Resultate werden mit der
1256 @code{+}-Funktion addiert.  Um sicherzugehen, dass die Addition
1257 richtig ausgeführt wird, wird das ganze Konstrukt in
1258 @code{ly:make-simple-closure} eingeschlossen.
1259
1260 In der Tat ist die Benutzung einer einzelnen Funktion als
1261 Eigenschaftswert äquivalent zu
1262
1263 @example
1264 (ly:make-simple-closure (ly:make-simple-closure (list @var{proc})))
1265 @end example
1266
1267 @noindent
1268 Das innere @code{ly:make-simple-closure} stellt den Grob als Argument
1269 für @var{proc} zur Verfügung, das äußere stellt sicher, dass das
1270 Resultat der Funktion ausgegeben wird und nicht das
1271 @code{simple-closure}-Objekt.
1272
1273 Aus dem Callback heraus kann man eine Beschriftung am einfachsten mit
1274 @code{grob-interpret-markup} auswerten.  Beispielsweise:
1275
1276 @example
1277 mein-callback = #(lambda (grob)
1278                  (grob-interpret-markup grob (markup "foo")))
1279 @end example
1280
1281
1282 @node Scheme-Code innerhalb LilyPonds
1283 @section Scheme-Code innerhalb LilyPonds
1284 @translationof Inline Scheme code
1285
1286 TODO: das Beispiel für diesen Abschnitt ist nicht gut gewähtl:
1287
1288 @example
1289 F = -\tweak font-size #-3 -\flageolet
1290 @end example
1291 (beachte @samp{-}, was ein Nachereignis anzeigt) funktioniert
1292 für den geschilderten Zweck sehr gut.  Aber bis der Abschnitt
1293 neu geschrieben wird, nehmen wir einfach an, dass wir das nicht
1294 wissen.
1295
1296 Der hauptsächliche Nachteil von @code{\tweak} ist seine
1297 syntaktische Inflexibilität.  Folgender Code beispielsweise
1298 ergibt einen Syntaxfehler:
1299
1300 @example
1301 F = \tweak font-size #-3 -\flageolet
1302
1303 \relative c'' @{
1304   c4^\F c4_\F
1305 @}
1306 @end example
1307
1308 @noindent
1309 Durch die Verwendung von Scheme kann dieses Problem umgangen werden.
1310 Der Weg zum Resultat wird gezeigt in
1311 @ref{Artikulationszeichen zu Noten hinzufügen (Beispiel)}, insbesondere
1312 wie @code{\displayMusic} benutzt wird, hilft hier weiter.
1313
1314 @example
1315 F = #(let ((m (make-music 'ArticulationEvent
1316                           'articulation-type "flageolet")))
1317        (set! (ly:music-property m 'tweaks)
1318              (acons 'font-size -3
1319                     (ly:music-property m 'tweaks)))
1320        m)
1321
1322 \relative c'' @{
1323   c4^\F c4_\F
1324 @}
1325 @end example
1326
1327 @noindent
1328 In diesem Beispiel werden die @code{tweaks}-Eigenschaften
1329 des Flageolet-Objekts @code{m} (mit @code{make-music} erstellt)
1330 werden mit @code{ly:music-property} ausgelesen, ein neues
1331 Schlüssel-Wert-Paar, um die Schriftgröße zu ändern, wird
1332 der Eigenschaftenliste mithilfe der @code{acons}-Schemefunktion
1333 vorangestellt, und das Resultat wird schließlich mit
1334 @code{set!} zurückgeschrieben.  Das letzte Element des
1335 @code{let}-Blocks ist der Wiedergabewert, @code{m}.
1336
1337
1338
1339 @node Schwierige Korrekturen
1340 @section Schwierige Korrekturen
1341 @translationof Difficult tweaks
1342
1343 Hier finden sich einige Klassen an schwierigeren Anpassungen.
1344
1345 @itemize
1346
1347 @item
1348 Ein Typ der schwierigen Anpassungen ist die Erscheinung von
1349 Strecker-Objekten wie Binde- oder Legatobögen.  Zunächst wird
1350 nur eins dieser Objekte erstellt, und sie können mit dem
1351 normalen Mechanismus verändert werden.  In einigen Fällen
1352 reichen die Strecker jedoch über Zeilenumbrüche.  Wenn das
1353 geschieht, werden diese Objekte geklont.  Ein eigenes
1354 Objekt wird für jedes System erstellt, in dem es sich befindet.
1355 Sie sind Klone des originalen Objektes und erben alle
1356 Eigenschaften, auch @code{\override}-Befehle.
1357
1358 Anders gesagt wirkt sich ein @code{\override} immer auf alle
1359 Stücke eines geteilten Streckers aus.  Um nur einen Teil eines
1360 Streckers bei einem Zeilenumbruch zu verändern, ist es notwendig,
1361 in den Formatierungsprozess einzugreifen.  Das Callback
1362 @code{after-line-breaking} enthält die Schemefunktion, die
1363 aufgerufen wird, nachdem Zeilenumbrüche errechnet worden sind
1364 und die Layout-Objekte über die unterschiedlichen Systeme verteilt
1365 wurden.
1366
1367 Im folgenden Beispiel wird die Funktion
1368 @code{my-callback} definiert.  Diese Funktion
1369
1370 @itemize
1371 @item
1372 bestimmt, ob das Objekt durch Zeilenumbrüche geteilt ist,
1373 @item
1374 wenn ja, ruft sie alle geteilten Objekte auf,
1375 @item
1376 testet, ob es sich um das letzte der geteilten Objekte handelt,
1377 @item
1378 wenn ja, wird @code{extra-offset} gesetzt.
1379 @end itemize
1380
1381 Diese Funktion muss in @rinternals{Tie} (Bindebogen) installiert
1382 werden, damit der letzte Teil eines gebrochenen Bindebogens
1383 neu ausgerichtet wird.
1384
1385 @lilypond[quote,verbatim,ragged-right]
1386 #(define (my-callback grob)
1387   (let* (
1388          ; have we been split?
1389          (orig (ly:grob-original grob))
1390
1391          ; if yes, get the split pieces (our siblings)
1392          (siblings (if (ly:grob? orig)
1393                      (ly:spanner-broken-into orig) '() )))
1394
1395    (if (and (>= (length siblings) 2)
1396              (eq? (car (last-pair siblings)) grob))
1397      (ly:grob-set-property! grob 'extra-offset '(-2 . 5)))))
1398
1399 \relative c'' {
1400   \override Tie.after-line-breaking =
1401   #my-callback
1402   c1 ~ \break c2 ~ c
1403 }
1404 @end lilypond
1405
1406 @noindent
1407 Wenn man diesen Trick anwendet, sollte das neue @code{after-line-breaking}
1408 auch das alte @code{after-line-breaking}-Callback aufrufen,
1409 wenn es vorhanden ist.  Wenn diese Funktion etwa mit
1410 @code{Hairpin} (Crescendo-Klammer) eingesetzt wird, sollte auch
1411 @code{ly:spanner::kill-zero-spanned-time} aufgerufen werden.
1412
1413
1414 @item
1415 Manche Objekte können aus technischen Gründen nicht mit @code{\override}
1416 verändert werden.  Beispiele hiervon sind @code{NonMusicalPaperColumn}
1417 und @code{PaperColumn}.  Sie können mit der
1418 @code{\overrideProperty}-Funktion geändert werden, die ähnlich wie
1419 @code{\once \override} funktioniert, aber eine andere Syntax einsetzt.
1420
1421 @example
1422 \overrideProperty
1423 Score.NonMusicalPaperColumn  % Grob-Bezeichnung
1424 #'line-break-system-details     % Eigenschaftsbezeichnung
1425 #'((next-padding . 20))         % Wert
1426 @end example
1427
1428 Es sollte angemerkt werden, dass @code{\override}, wenn man es auf
1429 @code{NonMusicalPaperColumn} und @code{PaperColumn} anwendet, immer noch
1430 innerhalb der @code{\context}-Umgebung funktioniert.
1431
1432 @end itemize
1433
1434
1435
1436 @node LilyPond Scheme-Schnittstellen
1437 @chapter LilyPond Scheme-Schnittstellen
1438 @translationof LilyPond Scheme interfaces
1439
1440 Dieses Kapitel behandelt die verschiedenen Werkzeuge, die LilyPond als
1441 Hilfe für Scheme-Programmierer zur Verfügung stellt, um Information in
1442 den Musik-Stream zu senden und aus ihm herauszubekommen.
1443
1444 TODO: was gehört hier eigentlich hin?