将文本缩小到 tikzpicture 中节点的宽度

将文本缩小到 tikzpicture 中节点的宽度

我希望能够将文本缩放到 TikZ 节点的宽度。

使用tikzpicture 中的 \widthof作为起点,我已经找到了某种解决方案,只是它的间距不正确,而且可能可以做得更优雅。

\documentclass{article}
\usepackage{tikz}
\usepackage{calc}
\usepackage{xstring}
\usepackage{ifthen}

\newlength{\scaleratio}

\makeatletter
\newcommand{\settowidthofnode}[2] {%
  \pgfextractx{#1}{\pgfpointanchor{#2}{east}}%
  \pgfextractx{\pgf@xa}{\pgfpointanchor{#2}{west}}%
  \addtolength{#1}{-\pgf@xa}%
}%
\makeatother

\makeatletter
\newcommand{\shrinktowidthofnode}[2] {%
  \settowidthofnode{\pgf@xb}{#2}%
  \setlength{\scaleratio} {%
    {1.0pt * \ratio{\pgf@xb}{\widthof{#1}}}%
  }%
  \ifthenelse{\lengthtest{\scaleratio < 1.0pt}} {%
    \setlength{\scaleratio}{\scaleratio}%
    \tokenize{\tokenized}{\the\scaleratio}%
    \StrBefore{\tokenized}{pt}[\result]%
    \scalebox{\result}{#1}%
  } {%
    #1%
  }%
}%
\makeatother

\begin{document}

\begin{tikzpicture}[every node/.style={draw,rectangle}]
  \draw[step=0.5cm,gray,very thin] (-3,-3) grid (3,3);
  \node (n) {blah};
  \node (m) [below of=n] {\shrinktowidthofnode{AAAAAAAA}{n}};
  \node (o) [below of=m] {\scalebox{0.43259}{AAAAAAAA}};
\end{tikzpicture}

\end{document}

输出如下所示:

结果

很难看清,但如果放大,中间节点的边界框会比它应该的要大,而且它的左边有一些额外的空间(之前有更多的额外空间,但由于某种原因,%在 s 中添加到每行末尾\newcommand有所帮助)。

底部节点是基本事实。有什么想法吗?

答案1

east和锚点west包括文本和框架之间的内边距 ( inner sep)。因此,您可以将文本设置为与框架另一个节点的宽度,而不是其文本的宽度。然后新节点会添加自己的内边距,从而使其变宽。我会改用textcenter锚点(参见pgfmanual第 420 页)。它们会给您一半的文本宽度,因此这只能加倍。

也没有必要使用calcwith tikz。它自带pgfmath更强大的数学引擎。另请注意\pgfpointanchor(和所有其他\pgfpoint...宏)已经存储了X-value 放入\pgf@x\pgfextractx只需调用\pgf@process(在本地执行\pgfpoint...宏并且仅使结果全局可用)并设置#1=\pgf@x

就您而言,最好\pgf@x直接使用,但请记住它将被下一个\pgfpoint...宏覆盖。另外,您无需自己计算比例因子。\resizebox{<width>}{<height>}{<content>}graphics包中使用(已由pgf或加载tikz)。!在此处使用高度,以便它与宽度一致缩放。

现在,锚代码本身或内部似乎有一个不需要的空格\pgfpointanchor,这会导致 s 之前出现额外的空白AAAAAAA\unskip在它们后面添加可以解决这个问题。但这值得调查并报告给开发人员。

\documentclass{article}
\usepackage{tikz}

\makeatletter
\newcommand{\settowidthofnode}[2]{%
  \pgfpointanchor{#2}{center}%
  \unskip
  \setlength{#1}{\pgf@x}%
  \pgfpointanchor{#2}{text}
  \unskip
  \addtolength{#1}{-\pgf@x}%
  \addtolength{#1}{#1}%
}%
\newcommand{\shrinktowidthofnode}[2]{%
  \begingroup
  \settowidthofnode{\pgf@xb}{#2}%
  \resizebox{\pgf@xb}{!}{#1}%
  \endgroup
}%
\makeatother

\begin{document}

\begin{tikzpicture}[every node/.style={draw,rectangle}]
  \draw[step=0.5cm,gray,very thin] (-3,-3) grid (3,3);
  \node (n) {blah};
  \node (m) [below of=n] {\shrinktowidthofnode{AAAAAAAA}{n}};
  \node (o) [below of=m] {\scalebox{0.43259}{AAAAAAAA}};
\end{tikzpicture}

\end{document}

结果:

结果

相关内容