我想找到节点在稍后构建时将具有的宽度。宽度取决于节点的内容和应用于节点的样式。样式可能会使用键改变字体font
。
我尝试在仅包含节点的 TikZ 图片上使用\settowidth
,并应用样式但inner sep
设置为零。如果使用的样式是red
或text opacity=.1
或甚至 之类的样式,则此方法可以正常工作fill=colour@background
。但是,如果用户添加font=\scriptsize
样式,则编译会失败并出现致命错误。
MNWE:
\documentclass[border=10pt,multi,tikz]{standalone}
\newlength\mylength
\tikzset{%
my code/.code={%
\settowidth\mylength{\tikz{\node[my style] {something};}}%
\draw (0,0) -- +(\mylength,0);
},
my style/.style={red},
}
\begin{document}
\begin{tikzpicture}
[
my code,
]
\end{tikzpicture}
\begin{tikzpicture}
[
my style/.style={font=\normalfont},% or font=\scriptszie or font=\itshape or whatever
my code,
]% this is line 119 mentioned in the error message
\end{tikzpicture}
\end{document}
以下是这个错误最致命的后果:
! TeX capacity exceeded, sorry [input stack size=5000].
\pgf@selectfontorig ->\pgf@selectfontorig
\nullfont
l.119 ]
! ==> Fatal error occurred, no output PDF file produced!
现在\nullfont
看起来明显不太可靠,但我不确定 TikZ 为什么会失败。
无论如何,我的方法显然太过简单了。
错误的原因是什么?如何避免?
答案1
您可以使用该calc
库和一个非常远的范围与overlay
关键:
\documentclass[border=10pt,multi,tikz]{standalone}
\usetikzlibrary{calc}
\tikzset{%
my code/.code={%
\begin{scope}[overlay]
\node[my style,anchor=west] (a) at (-16000pt,0) {something};
\path let \p1 = (a.east), \p2 = (a.west), \n1 = {veclen(\x2-\x1,0)}
in \pgfextra{\xdef\mygloballenght{\n1}};
\end{scope}
\draw[black] (0,0) -- +(\mygloballenght,0);
},
}
\begin{document}
\begin{tikzpicture}[my style/.style={red,font=\Large}]
\draw[red] (0,1) -- (2,1);
\tikzset{my code}
\end{tikzpicture}
\begin{tikzpicture}[my style/.style={font=\normalfont}]
\draw[red] (0,1) -- (2,1);
\tikzset{my code}
\end{tikzpicture}
\end{document}