![我可以使用 TikZ 水平缩放文本吗?](https://linux22.com/image/456919/%E6%88%91%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20TikZ%20%E6%B0%B4%E5%B9%B3%E7%BC%A9%E6%94%BE%E6%96%87%E6%9C%AC%E5%90%97%EF%BC%9F.png)
我正在尝试在 TikZ 中绘制带有 1-3 位数字的圆圈。所有数字应具有相同的高度,并应水平压缩以适合圆圈。高度应基于适合个位数的高度。
我想我可以用\scalebox
from 来实现这一点graphicx
,但是有没有办法只用 TikZ 来实现呢?
我最好以一种可以在 TeX、LaTeX 和 ConTeXt 之间移植的方式来做到这一点。
答案1
- 绘制具有所需尺寸的圆形节点。
- 在其中心添加标签
- 有实际内容,但没有绘图
- 经过 xscaled 处理以适合指定的
circledNumber base width
。
在xscale
公式中,基本宽度(一位或两位数)除以实际内容的宽度。这min(1,<factor>)
确保我们不会加宽实际上足够小的内容,而这些内容本身足以容纳它。这仅在基本宽度超过一位数时才需要,否则每个合理的整数都可以完美容纳或需要被挤压。
我添加了一种debug label
样式,显示外部节点用于测量其尺寸以及内部节点缩放到的文本框。
这不是一个非常有效的方法,因为我们只处理少数几个维度,而 PGFmath 会一次又一次地确定所有的宽度、高度和其他内容(尽管,如果需要,针对每种字体)。
代码
\input tikz.tex
\tikzset{
every circledNumber/.style={
shape=circle, draw, anchor=base, inner sep=+.1em, text height=height("0"),
text width=\pgfkeysvalueof{/tikz/circledNumber base width}},
circledNumber label/.style={
label={[%
xscale={min(1,\pgfkeysvalueof{/tikz/circledNumber base width}/width("#1"))},
every circledNumber label]center:#1}},
every circledNumber label/.style={
draw=none, inner sep=+0pt, outer sep=+0pt, shape=rectangle},
circledNumber base width/.initial=width("0"),
debug label/.style={
label={[%
every circledNumber,
every circledNumber label,
draw, gray, ultra thin]center:}}}
\def\circledNumber#1{%
\tikz[baseline=+0pt]
\node[every circledNumber, circledNumber label={#1}, debug label/.try]{};%
}
% \begin{document}
\circledNumber{1}
\circledNumber{10}
\circledNumber{100}
{%
\tikzset{circledNumber base width=width("00")}
\circledNumber{1}
\circledNumber{10}
\circledNumber{100}
}
% \end{document}
\bye