我经常遇到这种情况,我在路径表达式中有一个复杂的计算,并且想垂直向下直到碰到某条线。例如:
\draw (node.30) -- (node.30 |- foo);
现在我有了冗余;如果我更改传出度,我必须编辑两个地方。对于更复杂的表达式,这很麻烦。因此,我提出了一种简单的语法来引用路径上的最后一个保存位置:
\draw (node.30) -- (@ |- foo);
这是代码和一些小例子。在将其发送给 TikZ 维护者之前,我想征求一下您的意见。
\documentclass[crop,tikz]{standalone}
% Define \pgfutil@at with the correct catcode
\expandafter\def\csname pgfutil@at\endcsname{@}
\makeatletter
% @ syntax to access last saved node on path
\let\tikz@parse@atsyntax@orig=\tikz@parse@node
\def\tikz@parse@node#1(#2#3){%
\def\@next{\tikz@parse@atsyntax@orig#1(#2#3)}%
% Is the name equal to '@'?
\expandafter\ifx\pgfutil@at#2%
\ifx#3&&%
\edef\@next{\noexpand#1{\noexpand\pgfqpoint{\tikz@lastxsaved}{\tikz@lastysaved}}}%
\fi%
\fi%
\@next%
}%
\makeatother
% Example follows
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\node[draw] (A) {Text A};
\node[draw] at (4,2) (B) {Text B};
\draw[->] (A.east) -- ++(30:1cm)
-- (@ |- B.west) % @ == ($(A.east)+(30:1cm)$)
-- ($(@)!0.5!(B.west)$);
\end{tikzpicture}
\end{document}
答案1
实际上,您可以使用一个活跃的角色来实现这一点,并且可以有选择地打开一些图片。
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\tikzset{tilde is lastxy/.code={\def~{\csname pgf@x\endcsname,\csname pgf@y\endcsname}},
reset tilde/.code={\def~{}}
}
\begin{document}
\begin{tikzpicture}[tilde is lastxy]
\node[draw] (A) {Text A};
\node[draw] at (4,2) (B) {Text B};
\draw[->] (A.east) -- ++(30:1cm)
-- (~ |- B.west) % @ == ($(A.east)+(30:1cm)$)
-- ($(~)!0.5!(B.west)$);
\end{tikzpicture}
\end{document}