Schemefunktion überschreiben

Begonnen von Hilflos-im-Code, Freitag, 25. Mai 2018, 10:29

« vorheriges - nächstes »

Hilflos-im-Code

\version "2.19.81"
fooFinal =
#(define-scheme-function
  (parser location mrkp clr  )
  (markup? color?   )
  #{
    \markup {
      \with-color $clr
   
     
      %% other syntax-possibility:
      %\override #'(font-name . ,font-name-string)
     
      $mrkp
    }
  #})



A = \fooFinal "A" #blue #1 






{c^\A}



Jetzt tritt ein Sonderfall ein und ich hätte das A doch ausnahmsweise gerne Rot.

{ c -\tweak TextScript.color #red ^\A }

bringt nicht das gewünschte Ergebnis.

harm6

Hallo,

wenn ein stencil erstmal gefärbt ist, dann ist es aufwendig das wieder rückgängig zu machen bzw eine ander Farbe einzusetzen.
Anstatt nachher die Farbe zu ändern, scheint es mir einfacher von vornherein die gewünschte Farbe zu wählen.

Du könntest mit Deiner Funtion ja einfach codieren:
Ar = \fooFinal "A" #red
{ c^\Ar }


Der komplizierte und aufwendige Weg:
\version "2.19.81"

fooFinal =
#(define-scheme-function (mrkp clr) (markup? color?)
  #{ \markup { \with-color $clr $mrkp } #})

A = \fooFinal "A" #blue

#(define (lists-map function ls)
   "Apply @var{function} to @var{ls} and all of it sublists.
First it recurses over the children, then the function is applied to
@var{ls}."
   (if (list? ls)
       (set! ls (map (lambda (y) (lists-map function y)) ls))
       ls)
   (function ls))
   
#(define (change-stencil-color to)
  (lambda (grob)
    (let* ((stil (ly:text-interface::print grob))
           (x-ext (ly:stencil-extent stil X))
           (y-ext (ly:stencil-extent stil Y))
           (stil-expr (ly:stencil-expr stil))
           (recolored-stil-expr
             (lists-map
                 (lambda (e)
                  (if (and (list? e) (eq? 'color (car e)))
                      (append (list 'color to) (cddr e))
                      e))
               stil-expr)))
    (ly:make-stencil
      recolored-stil-expr
      x-ext
      y-ext))))


{ c^\A }
 
{ c -\tweak stencil #(change-stencil-color red) ^\A }



Geht es Dir wirklich um die Farbe?
Ich zumindest verwende Farben häufig, um etwas zu zeigen, aber das tatsächliche Problem ist mitunter (bedeutend) umfangreicher...

Gruß,
  Harm

Hilflos-im-Code

Danke. Im konkreten Fall ging es mir um die Farbe.

Aber die Frage stellt sich mir auch grundsätzlich. Denn ich verwende Scheme-Funkionen in mehreren Dateien, indem ich sie inkludiere.

Ab und zu passt das Ergebnis nicht. Und nachträglich die Scheme-Funktion zu ändern, schießt alle Dateien ab, die in der Vergangenheit auf diese Schemefunktionen zurückgreifen.

Also eigentlich ein Problem von all denen, die in ihren Templates Schemefunktionen inkludieren.

harm6

Zitat
Aber die Frage stellt sich mir auch grundsätzlich. Denn ich verwende Scheme-Funkionen in mehreren Dateien, indem ich sie inkludiere.

Ab und zu passt das Ergebnis nicht. Und nachträglich die Scheme-Funktion zu ändern, schießt alle Dateien ab, die in der Vergangenheit auf diese Schemefunktionen zurückgreifen.

Eigentlich ist doch nicht die schemefunktion problematisch, die funktioniert ja wie sie soll und ist auch variabel.
Du hast aber mit
A = \fooFinal "A" #blue
eine Anwendung dieser Funktion festgeklopft.
Das ist dann nicht mehr auf einfachem Weg zu ändern.

ZitatAlso eigentlich ein Problem von all denen, die in ihren Templates Schemefunktionen inkludieren.
Ich denke eher, es ist ein generelles Problem von Templates. Sie legen manches fest und schließen damit gleichzeitig anderes aus. Und irgenwann/irgendwo will man dann doch was anderes...

Gruß,
  Harm