RFC:TikZ 路径表达式中的 @ 语法

RFC:TikZ 路径表达式中的 @ 语法

我经常遇到这种情况,我在路径表达式中有一个复杂的计算,并且想垂直向下直到碰到某条线。例如:

\draw (node.30) -- (node.30 |- foo);

现在我有了冗余;如果我更改传出度,我必须编辑两个地方。对于更复杂的表达式,这很麻烦。因此,我提出了一种简单的语法来引用路径上的最后一个保存位置:

\draw (node.30) -- (@ |- foo);

这是代码和一些小例子。在将其发送给 TikZ 维护者之前,我想征求一下您的意见。

@ synatx 的示例用法

\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}

在此处输入图片描述

相关内容