如何获得完全适合文本高度/深度的背景?

如何获得完全适合文本高度/深度的背景?

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。但是,1emTeX 的字体要小一些。正确的值是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}

结果

相关内容