我想\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
可以稍后设置,而不是在绘制节点时设置。
\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}