我希望能够将文本缩放到 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
)。因此,您可以将文本设置为与框架另一个节点的宽度,而不是其文本的宽度。然后新节点会添加自己的内边距,从而使其变宽。我会改用text
和center
锚点(参见pgfmanual
第 420 页)。它们会给您一半的文本宽度,因此这只能加倍。
也没有必要使用calc
with 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}