Adaptació d’ordres incorporades
Una bona manera de començar a escriure una ordre de marcatge nova és seguir l’exemple d’una altra ordre ja incorporada. Gairebé totes les ordres de marcatge que estan incorporades al LilyPond es poden trobar al fitxer scm/define-markup-commands.scm.
Per exemple, voldríem adaptar l’ordre \draw-line
perquè
traci una línia doble. L’ordre \draw-line
està definida
com segueix (s’han suprimit els comentaris de documentació):
(define-markup-command (draw-line layout props dest) (number-pair?) #:category graphic #:properties ((thickness 1)) "…documentación…" (let ((th (* (ly:output-def-lookup layout 'line-thickness) thickness)) (x (car dest)) (y (cdr dest))) (make-line-stencil th 0 0 x y)))
Per definir una ordre nova basada en una altra existent, copieu la
definició i canvieu-li el nom. La paraula clau #:category
es pot eliminar sense por, atès que sols s’utilitza per generar
documentació del LilyPond, i no té cap utilitat per a les ordre de
marcatge definits per l’usuari.
(define-markup-command (draw-double-line layout props dest) (number-pair?) #:properties ((thickness 1)) "…documentació…" (let ((th (* (ly:output-def-lookup layout 'line-thickness) thickness)) (x (car dest)) (y (cdr dest))) (make-line-stencil th 0 0 x y)))
A continuació s’afegeix una propietat per establir la separació
entre les dues línies, anomenada line-gap
, amb un valor
predeterminat, per exemple 0.6:
(define-markup-command (draw-double-line layout props dest) (number-pair?) #:properties ((thickness 1) (line-gap 0.6)) "…documentació…" …
Finalment, s’afegeix el codi per traçar les dues línies. S’usen
dues crides a make-line-stencil
per traçar les línies, i
els segells resultants es combinen usant ly:stencil-add
:
#(define-markup-command (my-draw-line layout props dest) (number-pair?) #:properties ((thickness 1) (line-gap 0.6)) "..documentació.." (let* ((th (* (ly:output-def-lookup layout 'line-thickness) thickness)) (dx (car dest)) (dy (cdr dest)) (w (/ line-gap 2.0)) (x (cond ((= dx 0) w) ((= dy 0) 0) (else (/ w (sqrt (+ 1 (* (/ dx dy) (/ dx dy)))))))) (y (* (if (< (* dx dy) 0) 1 -1) (cond ((= dy 0) w) ((= dx 0) 0) (else (/ w (sqrt (+ 1 (* (/ dy dx) (/ dy dx)))))))))) (ly:stencil-add (make-line-stencil th x y (+ dx x) (+ dy y)) (make-line-stencil th (- x) (- y) (- dx x) (- dy y))))) \markup \my-draw-line #'(4 . 3) \markup \override #'(line-gap . 1.2) \my-draw-line #'(4 . 3)![]()