我用tikzcd
它来画图。我希望一条线在(且仅在)交叉点处与另一条线相交。我使用这个crossing over
选项。但还有其他东西被覆盖了。这是我的代码。
\documentclass{article}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}
X_1 &X_2 &X_3\ar[dll]\\
Y_1 &Y_2 &Y_3
\ar[from=1-2,crossing over]
\ar[from=1-1,crossing over]
\end{tikzcd}
\end{document}
$X_2$
图片是结果。我手动画了一个红色的圆圈来强调箭头。箭头从到的部分头部$Y_3$
被遮住了。
那么,有什么方法可以让crossing over
仅在交叉点处?谢谢您的建议。
答案1
这可能不是最优雅的解决方案,但却是 TikZ 的一种方法。
它在背景箭头和前景箭头之间的交叉点处绘制白色圆圈。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix,intersections}
\pgfdeclarelayer{fg}
\pgfdeclarelayer{crossing over}
\pgfsetlayers{main,crossing over,fg}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes, column sep=1cm, row sep=1cm, circle] {
X_1 &X_2 &X_3 \\
Y_1 &Y_2 &Y_3 \\
};
\draw[->, name path=bg arrow] (m-1-3) -- (m-2-1);
\begin{pgfonlayer}{fg}
\draw[->, name path global/.expanded=fg arrow1] (m-1-1) -- (m-2-3);
\draw[->, name path global/.expanded=fg arrow2] (m-1-2) -- (m-2-3);
\end{pgfonlayer}
\begin{pgfonlayer}{crossing over}
\foreach \arrow in {1, ..., 2} {
\fill[white, name intersections={of=bg arrow and fg arrow\arrow, name=i}] (i-1) circle (2pt);
}
\end{pgfonlayer}
\end{tikzpicture}
\end{document}
编辑:替代代码产生相同的输出但避免了多层:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix,intersections}
\makeatletter
% http://tex.stackexchange.com/a/127045/120953
\tikzset{use path/.code=\tikz@addmode{\pgfsyssoftpath@setcurrentpath#1}}
\makeatother
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes, column sep=1cm, row sep=1cm, circle] {
X_1 &X_2 &X_3 \\
Y_1 &Y_2 &Y_3 \\
};
\draw[->, name path=bg arrow] (m-1-3) -- (m-2-1);
\path[name path=fg arrow1, save path=\pathFGone] (m-1-1) -- (m-2-3);
\path[name path=fg arrow2, save path=\pathFGtwo] (m-1-2) -- (m-2-3);
\foreach \arrow in {1, ..., 2} {
\fill[white, name intersections={of=bg arrow and fg arrow\arrow, name=i}] (i-1) circle (2pt);
}
\draw[->, use path=\pathFGone];
\draw[->, use path=\pathFGtwo];
\end{tikzpicture}
\end{document}
答案2
我通过将一个箭头的长度从 减少到X_1
来解决了您的问题Y_3
。希望一切顺利。一般来说,我会尝试对每个 MWE 进行轻微的更改。
\documentclass{article}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}[column sep = large, row sep = large]
X_1 &X_2 &X_3\ar[dll]\\
Y_1 &Y_2 &Y_3
\ar[from=1-2,crossing over]
\ar[from=1-1,crossing over, shorten >= 5pt]
\end{tikzcd}
\end{document}
答案3
一个非常简单的解决方案是重新绘制第一个不带cross over
选项的交叉箭头。
\documentclass{standalone}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}
X_1 &X_2 &X_3\ar[dll]\\
Y_1 &Y_2 &Y_3
\ar[from=1-2,crossing over]
\ar[from=1-1,crossing over]
\ar[from=1-2]
\end{tikzcd}
\end{document}
如果你不喜欢箭头顶部的排列方式,你也可以使用塞巴斯蒂亚诺的回答并稍微缩短其中一个箭头,例如\ar[from=1-1,crossing over,shorten=2pt]
。