在 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}