![tikz 节点中垂直居中文本更加统一](https://linux22.com/image/461707/tikz%20%E8%8A%82%E7%82%B9%E4%B8%AD%E5%9E%82%E7%9B%B4%E5%B1%85%E4%B8%AD%E6%96%87%E6%9C%AC%E6%9B%B4%E5%8A%A0%E7%BB%9F%E4%B8%80.png)
这是一个“鱼与熊掌兼得”的问题——有没有办法让节点中的单个文本字母更“统一”地居中?
默认的垂直对齐方式总体上做得很好,通过将整个文本框垂直居中对齐(至少我认为是这样),但基线根据字母而有很大差异,并且一些字母看起来有点奇怪。(b和G和μ尤其。)
有什么建议吗?我的第一个想法是以某种方式将基线小写线居中。
\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 height
并text 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 width
、text depth
和text 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}