我可能不喜欢问这个问题,但有没有办法得到一个字母或单词的线性长度。也就是说,如果你用“超级”这个词来测量字母的外边界,你就会得到一个测量值。如果我给出字体和字体大小,有什么东西可以告诉我这个测量值吗?我是这里的菜鸟,所以要温柔。提前致谢。
任何自动系统来计算单词或短语中字母的线性长度?
这对于使用 TeX/LaTeX 来说是微不足道的(尽管您需要使用较新的版本,例如 xetex 或 luatex,以便能够轻松访问 OpenType 和 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}
这将输出:0.2060in
支持 OpenType 功能:
\settowidth{\samplewidth}{Test 0123456789}
\printer{samplewidth}{4}\par
\addfontfeature{Numbers={Proportional,Lining}}
\settowidth{\samplewidth}{Test 0123456789}
\printer{samplewidth}{4}
输出:
0.8425英寸
0.7911英寸
就常用工具而言,不,没有任何东西可以将 [random-font] [size] 和 [characters] 作为输入并吐出长度。有几个原因会一直如此,但主要原因是每个普通(非等宽)字体都有自己的字距调整表,从一个字体版本到下一个版本,它可以而且经常会有所不同,更不用说事实上,不同的字体代工厂发布了他们自己版本的流行字体(Futura、Times、Gill Sans 等),在字符轮廓和字距调整方面有自己的变化。所有这些,我们甚至还没有提到 OpenType 字体中常见的连字、跟踪、自定义字距调整或自动字符替换或花体。
因此,尽管理论上可以制造您所询问的那种测量工具,但使其真正有用所涉及的实用性可能会使其过于昂贵,不值得付出努力。
不过,一切都没有丢失。每个设计应用程序都有某种形式的测量工具(甚至,正如 WillAdams 指出的那样,专门用于 LaTeX 的类型),可用于测量页面上的任何内容。在 Adobe 应用程序中,它与吸管工具嵌套在一起。它是手动的,但它可以工作。
有很多方法可以做到这一点。我在这里展示了工程师如何解决这个问题。重点是表明该方法在许多方面类似于许多其他领域。大声列举它似乎很无聊,在这样的简单情况下,它会在头脑中默默地完成。这只是说明方法。
警告长解释。
第 1 阶段:定义解决方案
- 获取字符串的宽度。
- 使用特定的字体。
- 最好以技术上可用的方式来减少人为干预。
- 使用字体编码:未知询问澄清,影响解决方案
- 目的:不明问清楚,影响解决
- 多久需要一次工具:未知询问澄清,如果经常影响解决方案
- 需要批处理:未知要求澄清,如果需要影响解决方案
- 用户输入:字符串加字体?消除歧义
- 输出:用于自动化过程还是手动使用?
- 使用环境:什么操作系统?未知询问澄清,强烈影响解决方案
- 单位:像素、pt、英寸还是毫米?未知问澄清,影响解决
如您所见,有很多未知数需要回答。特别是如果一个人想要一个可以交付给客户的好的解决方案。始终努力理解问题。
第 2 阶段:在文献中搜索方法(或头脑风暴)
第一阶段是列出可以产生答案的应用程序和方法:
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)
清单就足够了 go test
第三阶段:原型(草图)
使用后记
Postscript 是一种已知的方法,postscript 的问题是您使用什么引擎来执行此操作,因为它们的效果略有不同。使用 gohostscript 以下批处理文件有效:
:: 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%
适用于 windows,返回点宽度,可能也适用于 linux,并进行了一些更改。边界限制未知。要求澄清。问题:需要修复 char 编码或使用中间 ps 文件。否则,没有空格字符串起作用。讨厌的编码问题,如果使用西方语言是可以管理的。
使用 Illustrator 和 javascipt
手动使用 illustrator:如果你勾勒出路径,你可以在 gui 的宽度框中读取文本的宽度。一旦理解了这一点,就可以编写脚本。
这可以用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")
有效,但需要 Illustrator 可能会或可能不会成为问题。如果需要,结果可能会针对某些技术方面进行细化。同样的事情可以在 VB 或 applescript 中完成,或者将 COM 与 C、C++、python、perl、ruby 等一起使用。如果需要,也可以通过命令行使用。
在上面的一些测试之后,选择一个进行细化。
PS:可以澄清一下吗?