Tikz-CD 中两个平行箭头相交

Tikz-CD 中两个平行箭头相交

在 Tikz 交换图中,我想绘制两个相交的平行箭头。像这样:

A x B

|   |
|   |
 \ /
  X  f
 / \
|   |
V   V

C x D

(当然我更希望箭头弯曲得平滑而不是有尖角)。

(这里 f 是从乘积 A x B 到乘积 C x D 的映射,我想直观地表明这样一个事实:如果 f 将一对 (a, b) 发送到一对 (c, d),则 c 仅依赖于 b 而不依赖于 a,而 d 仅依赖于 a 而不依赖于 b。)

有人知道一个简单的方法吗?如果在 Tikz-CD 中不可能实现,那么使用其他软件包是否可行?

如果可以调整两个箭头之间的间隔,则可以获得加分。

答案1

如果您需要经常这样做,那么您将需要一个 tikz 样式。您可以向 tikz-cd 箭头添加以下样式,使其显示为交叉:

\documentclass[border=5pt]{standalone}
\usepackage{tikz-cd}
\usetikzlibrary{calc, decorations.pathreplacing}

\tikzset{
  crossover/.style = {
    decorate, 
    decoration={show path construction, lineto code={
      \coordinate (crossovertikzinputsegmentfirst) at (\tikzinputsegmentfirst);
      \coordinate (crossovertikzinputsegmentlast) at (\tikzinputsegmentlast);
      \pgfmathanglebetweenpoints{\pgfpointanchor{crossovertikzinputsegmentfirst}{center}}
                                {\pgfpointanchor{crossovertikzinputsegmentlast}{center}}
      \let\ang\pgfmathresult
      \path ([shift=(90+\ang:#1)] \tikzinputsegmentfirst) edge[out=\ang, in=180+\ang] ([shift=(-90+\ang:#1)] \tikzinputsegmentlast)
            ([shift=(-90+\ang:#1)] \tikzinputsegmentfirst) edge[out=\ang, in=180+\ang] ([shift=(90+\ang:#1)] \tikzinputsegmentlast);
      },
    },
    commutative diagrams/labels={inner sep=#1},
  },
  crossover/.default=.8ex,
}


\begin{document}
\begin{tikzcd}
A \times B \arrow[crossover=2ex]{d}{f} \arrow[crossover]{r}{g} & F\\
C \times D 
\end{tikzcd}
\end{document}

可选参数是箭头之间的距离(一半)。

跨界

答案2

像这样?

在此处输入图片描述

这是纯 TikZ 解决方案:

\documentclass[tikz,
               border=3mm]{standalone}
\usetikzlibrary{arrows.meta, bending, calc, chains, positioning}
\begin{document}
    \begin{tikzpicture}[
node distance = 24mm and 0mm,
  start chain = A going right,
  line/.style = {line width=1mm, draw=gray, -Stealth[bend]}
                        ]
\begin{scope}[every node/.style = {minimum size= 7mm, outer sep=0pt, 
                                   font=\Large, on chain=A}]
\node   {$A$};              % <-- name: A-1
\node   {$\times$};
\node   {$B$};
%
\node[below=of A-1] {$C$};  % <-- name: A-4
\node   {$\times$};
\node   {$D$};
\end{scope} 
\coordinate[label={[xshift=1mm]right:$f$}] (x) at ($(A-2)!0.4!(A-5)$);
\draw[line] (A-1) to [out=-90, in=135] (x) to [out=- 45, in=90] (A-6); 
\draw[line] (A-3) to [out=-90, in= 45] (x) to [out=-135, in=90] (A-4);
    \end{tikzpicture}
\end{document} 

答案3

这是我最终做的事情。代码有几个问题:

  • 由于某种原因,当我添加“到路径”选项时标签消失了,所以我画了一个不可见的(白色)箭头来打印标签;
  • 它可能会将神奇的数字“1ex”抽象为一个一劳永逸地定义的变量(但我不知道如何在 TikZ 中做到这一点);

但它有效。

\documentclass[a4paper]{scrartcl}
\usepackage{tikz-cd}
\usetikzlibrary{calc}

\begin{document}

\[\begin{tikzcd}
A \times B
  \arrow[white]{dd}{{\color{black} \hspace{1ex} f}}
  \arrow[rounded corners, to path =
      {([xshift=-1ex]\tikztostart.south)
    -- ([xshift=-1ex, yshift=1ex]$(\tikztostart.south)!.5!(\tikztotarget.north)$)
    -- ([xshift=1ex, yshift=-1ex]$(\tikztostart.south)!.5!(\tikztotarget.north)$)
    -- ([xshift=1ex]\tikztotarget.north)}]{dd}
  \arrow[rounded corners, to path =
      {([xshift=1ex]\tikztostart.south)
    -- ([xshift=1ex, yshift=1ex]$(\tikztostart.south)!.5!(\tikztotarget.north)$)
    -- ([xshift=-1ex, yshift=-1ex]$(\tikztostart.south)!.5!(\tikztotarget.north)$)
    -- ([xshift=-1ex]\tikztotarget.north)}]{dd}\\
\\
C \times D
\end{tikzcd}\]

\end{document}

相关内容