Tikz:是否可以通过对齐它们的子节点来对齐任意两个节点?

Tikz:是否可以通过对齐它们的子节点来对齐任意两个节点?

我的问题是:

  • 是否可以通过对齐它们的子节点来对齐任意两个节点?

  • 对于 TikZ 节点,是否可以向现有节点添加新锚点?
    (例如:添加node-b.north为 的新锚点node-a

在这个例子中,我尝试将两个节点的“Delta”放在同一条垂直线上,但是失败了。

\documentclass[10pt,a4paper, utf-8]{article}
\usepackage{
    amsmath, 
    mathtools,
    amsfonts,
    amssymb,
    tikz
}
\usetikzlibrary{
    tikzmark,
    positioning,
    matrix,
}

\begin{document}
\begin{tikzpicture}[remember picture]
\node(a) [draw] {$A \subnode[draw]{sub-a}{\Delta} B \wedge C$};
\node(b) [draw,anchor=sub-b,below=1pt of sub-a]{$A \wedge C \subnode{sub-b}{\Delta} B$};
\end{tikzpicture}
\end{document}

我的想法是将 b 的锚点从子 b 移到子 a(如矩阵:您可以设置matrix anchor=inner node)。
我用tikzmark它来获取两个“Delta”的坐标。
当我尝试设置锚点的起点时,它不起作用。

一个简单的类比也许可以帮助你理解我的想法:
如果节点b是一艘船,那么
命令“ anchor=...”设置锚的释放点,
命令“ below=...”设置锚的目的地。


附言:

虽然matrix是一个可行的解决方案,
但是当“Delta”在分数内时(例如,“Delta”在分母内)就麻烦了。
上面的代码块只是一个简单的例子,
我真正希望看到的是一个更通用的解决方案(标题中说明)。

第一个问题已经回答了,但我真的很想看到第二个问题的答案对于 TikZ 节点,是否可以向现有节点添加新锚点?)。

请不要删除您的原始答案。它们也很有用^__^。

答案1

这是个微妙的问题!从表面上看,这似乎很简单。我们不能直接使用坐标\subnode来定位外部节点(b),因为在放置节点之后才能知道它在页面上的位置b。但有一个标准的解决方法 - 我们将各种必要的位置保存到文件中aux,然后在定位节点之前加载它们。

如果这么简单,我们要做的是保存sub-b节点和b节点的位置,然后使用它们的差值来调整节点的位置b。虽然这会移动b,但它也会移动sub-b相同的量,因此它们的差值保持不变。

问题在于子节点 ( sub-b) 的坐标已经基于以前的编译。因此上述策略不起作用,因为 TikZ 始终认为它sub-b位于上一次编译的位置。但b节点的位置基于当前的编译。因此 TikZ 不断地在玩追逐游戏,因为节点会在页面上b追逐子节点。sub-b

为了摆脱这个陷阱,我们还需要使用b上一次编译的位置。幸运的是,tikzmark可以处理保存部分。这样做的结果是,这需要三次编译才能解决。

\documentclass[10pt,a4paper]{article}
%\url{https://tex.stackexchange.com/q/567070/86}
\usepackage{
    amsmath, 
    mathtools,
    amsfonts,
    amssymb,
    tikz
}
\usetikzlibrary{
    tikzmark,
    calc,
}

\begin{document}
\begin{tikzpicture}[remember picture]
\node(a) [draw] {$A \subnode{sub-a}{\Delta} B \wedge C$};
\node(b) [draw] at ($(sub-a.south)-(pic cs:b)$) {$A \wedge C \subnode{sub-b}{\Delta} B$};
\begin{scope}[overlay]
\tikzmark{a}{(b.center)}
\tikzmark{b}{($(sub-b.north)-(pic cs:a)$)}
\end{scope}
\end{tikzpicture}
\end{document}

子节点对齐

答案2

此解决方案使用范围,首先计算 (sub-b) 和 (b) 的相对位置,然后将它们移动到需要的位置。由于 [记住图片],我无法重复使用节点名称 (b) 和 (sub-b)。请注意,(b.center) 和 (c.center) 位于其各自范围的原点。

\documentclass{standalone}
\usepackage{
    amsmath, 
    mathtools,
    amsfonts,
    amssymb,
    tikz
}
\usetikzlibrary{
    tikzmark,
    positioning,
    matrix,
    calc
}

\begin{document}
\begin{tikzpicture}[remember picture]
\node(a) [draw] {$A \subnode[draw]{sub-a}{\Delta} B \wedge C$};
\begin{scope}[opacity=0]
\node(b) [draw]{$A \wedge C \subnode{sub-b}{\Delta} B$};
\coordinate(S) at ($(sub-a.south)-(sub-b.north)-(0,1pt)$);
\end{scope}
\begin{scope}[shift=(S)]
\node(c) [draw]{$A \wedge C \subnode{sub-c}{\Delta} B$};
\end{scope}
\end{tikzpicture}
\end{document}

演示

相关内容