如何获取字体的深度和其他长度?

如何获取字体的深度和其他长度?

输出中的红线是\baselineskip,这是我所知道的唯一有问题的长度。此处提供的输出图像是经过编辑的图像,其中(代表的红线\baselineskip重新定位为从顶部底部开始x)蓝线显示我需要知道的长度。

\documentclass[varwidth]{standalone}
\usepackage{xcolor}
\begin{document}
  \fboxsep 0pt
  \fboxrule 0.1pt
  \fbox{xyfM}\newline
  \fbox{xyf}\newline
  {\color{red}\vrule height \baselineskip}
\end{document}

答案1

TeX 无法知道字形的确切大小,TeX 只知道它们周围的框,因此f第二行中的小蓝线无法由 TeX 单独确定。其他长度是可以确定的,您可以测量可以排版的任何框的大小(以下是纯 TeX 语法,在 LaTeX 中您可以使用\sbox0{x}):

\setbox0\hbox{x}
height: \the\ht0\par
depth: \the\dp0\par
width: \the\wd0

通过此,您可以确定第一条蓝线为:

\setbox0\hbox{yf}
distance between boxes: \the\dimexpr\baselineskip-\ht0-\dp0\relax

x第二行上下的蓝线:

% use even registers in 0-9 as local scratch registers
\setbox0\hbox{x}
\setbox2\hbox{yf}
distance above the x: \the\dimexpr\ht2-\ht0\relax\par
distance below the x: \the\dimexpr\dp2-\dp0\relax
\bye

在此处输入图片描述

答案2

e-tex 允许您获取每个字符的字体尺寸,而无需将其装箱,这将显示当前字体的 x 和 y

\documentclass{article}

\begin{document}

\typeout{x}
\showthe\fontcharht\font`x
\showthe\fontchardp\font`x
\showthe\fontcharwd\font`x


\typeout{y}
\showthe\fontcharht\font`y
\showthe\fontchardp\font`y
\showthe\fontcharwd\font`y
\end{document}

制作日志:

x
> 4.30554pt.
l.8 \showthe\fontcharht\font`x

? 
> 0.0pt.
l.9 \showthe\fontchardp\font`x

? 
> 5.2778pt.
l.10 \showthe\fontcharwd\font`x

? 
y
> 4.30554pt.
l.14 \showthe\fontcharht\font`y

? 
> 1.94444pt.
l.15 \showthe\fontchardp\font`y

? 
> 5.2778pt.
l.16 \showthe\fontcharwd\font`y

? 

答案3

用蓝线标记的两个距离取决于两行中的项目,除了“f”旁边的蓝线,它显然只取决于字母。

因此你无法总体上“了解”他们。

TeX 尝试实现恒定距离b连续线之间的距离(该值存储在参数中\baselineskip)。为了实现这一目标,TeX 通过确定最大深度来测量一条线(我们称之为“线 T”)和下一条线(称之为“线 B”d(字符在基线以下延伸的程度)在 T 行,最大高度在 B 行。

然后 TeX 计算bdH如果结果是正数,那么 TeX 就会在两条线之间插入一团等量的垂直粘连。

我们来看一个例子:

\documentclass{article}

\begin{document}

\typeout{depth of y: \the\fontchardp\font`y}

\typeout{height of f: \the\fontcharht\font`h}

\hbox{xyfM}\hbox{xyf}

\showoutput

\end{document}

日志文件的相关部分是

depth of y: 1.94444pt
height of f: 6.94444pt
[...]
...\hbox(6.94444+1.94444)x22.77786
....\OT1/cmr/m/n/10 x
....\OT1/cmr/m/n/10 y
....\OT1/cmr/m/n/10 f
....\OT1/cmr/m/n/10 M
...\glue(\baselineskip) 3.11111
...\hbox(6.94444+1.94444)x13.61118
....\OT1/cmr/m/n/10 x
....\OT1/cmr/m/n/10 y
....\OT1/cmr/m/n/10 f

看到,y的深度体现在T线的深度上,即\hbox(6.94444+1.94444)x22.77786;f的高度则对应B线的高度,即\hbox(6.94444+1.94444)x13.61118

如果我们尝试,1.94444+6.94444+3.11111我们会得到11.99999,对于 TeX 来说,它与 12pt 相同;实际上\typeout{\the\dimexpr1.94444pt+6.94444pt+3.11111pt}会打印12.0pt在控制台上。

然而,如果bdH小于存储在中的值\lineskiplimit(默认为 0pt),而不是计算出的粘连,TeX 使用存储在中的值\lineskip(默认为 1pt)插入固定量,这样线条就不会相互重叠(在标准设置中)。通过使用适当的\lineskiplimit和值\lineskip,实际上可以获得相互叠加的线条,而不会填满页面(这在\ooalign宏中得到利用)。

的使用\hbox可能看起来不太现实,但实际上 TeX\hbox在将段落分成几行之后就会生成 es。

TeX 不知道字形超出其边界框的量,并且与其计算无关,因为 TeX 仅使用以高度、深度和宽度为特征的边界框。

XeTeX 有一个原语可以进行此类测量,即;在 XeTeX 参考 ( )\XeTeXglyphbounds中查找它。texdoc xetex

相关内容