Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Hilflos-im-Code am Freitag, 25. Mai 2018, 10:29

Titel: Schemefunktion überschreiben
Beitrag von: Hilflos-im-Code am Freitag, 25. Mai 2018, 10:29
\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.
Titel: Antw:Schemefunktion überschreiben
Beitrag von: harm6 am Freitag, 25. Mai 2018, 11:29
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
Titel: Antw:Schemefunktion überschreiben
Beitrag von: Hilflos-im-Code am Freitag, 25. Mai 2018, 11:38
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.
Titel: Antw:Schemefunktion überschreiben
Beitrag von: harm6 am Freitag, 25. Mai 2018, 12:11
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