考虑以下代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix,intersections,calc}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes,row sep={4em,between origins},column sep={5em,between origins},nodes={anchor=base}]{
|[draw,inner sep=5pt,name path=border1]| \frac{A}{B}& E \\
C & D \\ };
\draw[->,name path=line1] (m-1-1.base west) -- (m-2-2.north east);
\fill [name intersections={of=line1 and border1},green] (intersection-1) circle (1.5pt) (intersection-2) circle (1.5pt);
\fill [red] ($(m-1-1.base)+(intersection-1)$) circle (1.5pt) ($(m-1-1.base)+(intersection-2)$) circle (1.5pt);
\end{tikzpicture}
\end{document}
结果:
它的目的是找到(绿色)左上角节点 (m-1-1) 的矩形边框(绘制并命名为“border1”)与图中唯一箭头的交点。但是,如您所见,绿色交点并不位于 (m-1-1) 的边界上。相反,只有绿色点相对于点 (m-1-1.base) 的偏移量(绘制为红色)才位于边界上。
这表明名为“border1”的路径不是放在左上角的节点上,而是放在整个图片的中心某处。更准确地说,节点 (m-1-1) 的实际边界似乎是“border1”移动了 (m-1-1.base)。
因此,有几个与此相关的问题以及如何解决我的问题:
为什么“border1”是原来的边界,而不是(m-1-1)的实际边界?
是否可以采取一些不同的方式来获得节点的实际边界(而不是移动到图片中心的边界),然后我们可以用它来计算交点?
给定路径“border1”(绘制之后),我们如何创建它的一个副本,该副本按(m-1-1.base)移动,然后我们可以使用它来计算交点?(顺便问一下,如果我们不知道节点固定在(m-1-1.base)怎么办?)
答案1
因为矩阵是非常复杂。我看了一眼代码,试着理解它。我花了好几天才重新理清思路。节点必须在定位之前设置,因为它们的位置取决于后面节点的位置,所以它们要排版,然后放入框中,测量,然后定位,最后渲染框。但定位和标记是在放入框时进行的,所以偏移量都是错误的。如果你尝试矩阵中的其他条目,你会发现它们是全部位于矩阵的中心。
是的。有两种方法。一种方法是利用矩阵渲染后偏移量被记住的事实。如果你行动迅速,你可以阅读这些并找出偏移量的位置。我在回答关于设置矩阵背景的问题时做了类似的事情:如何在 Tikz 中设置矩阵节点的行和列的背景颜色?。 如果你真的想要这个,可以做到。但更快捷的方法是使用
fit
库,在正确定位原始节点后在其周围放置一个新节点。因此,以下方法有效:\documentclass{article} %% \url{https://tex.stackexchange.com/q/15985/86} \usepackage{tikz} \usetikzlibrary{matrix,intersections,calc,fit} \begin{document} \begin{tikzpicture} \matrix (m) [matrix of math nodes,row sep={4em,between origins},column sep={5em,between origins},nodes={anchor=base}]{ |[draw,inner sep=5pt]| \frac{A}{B}& E \\ C & D \\ }; \node[fit=(m-1-1),name path=border1,inner sep=0pt] {}; \draw[->,name path=line1] (m-1-1.base west) -- (m-2-2.north east); \fill [name intersections={of=line1 and border1},green] (intersection-1) circle (1.5pt) (intersection-2) circle (1.5pt); \fill [red] ($(m-1-1.base)+(intersection-1)$) circle (1.5pt) ($(m-1-1.base)+(intersection-2)$) circle (1.5pt); \end{tikzpicture} \end{document}
我认为我对(2)的回答也回答了这个问题。