如何在 tikzcd 中仅在路口处过马路

如何在 tikzcd 中仅在路口处过马路

我用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]

相关内容