我想绘制一个与节点 B 宽度相同的节点 A。但不应绘制节点 B。如何获取 B 的宽度?
答案1
这部分基于创建一个适合其他两个节点水平宽度的节点
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\node[draw = none] at (0,-1) (B) {\phantom{This node should be hidden}};
\path let \p1=($(B.west)-(B.east)$),
\n1 = {veclen(\p1)-\pgflinewidth}
in node[minimum width=\n1,draw] at (0,-1) (A) {foobar};
\end{tikzpicture}
\end{document}
答案2
这个答案解决了原始问题,在编辑之前,该答案被编辑得不再适用。
当然,你永远无法绘制已保存的节点,但那将是一条不必要的迂回路线。
可以保存已构建的节点,稍后再绘制。这意味着您可以保存节点,测量它,使用结果执行其他操作,然后绘制原始节点。
基本方法在 Ti 的第 1030 页中有说明钾Z 手册的 PGF 部分。我定义了一些额外的便捷命令,让我们可以编写
\begin{tikzpicture}
\mylaternode [fill=magenta, blend mode=normal, draw=magenta, fill opacity=.5, draw opacity=.75] (hi) {Hello world};
\mylaternode
应该可以像之前一样工作,\node
只是我们不应该定位它,即我们不想要at
或任何东西。此命令使\mylaternodewidth
存储节点宽度减去当前线宽的命令可用。如果绘制了节点,则这是正确的。如果没有,您需要调整定义或手动添加宽度。
我们现在可以用它来构造另一个宽度匹配的节点。
\node [top color=blue!50!cyan, bottom color=blue!50!cyan, middle color=white, minimum height=20mm, minimum width=\mylaternodewidth, draw=blue!50!cyan] at (10mm,10mm) {};
最后我们用来\placemynode(<x>,<y>)
实际绘制保存的节点。
\placemynode(10mm,10mm)
\end{tikzpicture}
完成图片后,我们得到以下结果。
\documentclass[border=10pt,multi,tikz]{standalone}
\begin{document}
% adapted from manual 1030
\newbox\mybox
\newcommand*\mysaver{%
\global\setbox\mybox=\box\pgfpositionnodelaterbox
\global\let\myname=\pgfpositionnodelatername
\global\let\myminx=\pgfpositionnodelaterminx
\global\let\myminy=\pgfpositionnodelaterminy
\global\let\mymaxx=\pgfpositionnodelatermaxx
\global\let\mymaxy=\pgfpositionnodelatermaxy
\pgfmathsetlengthmacro\mylaternodexlength{abs(\mymaxx-\myminx)-\pgflinewidth}%
\global\let\mylaternodewidth=\mylaternodexlength
}
\newcommand*\myrestorer{%
\let\pgfpositionnodelatername=\myname
\let\pgfpositionnodelaterminx=\myminx
\let\pgfpositionnodelaterminy=\myminy
\let\pgfpositionnodelatermaxx=\mymaxx
\let\pgfpositionnodelatermaxy=\mymaxy
\setbox\pgfpositionnodelaterbox=\box\mybox
}
\def\mylaternode#1;{%
{%
\pgfpositionnodelater{\mysaver}
\node #1;
}%
}
\def\placemynode(#1,#2){%
\myrestorer
\pgfpositionnodenow{\pgfqpoint{#1}{#2}}%
}
\begin{tikzpicture}
\mylaternode [fill=magenta, blend mode=normal, draw=magenta, fill opacity=.5, draw opacity=.75] (hi) {Hello world};
\node [top color=blue!50!cyan, bottom color=blue!50!cyan, middle color=white, minimum height=20mm, minimum width=\mylaternodewidth, draw=blue!50!cyan] at (10mm,10mm) {};
\placemynode(10mm,10mm)
\end{tikzpicture}
\end{document}