输出中的红线是\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 计算b−d−H如果结果是正数,那么 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
在控制台上。
然而,如果b−d−H小于存储在中的值\lineskiplimit
(默认为 0pt),而不是计算出的粘连,TeX 使用存储在中的值\lineskip
(默认为 1pt)插入固定量,这样线条就不会相互重叠(在标准设置中)。通过使用适当的\lineskiplimit
和值\lineskip
,实际上可以获得相互叠加的线条,而不会填满页面(这在\ooalign
宏中得到利用)。
的使用\hbox
可能看起来不太现实,但实际上 TeX\hbox
在将段落分成几行之后就会生成 es。
TeX 不知道字形超出其边界框的量,并且与其计算无关,因为 TeX 仅使用以高度、深度和宽度为特征的边界框。
XeTeX 有一个原语可以进行此类测量,即;在 XeTeX 参考 ( )\XeTeXglyphbounds
中查找它。texdoc xetex