lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: \label et barnnumber


From: Nicolas Sceaux
Subject: Re: \label et barnnumber
Date: Sun, 5 Jun 2011 21:36:45 +0200

Le 5 juin 2011 à 20:08, Jean-Charles Malahieude a écrit :

> La commande \label #'ici permet de référencer un numéro de page.
> Comment faire pour, par la même occasion, référencer le numéro de mesure pour 
> ensuite faire
> 
> \markup { Correction A (page \page-ref #'correctA "0" "?"
>         mesure \bar-ref #'correctA "0" "?")}
> 
> J'ai bien tenté de faire un cocktail détonnant à partir de la fonction telle 
> qu'elle apparaît dans ly/music-functions-init.ly et le message
> http://lists.gnu.org/archive/html/lilypond-user/2011-02/msg00219.html

Voici une solution possible :

#(define global-bar-label-table '())

barLabel =
#(define-music-function (parser location label) (symbol?)
   (make-music
    'SequentialMusic
    'elements (list (make-music
                     'EventChord
                     'page-marker #t
                     'page-label label
                     'elements (list (make-music 'LabelEvent
                                                 'page-label label)))
                    (make-music
                     'ApplyContext
                     'origin location
                     'procedure (lambda (c)
                                  (let ((cbn (ly:context-property c 
'currentBarNumber)))
                                    (set! global-bar-label-table
                                          (acons label
                                                 (if (not (number? cbn)) 0 cbn)
                                                 global-bar-label-table))))))))

#(define-markup-command (generic-label-reference layout props label table-proc 
next)
     (symbol? procedure? markup?)
   #:properties ((gauge-markup "000"))
  (let* ((gauge-stencil (interpret-markup layout props gauge-markup))
         (x-ext (ly:stencil-extent gauge-stencil X))
         (y-ext (ly:stencil-extent gauge-stencil Y)))
    (ly:make-stencil
     `(delay-stencil-evaluation
       ,(delay (ly:stencil-expr
                (let* ((table (table-proc))
                       (label-ref (and (list? table) (assoc label table)))
                       (ref-number (and label-ref (cdr label-ref)))
                       (ref-markup (markup #:concat ((format "~a" (or 
ref-number "?"))
                                                     next)))
                       (ref-stencil (interpret-markup layout props ref-markup))
                       (gap (- (interval-length x-ext)
                               (interval-length (ly:stencil-extent ref-stencil 
X)))))
                  (interpret-markup layout props
                                    (markup #:concat (ref-markup #:hspace 
gap)))))))
     x-ext
     y-ext)))

#(define-markup-command (full-page-bar-ref layout props label) (symbol?)
   (interpret-markup layout props
                     (markup "(page"
                             #:generic-label-reference
                             label
                             (lambda ()
                               (ly:output-def-lookup layout 'label-page-table))
                             #:line (" mesure " #:generic-label-reference
                                                label
                                                (lambda ()
                                                  global-bar-label-table) 
")"))))

{ \barLabel #'c c'1
  \barLabel #'d d'\pageBreak
  \barLabel #'e e'
  \barLabel #'f f' }

\markup { c \full-page-bar-ref #'c }
\markup { d \full-page-bar-ref #'d }
\markup { e \full-page-bar-ref #'e }
\markup { f \full-page-bar-ref #'f }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]