我的问题是:
是否可以通过对齐它们的子节点来对齐任意两个节点?
对于 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}