我可以使用 TikZ 水平缩放文本吗?

我可以使用 TikZ 水平缩放文本吗?

我正在尝试在 TikZ 中绘制带有 1-3 位数字的圆圈。所有数字应具有相同的高度,并应水平压缩以适合圆圈。高度应基于适合个位数的高度。

我想我可以用\scaleboxfrom 来实现这一点graphicx,但是有没有办法只用 TikZ 来实现呢?

我最好以一种可以在 TeX、LaTeX 和 ConTeXt 之间移植的方式来做到这一点。

答案1

  1. 绘制具有所需尺寸的圆形节点。
  2. 在其中心添加标签
    • 有实际内容,但没有绘图
    • 经过 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

输出

在此处输入图片描述

相关内容