Hello Valentin,
I looked at the src code as well. I don't see an easy way to by-pass the problem, given that
ly:font-config-get-font-file is bound to a C++ code that can't be dynamically overridden. In addition, The procedure explained in
even if it does work, it appears a bit misleading to me, because it requires to set the font-name attribute with a string which doesn't represent the name of the font, because it can include the style attributes as well.
IMHO, replacing:
\override #'(font-name . "Bitstream Vera Sans, sans-serif, Oblique Bold")
with
\override #'(font-formatted-class . "Bitstream Vera Sans, sans-serif, Oblique Bold")
Would be more appropriate (maybe there are better strings than "font-formatted-class", but you get the idea). However, I can image that this would be not a trivial change to the current API.
In any case, given a string that represents the class of the font (name + other attributes), I can't find a function that can parse this string and consequently finds the associated font-file.
In fact #(ly:font-config-get-font-file str) accepts only the name of the font.
Then, until we find a way to A) parse the complete string AND B) check if the corresponding font is really found, when I want to set fonts for my score I can only do the following procedure, which is long, unsafe and laborious:
1) I choose a font with some system fonts viewer, then check if it is included in the list obtained with -dshow-available-fonts (this is laborious: it would be better to have a sort of "font viewer" already bound to LilyPond)
2) I Inspect the properties of the chosen font with the above command, so to manually create a string that represents it (i.e: "Bitstream Vera Sans, sans-serif, Oblique Bold") and then set font-name with that string (this is unsafe, because there's not a way to check if the font is installed)
3) Get the file of the font with ly:font-config-get-font-file, and then feed a function like \checkFontFile font-name font-file-name (see the snippet below): this is tedious but necessary too, because if we compile a score on a different OS than the original one, it can raise a warning if the font is not found. And this is error-prone too: for example, for "Liberation Sans, Italic", I got the LiberationSansNarrow-Regular.ttf file, which can be misleading.
If we solve at least the above A and B problems, the procedure is much simplified. Please let me know if you have any idea about it, or an alternative. It would be really useful to have a proper way to manage these things.
Best,
Paolo
%%%%%%%%%%%%%%
checkFontFile = #(define-scheme-function (parser location fontName fontFile) (string? string?)
(let
((warning (not (string-contains (ly:font-config-get-font-file fontName) fontFile))))
(if warning
(begin
(display "\nwarning: font '")
(display fontFile)
(display "' not found!\n")
)
)
))
%%%%%%%%%%%%%%