tikz 节点中垂直居中文本更加统一

tikz 节点中垂直居中文本更加统一

这是一个“鱼与熊掌兼得”的问题——有没有办法让节点中的单个文本字母更“统一”地居中?

默认的垂直对齐方式总体上做得很好,通过将整个文本框垂直居中对齐(至少我认为是这样),但基线根据字母而有很大差异,并且一些字母看起来有点奇怪。(bGμ尤其。)

有什么建议吗?我的第一个想法是以某种方式将基线小写线居中。

\documentclass[tikz, border=1mm]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach\s  [count=\i] in {x,y,z,\delta, \mu, \beta, 1, 4, b, g, S, f, k, c, w, l, \rho, \lambda,\nu,\xi, p, q, r, t } {
  \pgfmathsetmacro{\row}{int((\i-1)/6)}
  \pgfmathsetmacro{\col}{mod(\i-1,6)}
  \node[circle, inner sep = 0, minimum width = 5mm, draw=black] at (0.55*\col,0.55*\row) {$\s$};
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

弄乱text heighttext depth有点起作用...至少它使基线统一,但代价是使一些字符在其他方面看起来“不对劲”。

\documentclass[tikz, border=1mm]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach\s  [count=\i] in {x,y,z,\delta, \mu, \beta, 1, 4, b, g, S, f, k, c, w, l, \rho, \lambda,\nu,\xi, p, q, r, t } {
  \pgfmathsetmacro{\row}{int((\i-1)/6)}
  \pgfmathsetmacro{\col}{mod(\i-1,6)}
  \node[circle, inner sep = 0, minimum width = 5mm, draw=black, text height=2.0ex, text depth=1ex] at (0.55*\col,0.55*\row) {$\s$};
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案1

您可以测量所有字符的最大宽度、深度和高度,并使用此信息来设置text widthtext depthtext height。在此示例中,文本高度设置为最大高度加上最大深度。这是否是最佳选择取决于个人喜好。您可能想尝试不同的方案,直到找到足够吸引人的东西。

\documentclass[tikz, border=1mm]{standalone}

\begin{document}
\begin{tikzpicture}[measure char/.code={\setbox0\hbox{$#1$}%
    \ifcsname mywd\endcsname
        \pgfmathsetmacro{\mywd}{max(\mywd,\wd0)}%
    \else
        \pgfmathsetmacro{\mywd}{\wd0}%
    \fi 
    \ifcsname mydp\endcsname
        \pgfmathsetmacro{\mydp}{max(\mydp,\dp0)}%
    \else
        \pgfmathsetmacro{\mydp}{\dp0}%
    \fi 
    \ifcsname myht\endcsname
        \pgfmathsetmacro{\myht}{max(\myht,\ht0)}%
    \else
        \pgfmathsetmacro{\myht}{\ht0}%
    \fi 
    }]
\tikzset{measure char/.list={x,y,z,\delta, \mu, \beta, 1, 4, b, g, S, f, k, c, w, l, \rho, \lambda,\nu,\xi, p, q, r, t }}
\foreach\s  [count=\i] in {x,y,z,\delta, \mu, \beta, 1, 4, b, g, S, f, k, c, w, l, \rho, \lambda,\nu,\xi, p, q, r, t } {
  \pgfmathsetmacro{\row}{int((\i-1)/6)}
  \pgfmathsetmacro{\col}{mod(\i-1,6)}
  \node[circle, inner sep = 0, text width = \mywd pt,text depth=\mydp pt,text height=\myht pt+\mydp pt, draw=black,align=center] at (0.55*\col,0.55*\row) {$\s$};
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这不是一个答案。我只测试了这里提出的 3 个解决方案,通过在每个解决方案中添加以下代码行(在每个环境的开头)tikkzpicture

\draw[gray!15,step=.55] (-.5,-.5) grid (3,2);

我有这个居中比较的结果:

在此处输入图片描述

对我来说,第一个更好。

相关内容