Algum sistema automatizado para calcular o comprimento linear de uma letra em uma palavra ou frase?

7

Eu posso estar fora do comum fazendo essa pergunta, mas existe uma maneira de obter o comprimento linear de uma letra ou palavras. Ou seja, se você pegasse a palavra "super" e medisse a borda externa das letras, obteria uma medida. Existe algo lá fora que me diria essa medida se eu fornecer a fonte e o tamanho da fonte? Eu sou um novato aqui, então seja gentil. desde já, obrigado.

mrbungle
fonte

Respostas:

6

Isso é simples de usar TeX / LaTeX (embora você queira usar uma versão mais recente, como xetex ou luatex, para poder acessar facilmente as fontes OpenType e TrueType):

\documentclass{standalone}
\usepackage{fontspec}
\setmainfont{Myriad Pro Black Condensed}% <<-- change to desired font
\usepackage[nomessages]{fp}
\makeatletter
\newcommand{\printer}[3][in]{%
\FPeval\temp{round(\expandafter\strip@pt\csname#2\endcsname/72.27:#3)}%
\temp#1}
\makeatother
\begin{document}
\newlength{\samplewidth}
\settowidth{\samplewidth}{Test} % <<-- change to the text which you wish to measure
\printer{samplewidth}{4}
\end{document}

qual saída: 0.2060in

Os recursos OpenType são suportados:

\settowidth{\samplewidth}{Test 0123456789}
\printer{samplewidth}{4}\par
\addfontfeature{Numbers={Proportional,Lining}}
\settowidth{\samplewidth}{Test 0123456789}
\printer{samplewidth}{4}

quais saídas:

0.8425in

0.7911in

WillAdams
fonte
11
Quando se trata de alternativas contextuais, ligaduras discricionárias e a gama de recursos / substituições do OpenType, não sei se "trivial" é exatamente a palavra que eu usaria ... :) [BTW: Não nos conhecemos no listserv InDesign, ou você é um LaTeX diferente aficionado de mesmo nome]?
Alan Gilbertson
11
Qual recurso OpenType você gostaria de ativar - todos eles funcionam e são acessíveis (ativar opções em um programa pré-escrito é considerado trivial, não). Sim, sou o willadams da lista do InDesign.
WillAdams
<sorrindo amplamente> Somente um nerd de verdade, totalmente pago e totalmente nerd, poderia chamar 14 linhas de código de "triviais" em primeiro lugar, então suponho que, com base nisso, a adição dos parâmetros OTF necessários se qualifique da mesma forma.
Alan Gilbertson
Ótimo ver você aqui, no entanto. Você tem várias áreas de conhecimento que não são muito representadas aqui de outra forma (disse que o LaTeX é um bom exemplo).
Alan Gilbertson
O @AlanGilbertson 14 linhas pode ser difícil, mas não é difícil se elas não tiverem efeito algorítmico e são copiadas de uma documentação, quando usadas exatamente no escopo em que foram projetadas. A contagem de linhas simplesmente entra na imagem.
Joojaa
3

Em termos de ferramentas comumente disponíveis, não, não há nada que tome [fonte aleatória] [tamanho] e [caracteres] como entradas e cuspa um comprimento. Há várias razões pelas quais isso sempre será verdade, mas a principal é que toda fonte normal (não monoespaçada ) tem sua própria tabela de kerning que pode e geralmente varia um pouco de uma versão da fonte para a próxima, sem mencionar o fato de que diferentes fundições publicam suas próprias versões de tipos populares (Futura, Times, Gill Sans, etc.), com suas próprias variações nos contornos dos caracteres e no kerning. Tudo isso, e nem mencionamos ligaduras, rastreamento, kerning personalizado ou alternativos ou swashes automáticos de caracteres, como normalmente estão disponíveis nas fontes OpenType.

Portanto, embora em teoria possa ser feita uma ferramenta de medição do tipo que você está perguntando, os aspectos práticos envolvidos em torná-la realmente útil provavelmente a tornariam muito caro para valer o esforço.

Nem tudo está perdido entretanto. Todo aplicativo de design possui alguma forma de ferramenta de medição (até, como WillAdams destaca, especificamente para o tipo no caso do LaTeX) que pode ser usada para medir qualquer coisa na página. Nos aplicativos da Adobe, é encontrado aninhado com a ferramenta Conta-gotas. É manual, mas funciona.

Alan Gilbertson
fonte
Obrigado pela resposta detalhada. Embora acima da minha cabeça não seja completamente difícil entender o que você está fazendo.
Mrbungle 12/05
11
Se parecer demais, basta pegar os bits individuais da terminologia com os quais você não está familiarizado e pesquisar no Google. A terminologia é 90% da batalha em se sentir confortável e capaz de se tornar fácil com qualquer assunto.
Alan Gilbertson
De fato. Eu sou um escritor de dba / relatório lançado na posição. Este tópico, no entanto, é apenas para um projeto pessoal. :-)
mrbungle
Nesse caso, você deve dar uma olhada em: pytex.org/texd
WillAdams
Vou verificar isso também, parece interessante e algo que provavelmente terminarei sabendo muito apenas de um projeto paralelo pessoal, lol. Sempre aprendendo!
Mrbungle 12/05
1

Há muitas maneiras de fazer isso. Estou mostrando aqui como um engenheiro abordaria o problema. O objetivo é mostrar que a abordagem é de muitas maneiras análoga a muitos outros campos. Enumerá-lo em voz alta parece chato e, em casos simples como esse, é feito silenciosamente na cabeça. Isso apenas ilustra o método.

Atenção explicação longa.

Etapa 1: Definir solução

  • Obter largura da string.
  • Usando fonte específica.
  • De preferência de uma maneira tecnicamente utilizável, para uma intervenção humana mínima.
  • Usando codificação de fonte: desconhecido, solicite esclarecimentos, afeta a solução
  • Objetivo: Desconhecer pedir esclarecimentos, afeta a solução
  • Quantas vezes a ferramenta é necessária: Desconhecidos solicitam esclarecimentos, afetam a solução, se frequentemente
  • precisa de processamento em lote: desconhecido, solicite esclarecimentos, afeta a solução, se necessário
  • entrada do usuário: string mais fonte? Desambiguar
  • saída: para um processo automatizado ou para uso manual?
  • ambiente de uso: qual sistema operacional? Esclarecimento de solicitação desconhecido , afeta fortemente a solução
  • unidade: pixels, pt, polegadas ou mm? Esclarecimento de solicitação desconhecido , afeta solução

Como você pode ver, muitas incógnitas precisam ser respondidas. Especialmente se alguém quiser ter uma boa solução que possa ser enviada ao cliente. Sempre se esforce para entender o problema.

Etapa 2: procure métodos na literatura (ou faça brainstorming)

O primeiro estágio é listar aplicativos e métodos que poderiam gerar respostas:

Graphics applications (adobe has scripting api OK)
Page setters (TEX solution above)
Operating system (windows has methods for font metrics)
Manually parse fontfile (Infeasible, many formats in one need to implement a lot of routines)
postscript interpretters (solution known)
GUI toolkits (QT can do this)
Other Tookints (Graphing tools like Scipy have this info)

A lista é suficiente para testar

Etapa 3: Protótipo (esboço)

usando postscript

O postscript é um método conhecido, o problema com o postscript é o mecanismo que você usa para fazer isso, pois eles têm efeitos ligeiramente diferentes. Usando o gohostscript, o seguinte arquivo em lote funciona:

:: usage stringWidth string systemfont
set "ps=(%1) /%2 findfont 12 scalefont setfont 0 0 moveto true charpath pathbbox pop exch pop exch sub pstack"
gswin64c -dQUIET -dBATCH -r1200 -dNODISPLAY -sFONTPATH=%windir%\fonts -c %ps%

Funciona no Windows, retorna a largura do ponto, provavelmente também funciona no Linux com algumas alterações. Restrições de borda desconhecidas. Peça esclarecimentos. Problemas: é necessário corrigir a codificação de caracteres ou usar o arquivo ps intermediário. Caso contrário, nenhuma string espaçada funcionará. Problemas de codificação desagradáveis, gerenciáveis ​​se estiver usando idiomas ocidentais.

Usando Illustrator e javascipt

usando o ilustrador manualmente: Se você esboçar o caminho, poderá ler a largura do texto na caixa de largura da GUI. Depois que isso for entendido, ele poderá ser roteirizado.

Isso pode ser codificado em javascript:

#target illustrator

var doc = app.documents.add();
var text = doc.textFrames.add();
text.contents = "test";
text.textRange.characterAttributes.size = 12;
text.textRange.characterAttributes.textFont = textFonts.getByName("Onyx");

var outline = text.createOutline();
var bounds = outline.geometricBounds
var width = bounds[1]-bounds[3]
alert(width+" pt")

Funciona, mas precisa do Illustrator pode ou não ser um problema. O resultado pode ser refinado para alguns aspectos técnicos, se necessário. O mesmo pode ser feito no VB ou no AppleScript, ou usando COM com C, C ++, python, perl, ruby ​​etc. Também pode ser usado através da linha de comando, se necessário.

E depois que alguns dos itens acima forem testados, escolha um para refinamento.

PS: O op poderia esclarecer?

joojaa
fonte