On 1/19/2018 2:37 PM, Urs Liska wrote:
Hi Knut,


Am 19.01.2018 um 13:38 schrieb Knut Petersen:
Am 19.01.2018 um 09:37 schrieb Urs Liska:
I'm contributing to a LuaLaTeX package (https://github.com/jperon/lyluatex) that uses an external program (LilyPond) to generate images to be included in the LaTeX document. I need to pass the used fonts to LilyPond, and I didn't manage to retrieve the necessary information in Lua.

What I need is

a) which families are currently set as roman, sans and mono fonts
b) the "family" name of these.  [...]

So you want to teach lilypond to use the fonts latex uses.

Yes, it's awesome when included scores use the same fonts as the surrounding text.

In a similar project I use this code fragment to get information about the current TeX font and to pass it to lilypond:

      \else
        {
          \mdseries\@llftmp
          \immediate\write18{
            LANG=c
            FONT=`echo '\fontname\font'
            | sed -e 's/"//g'
            | sed -e
    's/\@esc[\@esc([[:print:]]*\@esc)\@esc][[:print:]]*/\@esc1/'`
            ;
            otfinfo --info `kpsewhich $FONT`
            | grep "Full name:"
            | sed -e 's/Full
    name:[[:blank:]]*\@esc([[:print:]]*\@esc)/\@esc\@esc
              def \@esc\@esc fontfullname\@cbopen\@esc 1\@cbclose/'
            > ourfont.tex}
          \input "ourfont.tex"
          \@imwrtof{\@ht(define lyinlaFontName "\fontfullname")}
          \@imwrtof{\@ht(define lyinlaFontSize (absFontSize \f@size))}
        }
      \fi


\@imwrtof is defined to immediately write to an output file that will be processed by lilypond,
\@esc gives a literal "\",
\@ht gives a literal "#",
\@cbopen gives a literal "{",
\@cbclose gives a  literal "}"

Obviously it does not compile, it requires --shell-escape,

That's not an issue, the lyluatex package needs that anyway to start LilyPond.

and it is not OS-independent.

That's probably true.

Bt it might be a starting point for you.

The idea of the code is to take \fontname\font,
to process it as shown,
to get the font filename from kpsewhich,
and to use otfinfo to get the needed information.

The output of otfinfo is filtered and written to a TeX file,
that file is read after return from the shell,
and two scheme expression (for fontname and fontsize) are
written to a file that later will be processed by lilypond.


I can do that with little effort in the Lua layer (I'm working in anyway):

  * get the absolute filename from the font object.
  * run otfinfo -a with that filename

This should be straightforward to implement but hard to make OS independent. While I personally don't care about that I vividly recall that in an earlier life I felt strongly offended by the attitude "YOU made the mistake of using Windows, so don't complain now" ...

otfinfo seems to be available on Windows and even included in http://w32tex.org/ ,  but I'm not sure if that will be an acceptable dependency. Of course I can start with implementing it for Linux and make the option be limited to that.


But still I can't really believe that Lua can tell me the postscriptname, "fullname", filename, but not the family.

Does anybody know if that's a deliberate limitation?
Something like this

\directlua {
    function FontInfoField(id,name)
        local t = fonts.hashes.identifiers[id]
if t and t.shared and t.shared.rawdata and t.shared.rawdata.metadata then
            local s = t.shared.rawdata.metadata[name]
            if t then
                tex.print(s)
            end
        end
    end
}

\def\CurrentFontName {\directlua{tex.sprint(FontInfoField(\fontid\font,"fontname"))}} \def\CurrentFullName {\directlua{tex.sprint(FontInfoField(\fontid\font,"fullname"))}} \def\CurrentFamily {\directlua{tex.sprint(FontInfoField(\fontid\font,"family"))}} \def\CurrentFamilyName {\directlua{tex.sprint(FontInfoField(\fontid\font,"familyname"))}} \def\CurrentSubFamily {\directlua{tex.sprint(FontInfoField(\fontid\font,"subfamily"))}} \def\CurrentSubFamilyName {\directlua{tex.sprint(FontInfoField(\fontid\font,"subfamilyname"))}}
\def\CurrentCompatibleName{\directlua{tex.sprint(FontInfoField(\fontid\font,"compatiblename"))}}

\def\test{%
    \CurrentFontName      \par
    \CurrentFullName      \par
    \CurrentFamily        \par
    \CurrentFamilyName    \par
    \CurrentSubFamily     \par
    \CurrentSubFamilyName \par
    \CurrentCompatibleName\par
}

\test \bf \test

should give

LMRoman10-Regular
LMRoman10-Regular
LM Roman 10
Latin Modern Roman
Regular
10 Regular
LM Roman 10 Regular
LMRoman10-Bold
LMRoman10-Bold
LM Roman 10
Latin Modern Roman
Bold
10 Bold
LM Roman 10 Bold

but it depends on the macro package how you'd really do it (this is a somewhat generic approach which might work ok for latex but i didn't test it)

Hans

-----------------------------------------------------------------
                                          Hans Hagen | PRAGMA ADE
              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
       tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------

Reply via email to