Cerco (offro) uno script per costruire un font-book

  • Creatore
    Topic
  • #58709
    Up
    0
    Down
    ::


    Salve a tutti.

    Qualcuno di voi sa se esiste uno script (o magari ne ha scritto uno) in python o in lua che raccoglie le stringhe prodotte da fc-list e ci costruisce un file .tex che, una volta compilato, produca un “libro dei fonts” presenti sul proprio sistema? Qualcosa di simile al sampler.tex che una volta compilato produce il sampler.pdf, ma riferito a tutti i fonts presenti sul proprio sistema.

    A me sembra che con XeTeX o LuaTeX dovrebbe essere piuttosto facile, ma in rete finora non ho trovato niente.

    Ho provato a usare Font Manager, Fontmatrix e Specimen, ma non danno risultati soddisfacenti.

    Grazie, ciao.

    Sam Qasbah

Visualizzazione 2 filoni di risposte
  • Autore
    Risposte
    • #58710
      Up
      0
      Down
      ::


      Ci sto lavorando sopra. Al momento ho messo su qualcosa di macchinoso, ma che sembra funzionare; mi serve comunque qualche aiuto.

        dò nel terminale il comando `find / -name \*.otf -print`

        Mi copio il risultato in un file di testo, diciamo “fonts.txt”

        Ho scritto uno script python, diciamo “fontbook.py” `#!/usr/bin/env python
        # -*- coding: utf-8 -*-

        def maketexfile():
        flist = open('fonts.txt','r')
        slist=[]
        for line in flist:
        if line[0]=='/': slist.append(line)
        flist.close()

        slist.sort()

        texfile = open('fontlist.tex','w')
        for line in slist:
        line = line.rstrip('\n')
        texfile.write('\\font\currfont=”[%s]” at 12pt \n'% line)
        texfile.write('\line{\\namefont %s\hfil}\par\hfil\hbox to 15cm{\currfont\sample}\medskip \n'% (line.rpartition('/'))[2])
        texfile.close()

        if __name__ == '__main__':
        maketexfile()
        ` Il nucleo dello script è il blocco “for line in slist”: per ogni linea di testo (contenente il path completo dei files *.otf presenti sul sistema) scrive nel file fontlist.tex due linee di testo secondo il seguente schema `\font\currfont=”[]” at 12pt
        \line{\namefont \hfil}\par\hfil\hbox to 15cm{\currfont\sample}\medskip
        `

        Mi sono altresì preparato un piccolo file TeX (fontbook.tex) che definisce \sample e richiama il file fontlist.tex prodotto dallo script di cui sopra `\font\titlefont=”[/home/sam/.local/share/font-manager/Library/A/afont.otf]” at 18pt
        \font\namefont=”[/home/sam/.local/share/font-manager/Library/A/anotherfont.otf]” at 12pt

        \def\sample{Science is knowledge which we understand so well that we can teach it to a computer; and if we dont fully understand something, it is an art to deal with it.}

        \line{\hfil\titlefont\bf The Font Book\hfil}\bigskip

        \input fontlist.tex

        \bye `

        Compilando questo file con XeTeX si ottiene, finalmente, il FontBook dei fonts presenti sul mio sistema.

      Tutto funziona bene, tranne il fatto che il TeX è più rognoso di quel che sembra: la frase “\sample” non viene spezzata in più righe dentro il box in cui viene composta, ma resta una unica riga che finisce fuori il foglio.

      Come posso correggere? In altre parole: come posso modificare lo schema di due righe da inserire nel file fontlist.tex?

      Mi si scusi la lunghezza del post. Grazie per ogni aiuto. Ciao.

      Sam Qasbah

    • #58711
      Up
      0
      Down
      ::

      Ci sto lavorando sopra. Al momento ho messo su qualcosa di macchinoso, ma che sembra funzionare; mi serve comunque qualche aiuto.

        dò nel terminale il comando `find / -name \*.otf -print`

        Mi copio il risultato in un file di testo, diciamo “fonts.txt”

        Ho scritto uno script python, diciamo “fontbook.py” `#!/usr/bin/env python
        # -*- coding: utf-8 -*-

        def maketexfile():
        flist = open('fonts.txt','r')
        slist=[]
        for line in flist:
        if line[0]=='/': slist.append(line)
        flist.close()

        slist.sort()

        texfile = open('fontlist.tex','w')
        for line in slist:
        line = line.rstrip('\n')
        texfile.write('\\font\currfont=”[%s]” at 12pt \n'% line)
        fontnametuple = line.rpartition('/')
        fontname = fontnametuple[2]
        texfile.write('\line{\\namefont %s\hfil}\par\hfil\hbox to 15cm{\currfont\sample}\medskip \n'% fontname)
        texfile.close()

        if __name__ == '__main__':
        maketexfile()
        ` Il nucleo dello script è il blocco “for line in slist”: per ogni linea di testo (contenente il path completo dei files *.otf presenti sul sistema) scrive nel file fontlist.tex due linee di testo secondo il seguente schema `\font\currfont=”[]” at 12pt
        \line{\namefont \hfil}\par\hfil\hbox to 15cm{\currfont\sample}\medskip
        `

        Mi sono altresì preparato un piccolo file TeX (fontbook.tex) che definisce \sample e richiama il file fontlist.tex prodotto dallo script di cui sopra `\font\titlefont=”[/home/sam/.local/share/font-manager/Library/A/afont.otf]” at 18pt
        \font\namefont=”[/home/sam/.local/share/font-manager/Library/A/anotherfont.otf]” at 12pt

        \def\sample{Science is knowledge which we understand so well that we can teach it to a computer; and if we dont fully understand something, it is an art to deal with it.}

        \line{\hfil\titlefont\bf The Font Book\hfil}\bigskip

        \input fontlist.tex

        \bye `

        Compilando questo file con XeTeX si ottiene, finalmente, il FontBook dei fonts presenti sul mio sistema.

      Tutto funziona bene, tranne il fatto che il TeX è più rognoso di quel che sembra: la frase “\sample” non viene spezzata in più righe dentro il box in cui viene composta, ma resta una unica riga che finisce fuori il foglio.

      Come posso correggere? In altre parole: come posso modificare lo schema di due righe da inserire nel file fontlist.tex?

      Mi si scusi la lunghezza del post. Grazie per ogni aiuto. Ciao.

      Sam Qasbah

      Componi \sample in una \hbox, per forza non va a capo: \hbox è del tutto analogo a \mbox (con una lieve differenza).

      Cambierei la riga
      ` texfile.write('\line{\\namefont %s\hfil}\par\hfil\hbox to 15cm{\currfont\sample}\medskip \n'% fontname)`
      in
      ` texfile.write('\hbox{\\namefont %s}\vbox{\hsize15cm\currfont\sample}\medskip \n'% fontname)`
      (aggiusta tu se ci sono problemi con Python). L’idea è di comporre
      `\font\currfont=”[]” at 12pt
      \hbox{\namefont }
      \vbox{\hsize15cm\currfont\sample}\medskip`
      Non c’è bisogno di \par, perché \hbox e \vbox non fanno uscire TeX dal modo verticale.

      Nota però che XeTeX accetta anche .ttf

      Ciao
      Enrico

    • #58712
      Up
      0
      Down
      ::

      Cambierei la riga
      ` texfile.write('\line{\\namefont %s\hfil}\par\hfil\hbox to 15cm{\currfont\sample}\medskip \n'% fontname)`
      in
      ` texfile.write('\hbox{\\namefont %s}\vbox{\hsize15cm\currfont\sample}\medskip \n'% fontname)`…

      Nota però che XeTeX accetta anche .ttf

      Ciao
      Enrico

      Grazie. Adesso funziona bene.

      Ho fatto un pò di ottimizzazione: adesso fontbook.tex è così`\font\titlefont=”[/home/sam/.local/share/font-manager/Library/A/Afontname.otf]” scaled 2000
      \font\namefont=”[/home/sam/.local/share/font-manager/Library/A/Afontname.otf]” at 12pt

      \def\sample{Science is knowledge which we understand so well that we can teach
      it to a computer; and if we dont fully understand something, it is an art to
      deal with it.}

      \def\currline#1#2{\font\currfont=”[#1]” at 12pt\hbox{\namefont #2}\vbox{\hsize15cm\currfont\sample}\medskip}

      \line{\hfil\titlefont\bf The Font Book\hfil}\bigskip

      \input fontlist.tex

      \bye`
      Quindi la composizione di tutte le linee avviene in questo file con il comando \currline, in modo da poterlo modificare a piacere e semplicemente, mentre il file fontlist.tex contiene solo una lista di path di fonts racchiusi, appunto, nel comando \currline.
      fontlist.tex viene composto automaticamente dallo script fontbook.py`
      #!/usr/bin/env python
      # -*- coding: utf-8 -*-

      import commands

      def maketexfile():
      print('Working. Please wait … \n')
      output = commands.getoutput('find / -name \*.otf -print')
      fontlist = output.split('\n')
      print('.otf fonts now collected … \n')
      output = ''
      output = commands.getoutput('find / -name \*.ttf -print')
      fontlist.extend(output.split('\n'))
      print('.ttf fonts now collected … \n')
      fontlist.sort()
      print('fonts now sorted … \n')

      texfile = open('fontlist.tex','w')
      try:
      print('Writing .tex file … \n')
      for fontpathline in fontlist:
      if (fontpathline[0] == '/') and (fontpathline.count('_') == 0):
      texfile.write('\currline{%s}{%s} \n' % (fontpathline, (fontpathline.rpartition('/'))[2]))
      print('Job well done! \n')
      finally:
      texfile.close()

      if __name__ == '__main__':
      maketexfile() ` che si occupa anche di interrogare il sistema (debian; per altri sistemi non garantisco) circa la presenza e il numero di fonts .otf e .ttf e ordinarli alfabeticamente.

      Fornisco il codice completo sia perchè ho notato che l’argomento affrontato in questo thread è piuttosto ricorrente, sia per incoraggiare chiunque abbia delle idee (soprattutto per la composizione del file fontbook.tex) a condividerle qui.

      Grazie, ciao.

      Sam Qasbah

      p.s.: Enrico, madonna quanto ti invidio il livello e la profondità delle tue competenze. Ciao.

Visualizzazione 2 filoni di risposte
  • Devi essere connesso per rispondere a questo topic.

Go to top