![如何获得完全适合文本高度/深度的背景?](https://linux22.com/image/369085/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%BE%97%E5%AE%8C%E5%85%A8%E9%80%82%E5%90%88%E6%96%87%E6%9C%AC%E9%AB%98%E5%BA%A6%2F%E6%B7%B1%E5%BA%A6%E7%9A%84%E8%83%8C%E6%99%AF%EF%BC%9F.png)
text
我尝试使用从锚点或从base
锚点开始的背景,以及colorbox
没有分隔符的背景,但是“S”的顶部和“p”的底部略高于背景边框。
是否可以精确设置它们而无需手动调整?我做错了什么吗?
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\usetikzlibrary{backgrounds}
\newlength{\mywidth}
\newlength{\mydepth}
\newlength{\myheight}
\begin{document}
\settowidth{\mywidth}{\Huge Stop}
\settodepth{\mydepth}{\Huge Stop}
\settoheight{\myheight}{\Huge Stop}
\begin{tikzpicture}
\node[draw=gray, very thick, font=\Huge] (stop) {Stop};
\scoped[on background layer]
\draw[lightgray,fill=lightgray] (stop.text) --
++(0,\myheight) -- ++(\mywidth, 0) --
++(0,-\myheight) -- ++(0,-\mydepth) --
++(-\mywidth, 0) -- cycle;
\node[draw=gray, very thick, font=\Huge, below=1ex of stop]
(another) {Stop};
\scoped[on background layer]
\draw[lightgray,fill=lightgray] (another.base) --
++(-.5\mywidth,0) --
++(0,\myheight) -- ++(\mywidth, 0) --
++(0,-\myheight) -- ++(0,-\mydepth) --
++(-\mywidth, 0) -- ++(0,\mydepth);
\node[draw=gray, very thick, font=\Huge, below=1ex of another]
(andanother) {\setlength{\fboxsep}{0pt}\colorbox{lightgray}{Stop}};
\end{tikzpicture}
\end{document}
答案1
TeX 不了解每个字形的具体内容。TeX 只知道字体提供的边界框(通过文件.tfm
)。
作为 大卫·卡莱尔他在评论中说道,如果字体设计师选择让字符偏离该区域,则无法判断。
答案2
TeX 知道字体报告的字形边界框。通常,这些边界框并不精确:
- 添加了侧边距(左右空间)。
- 弯曲的元素往往会稍微向外突出。
- 有时字形会根据设计位于边界框之外,例如:
\not
。
问题的示例使用字体cmr17.pfb
。 类似这样的字体编辑器fontforge
可以显示字形的实际尺寸:
- 左侧轴承
S
:46 - 身高
S
:699 - 深度
p
:-195 - 右侧轴承
p
:33
字体使用 1000 个单位表示 1 em。但是,1em
TeX 的字体要小一些。正确的值是24.88pt
字体的标称值:(OT1/cmr/m/n/24.88
的结果\the\font
)。
合并:
\documentclass[tikz]{standalone}
\newsavebox\StopBox
\sbox\StopBox{%
\Huge
\wlog{Font: \the\font}% Font: \OT1/cmr/m/n/24.88
\dimen0=24.88pt
\kern-.046\dimen0\relax % cancel left side bearing of S/cmr17
\smash{Stop}% no height, no depth
\kern-.033\dimen0\relax % cancel right side bearing of p/cmr17
\vrule
width 0pt
height .699\dimen0 % height of S
depth .195\dimen0 % depth of p
\relax
}
\begin{document}
\begin{tikzpicture}
\node[draw=gray, very thick, font=\Huge] (stop) {%
\setlength{\fboxsep}{0pt}%
\colorbox{lightgray}{\usebox\StopBox}%
};
\end{tikzpicture}
\end{document}