mf2ff mf2ff é uma ferramenta para criar fontes vetoriais a partir do código Metafont usando a API Python do FontForge.
É baseado em um conceito de como o MetaFont pode trabalhar em conjunto com um gerador de fonte vetorial sem o desvio do rastreamento do bitmap, descrito abaixo na seção conceitual do MF2VEC. mf2ff é o primeiro e, ao conhecimento do desenvolvedor, a única implementação desse conceito até o momento.
Abaixo, você encontrará alguma ajuda sobre como configurá -lo e como usá -lo.
A ferramenta ainda não foi bem testada, mas os comandos metafont mais comuns são suportados. Além de preencher e desenhar, também são suportados kerning e alguns comandos de ligadura. Por favor, dê uma olhada nas limitações listadas abaixo.
mf2ffmf2ff Você precisa instalar o FontForge e o MetaFont para usar mf2ff .
Você pode ter problemas para executar o script mf2ff . Um problema pode ser que você precisa executar o Python 3 com o módulo FontForge. Abaixo estão algumas dicas sobre como fazê -lo funcionar. Não posso garantir que isso funcionará no seu sistema, mas você deve tentar.
Em diferentes sistemas operacionais ou configurações do sistema em que as dicas abaixo não funcionam, verifique se você usa o módulo Python de Python e Fontforge:
ffpython , python3 , python ). Verifique se as informações da versão afirmam que você está executando Python 3 .import fontforge dentro do intérprete deve funcionar sem erros.fontforge.font() não deve levantar um erro. Se isso funcionar apenas em alguns diretórios, você deve verificar seu PATH ou variável PYTHONPATH . Para acesso temporário à versão Python da Fontforge ffpython , o FontForge vem com um arquivo em lote:
C:Program Files (x86)FontForgeBuilds ) e execute fontforge-console.bat , pois o comando set do Windows altera a variável PATH SOMENTE na sessão de prompt de comando atual.Para acesso permanente, você precisa editar a variável do caminho permanentemente:
environment variables e abra Edit the system environment variables . Clique nas Environment variables e edite a variável PATH da sua conta de usuário ou a do sistema, se você precisar de acesso ao ffpython em várias contas de usuário. Agora, adicione o caminho da FontForge (por exemplo C:Program Files (x86)FontForgeBuildsbin , lembre -se da bin !) Na lista.ffpython está agora disponível em todas as novas janelas de prompt de comando e você poderá usar ffpython path/to/mf2ff.py ... Para acessar facilmente o script mf2ff de todos os lugares, faça o seguinte:
mf2ff à variável PYTHONPATH . Se ainda não houver variável PYTHONPATH , adicione -a à lista.mf2ff com ffpython -m mf2ff ... em novas sessões de prompt de comando.O Ubuntu é usado neste exemplo.
Alguns repositórios enviam versões antigas do Fontforge com suporte ao Python 2. Você pode querer construir o FontForge a partir da fonte:
sudo apt install libjpeg-dev libtiff5-dev libpng-dev libfreetype6-dev libgif-dev libgtk-3-dev libxml2-dev libpango1.0-dev libcairo2-dev libspiro-dev libuninameslist-dev python3-dev ninja-build cmake build-essentialsudo apt install gitgit clone https://github.com/fontforge/fontforge . Isso cria um fontforge/ Diretório.fontforge/ :cd fontforge; mkdir build; cd buildcmake -GNinja ..ninjasudo ninja installNOTA: Verifique a documentação de Fontfore se você tiver problemas com esse processo.
Para acessar facilmente o módulo Python da Fontforge, adicione -o ao seu PythonPath:
~/.profile : export PYTHONPATH=$PYTHONPATH:/path/to/fontforge/ , onde o /path/to/fontforge/ diretório é o criado pela clonagem de fontforge com git, por exemplo $HOME/fontforge .python3 path/to/mf2ff.py ... em novas sessões de shell. Nota: Dependendo da configuração do seu sistema, você precisa digitar python em vez do python3 para executar o Python 3.
Para acessar facilmente o script mf2ff de todos os lugares, adicione sua localização à variável pythonpath:
~/.profile : export PYTHONPATH=$PYTHONPATH:/path/to/mf2ff/ , where /path/to/mf2ff/ diretório é aquele em que você coloca o arquivo mf2ff.py , eg $HOME/mf2ff/mf2ff .mf2ff facilmente com python3 -m mf2ff ... em novas sessões de shell.NOTA: Dependendo do que você está usando, uma reinicialização da concha em vez de uma reinicialização pode ser suficiente.
A solução abaixo usa homebrew. Dessa forma, Fontforge também é acessível com Python:
brew install fontforge .python3 path/to/mf2ff.py ... em novas sessões de shell. Nota: Dependendo da configuração do seu sistema, você precisa digitar python em vez do python3 para executar o Python 3.
Para acessar facilmente o script mf2ff de todos os lugares, adicione sua localização à variável PYTHONPATH :
PYTHONPATH=$PYTHONPATH:/path/to/mf2ff/ .zsh . No seu diretório doméstico, crie ou modifique o arquivo .zshenv .bash . No seu diretório inicial, crie ou modifique o arquivo .bash_profile .tcsh . No seu diretório inicial, crie ou modifique o arquivo correspondente do shell tcsh .mf2ff com python3 -m mf2ff ... em novas sessões de shell. Por padrão, mf2ff gerará um arquivo de banco de dados de fontes (.sfd). Você pode usar as opções -ttf / mf2ff.options['ttf'] = True ou -otf / mf2ff.options['otf'] = True para gerar fontes diretamente.
mf2ff não faz muita limpeza por padrão, pois você pode refazer manualmente os glifos. Você pode usar as opções -cull-at-shipout / mf2ff.options['cull-at-shipout'] = True ou -remove-artifacts / mf2ff.options['remove-artifacts'] = True para executar alguma limpeza automatizada. Observe que os comandos Cull que fazem parte de uma definição de glifos podem resultar na opção cull-at-shipout não fazendo mais alterações para alguns glifos.
Por favor, dê uma olhada nas limitações listadas abaixo.
A principal idéia do conceito MF2VEC é fazer do MetaFont redirecionar as geometrias dos glifos para outro programa (no caso de mf2ff , este programa é Fontforge) em vez de usá -las para gerar uma fonte de bitmap. Isso é possível devido ao fato de o Metafont usar internamente a mesma descrição geométrica que é posteriormente necessária nos arquivos de fonte do vetor - as curvas de Bézier.
O desvio usado por algumas alternativas de conversão das curvas de Bézier em gráficos rasteros e as curvas de volta para Bézier é contornado. Ao usar diretamente a geometria, nenhuma informação se perde.
Como o MetaFont é usado em vez de outras ferramentas, como o MetaPost, para ler arquivos .mf , os arquivos de código metafont não modificados podem ser usados e não apenas a geometria, mas também a codificação de caracteres, os tamanhos das caixas, as informações de kerning e ligadura etc. são enviadas para a fonte vetorial sem reformulação manual.
Essa interceptação das informações é feita redefinindo os comandos Metafont. Como o Metafont não pode interagir com outros programas durante o tempo de execução, a interpretação do arquivo .MF e a geração da fonte precisam ser separados no tempo. Portanto, as informações que Metafont usaria para gerar gráficos de bitmap é salvo no arquivo de log da Metafont. Os comandos da Metafont são redefinidos para que o MetaFont grava as propriedades de geometria e fonte em seu arquivo de log. Depois que o MetaFont tiver processado todos os comandos dos arquivos Metafont, as informações são lidas no arquivo de log, processadas para criar uma fonte e depois removidas do arquivo de log para mantê -lo claro.
A idéia para essa abordagem surgiu em outubro de 2018. Para verificar a praticabilidade, uma implementação para Fontforge foi imediatamente realizada no Python e a gama de comandos suportados foi progressivamente expandida. Quando os testes iniciais mostraram que a ideia funcionou, foi decidido disponibilizar mf2ff para outros usuários interessados. Isso acontece desde março de 2019. Após algumas melhorias e correções de bugs, o desenvolvimento foi pausado por alguns anos. Devido ao feedback da comunidade, o desenvolvimento mf2ff foi continuado em julho de 2023.
Ideia básica
O conceito é baseado na redefinição dos comandos básicos do MetaFont. Eles são definidos de tal maneira que as informações que Metafont normalmente usa para criar a fonte do bitmap é gravada no arquivo de log. Posteriormente, esse arquivo de log é lido e as instruções são passadas para o programa que gera a fonte vetorial a partir dele. Por exemplo, mf2ff usa o FontForge para esse fim. Posteriormente, as informações adicionadas pelos comandos Modified Metafont são removidas do arquivo de log para mantê -las claras.
O diagrama a seguir ilustra o conceito usando mf2ff como exemplo.
┌──────────┐
│ font.mf │
└──────────┘
v
┌──────────┐ ┌───────────┐
│ │ > │ METAFONT │
│ │ └───────────┘
│ │ v
│ │ ┌───────────┐
│ mf2ff │ < │ font.log │
│ │ └───────────┘
│ │
│ │ ┌───────────┐
│ │ > │ FontForge │
└──────────┘ └───────────┘
v v
┌──────────┐ ┌─────────────────────┐
│ font.log │ │ font.ttf / font.otf │
└──────────┘ └─────────────────────┘
Exemplo simples
A adição do código a seguir a um arquivo metafont fará com que a MetaFont não fill o contorno c , mas para escrever as operações no arquivo de log:
def fill expr c =
message "fill"; show c;
enddef;
Depois que o Metafont terminou o processamento do arquivo, um script analisa o arquivo de log e sabe que havia um comando fill e sabe que o contorno é preenchido. Essas informações podem ser passadas para o programa de processamento de fontes para adicioná -las ao glifo.
De fato, esse processo é muito mais complicado. Para poder processar arquivos metafont não baseados em metafont simples, comandos como addto em vez de comandos como fill precisam ser redefinidos. Mas esses comandos addto são mais complexos; Eles também formam a base para outros comandos metafont simples, como unfill , ( un ) draw , ( un ) drawdot e erase . Esses comandos se expandem para várias palavras -chave que separam as diferentes partes das informações necessárias para realizar essas diferentes operações ( addto , also , contour , doublepath , withpen , withweight ).
Outro desafio é o cólon em condições e loops. Essas estruturas podem aparecer em qualquer outro comando, mesmo em comandos que usam o cólon como um separador ( ligtable e fontdimen ), então : deve ser redefinido como outras palavras -chave para produzir informações para o arquivo de log. É necessária uma mudança sofisticada entre diferentes redefinições do cólon nesses comandos.
Além disso, um processo precisa ser implementado para facilitar a localização de todos os comandos no arquivo de log, mesmo que haja comandos de mensagem no arquivo metafont não relacionados à redefinição das primitivas Metafont. Esses não devem ser interpretados como informações para a geração de fontes. Portanto, todas as informações gravadas no arquivo de log precisam ser incluídas em palavras -chave especiais que são improváveis para serem usadas nos comandos da mensagem dos arquivos metafont.
Metafont, desenvolvido por De Knuth desde 1977, é um programa que gera fontes de bitmap a partir de arquivos escritos no idioma metafont. As fontes de bitmap têm a desvantagem de que ficam embaçadas sob ampliação. Metafont foi desenvolvido para que, para a resolução específica da impressora, uma fonte separada fosse gerada. Atualmente, as fontes vetoriais são padrão, que não têm esse problema sob ampliação. Portanto, eles são mais adequados para uso em displays. Além disso, eles podem ser usados com todas as impressoras sem restrições.
Além da abordagem MF2VEC com o mf2ff apresentado aqui, os seguintes scripts para converter arquivos metafont em fontes vetoriais estão disponíveis:
| Nome | Método |
|---|---|
| Metatype1 | Metapost |
| MF2PT1 | Metapost |
| mftrace | Rastreamento de bitmap |
| Textrace | Rastreamento de bitmap |
Nesse contexto, o MetaPost significa que o programa Metapost é usado para converter todos os caracteres do arquivo metafont em um gráfico vetorial. Depois disso, os gráficos vetoriais são montados para obter uma fonte vetorial. Esse método tem a desvantagem de que a MetaPost só pode processar uma parte do idioma metafont.
O rastreamento do bitmap significa que o MetaFont gera uma fonte de bitmap primeiro. Em um programa separado, o bitmap de cada glifo é rastreado e depois montado para obter uma fonte vetorial.
Cada um dos métodos tem desvantagens específicas. Por favor, dê uma olhada na comparação abaixo para obter mais detalhes.
Na tabela a seguir, mostra uma comparação dos scripts disponíveis para converter arquivos metafont em fontes vetoriais.
| Característica | Metafont | mf2ff | Metatype1 | MF2PT1 | mftrace | Textrace |
|---|---|---|---|---|---|---|
| Script está escrito em | - | Python 3 | Perl | Perl | Python 2 | Perl |
| Processamento de arquivos metafont | Metafont | Metafont | Metapost | Metapost | Metafont | Metafont |
| Processamento subsequente | - | Fontforge | AWK / T1ASM | T1ASM | Autotrace ou Potrace / T1ASM | Autotrace |
| Formato de saída | Gf / tfm | ✅ TTF, OTF, SFD | ? Pfb | ? Pfb | ✅ AFM / PFA / PFB / TTF / SVG | ? Pfb |
| Qualidade de saída | bitmap | ✅ Gráfico vetorial | ✅ Gráfico vetorial | ✅ Gráfico vetorial | ? bitmap rastreado | ? bitmap rastreado |
| Redefine os não primitivos / requer não primitivos | ✅ Não | ✅ Não | Sim | Sim | ✅ Não | ✅ Não |
| Suporte Unicode | Não | ✅ Sim | ❔ | Não | Não | Não |
| Suporta comandos de caneta | ✅ Sim | ? Limitado | Não | ? Limitado | ✅ Sim | ✅ Sim |
| Suporta comandos de ligadura e kerning | ✅ Sim | ? Limitado | ❔ | ❔ | ❔ | Não |
| Suporta fontes variáveis | Não | Não, possivelmente no futuro | Não | Não | ❔ | Não |
A seguir, alguns exemplos criados com mf2ff . Os contornos e caracteres preenchidos são mostrados à medida que são exibidos em fontforge. Observe que os resultados ainda não foram perfeitos.
Alguns glifos dos tipos de letra modernos do computador ainda não foram processados corretamente, ou seja, a parte do meio do capital s e sloped_serif em letras minúsculas.

![]() | ![]() | ![]() |
A imagem à esquerda foi criada por comandos cull desativados.
O estilizado Costa Redwood Tree El Palo Alto, que é apresentado nas páginas 124-126 do MetafontBook. Na versão esquerda, a opção cull-at-shipout é ativada. Como o porta-malas e a filial superior compartilham um ponto na curva, a implementação atual causa resultados errados lá.
![]() | ![]() | ![]() | ![]() |
O logotipo, que é apresentado na página 138, o MetaFontBook. Na versão esquerda, a opção cull-at-shipout é ativada. O logotipo preenchido é o mesmo nos dois casos.
![]() | ![]() | ![]() |
mf2ff Como mf2ff ainda está em desenvolvimento e não é bem testado, existem algumas limitações. Eles podem ser abordados em atualizações futuras.
Se uma limitação específica estiver segurando seu projeto, abra um problema para que atualizações futuras possam se concentrar nas necessidades dos usuários.
penrazor não é suportado (veja Dangerous_Bend_Symbol Exemplo), Fontforge: "Largura do golpe não pode ser zero"penspeck levanta um aviso, mas a saída parece ser boa em alguns casos.cull é limitado.: :: , kern , skipto bem como os operadores de ligadura =: , |=: :, =:| e |=:| são suportados. O comando ligtável ignora > em operadores. Além disso, o operador ||: não é suportado.charlist Nether Nem Comandos extensible ainda são suportados.picture deve ser redefinida para inicializar as variáveis de imagem como uma camada vetorial de fontforge. Como o MetaFont usa as palavras -chave TIPE para ambos, declaração variável e teste de tipo em expressões booleanas, a palavra -chave picture não pode ser usada para testar se uma variável for da picture do tipo.makepen e makepath não têm efeito. Pens e caminho não podem ser distinguidos usando pen ou path em uma expressão booleana. Existe uma opção is_type que apresenta is_pen ou is_path , que pode ajudá -lo a contornar esse problema.ligtable e fontdimenmf2ff precisa redefinir o cólon : :). Isso pode causar problemas no processamento de múltiplos aninhados if ... ( elseif ) ... ( end ) ... fi e / ou for / forsuffixes / forever ... endfor dentro dos comandos que usam o cólon em sua própria sintaxe, ou seja, ligtable e fontdimen .charlist e extensibleExistem algumas coisas, que podem ajudar. Lembre -se de que não os entendo 100%:
/usr/local/lib/python3/dist-packages no seu $PYTHONPATHexport PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3/dist-packages para o seu ~/.profile )/usr/local/lib/python3.4/site-packages no caminho de Python