Darstellung der Fonts/Schriftarten funktioniert nicht für Lyrics - nur default

Begonnen von Korbinian, Mittwoch, 31. März 2021, 10:24

« vorheriges - nächstes »

Korbinian

Ich habe das Problem, dass unter Windows nur die Standartschriftarten für die Lyrics von Lilypond funktionieren. Änderungen sämtlicher Schriftarten und auch der neu installierten werden nicht angenommen und die PDF-Datei oder SVG-Datei zeigt immer wieder die Default-Schriftarten nach der Kompilation. Ich arbeite mit Frescobaldi 3.1.3. Ich habs mit #(ly:font-config-add-directory "C:/WINDOWS/Fonts") und #(ly:font-config-add-font "Platzhalter") probiert und hab in einem weiteren Lösungsversuch die Windows-Schriftarten in den Fonts-Ordner von Lilypond und in den Ordner kopiert, wo ich meine aktuellen Lilypond-Dateien bearbeite. Nichts hat funktioniert. Ich hab auch andere Schriftarten wie Doulos SIL probiert bzw. unten im Minimalbeispiel statt Gentium Plus GentiumPlus-R als Name versucht.

Die Schriftart im Titel ändert sich immer korrekt, aber die in den Lyrics nicht - das ist meiner Kollegin aufgefallen, die das Problem (auch Windows) replizieren konnte.

\version "2.22.0"


\paper {
%#(ly:font-config-add-font "GentiumPlus-R.ttf")
%#(ly:font-config-add-directory "C:/WINDOWS/Fonts/")
  #(define fonts
    (set-global-fonts
     #:roman "Gentium Plus"
     #:sans "Gentium Plus"
     #:typewriter "Gentium Plus"
    )) }


Hat jemand eine Idee woran das liegen könnte?

harm6

Hmm, bislang hat noch niemand geantwortet...
Dann vesuch ich es mal, obwohl ich weder diese Schriftart noch Windows habe.

Zunächst mal stelle sicher, daß LilyPond die Schriftart überhaupt sieht.
D.H. ob mit
#(ly:font-config-display-fonts)
die Schriftart in der ausgegebenen Liste auftaucht.

Falls ja, dann ist das ein reines Windowsproblem und ich habe nur noch einen möglichen work-around:

\new Lyrics \with { \override LyricText.font-name = "Gentium Plus" }
  \lyricmode {
    foo -- bar
  }


Um zu sehen welche Schriftart tatsächlich genommen wird hier ein test-code:

#(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))

printStencilExpressionFonts = 
#(lambda (grob)
  (let* ((stil (ly:grob-property grob 'stencil))
         (stil-expr (ly:stencil-expr stil))
         (output '())
         ;; Finde font-names und speichere sie in "output"
         ;; Die Methode muß zwischen "named-glyph" und "glyph-string"
         ;; differenzieren, da LilyPond das intern anders umsetzt.
         (store-font-names
           (lambda (entry)
             (cond
                   ;; Wenn die stencil-expression irgendwo "named-glyph"
                   ;; beinhaltet, dann extrahiere die Schriftart via
                   ;; ly:font-name aus dem zweiten Eintrag der mit "named-glyph"
                   ;; anfangenden Liste.
                   ;; Erweitere output mit dem Ergebnis.
                   ((and (list? entry)
                         (eq? 'named-glyph (car entry))
                         (ly:font-metric? (cadr entry)))
                     (set! output
                           (cons (ly:font-name (cadr entry)) output)))
                   ((and (list? entry)
                   ;; Wenn die stencil-expression irgendwo "glyph-string"
                   ;; beinhaltet, dann extrahiere die Schriftart indem das
                   ;; dritte Element, der mit "glyph-string" anfangenden Liste
                   ;; ausgewählt wird, ly:font-name würde hier #f zurückgeben.
                   ;; Erweitere output mit dem Ergebnis.
                         (eq? 'glyph-string (car entry))
                         (ly:font-metric? (cadr entry)))
                     (set! output
                           (cons (caddr entry) output)))
                   ;; Ansonsten mache nichts weiter.
                   (else entry)))))
        (lists-map store-font-names stil-expr)

    (pretty-print (cons (grob::name grob) (reverse output)))))
   

printLyricTextFont =
  \override LyricText.after-line-breaking = \printStencilExpressionFonts

\paper {
%#(ly:font-config-add-font "GentiumPlus-R.ttf")
%#(ly:font-config-add-directory "C:/WINDOWS/Fonts/")
  #(define fonts
    (set-global-fonts
     #:roman "Gentium Plus"
     #:sans "Gentium Plus"
     #:typewriter "Gentium Plus"
    )) }

\new Lyrics \with { \override LyricText.font-name = "Gentium Plus" }
  \lyricmode {
  \printLyricTextFont
    foo -- bar
  }


Bei mir sehe ich dann:
(LyricText "DejaVuSans")
(LyricText "DejaVuSans")

Wie erwartet wird ein fallback benutzt, da ich "Gentium Plus" nicht habe.

Gruß,
  Harm