Gibt es ein automatisiertes System zur Berechnung der linearen Länge eines Buchstabens in einem Wort oder einer Phrase?

7

Ich bin vielleicht weit außerhalb der Liga und stelle diese Frage, aber gibt es eine Möglichkeit, die lineare Länge eines Buchstabens oder von Wörtern zu ermitteln? Das heißt, wenn Sie das Wort "super" nehmen und den äußeren Rand der Buchstaben messen würden, würden Sie eine Messung erhalten. Gibt es da draußen etwas, das mir diese Messung sagen würde, wenn ich die Schriftart und die Schriftgröße angeben würde? Ich bin ein Neuling hier, also sei sanft. Danke im Voraus.

mrbungle
quelle

Antworten:

6

Dies ist mit TeX / LaTeX trivial (obwohl Sie eine neuere Version wie xetex oder luatex verwenden möchten, um problemlos auf OpenType- und TrueType-Schriftarten zugreifen zu können):

\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}

welches ausgegeben wird: 0.2060in

OpenType-Funktionen werden unterstützt:

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

welche Ausgänge:

0,8425 Zoll

0,7911 Zoll

WillAdams
quelle
1
Wenn es um kontextbezogene Alternativen, diskretionäre Ligaturen und die Bandbreite der OpenType-Funktionen / -Substitutionen geht, weiß ich nicht, dass "trivial" genau das Wort ist, das ich verwenden würde ... :) [Übrigens: Haben wir uns auf dem nicht getroffen? InDesign Listserv, oder sind Sie ein anderer LaTeX-Fan mit dem gleichen Namen?]
Alan Gilbertson
1
Welche OpenType-Funktion möchten Sie aktivieren? Sie funktionieren alle und sind zugänglich (das Aktivieren von Optionen in einem vorab geschriebenen Programm gilt als trivial, nein). Ja, ich bin der Willadam aus der InDesign-Liste.
WillAdams
<breit grinsend> Nur ein echt blauer, voll bezahlter Geek's Geek könnte 14 Codezeilen überhaupt als "trivial" bezeichnen, daher würde sich das Hinzufügen der erforderlichen OTF-Parameter auf dieser Grundlage ebenfalls qualifizieren.
Alan Gilbertson
Schön, Sie hier zu sehen. Sie haben mehrere Wissensbereiche, die hier sonst nicht sehr vertreten sind (LaTeX ist ein gutes Beispiel dafür).
Alan Gilbertson
@AlanGilbertson 14-Zeilen können hart sein, aber es ist nicht schwer, wenn sie keinen algorithmischen Effekt haben und aus einer Dokumentation kopiert werden, wenn sie genau in dem Umfang verwendet werden, in dem sie entworfen wurden. Die Zeilenanzahl gibt einfach das Bild ein.
Joojaa
3

In Bezug auf allgemein verfügbare Tools gibt es nichts, was [Zufallsschrift] [Größe] und [Zeichen] als Eingaben verwendet und eine Länge ausspuckt. Es gibt mehrere Gründe, warum dies immer der Fall sein wird, aber der Hauptgrund ist, dass jede normale (nicht monospaced ) Schriftart eine eigene Kerning-Tabelle hat, die von einer Version der Schriftart zur nächsten etwas variieren kann und oft auch, ganz zu schweigen von der Tatsache, dass verschiedene Gießereien ihre eigenen Versionen beliebter Schriften (Futura, Times, Gill Sans usw.) veröffentlichen, mit ihren eigenen Variationen in den Charakterumrissen und im Kerning. All das, und wir haben noch nicht einmal Ligaturen, Tracking, benutzerdefiniertes Kerning oder automatische Zeichenwechsel oder Swashes erwähnt, wie sie üblicherweise in OpenType-Schriftarten verfügbar sind.

Obwohl ein Messwerkzeug, nach dem Sie fragen, theoretisch hergestellt werden könnte, würden die praktischen Aspekte, die damit verbunden sind, es tatsächlich nützlich zu machen, es wahrscheinlich zu teuer machen, um die Mühe wert zu sein.

Es ist jedoch nicht alles verloren. Jede Designanwendung verfügt über eine Art Messwerkzeug (auch, wie WillAdams hervorhebt, speziell für den Typ im Fall von LaTeX), mit dem alles auf der Seite gemessen werden kann. In den Adobe-Anwendungen wird es mit der Pipette verschachtelt gefunden. Es ist manuell, aber es funktioniert.

Alan Gilbertson
quelle
Danke für die ausführliche Antwort. Obwohl es über meinem Kopf nicht ganz schwierig ist zu verstehen, worauf du hinaus willst.
Mrbungle
1
Wenn es Ihnen über den Kopf geht, nehmen Sie einfach die einzelnen Begriffe, mit denen Sie nicht vertraut sind, und googeln Sie sie. Terminologie macht 90% des Kampfes aus, um sich mit jedem Thema vertraut zu machen und in der Lage zu sein, es zu verstehen.
Alan Gilbertson
Tatsächlich. Ich bin ein DBA / Reportwriter, der in die Position geworfen wird. Dieses Thema ist jedoch nur für ein persönliches Projekt. :-)
Mrbungle
In diesem Fall sollten Sie einen Blick darauf werfen: pytex.org/texd
WillAdams
Ich werde das auch überprüfen, sieht interessant aus und etwas, von dem ich wahrscheinlich zu viel wissen werde, nur für ein persönliches Nebenprojekt, lol. Immer lernen!
Mrbungle
1

Es gibt viele Möglichkeiten, dies zu tun. Ich zeige hier, wie ein Ingenieur das Problem angehen würde. Der Punkt ist zu zeigen, dass der Ansatz in vielerlei Hinsicht analog zu vielen anderen Bereichen ist. Es laut aufzuzählen scheint langweilig und in einfachen Fällen wie diesem wird es lautlos im Kopf gemacht. Dies veranschaulicht nur die Methode.

Warnung lange Erklärung.

Stufe 1: Lösung definieren

  • Holen Sie sich die Breite der Zeichenfolge.
  • Verwenden einer bestimmten Schriftart.
  • Vorzugsweise auf technisch nutzbare Weise also minimaler menschlicher Eingriff.
  • Verwenden der Schriftkodierung: Unbekannte Fragenklärung wirkt sich auf die Lösung aus
  • Zweck: Unbekannte Fragenklärung, wirkt sich auf die Lösung aus
  • Wie oft wird das Tool benötigt: Unbekannte Fragenklärung, wirkt sich auf die Lösung aus, wenn dies häufig der Fall ist
  • Stapelverarbeitung erforderlich: Unbekannte Fragenklärung, wirkt sich bei Bedarf auf die Lösung aus
  • Benutzereingabe: Zeichenfolge plus Schriftart? Disambiguieren
  • Ausgabe: für einen automatisierten Prozess oder für den manuellen Gebrauch?
  • Nutzungsumgebung: Welches Betriebssystem? Unbekannte Fragenklärung, wirkt sich stark auf die Lösung aus
  • Einheit: Pixel, pt, Zoll oder mm? Unbekannte Fragenklärung, wirkt sich auf die Lösung aus

Wie Sie sehen, gibt es viele Unbekannte, die beantwortet werden müssen. Vor allem, wenn man eine gute Lösung haben möchte, die an den Kunden geliefert werden kann. Bemühen Sie sich immer, das Problem zu verstehen.

Stufe 2: Suche nach Methoden in der Literatur (oder Brainstorming)

In der ersten Phase werden Anwendungen und Methoden aufgelistet, die Antworten liefern können:

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)

Die Liste reicht aus, um zu testen

Stufe 3: Prototyp (Skizze)

mit Postscript

Postscript ist eine bekannte Methode. Das Problem mit Postscript ist die Engine, mit der Sie dies tun, da sie leicht unterschiedliche Auswirkungen haben. Die Verwendung von gohostscript funktioniert wie folgt:

:: 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%

Funktioniert unter Windows, gibt die Punktbreite zurück und funktioniert wahrscheinlich auch unter Linux mit einigen Änderungen. Randbedingungen unbekannt. Bitte um Klarstellung. Probleme: Sie müssen die Zeichencodierung korrigieren oder die ps-Zwischendatei verwenden. Andernfalls funktioniert keine beabstandete Zeichenfolge. Böse Codierungsprobleme, die bei Verwendung westlicher Sprachen beherrschbar sind.

Verwenden von Illustrator und Javascipt

Manuelles Verwenden des Illustrators: Wenn Sie den Pfad skizzieren, können Sie die Breite des Texts im Feld Breite in der Benutzeroberfläche lesen. Sobald dies verstanden ist, kann es per Skript erstellt werden.

Dies kann in Javascript kodifiziert werden:

#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")

Funktioniert, benötigt aber Illustrator kann ein Problem sein oder auch nicht. Das Ergebnis kann bei Bedarf unter Berücksichtigung einiger technischer Aspekte verfeinert werden. Das Gleiche kann in VB oder Applescript oder mit COM mit C, C ++, Python, Perl, Ruby usw. erfolgen. Kann bei Bedarf auch über die Befehlszeile verwendet werden.

Und nachdem einige der oben genannten getestet wurden, wählen Sie eine zur Verfeinerung.

PS: Könnte op klarstellen?

joojaa
quelle