稍后引用节点时使用 tikz 节点 `pos`-key

稍后引用节点时使用 tikz 节点 `pos`-key

我想\node[pos=0.8]{MYNODE};在节点内部定义之后使用例如\draw

考虑以下

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
    \begin{tikzpicture}
        \draw(0,0) -- (2,2) node(myLine){};
        \node[above left,pos=0.8] at (myLine){Upper part};
    \end{tikzpicture}
\end{document}

输出结果如下

该图显示 pos 被“忽略”

然而,我希望它呈现这样的输出:

所需输出(pos 不会被忽略)


期望输出可以可以像下面这样生成,但重要的是pos可以稍后设置,而不是在绘制节点时设置。

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
    \begin{tikzpicture}
        \draw(0,0) -- (2,2) node[pos=0.8](myLine){};
        \node[above left] at (myLine){Upper part};
    \end{tikzpicture}
\end{document}

有任何想法吗?

谢谢! :)

附言:请随意编辑/澄清标题。我很难构思它。

答案1

在 TikZ 的源代码中,将节点(坐标、图片)沿路径段放置的算法称为计时器(pos在内部也称为时间)。

在路径操作期间,--TikZ 将起点和终点存储在两个宏中,并将计时器设置为直线的计时器。当pos遇到具有 ition 的节点时,将使用此计时器相应地访问起点/终点宏。

这在路径甚至下一个路径操作中都无法幸免。不过,我们可以一起破解一些东西:

由于\node可能放置在可能不使用与操作相同的变换矩阵的上下文中,因此--我们只需将这两个点保存为坐标并将它们用作起点和终点坐标。


这仅仅是一个概念证明,因为我们需要为每个计时器编写一个保存器和恢复器(默认情况下只有四个:--|-/ -|,,)。arc.. controls ..

不幸的是,没有好的界面可以解决这个问题。

代码

\documentclass[tikz]{standalone}
\makeatletter
\tikzset{
  save line timer/.code=
    \pgfcoordinate{tikz@saved@timer@start@#1}{\tikz@timer@start}%
    \pgfcoordinate{tikz@saved@timer@end@#1}  {\tikz@timer@end},
  restore line timer/.code=
    \let\tikz@timer\tikz@timer@line
    \def\tikz@timer@start{\pgfpointanchor{tikz@saved@timer@start@#1}{center}}%
    \def\tikz@timer@end  {\pgfpointanchor{tikz@saved@timer@end@#1}  {center}}}
\makeatother
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (2,2) [save line timer=myLine];
\tikzset{rotate=30, shift={(3,5)}} % random stuff
\node[restore line timer=myLine, above left, pos=.8] {Upper part};
\end{tikzpicture}
\end{document}

相关内容