TikZ:获取不应绘制的节点的宽度

TikZ:获取不应绘制的节点的宽度

我想绘制一个与节点 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}

相关内容