]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/de/user/programming-interface.itely
Doc-de: translation of programming-interface
[lilypond.git] / Documentation / de / user / programming-interface.itely
1 @c -*- coding: utf-8; mode: texinfo; -*-
2 @c This file is part of lilypond.tely
3 @ignore
4     Translation of GIT committish: d79348b1cda7e897422c58d5b9a4a6be1da03731
5
6     When revising a translation, copy the HEAD committish of the
7     version that you are working on.  See TRANSLATION for details.
8 @end ignore
9
10 @c \version "2.12.0"
11
12 @node Interfaces for programmers
13 @chapter Interfaces for programmers
14
15 Fortgeschrittene Anpassungen können mithilfe der Programmiersprache
16 Scheme vorgenommen werden.  Wenn Sie Scheme nicht kennen, gibt
17 es eine grundlegende Einleitung in LilyPonds
18 @rlearning{Scheme tutorial}.
19
20 @menu
21 * Music functions::
22 * Programmer interfaces::
23 * Building complicated functions::
24 * Markup programmer interface::
25 * Contexts for programmers::
26 * Scheme procedures as properties::
27 * Using Scheme code instead of \tweak::
28 * Difficult tweaks::
29 @end menu
30
31
32 @node Music functions
33 @section Music functions
34
35 Dieser Abschnitt behandelt die Erstellung von musikalischen Funktionen
36 innerhalb von LilyPond.
37
38 @menu
39 * Overview of music functions::
40 * Simple substitution functions::
41 * Paired substitution functions::
42 * Mathematics in functions::
43 * Void functions::
44 * Functions without arguments::
45 * Overview of available music functions::
46 @end menu
47
48 @node Overview of music functions
49 @subsection Overview of music functions
50
51 Es ist einfach, eine Funktion zu erstellen, die Variablen
52 im LilyPond-Code ersetzt.  Die allgemeine Form derartiger
53 Funktionen ist
54
55 @example
56 function =
57 #(define-music-function (parser location @var{var1} @var{var2}...@var{vari}... )
58                         (@var{var1-type?} @var{var2-type?}...@var{vari-type?}...)
59   #@{
60     @emph{...Noten...}
61   #@})
62 @end example
63
64 @noindent
65 wobei
66
67 @multitable @columnfractions .33 .66
68 @item @var{vari}         @tab die @var{i}te Variable
69 @item @var{vari-type?}   @tab die Art der @var{i}ten Variable
70 @item @var{...Noten...}  @tab normaler LilyPond-Code, in dem Variablen 
71 wie @code{#$var1} usw. benutzt werden.
72 @end multitable
73
74 Die folgenden Eingabetypen können als Variablen in einer musikalischen
75 Funktion benutzt werden.  Diese Liste ist nicht vollständig -- siehe
76 auch andere Dokumentationen überScheme für weitere Variablenarten.
77
78 @multitable @columnfractions .33 .66
79 @headitem Eingabetyp           @tab @var{vari-type?}-Notation
80 @item Ganzzahl                 @tab @code{integer?}
81 @item Float (Dezimalzahl)      @tab @code{number?}
82 @item Zeichenkette             @tab @code{string?}
83 @item Textbeschriftung         @tab @code{markup?}
84 @item Musikalischer Ausdruck   @tab @code{ly:music?}
85 @item Ein Variablenpaar        @tab @code{pair?}
86 @end multitable
87
88 Die Argumente @code{parser} und @code{location} sind zwingend erforderlich
89 und werden in einigen fortgeschrittenen Situationen eingesetzt.  Das
90 Argument @code{parser} wird benutzt, um auf den Wert einer weiteren
91 LilyPond-Variable zuzugreifen.  Das Argument @code{location} wird
92 benutzt, um den @qq{Ursprung} des musikalischen Ausdrucks zu definieren, der von
93 der musikalischen Funktion erzeugt wird.  Das hilft, wenn ein
94 Syntaxfehler auftaucht: in solchen Fällen kann LilyPond mitteilen,
95 an welcher Stelle in der Eingabedatei sich der Fehler befindet.
96
97
98 @node Simple substitution functions
99 @subsection Simple substitution functions
100
101 Hier ist ein einfaches Beispiel:
102
103 @lilypond[quote,verbatim,ragged-right]
104 padText = #(define-music-function (parser location padding) (number?)
105   #{
106     \once \override TextScript #'padding = #$padding
107   #})
108
109 \relative c''' {
110   c4^"piu mosso" b a b
111   \padText #1.8
112   c4^"piu mosso" d e f
113   \padText #2.6
114   c4^"piu mosso" fis a g
115 }
116 @end lilypond
117
118 Musikalische Ausdrücke können auch ersetzt werden:
119
120 @lilypond[quote,verbatim,ragged-right]
121 custosNote = #(define-music-function (parser location note)
122                                      (ly:music?)
123   #{
124     \once \override Voice.NoteHead #'stencil =
125       #ly:text-interface::print
126     \once \override Voice.NoteHead #'text =
127       \markup \musicglyph #"custodes.mensural.u0"
128     \once \override Voice.Stem #'stencil = ##f
129     $note
130   #})
131
132 { c' d' e' f' \custosNote g' }
133 @end lilypond
134
135 Mehrere Variablen können benutzt werden:
136
137 @lilypond[quote,verbatim,ragged-right]
138 tempoPadded = #(define-music-function (parser location padding tempotext)
139   (number? string?)
140 #{
141   \once \override Score.MetronomeMark #'padding = $padding
142   \tempo \markup { \bold $tempotext }
143 #})
144
145 \relative c'' {
146   \tempo \markup { "Low tempo" }
147   c4 d e f g1
148   \tempoPadded #4.0 #"High tempo"
149   g4 f e d c1
150 }
151 @end lilypond
152
153
154 @node Paired substitution functions
155 @subsection Paired substitution functions
156
157 Einige @code{\override}-Befehle benötigen ein Zahlenpaar
158 (als @code{cons}-Zelle in Scheme bezeichnet).  Um beide Zahlen
159 einer Funktion zuzuweisen, kann entweder die Variable @code{pair?}
160 benutzt werden oder die @code{cons} in die musikalische Funktion
161 eingefügt werden.
162
163 @quotation
164 @example
165 manualBeam =
166 #(define-music-function (parser location beg-end)
167                         (pair?)
168 #@{
169   \once \override Beam #'positions = #$beg-end
170 #@})
171
172 \relative @{
173   \manualBeam #'(3 . 6) c8 d e f
174 @}
175 @end example
176 @end quotation
177
178 @noindent
179 oder
180
181 @lilypond[quote,verbatim,ragged-right]
182 manualBeam =
183 #(define-music-function (parser location beg end)
184                         (number? number?)
185 #{
186   \once \override Beam #'positions = #(cons $beg $end)
187 #})
188
189 \relative {
190   \manualBeam #3 #6 c8 d e f
191 }
192 @end lilypond
193
194
195 @node Mathematics in functions
196 @subsection Mathematics in functions
197
198 Musikalische Funktionen können neben einfachen Ersetzungen
199 auch Scheme-Programmcode enthalten:
200
201 @lilypond[quote,verbatim,ragged-right]
202 AltOn = #(define-music-function (parser location mag) (number?)
203   #{ \override Stem #'length = #$(* 7.0 mag)
204      \override NoteHead #'font-size =
205        #$(inexact->exact (* (/ 6.0 (log 2.0)) (log mag))) #})
206
207 AltOff = {
208   \revert Stem #'length
209   \revert NoteHead #'font-size
210 }
211
212 { c'2 \AltOn #0.5 c'4 c'
213   \AltOn #1.5 c' c' \AltOff c'2 }
214 @end lilypond
215
216 @noindent
217 Dieses Beispiel kann auch umformuliert werden, um musikalische Ausdrücke
218 zu integrieren:
219
220 @lilypond[quote,verbatim,ragged-right]
221 withAlt = #(define-music-function (parser location mag music) (number? ly:music?)
222   #{ \override Stem #'length = #$(* 7.0 mag)
223      \override NoteHead #'font-size =
224        #$(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
225      $music
226      \revert Stem #'length
227      \revert NoteHead #'font-size #})
228
229 { c'2 \withAlt #0.5 {c'4 c'}
230   \withAlt #1.5 {c' c'} c'2 }
231 @end lilypond
232
233
234 @node Void functions
235 @subsection Void functions
236
237 Eine musikalische Funktion muss einen musikalischen Ausdruck
238 ausgeben, aber in manchen Fällen müssen Funktionen erstellt werden,
239 die keine Notation enthalten (wie etwa eine Funktion, mit der
240 man @qq{Point and Click} ausschalten kann).  Um das vornehmen zu
241 können, wird ein @code{leere}r musikalischer Ausdruck ausgegeben.
242
243 Das ist der Grund, warum die Form, die ausgegeben wird,
244 @code{(make-music ...)} heißt.  Wird die Eigenschaft
245 @code{'void} (engl. für @qq{leer}) auf @code{#t} gesetzt, wird der
246 Parser angewiesen, den ausgegebenen musikalischen Ausdruck zu ignorieren.
247 Der maßgebliche Teil der @code{'void}-Funktion ist also die Verarbeitung,
248 die die Funktion vornimmt, nicht der musikalische Ausdruck, der ausgegeben
249 wird.
250
251 @example
252 noPointAndClick =
253 #(define-music-function (parser location) ()
254    (ly:set-option 'point-and-click #f)
255    (make-music 'SequentialMusic 'void #t))
256 ...
257 \noPointAndClick   % disable point and click
258 @end example
259
260
261 @node Functions without arguments
262 @subsection Functions without arguments
263
264 In den meisten Fällen sollten Funktionen ohne Argumente mit einer
265 Variable notiert werden:
266
267 @example
268 dolce = \markup@{ \italic \bold dolce @}
269 @end example
270
271 In einigen wenigen Fällen kann es aber auch sinnvoll sein, eine
272 musikalische Funktion ohne Argumente zu erstellen:
273
274 @example
275 displayBarNum =
276 #(define-music-function (parser location) ()
277    (if (eq? #t (ly:get-option 'display-bar-numbers))
278        #@{ \once \override Score.BarNumber #'break-visibility = ##f #@}
279        #@{#@}))
280 @end example
281
282 Damit auch wirklich Taktzahlen angezeigt werden, wo die
283 Funktion eingesetzt wurde, muss @command{lilypond} mit
284 der Option
285
286 @example
287 lilypond -d display-bar-numbers Dateiname.ly
288 @end example
289
290 @noindent
291 aufgerufen werden.
292
293
294 @node Overview of available music functions
295 @subsection Overview of available music functions
296
297 @c fixme ; this should be move somewhere else?
298 Die folgenden Befehle sind musikalische Funktionen:
299
300 @include identifiers.tely
301
302
303
304 @node Programmer interfaces
305 @section Programmer interfaces
306
307 Dieser Abschnitt zeigt, wie LilyPond und
308 Scheme gemischt werden können.
309
310 @menu
311 * Input variables and Scheme::
312 * Internal music representation::
313 @end menu
314
315
316 @node Input variables and Scheme
317 @subsection Input variables and Scheme
318
319 Das Eingabeformat unterstützt die Notation von Variablen: im
320 folgenden Beispiel wird ein musikalischer Ausdruck einer Variable
321 mit der Bezeichnung @code{traLaLa} zugewiesen:
322
323 @example
324 traLaLa = @{ c'4 d'4 @}
325 @end example
326
327 Der Geltungsbereich von Variablen ist beschränkt: im folgenden
328 Beispiel enthält die @code{\layout}-Umgebung auch eine
329 @code{traLaLa}-vVariable, die unabhängig von der äußeren
330 @code{\traLaLa}-Variable ist:
331
332 @example
333 traLaLa = @{ c'4 d'4 @}
334 \layout @{ traLaLa = 1.0 @}
335 @end example
336
337 Grundsätzlich ist jede Eingabedatei ein Geltungsbereich, und
338 alle @code{\header}-, @code{\midi}- und @code{\layout}-Umgebungen
339 sind Geltungsbereiche, die unterhalb des globalen Geltungsbereiches
340 angeordnet sind.
341
342 Sowohl Variablen als auch Geltungsbereiche sind in Form des
343 GUILE-Modulsystems implementiert.  Ein anonymes Scheme-Modul
344 wird an jeden Geltunsbereich angehängt.  Eine Zuweisung der form
345
346 @example
347 traLaLa = @{ c'4 d'4 @}
348 @end example
349
350 @noindent
351 wird intern in die Scheme-Definition
352
353 @example
354 (define traLaLa @var{Scheme-Wert von `@code{... }'})
355 @end example
356
357 @noindent
358 umgewandelt.
359
360 Das bedeutet, dass Eingabe- und Scheme-Variablen frei vermischt
361 werden können.  Im nächsten Beispiel wird ein Notenfragment in
362 der Variable @code{traLaLa} gespeichert und mithilfe von Schme
363 dupliziert.  Das Ergebnis wird in eine @code{\score}-Umgebung
364 mit der zweiten Variable @code{twice} integriert:
365
366 @lilypond[verbatim]
367 traLaLa = { c'4 d'4 }
368
369 %% dummy action to deal with parser lookahead
370 #(display "this needs to be here, sorry!")
371
372 #(define newLa (map ly:music-deep-copy
373   (list traLaLa traLaLa)))
374 #(define twice
375   (make-sequential-music newLa))
376
377 { \twice }
378 @end lilypond
379
380 In diesem Beispiel geschieht die Zuweisung, nachdem der Parser
381 festgestellt hat, dass nichts interessantes mehr nach
382 @code{traLaLa = @{ ... @}} vorkommt.  Ohne die Pseudovariable
383 in dem Beispiel würde die @code{newLa}-Devinition ausgeführt
384 werden, bevor @code{traLaLa} definiert ist, was zu einem
385 Syntax-Fehler führen würde.
386
387 Das obige Beispiel zeigt, wie man musikalische Ausdrücke
388 von der Eingabe in den Scheme-Interpretierer @qq{exportieren}
389 kann.  Es geht auch in die andere Richtung.  Indem man einen
390 Scheme-Wert in die Funktion @code{ly:export} einpackt, wird
391 der Scheme-Wert interpretiert als ob er in LilyPond-Syntax
392 notiert worden wäre.  Anstatt @code{\twice} zu definieren,
393 hätte man also auch schreiben können:
394
395 @example
396 ...
397 @{ #(ly:export (make-sequential-music (list newLa))) @}
398 @end example
399
400 Scheme-Code wird sofort ausgewertet, wenn der Parser darauf
401 stößt.  Um Scheme-Code in einem Makro zu definieren (das dann
402 erst später aufgerufen werden soll), müssen leere Funktionen
403 benutzt werden (siehe @ref{Void functions}) oder das Folgende:
404
405 @example
406 #(define (nopc)
407   (ly:set-option 'point-and-click #f))
408
409 ...
410 #(nopc)
411 @{ c'4 @}
412 @end example
413
414 @knownissues
415
416 Scheme- und LilyPond-Variablen können im LilyPond-Modus mit der
417 @code{--safe}-Option nicht vermischt werden.
418
419
420 @node Internal music representation
421 @subsection Internal music representation
422
423 Wenn ein musikalischer Ausdruck ausgewertet wird, wird er in eine
424 Anzahl von musikalischen Scheme-Objekten konvertiert.  Die Eigenschaft, die ein
425 musikalisches Objekt definiert, ist, dass es Zeit einnimmt.  Zeit ist
426 eine rationale Zahl, die die Länge eines Stückes in ganzen Noten
427 misst.
428
429 Ein musikalisches Objekt hat drei Typusarten:
430 @itemize
431 @item
432 musikalische Bezeichnung: Jeder musikalische Ausdruck hat eine Bezeichnung.
433 Eine Note beispielsweise führt zu einem @rinternals{NoteEvent} und
434 @code{\simultaneous} führt zu @rinternals{SimultaneousMusic}.  Eine Liste
435 aller möglichen Ausdrücke findet sich in der Referenz der Interna, unter
436 @rinternals{Music expressions}.
437
438 @item
439 @q{Typ} oder Schnittstelle:  Jede musikalische Bezeichnung hat mehrere
440 @qq{Typen} oder Schnittstellten, beispielsweise ist eine Note ein
441 @code{event}, ober sie ist auch ein @code{note-event}, ein
442 @code{rhythmic-event} und ein @code{melodic-event}.  Alle diese
443 Notationsklassen finden sich in der Referenz der Interna unter
444 @rinternals{Music classes}.
445
446 @item
447 C++-Objekt:  Jedes musikalische Objekt wird von einem Objekt der
448 C++-Klasse @code{Music} repräsentiert.
449 @end itemize
450
451 Die eigentlich Information eines musikalischen Ausdrucks ist in
452 Eigenschaften gespeichert.  Ein @rinternals{NoteEvent} hat zum
453 Beispiel @code{pitch}- und @code{duration}-Eigenschaften, die
454 die Tonhöhe und die Dauer dieser Note speichern.  Eine Liste aller
455 verfügbaren Eigenschaften findet sich in der Referenz der Interna unter
456 @rinternals{Music properties}.
457
458 Ein zusammengesetzter musikalischer Ausdruck ist ein musikalisches
459 Objekt, das andere Objekte in seinen Eigenschaften enthält.  Eine Liste
460 der Objekte kann in der @code{elements}-Eigenschaft eines
461 musikalischen Objektes gespeichert werden, oder ein einziges
462 @qq{Kind}-Objekt in der @code{element}-Eigenschaft.  Sa hat etwa
463 @rinternals{SequentialMusic} seine @qq{Kinder} in @code{elements},
464 und @rinternals{GraceMusic} hat sein einziges Argument in
465 @code{element}.  Der Hauptteil einer Wiederholung wird in der
466 @code{element}-Eigenschaft von @rinternals{RepeatedMusic} gespeichert,
467 und die Alternativen in @code{elements}.
468
469
470
471 @node Building complicated functions
472 @section Building complicated functions
473
474 Dieser Abschnitt zeigt, wie man Information zusammensucht,
475 um komplizierte musikalische Funktionen  zu erstellen.
476
477 @menu
478 * Displaying music expressions::
479 * Music properties::
480 * Doubling a note with slurs (example)::
481 * Adding articulation to notes (example)::
482 @end menu
483
484
485 @node Displaying music expressions
486 @subsection Displaying music expressions
487
488 @cindex interne Speicherung
489 @funindex \displayMusic
490
491 Wenn man eine musikalische Funktion erstellt, ist es oft
492 hilfreich sich anzuschauen, wie musikalische Funktionen
493 intern gespeichert werden.  Das kann mit der Funktion
494 @code{\displayMusic} erreicht werden:
495
496 @example
497 @{
498   \displayMusic @{ c'4\f @}
499 @}
500 @end example
501
502 @noindent
503 zeigt:
504
505 @example
506 (make-music
507   'SequentialMusic
508   'elements
509   (list (make-music
510           'EventChord
511           'elements
512           (list (make-music
513                   'NoteEvent
514                   'duration
515                   (ly:make-duration 2 0 1 1)
516                   'pitch
517                   (ly:make-pitch 0 0 0))
518                 (make-music
519                   'AbsoluteDynamicEvent
520                   'text
521                   "f")))))
522 @end example
523
524 Normalerweise gibt LilyPond diese Ausgabe auf der Konsole mit
525 allen anderen Nachrichten aus.  Um die wichtigen Nachrichten
526 in einer Datei zu speichern, kann die Ausgabe in eine Datei
527 umgeleitet werden:
528
529 @example
530 lilypond file.ly >display.txt
531 @end example
532
533 Mit etwas Umformatierung ist die gleiche Information sehr viel
534 einfacher zu lesen:
535
536 @example
537 (make-music 'SequentialMusic
538   'elements (list (make-music 'EventChord
539                     'elements (list (make-music 'NoteEvent
540                                       'duration (ly:make-duration 2 0 1 1)
541                                       'pitch (ly:make-pitch 0 0 0))
542                                     (make-music 'AbsoluteDynamicEvent
543                                       'text "f")))))
544 @end example
545
546 Eine musikalische @code{@{ ... @}}-Sequenz hat die Bezeichnung
547 @code{SequentialMusic} und ihre inneren Ausdrücke werden als
548 Liste in seiner @code{'elements}-Eigenschaft gespeichert.  Eine
549 Note ist als als ein @code{EventChord}-Ausdruck dargestellt,
550 der ein @code{NoteEvent}-Objekt (welches Dauer und
551 Tonhöhe speichert) und zusätzliche Information enthält (in
552 diesem Fall ein @code{AbsoluteDynamicEvent} mit einer
553 @code{"f"}-Text-Eigenschaft.
554
555
556 @node Music properties
557 @subsection Music properties
558
559 Das @code{NoteEvent}-Objekt ist das erste Objekt der
560 @code{'elements}-Eigenschaft von @code{someNote}.
561
562 @example
563 someNote = c'
564 \displayMusic \someNote
565 ===>
566 (make-music
567   'EventChord
568   'elements
569   (list (make-music
570           'NoteEvent
571           'duration
572           (ly:make-duration 2 0 1 1)
573           'pitch
574           (ly:make-pitch 0 0 0))))
575 @end example
576
577 Die @code{display-scheme-music}-Funktion ist die Funktion, die von
578 @code{\displayMusic} eingesetzt wird, um die Scheme-Repräsentation
579 eines musikalischen Ausdrucks anzuzeigen.
580
581 @example
582 #(display-scheme-music (first (ly:music-property someNote 'elements)))
583 ===>
584 (make-music
585   'NoteEvent
586   'duration
587   (ly:make-duration 2 0 1 1)
588   'pitch
589   (ly:make-pitch 0 0 0))
590 @end example
591
592 Danach wird die Tonhöhe der Note von der @code{'pitch}-Eigenschaft
593 des @code{NoteEvent}-Objektes gelesen:
594
595 @example
596 #(display-scheme-music
597    (ly:music-property (first (ly:music-property someNote 'elements))
598                       'pitch))
599 ===>
600 (ly:make-pitch 0 0 0)
601 @end example
602
603 Die Tonhöhe einer Note kann geändert werden, indem man diese
604 @code{'pitch}-Eigenschaft umdefiniert:
605
606 @funindex \displayLilyMusic
607 @funindex displayLilyMusic
608
609 @example
610 #(set! (ly:music-property (first (ly:music-property someNote 'elements))
611                           'pitch)
612        (ly:make-pitch 0 1 0)) ;; Die Tonhöhen auf d' verändern.
613 \displayLilyMusic \someNote
614 ===>
615 d'
616 @end example
617
618
619 @node Doubling a note with slurs (example)
620 @subsection Doubling a note with slurs (example)
621
622 In diesem Abschnitt soll gezeigt, werden, wie man eine
623 Funktion erstellt, die eine Eingabe wie @code{a}
624 nach @code{a( a)} umdefiniert.  Dazu wird zuerst die
625 interne Repräsentation der Musik betrachtet, die
626 das Endergebnis darstellt:
627
628 @example
629 \displayMusic@{ a'( a') @}
630 ===>
631 (make-music
632   'SequentialMusic
633   'elements
634   (list (make-music
635           'EventChord
636           'elements
637           (list (make-music
638                   'NoteEvent
639                   'duration
640                   (ly:make-duration 2 0 1 1)
641                   'pitch
642                   (ly:make-pitch 0 5 0))
643                 (make-music
644                   'SlurEvent
645                   'span-direction
646                   -1)))
647         (make-music
648           'EventChord
649           'elements
650           (list (make-music
651                   'NoteEvent
652                   'duration
653                   (ly:make-duration 2 0 1 1)
654                   'pitch
655                   (ly:make-pitch 0 5 0))
656                 (make-music
657                   'SlurEvent
658                   'span-direction
659                   1)))))
660 @end example
661
662 Eine schlechte Nachricht ist, dass die
663 @code{SlurEvent}-Ausdrücke @qq{innerhalb}
664 der Noten (bzw. innerhalb der
665 @code{EventChord}-Ausdrücke) hinzugefügt werden müssen.
666
667 Jetzt folgt eine Betrachtung der Eingabe:
668
669 @example
670 (make-music
671   'SequentialMusic
672   'elements
673   (list (make-music
674           'EventChord
675           'elements
676           (list (make-music
677                   'NoteEvent
678                   'duration
679                   (ly:make-duration 2 0 1 1)
680                   'pitch
681                   (ly:make-pitch 0 5 0))))))
682 @end example
683
684 In der gewünschten Funktion muss also dieser Ausdruck
685 kopiert werden (sodass zwei Noten vorhanden sind, die
686 eine Sequenz bilden), dann müssen @code{SlurEvent}
687 zu der @code{'elements}-Eigenschaft jeder Noten hinzugefügt
688 werden, und schließlich muss eine @code{SequentialMusic}
689 mit den beiden @code{EventChords} erstellt werden.
690
691 @example
692 doubleSlur = #(define-music-function (parser location note) (ly:music?)
693          "Return: @{ note ( note ) @}.
694          `note' is supposed to be an EventChord."
695          (let ((note2 (ly:music-deep-copy note)))
696            (set! (ly:music-property note 'elements)
697                  (cons (make-music 'SlurEvent 'span-direction -1)
698                        (ly:music-property note 'elements)))
699            (set! (ly:music-property note2 'elements)
700                  (cons (make-music 'SlurEvent 'span-direction 1)
701                        (ly:music-property note2 'elements)))
702            (make-music 'SequentialMusic 'elements (list note note2))))
703 @end example
704
705
706 @node Adding articulation to notes (example)
707 @subsection Adding articulation to notes (example)
708
709 Am einfachsten können Artikulationszeichen zu Noten
710 hinzugefügt werden, indem man zwei musikalische Funktionen
711 in einen Kontext einfügt, wie erklärt in
712 @ref{Creating contexts}.  Hier soll jetzt eine musikalische
713 Funktion entwickelt werden, die das vornimmt.
714
715 Eine @code{$variable} innerhalb von @code{#@{...#@}} ist das
716 gleiche wie die normale Befehlsform @code{\variable} in
717 üblicher LilyPond-Notation.  Es ist bekannt dass
718
719 @example
720 @{ \music -. -> @}
721 @end example
722
723 @noindent
724 in LilyPond nicht funktioniert.  Das Problem könnte vermieden
725 werden, indem das Artikulationszeichen an eine Pseudonote
726 gehängtwird:
727
728 @example
729 @{ << \music s1*0-.-> @}
730 @end example
731
732 @noindent
733 aber in diesem Beispiel soll gezeigt werden, wie man das in
734 Scheme vornimmt.  Zunächst wird die Eingabe und die gewünschte
735 Ausgabe examiniert:
736
737 @example
738 %  Eingabe
739 \displayMusic c4
740 ===>
741 (make-music
742   'EventChord
743   'elements
744   (list (make-music
745           'NoteEvent
746           'duration
747           (ly:make-duration 2 0 1 1)
748           'pitch
749           (ly:make-pitch -1 0 0))))
750 =====
751 %  gewünschte Ausgabe
752 \displayMusic c4->
753 ===>
754 (make-music
755   'EventChord
756   'elements
757   (list (make-music
758           'NoteEvent
759           'duration
760           (ly:make-duration 2 0 1 1)
761           'pitch
762           (ly:make-pitch -1 0 0))
763         (make-music
764           'ArticulationEvent
765           'articulation-type
766           "marcato")))
767 @end example
768
769 Dabei ist zu sehen, dass eine Note (@code{c4}) als @code{EventChord}
770 repräsentiert ist, mit einem @code{NoteEvent}-Ausdruck in ihrer
771 Elementenliste.  Um eine Marcato-Artikulation hinzuzufügen, muss
772 ein @code{ArticulationEvent}-Ausdrcuk zu der Elementeigenschaft
773 des @code{EventChord}-Ausdrucks hinzugefügt werden.
774
775 Um diese Funktion zu bauen, wird folgerndermaßen begonnen:
776
777 @example
778 (define (add-marcato event-chord)
779   "Add a marcato ArticulationEvent to the elements of `event-chord',
780   which is supposed to be an EventChord expression."
781   (let ((result-event-chord (ly:music-deep-copy event-chord)))
782     (set! (ly:music-property result-event-chord 'elements)
783           (cons (make-music 'ArticulationEvent
784                   'articulation-type "marcato")
785                 (ly:music-property result-event-chord 'elements)))
786     result-event-chord))
787 @end example
788
789 Die erste Zeile definiert eine Funktion in Scheme: Die Bezeichnung
790 der Funktion ist @code{add-marcato} und sie hat eine Variable
791 mit der Bezeichnung @code{event-chord}.  In Scheme geht der Typ
792 einer Variable oft direkt aus der Bezeichnung hervor (das ist auch
793 eine gute Methode für andere Programmiersprachen).
794
795 @example
796 "Add a marcato..."
797 @end example
798
799 @noindent
800 ist eine (englische) Beschreibung, was diese Funktion tut.  Sie ist
801 nicht unbedingt notwendig, aber genauso wie klare Variablen-Bezeichnungen
802 ist auch das eine gute Methode.
803
804 @example
805 (let ((result-event-chord (ly:music-deep-copy event-chord)))
806 @end example
807
808 @code{let} wird benutzt, um die lokalen Variablen zu definieren.  Hier
809 wird eine lokale Variable benutzt: @code{result-event-chord}.  Sie erhält
810 den Wert @code{(ly:music-deep-copy event-chord)}.  @code{ly:music-deep-copy}
811 ist eine LilyPond-spezifische Funktion, die wie alle Funktionen mit dem
812 Präfix @code{ly:} versehen ist.  Sie wird benutzt, um eine Kopie eines
813 musikalischen Ausdrucks anzufertigen.  Hier wird @code{event-chord}
814 (der Parameter der Funktion) kopiert.  Die Funktion soll ja nur ein
815 Artikulationszeichen an einen @code{EventChord} gehängt werden, deshalb ist es besser,
816 den @code{EventChord}, der als Argument gegeben wurde, nicht zu
817 verändern, weil er woanders benutzt werden könnte.
818
819 Jetzt gibt es @code{result-event-chord}, wobei es sich um einen
820 @code{NoteEventChord}-Ausdruck handelt, welcher gleichzeigt eine Kopie
821 von @code{event-chord} ist.  Das Makro wird seiner Eigenschaftsliste
822 hinzugefügt:
823
824 @example
825 (set! place new-value)
826 @end example
827
828 Was in diesem Fall @qq{gesetzt} werden soll (@qq{place}) ist die
829 @q{elements}-Eigenschaft des @code{result-event-chord}-Ausdrucks.
830
831 @example
832 (ly:music-property result-event-chord 'elements)
833 @end example
834
835 @code{ly:music-property} ist die Funktion, mit der musikalische
836 Eigenschaften erreicht werden können (die @code{'elements},
837 @code{'duration}, @code{'pitch} usw., die in der Ausgabe von
838 @code{\displayMusic} weiter oben angezeigt werden).  Der neue
839 Wert ist, was ehemals die Elemtneigenschaft war, mit einem
840 zusätzlichen Element: dem @code{ArticulationEvent}-Ausdruck,
841 der aus der Ausgabe von
842 @code{\displayMusic} kopiert werden kann:
843
844 @example
845 (cons (make-music 'ArticulationEvent
846         'articulation-type "marcato")
847       (ly:music-property result-event-chord 'elements))
848 @end example
849
850 @code{cons} wird benutzt, um ein Element zu einer Liste hinzuzufügen,
851 ohne dass die originale Liste verändert wird.  Das ist es, was die
852 Funktion tun soll:  die gleiche Liste, aber mit dem neuen
853 @code{ArticulationEvent}-Ausdruck.  Die Reihenfolge innerhalb
854 der Elementeeigenschaft ist hier nicht relevant.
855
856 Wenn schließlich die Marcato-Artikulation zu der entsprechenden
857 @code{elements}-Eigenschaft hinzuzugefügt ist, kann
858 @code{result-event-chord} ausgegeben werden, darum die letzte Zeile
859 der Funktion.
860
861 Jetzt wird die @code{add-marcato}-Funktion in eine musikalische
862 Funktion umgewandelt:
863
864 @example
865 addMarcato = #(define-music-function (parser location event-chord)
866                                      (ly:music?)
867     "Add a marcato ArticulationEvent to the elements of `event-chord',
868     which is supposed to be an EventChord expression."
869     (let ((result-event-chord (ly:music-deep-copy event-chord)))
870       (set! (ly:music-property result-event-chord 'elements)
871             (cons (make-music 'ArticulationEvent
872                     'articulation-type "marcato")
873                   (ly:music-property result-event-chord 'elements)))
874       result-event-chord))
875 @end example
876
877 Eine Überprüfung, dass die Funktion richtig arbeitet, geschieht
878 folgendermaßen:
879
880 @example
881 \displayMusic \addMarcato c4
882 @end example
883
884
885 @node Markup programmer interface
886 @section Markup programmer interface
887
888 Textbeschriftungselemente sind als besondere Scheme-Funktionen
889 definiert, die ein Stencil-Objekt erstellen, dem eine Anzahl
890 an Argumenten übergeben wird.
891
892 @menu
893 * Markup construction in Scheme::
894 * How markups work internally::
895 * New markup command definition::
896 * New markup list command definition::
897 @end menu
898
899
900 @node Markup construction in Scheme
901 @subsection Markup construction in Scheme
902
903 @cindex Textbeschriftungsbefehle, definieren
904 @cindex Textbeschriftung, eigene Befehle
905 @cindex eigene Befehle, Textbeschriftung
906 @cindex markup, eigene Befehle
907 @cindex Befehle definieren, Textbeschriftung
908
909 Das @code{markup}-(Textbeschriftungs)Makro erstellt Textbeschriftungs-Ausdrücke
910 in Scheme, wobei eine LilyPond-artige Syntax benutzt wird.  Beispielsweise
911 ist
912
913 @example
914 (markup #:column (#:line (#:bold #:italic "hello" #:raise 0.4 "world")
915                   #:larger #:line ("foo" "bar" "baz")))
916 @end example
917
918 @noindent
919 identisch mit
920
921 @example
922 \markup \column @{ \line @{ \bold \italic "hello" \raise #0.4 "world" @}
923                   \larger \line @{ foo bar baz @} @}
924 @end example
925
926 @noindent
927 Dieses Beispiel zeigt die hauptsächlichen Übersetzungsregeln
928 zwischen normaler Textbeschriftungssyntax von LilyPond und der
929 Textbeschriftungssyntax in Scheme.
930
931 @quotation
932 @multitable @columnfractions .3 .3
933 @item @b{LilyPond} @tab @b{Scheme}
934 @item @code{\markup Text1} @tab @code{(markup Text1)}
935 @item @code{\markup @{ Text1 Text2 ... @}} @tab
936         @code{(markup Text1 Text2 ... )}
937 @item @code{\Befehl} @tab @code{#:Befehl}
938 @item @code{\Variable} @tab @code{Variable}
939 @item @code{\center-column @{ ... @}} @tab @code{#:center-column ( ... )}
940 @item @code{Zeichenkette} @tab @code{"Zeichenkette"}
941 @item @code{#scheme-arg} @tab @code{scheme-arg}
942 @end multitable
943 @end quotation
944
945 Die gesamte Scheme-Sprache ist innerhalb des @code{markup}-Makros
946 zugänglich.  Man kann also beispielsweise Funktionen innerhalb
947 eines @code{markup} aufrufen, um Zeichenketten zu manipulieren.
948 Das ist nützlich, wenn neue Beschriftungsbefehle definiert werden
949 sollen (siehe auch
950 @ref{New markup command definition}).
951
952
953 @knownissues
954
955 Das Beschriftungslistenargument von Befehlen wie @code{#:line},
956 @code{#:center} und @code{#:column} kann keine Variable oder
957 das Resultat eines Funktionsaufrufen sein.
958
959 @lisp
960 (markup #:line (Funktion-die-Textbeschriftung-ausgibt))
961 @end lisp
962
963 @noindent
964 ist ungültig.  Man sollte anstatt dessen die Funktionen
965 @code{make-line-markup}, @code{make-center-markup} oder
966 @code{make-column-markup} benutzen:
967
968 @lisp
969 (markup (make-line-markup (Funktion-die-Textbeschriftung-ausgibt)))
970 @end lisp
971
972
973 @node How markups work internally
974 @subsection How markups work internally
975
976 In einer Textbeschriftung wie
977
978 @example
979 \raise #0.5 "Textbeispiel"
980 @end example
981
982 @noindent
983 ist @code{\raise} unter der Haube durch die @code{raise-markup}-Funktion
984 repräsentiert.  Der Beschriftungsausdruck wird gespeichert als
985
986 @example
987 (list raise-markup 0.5 (list simple-markup "Textbeispiel"))
988 @end example
989
990 Wenn die Beschriftung in druckbare Objekte (Stencils) umgewandelt ist,
991 wir die @code{raise-markup}-Funktion folgendermaßen aufgerufen:
992
993 @example
994 (apply raise-markup
995        @var{\layout object}
996        @var{Liste der Eigenschafts-alists}
997        0.5
998        @var{die "Textbeispiel"-Beschriftung})
999 @end example
1000
1001 Die @code{raise-markup}-Funktion erstellt zunächt den Stencil für die
1002 @code{Textbeispiel}-Beschriftung und verschiebt dann diesen Stencil
1003 um 0.5 Notenlinienzwischenräume nach oben.  Das ist ein einfaches
1004 Beispiel.  Weitere, kompliziertere Beispiele finden sich nachfolgend
1005 in diesem Abschnitt und in der Datei
1006 @file{scm/@/define@/-markup@/-commands@/.scm}.
1007
1008
1009 @node New markup command definition
1010 @subsection New markup command definition
1011
1012 Neue Textbeschriftungsbefehle können mit dem
1013 @code{define-markup-command}-Scheme-Makro definiert werden.
1014
1015 @lisp
1016 (define-markup-command (@var{befehl-bezeichnung} @var{layout} @var{props} @var{arg1} @var{arg2} ...)
1017             (@var{arg1-type?} @var{arg2-type?} ...)
1018   ..Befehlkörper..)
1019 @end lisp
1020
1021 Die Argumente sind:
1022
1023 @table @var
1024 @item argi
1025 @var{i}te Befehlsargument
1026 @item argi-type?
1027 eine Eigenschaft für das @var{i}te Argument
1028 @item layout
1029 die @q{layout}-Definition
1030 @item props
1031 eine Liste an alists, in der alle aktiven Eigenschaften enthalten sind
1032 @end table
1033
1034 Als einfaches Beispiel soll gezeigt werden, wie man einen
1035 @code{\smallcaps}-Befehl hinzufügen kann, der die Kapitälchen
1036 für die Schriftzeichen auswählt.  Normalerweise würde man Kapitälchen
1037 folgendermaßen auswählen:
1038
1039 @example
1040 \markup @{ \override #'(font-shape . caps) Text-in-Kapitälchen @}
1041 @end example
1042
1043 @noindent
1044 Damit wird die Kapitälchenschriftart ausgewählt, indem die
1045 @code{font-shape}-Eigesnchaft auf @code{#'caps} gesetzt wird,
1046 während @code{Text-in-caps} interpretiert wird.
1047
1048 Damit diese Funkion als @code{\smallcaps}-Befehl zur Verfügung
1049 gestellt werden kann, muss eine Funktion mit @code{define-markup-command}
1050 definiert werden.  Der Befehl braucht ein Argument vom Typ @code{markup}.
1051 Darum sollte der Beginn der Funktion lauten:
1052
1053 @example
1054 (define-markup-command (smallcaps layout props argument) (markup?)
1055 @end example
1056
1057 @noindent
1058
1059 Was jetzt folgt, ist der eigentliche Inhalt des Befehls: das
1060 @code{argument} soll als Beschriftung (markup) interpretiert werden,
1061 also:
1062
1063 @example
1064 (interpret-markup layout @dots{} argument)
1065 @end example
1066
1067 @noindent
1068 Diese Interpretation sollte @code{'(font-shape . caps)} zu den
1069 aktiven Eigenschaften hinzufügen, weshalb wir das Folgende anstelle
1070 der @dots{} in dem Beispiel einfügen:
1071
1072 @example
1073 (cons (list '(font-shape . caps) ) props)
1074 @end example
1075
1076 @noindent
1077 Die Variable @code{props} ist eine Liste an alists, und mit @code{cons}
1078 wird ihr eine zusätzliche Einstellung hinzugefügt.
1079
1080 Man könnte sich auch vorstellen, dass ein Rezitativ einer Oper
1081 gesetzt werden soll, und ein Befehl wäre sehr bequem, mit dem
1082 man die Namen der Charaktere auf eine eigene Art darstellen könnte.
1083 Namen sollen in Kapitälchen gesetzt werden und etwas nach links und
1084 oben verschoben werden.  Man kann also einen @code{\character}-Befehl
1085 definieren, der die nötige Verschiebung berücksichtigt und
1086 den neuen @code{\smallcaps}-Befehl einsetzt:
1087
1088 @example
1089 #(define-markup-command (character layout props name) (string?)
1090   "Print the character name in small caps, translated to the left and
1091   top.  Syntax: \\character #\"name\""
1092   (interpret-markup layout props
1093    (markup #:hspace 0 #:translate (cons -3 1) #:smallcaps name)))
1094 @end example
1095
1096 Hier ist eine Komplikation, die erklärt werden muss: Text über oder
1097 unter dem Notensystem wird vertikal verschoben um in einem bestimmten
1098 Abstand von dem System und den Noten zu sein (das wird als @qq{padding}
1099 bezeichnet).  Um sicherzugehen, dass dieser Mechanismus nicht die
1100 vertikale Verschiebung von @code{#:translate} annulliert, wird
1101 die leere Zeichenkette (@code{#:hspace 0}) vor den zu verschiebenden
1102 Text gesetzt.  Das @code{#:hspace 0} wird jetzt also über die Noten
1103 gesetzt und @code{name} dann relativ zu der leeren Zeichenkette
1104 verschoben.  Im Endeffekt wird der Text nach links oben verschoben.
1105
1106 Das Resultat sieht folgendermaßen aus:
1107
1108 @example
1109 @{
1110   c''^\markup \character #"Cleopatra"
1111   e'^\markup \character #"Giulio Cesare"
1112 @}
1113 @end example
1114
1115 @lilypond[quote,ragged-right]
1116 #(define-markup-command (smallcaps layout props str) (string?)
1117   "Print the string argument in small caps.  Syntax: \\smallcaps #\"string\""
1118   (interpret-markup layout props
1119    (make-line-markup
1120     (map (lambda (s)
1121           (if (= (string-length s) 0)
1122               s
1123               (markup #:large (string-upcase (substring s 0 1))
1124                       #:translate (cons -0.6 0)
1125                       #:tiny (string-upcase (substring s 1)))))
1126          (string-split str #\Space)))))
1127
1128 #(define-markup-command (character layout props name) (string?)
1129   "Print the character name in small caps, translated to the left and
1130   top.  Syntax: \\character #\"name\""
1131   (interpret-markup layout props
1132    (markup #:hspace 0 #:translate (cons -3 1) #:smallcaps name)))
1133
1134 {
1135   c''^\markup \character #"Cleopatra" c'' c'' c''
1136   e'^\markup \character #"Giulio Cesare" e' e' e'
1137 }
1138 @end lilypond
1139
1140 In diesen Befehlen wurden Kapitälchen eingesetzt, aber es kann
1141 vorkommen, dass die Schriftart keine Kapitälchen zur Verfügung
1142 stellt.  In diesem Fall können die Kapitälchen nachempfunden
1143 werden, indem man Großbuchstaben setzt, deren Anfangsbuchstabe
1144 etwas größer gesetzt wird:
1145
1146 @example
1147 #(define-markup-command (smallcaps layout props str) (string?)
1148   "Print the string argument in small caps."
1149   (interpret-markup layout props
1150    (make-line-markup
1151     (map (lambda (s)
1152           (if (= (string-length s) 0)
1153               s
1154               (markup #:large (string-upcase (substring s 0 1))
1155                       #:translate (cons -0.6 0)
1156                       #:tiny (string-upcase (substring s 1)))))
1157          (string-split str #\Space)))))
1158 @end example
1159
1160 Der @code{smallcaps}-Befehl spaltet die Argumente zuerst in
1161 Einzelstücke auf, die von Leerzeichen getrennt sind
1162 (@code{(string-split str #\Space)}); für jedes Einzelstück
1163 wird dann eine Beschriftung aufgebaut, deren erster Buchstabe
1164 vergrößert wird und als Versalbuchstabe gesetzt wird
1165 (@code{#:large (string-upcase (substring s 0 1))}), und eine
1166 zweite Versalbuchstaben gesetzt werden
1167 (@code{#:tiny (string-upcase (substring s 1))}).  Wenn
1168 LilyPond ein Leerzeichen zwischen Beschriftungen einer Zeile
1169 entdeckt, wird die zweite Beschriftung nach links verschoben
1170 (@code{#:translate (cons -0.6 0) ...}).  Dann werden die
1171 Beschriftungen für jedes Einzelstück in eine Zeile gesetzt
1172 @code{(make-line-markup ...)}.  Schließlich wird die resultierende
1173 Beschriftung an die @code{interpret-markup}-Funktion zusammen
1174 mit den Argumenten @code{layout} und @code{props} weitergereicht.
1175
1176 Achtung: ist gibt keinen internen Befehl @code{\smallCaps}, der
1177 benutzt werden kann, um Text in Kapitälchen zu setzen.  Siehe auch
1178 @ref{Text markup commands}.
1179
1180 @knownissues
1181
1182 Im Moment sind die möglichen Kombinationen von Argumenten (nach den
1183 Standardargumenten @var{layout} und @var{props}), die mit
1184 @code{define-markup-command} definiert werden, wie folgt
1185 limitiert:
1186
1187 @table @asis
1188 @item (kein Argument)
1189 @itemx @var{list}
1190 @itemx @var{markup}
1191 @itemx @var{markup markup}
1192 @itemx @var{scm}
1193 @itemx @var{scm markup}
1194 @itemx @var{scm scm}
1195 @itemx @var{scm scm markup}
1196 @itemx @var{scm scm markup markup}
1197 @itemx @var{scm markup markup}
1198 @itemx @var{scm scm scm}
1199 @end table
1200
1201 @noindent
1202 Hier stellt @var{scm} native Scheme-Datentypen dar wie
1203 @q{number} oder @q{string}.
1204
1205 Es ist beispielsweise nicht möglich, einen Beschriftungsbefehl
1206 @code{foo} mit vier Argumenten in folgender Weise zu nutzen:
1207
1208 @example
1209 #(define-markup-command (foo layout props
1210                          num1    str1    num2    str2)
1211                         (number? string? number? string?)
1212   ...)
1213 @end example
1214
1215 @noindent
1216 Wenn es folgendermaßen eingesetzt wird:
1217
1218 @example
1219 \markup \foo #1 #"bar" #2 #"baz"
1220 @end example
1221
1222 @cindex Scheme signature
1223 @cindex Signatur, Scheme
1224 @noindent
1225 beschwert sich @command{lilypond}, dass @code{foo} wegen einer ungekannten
1226 Scheme Signatur nicht analysiert werden kann.
1227
1228
1229 @node New markup list command definition
1230 @subsection New markup list command definition
1231
1232 Beschriftungslistenbefehle können mit dem Scheme-Makro
1233 @code{define-markup-list-command} definiert werden, welches
1234 sich ähnlich verhält wie das
1235 @code{define-markup-command}-Makro, das schon beschrieben
1236 wurde in @ref{New markup command definition}.  Ein Unterschied
1237 ist, dass bei diesem Listen-Makro eine ganze Liste an
1238 Stecils ausgegeben wird.
1239
1240 Im folgenden Beispiel wird ein @code{\paragraph}-Beschriftungslistenbefehl
1241 definiert, welcher eine Liste von Zeilen im Blocksatz ausgibt, von
1242 denen die erste Zeile eingerückt ist.  Der Einzug wird aus dem
1243 @code{props}-Argument entnommen.
1244
1245 @example
1246 #(define-markup-list-command (paragraph layout props args) (markup-list?)
1247    (let ((indent (chain-assoc-get 'par-indent props 2)))
1248      (interpret-markup-list layout props
1249        (make-justified-lines-markup-list (cons (make-hspace-markup indent)
1250                                                args)))))
1251 @end example
1252
1253 Neben den üblichen @code{layout} und @code{props}-Argumenten, nimmt der
1254 @code{paragraph}-Beschriftungslistenbefehl als Argument eine Beschriftungsliste,
1255 die @code{args} genannt wird.  Das Prädikat für Beschriftungslisten ist
1256 @code{markup-list?}.
1257
1258 Zuerst errechnet die Funktion die Breite des Einzugs, eine Eigenschaft
1259 mit der Bezeichnung @code{par-indent} anhand der Eigenschaftsliste
1260 @code{props}.  Wenn die Eigenschaft nicht gefunden wird, ist der
1261 Standardwert @code{2}.  Danach wird eine Liste von Zeilen im Blocksatz
1262 erstellt, wobei die @code{make-justified-lines-markup-list}-Funktion
1263 eingesetzt wird, die verwandt ist mit dem eingebauten
1264 @code{\justified-lines}-Beschriftungslistenbefehl.  Horizontaler
1265 Platz wird zu Beginn eingefügt mit der @code{make-hspace-markup}-Funktion.
1266 Zuletzt wird die Beschriftungsliste ausgewertet durch die
1267 @code{interpret-markup-list}-Funktion.
1268
1269 Dieser neue Beschriftungslistenbefehl kann wie folgt benutzt werden:
1270
1271 @example
1272 \markuplines @{
1273   \paragraph @{
1274     Die Kunst des Notensatzes wird auch als \italic @{Notenstich@} bezeichnet. Dieser
1275     Begriff stammt aus dem traditionellen Notendruck. Noch bis vor etwa
1276     20 Jahren wurden Noten erstellt, indem man sie in eine Zink- oder
1277     Zinnplatte schnitt oder mit Stempeln schlug.
1278   @}
1279   \override-lines #'(par-indent . 4) \paragraph @{
1280     Diese Platte wurde dann mit Druckerschwärze versehen, so dass sie
1281     in den geschnittenen und gestempelten Vertiefungen blieb. Diese 
1282     Vertiefungen schwärzten dann ein auf die Platte gelegtes Papier.
1283     Das Gravieren wurde vollständig von Hand erledigt.
1284   @}
1285 @}
1286 @end example
1287
1288
1289
1290 @node Contexts for programmers
1291 @section Contexts for programmers
1292
1293 @menu
1294 * Context evaluation::
1295 * Running a function on all layout objects::
1296 @end menu
1297
1298 @node Context evaluation
1299 @subsection Context evaluation
1300
1301 @cindex Aufrufen von Code während der Interpretation
1302 @cindex On-the-fly Code ausführen
1303
1304 @funindex \applyContext
1305
1306 Kontexte können während ihrer Interpretation mit Scheme-Code
1307 modifiziert werden.  Die Syntax hierfür ist
1308
1309 @example
1310 \applyContext @var{function}
1311 @end example
1312
1313 @var{function} sollte eine Scheme-Funktion sein, die ein
1314 einziges Argument braucht, welches der Kontext ist, auf den
1315 sie ausgeführt werden soll.  Der folgende Code schreibt
1316 die aktuelle Taktzahlshould in die Standardausgabe
1317 während der Kompilation.
1318
1319 @example
1320 \applyContext
1321   #(lambda (x)
1322     (format #t "\nWe were called in barnumber ~a.\n"
1323      (ly:context-property x 'currentBarNumber)))
1324 @end example
1325
1326
1327
1328 @node Running a function on all layout objects
1329 @subsection Running a function on all layout objects
1330
1331
1332 @cindex Aufruf von Code für Layoutobjekte
1333
1334 @funindex \applyOutput
1335
1336 Der vielfältigste Weg, ein Objekt zu beeinflussen, ist
1337 @code{\applyOutput}.  Die Syntax lautet:
1338
1339 @example
1340 \applyOutput @var{Kontext} @var{proc}
1341 @end example
1342
1343 @noindent
1344 wobei @var{proc} eine Scheme-Funktion ist, die drei Argumente
1345 benötigt.
1346
1347 Während der Interpretation wird die Funktion @var{proc} für
1348 jedes Layoutobjekt aufgerufen, dass im Kontext @var{Kontext}
1349 vorgefunden wird, und zwar mit folgenden Argumenten:
1350
1351 @itemize
1352 @item dem Layoutobjekt
1353 @item dem Kontext, in dem das Objekt erstellt wurde
1354 @item dem Kontext, in welchem @code{\applyOutput} bearbeitet wird.
1355 @end itemize
1356
1357 Zusätzlich findet sich der Grund für das Layoutobjekt, etwa
1358 der musikalische Ausdruck oder das Objekt, das für seine Erstellung
1359 verantwortlich war, in der Objekteigenschaft @code{cause}.
1360 Für einen Notenkopf beispielsweise ist das ein
1361 @rinternals{NoteHead}-Ereignis, und für einen Notenhals
1362 (ein @rinternals{Stem}-Objekt) ist es ein @rinternals{NoteHead}-Objekt.
1363
1364 Hier ist eine Funktion, die mit @code{\applyOutput} benutzt
1365 werden kann; sie macht Notenköpfe auf der Mittellinie unsichtbar:
1366
1367 @example
1368 (define (blanker grob grob-origin context)
1369  (if (and (memq (ly:grob-property grob 'interfaces)
1370                 note-head-interface)
1371           (eq? (ly:grob-property grob 'staff-position) 0))
1372      (set! (ly:grob-property grob 'transparent) #t)))
1373 @end example
1374
1375
1376 @node Scheme procedures as properties
1377 @section Scheme procedures as properties
1378
1379 Eigenschaften (wie Dicke, Richtung usw.) können mit
1380 @code{\override} auf feste Werte gesetzt werden, etwa:
1381
1382 @example
1383 \override Stem #'thickness = #2.0
1384 @end example
1385
1386 Eigenschaften können auch auf eine Scheme-Prozedur gesetzt werden:
1387
1388 @lilypond[fragment,verbatim,quote,relative=2]
1389 \override Stem #'thickness = #(lambda (grob)
1390     (if (= UP (ly:grob-property grob 'direction))
1391         2.0
1392         7.0))
1393 c b a g b a g b
1394 @end lilypond
1395
1396 @noindent
1397 In diesem Fall wird die Prozedur ausgeführt, sobal der Wert der
1398 Eigenschaft während das Formatierungsprozesses angefordert wird.
1399
1400 Der größte Teil der Satzmaschinierie funtioniert mit derartigen
1401 Callbacks.  Eigenschaften, die üblicherweise Callbacks
1402 benutzen, sind u. A.:
1403
1404 @table @code
1405 @item stencil
1406   Die Druckfunktion, die eine Ausgabe des Symbols ervorruft
1407 @item X-offset
1408   Die Funktion, die die horizontale Position setzt
1409 @item X-extent
1410   Die Funktion, die die Breite eines Objekts errechnet
1411 @end table
1412
1413 Die Funktionen brauchen immer ein einziges Argument, das der
1414 Grob ist.
1415
1416 Wenn Funktionen mit mehreren Argumenten aufgerufen werden müssen,
1417 kann der aktuelle Grob mit einer Grob-Einschließung
1418 eingefügt werden.  Hier eine Einstellung aus
1419 @code{AccidentalSuggestion}:
1420
1421 @example
1422 (X-offset .
1423   ,(ly:make-simple-closure
1424     `(,+
1425         ,(ly:make-simple-closure
1426            (list ly:self-alignment-interface::centered-on-x-parent))
1427       ,(ly:make-simple-closure
1428            (list ly:self-alignment-interface::x-aligned-on-self)))))
1429 @end example
1430
1431 @noindent
1432 In diesem Beispiel werden sowohl @code{ly:self-alignment-interface::x-aligned-on-self}
1433 als auch @code{ly:self-alignment-interface::centered-on-x-parent}
1434 mit dem Grob als Argument aufgerufen.  Die Resultate werden mit der
1435 @code{+}-Funktion addiert.  Um sicherzugehen, dass die Addition
1436 richtig ausgeführt wird, wird das ganze Konstrukt in
1437 @code{ly:make-simple-closure} eingeschlossen.
1438
1439 In der Tat ist die Benutzung einer einzelnen Funktion als
1440 Eigenschaftswert äquivalent zu
1441
1442 @example
1443 (ly:make-simple-closure (ly:make-simple-closure (list @var{proc})))
1444 @end example
1445
1446 @noindent
1447 Das innere @code{ly:make-simple-closure} stellt den Grob als Argument
1448 für @var{proc} zur Verfügung, das äußere stellt sicher, dass das
1449 Resultat der Funktion ausgegeben wird und nicht das
1450 @code{simple-closure}-Objekt.
1451
1452
1453 @node Using Scheme code instead of \tweak
1454 @section Using Scheme code instead of @code{\tweak}
1455
1456 Der hauptsächliche Nachteil von @code{\tweak} ist seine
1457 syntaktische Inflexibilität.  Folgender Code beispielsweise
1458 ergibt einen Syntaxfehler:
1459
1460 @example
1461 F = \tweak #'font-size #-3 -\flageolet
1462
1463 \relative c'' @{
1464   c4^\F c4_\F
1465 @}
1466 @end example
1467
1468 @noindent
1469 Anders gesagt verhält sich @code{\tweak} nicht wie eine Artikulation
1470 und kann auch nicht deren Syntax verwenden: man kann es nicht
1471 mit @code{^} oder @code{_} anfügen.
1472
1473 Durch die Verwendung von Scheme kann dieses Problem umgangen werden.
1474 Der Weg zum Resultat wird gezeigt in
1475 @ref{Adding articulation to notes (example)}, insbesondere
1476 wie @code{\displayMusic} benutzt wird, hilft hier weiter.
1477
1478 @example
1479 F = #(let ((m (make-music 'ArticulationEvent
1480                           'articulation-type "flageolet")))
1481        (set! (ly:music-property m 'tweaks)
1482              (acons 'font-size -3
1483                     (ly:music-property m 'tweaks)))
1484        m)
1485
1486 \relative c'' @{
1487   c4^\F c4_\F
1488 @}
1489 @end example
1490
1491 @noindent
1492 In diesem Beispiel werden die @code{tweaks}-Eigenschaften
1493 des Flageolet-Objekts @code{m} (mit @code{make-music} erstellt)
1494 werden mit @code{ly:music-property} ausgelesen, ein neues
1495 Schlüssel-Wert-Paar, um die Schriftgröße zu ändern, wird
1496 der Eigenschaftenliste mithilfe der @code{acons}-Schemefunktion
1497 vorangestellt, und das Resultat wird schließlich mit
1498 @code{set!} zurückgeschrieben.  Das letzte Element des
1499 @code{let}-Blocks ist der Wiedergabewert, @code{m}.
1500
1501
1502
1503 @node Difficult tweaks
1504 @section Difficult tweaks
1505
1506 Hier finden sich einige Klassen an schwierigeren Anpassungen.
1507
1508 @itemize
1509
1510 @item
1511 Ein Typ der schwierigen Anpassungen ist die Erscheinung von
1512 Strecker-Objekten wie Binde- oder Legatobögen.  Zunächst wird
1513 nur eins dieser Objekte erstellt, und sie können mit dem
1514 normalen Mechanismus verändert werden.  In einigen Fällen
1515 reichen die Strecker jedoch über Zeilenumbrüche.  Wenn das
1516 geschieht, werden diese Objekte geklont.  Ein eigenes
1517 Objekt wird für jedes System erstellt, in dem es sich befindet.
1518 Sie sind Klone des originalen Objektes und erben alle
1519 Eigenschaften, auch @code{\override}-Befehle.
1520
1521 Anders gesagt wirkt sich ein @code{\override} immer auf alle
1522 Stücke eines geteilten Streckers aus.  Um nur einen Teil eines
1523 Streckers bei einem Zeilenumbruch zu verändern, ist es notwendig,
1524 in den Formatierungsprozess einzugreifen.  Das Callback
1525 @code{after-line-breaking} enthält die Schemefunktion, die
1526 aufgerufen wird, nachdem Zeilenumbrüche errechnet worden sind
1527 und die Layout-Objekte über die unterschiedlichen Systeme verteilt
1528 wurden.
1529
1530 Im folgenden Beispiel wird die Funktion
1531 @code{my-callback} definiert.  Diese Funktion
1532
1533 @itemize
1534 @item
1535 bestimmt, ob das Objekt durch Zeilenumbrüche geteilt ist,
1536 @item
1537 wenn ja, ruft sie alle geteilten Objekte auf,
1538 @item
1539 testet, ob es sich um das letzte der geteilten Objekte handelt,
1540 @item
1541 wenn ja, wird @code{extra-offset} gesetzt.
1542 @end itemize
1543
1544 Diese Funktion muss in @rinternals{Tie} (Bindebogen) installiert
1545 werden, und der letzte Teil eines gebrochenen Bindebogens wird
1546 nach oben verschoben.
1547
1548 @lilypond[quote,verbatim,ragged-right]
1549 #(define (my-callback grob)
1550   (let* (
1551          ; have we been split?
1552          (orig (ly:grob-original grob))
1553
1554          ; if yes, get the split pieces (our siblings)
1555          (siblings (if (ly:grob? orig)
1556                      (ly:spanner-broken-into orig) '() )))
1557
1558    (if (and (>= (length siblings) 2)
1559              (eq? (car (last-pair siblings)) grob))
1560      (ly:grob-set-property! grob 'extra-offset '(-2 . 5)))))
1561
1562 \relative c'' {
1563   \override Tie #'after-line-breaking =
1564   #my-callback
1565   c1 ~ \break c2 ~ c
1566 }
1567 @end lilypond
1568
1569 @noindent
1570 Wenn man diesen Trick anwendet, sollte das neue @code{after-line-breaking}
1571 auch das alte @code{after-line-breaking}-Callback aufrufen,
1572 wenn es vorhanden ist.  Wenn diese Funktion etwa mit
1573 @code{Hairpin} (Crescendo-Klammer) eingesetzt wird, sollte auch
1574 @code{ly:hairpin::after-line-breaking} aufgerufen werden.
1575
1576
1577 @item
1578 Manche Objekte können aus technischen Gründen nicht mit @code{\override}
1579 verändert werden.  Beispiele hiervon sind @code{NonMusicalPaperColumn}
1580 und @code{PaperColumn}.  Sie können mit der
1581 @code{\overrideProperty}-Funktion geändert werden, die ähnlich wie
1582 @code{\once \override} funktioniert, aber eine andere Syntax einsetzt.
1583
1584 @example
1585 \overrideProperty
1586 #"Score.NonMusicalPaperColumn"  % Grob-Bezeichnung
1587 #'line-break-system-details     % Eigenschaftsbezeichnung
1588 #'((next-padding . 20))         % Wert
1589 @end example
1590
1591 Es sollte angemerkt werden, dass @code{\override}, wenn man es auf
1592 @code{NonMusicalPaperColumn} und @code{PaperColumn} anwendet, immernoch
1593 innerhalb der @code{\context}-Umgebung funktioniert.
1594
1595 @end itemize