这是我的代码:
\begin{equation*}
\begin{tikzcd}
0 \arrow[rr] & & A\arrow{dd} \arrow[rd]\arrow[rr]&& B\arrow[rd]\arrow[rr]\arrow{dd} && C\arrow[rr]\arrow[rd] && 0\\
& 0 \arrow[crossing over]{rr} && A'\arrow[crossing over]{dd} \arrow[crossing over]{rr} && B'\arrow[crossing over]{dd}\arrow[crossing over]{rr} && C'\arrow[crossing over]{dd} \arrow[rr] && 0\\
0 \arrow{rr} & & I^0\arrow{rr}&& I^0 \oplus J^0\arrow{rr} && J^0\arrow{rr} && 0 \\
& 0 \arrow[crossing over]{rr} && I^{0'} \arrow[crossing over]{rr} && I^{0'}\oplus J^{0'}\arrow[crossing over]{rr} && J^{0'} \arrow[rr] && 0
\end{tikzcd}
\begin{equation*}
不幸的是,我的图表看起来像这样: 我们可以看到,从第二行到第四行的向下箭头不遵循交叉命令。有什么想法吗?
编辑:
这是我的完整代码:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{amsthm}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{xfrac}
\usepackage{tikz-cd}
\begin{document}
\begin{equation}
\begin{tikzcd}
0 \arrow[rr] & & A\arrow{dd} \arrow[rd]\arrow[rr]&& B\arrow[rd]\arrow[rr]\arrow{dd} && C\arrow[rr]\arrow[rd] && 0\\
& 0 \arrow[crossing over]{rr} && A'\arrow[crossing over]{dd} \arrow[crossing over]{rr} && B'\arrow[crossing over]{dd}\arrow[crossing over]{rr} && C'\arrow[crossing over]{dd} \arrow[rr] && 0\\
0 \arrow{rr} & & I^0\arrow{rr}&& I^0 \oplus J^0\arrow{rr} && J^0\arrow{rr} && 0 \\
& 0 \arrow[crossing over]{rr} && I^{0'} \arrow[crossing over]{rr} && I^{0'}\oplus J^{0'}\arrow[crossing over]{rr} && J^{0'} \arrow[rr] && 0
\end{tikzcd}
\end{equation}
\end{document}
答案1
当“下箭头”已经绘制完成后,您需要延迟绘制交叉箭头。
最简单的方法是用 在目标单元格中定义它们from=
。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{amsthm}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{xfrac}
\usepackage{tikz-cd}
\begin{document}
\begin{equation}
\begin{tikzcd}[column sep={between origins,3.5em}]
0 \arrow[rr] &&
A \arrow[dd] \arrow[rd] \arrow[rr] &&
B \arrow[rd] \arrow[rr] \arrow[dd] &&
C \arrow[rr]\arrow[rd] &&
0
\\
% down arrows here are delayed
&
0 \arrow[crossing over,rr] &&
A' \arrow[crossing over,rr] &&
B' \arrow[crossing over,rr] &&
C' \arrow[rr] &&
0
\\
0 \arrow[rr] &&
I^0\arrow[rr] &&
I^0 \oplus J^0 \arrow[rr] &&
J^0\arrow{rr} &&
0
\\
&
0 \arrow[crossing over,rr] &&
I^{0'} \arrow[crossing over,rr] \arrow[from=uu,crossing over] &&
I^{0'}\oplus J^{0'} \arrow[crossing over,rr] \arrow[from=uu,crossing over] &&
J^{0'} \arrow[rr] \arrow[from=uu,crossing over] &&
0
\end{tikzcd}
\end{equation}
\end{document}
我还对您的代码做了一些调整,统一了语法。我不喜欢过长的行,这样我就可以控制一行的整个代码。更重要的是,between origins
避免对角箭头的不同斜率;缺点是必须猜测列分隔,但无论如何,在排版时都必须查看此类图表,并且不存在行或列间距的“通用配方”。
一支箭C到J0可能缺失(也在您的示例代码中)。
答案2
像这样 ?
- 我用的是箭头的绝对位置。
- 我给它们涂上颜色蓝色的以便您可以更轻松地看到更改。
- 我有评论代码是无用构建此图表而不删除它,以便您可以更轻松地看到更改。
一些解释:
- 使用 tikz-cd,
the crossing over style makes a thicker line, with color background color, to be drawn under the current arrow, simulating the effect of its passing over other arrows
(参见手册第 2.6 节(三维图)。 - 由于您的交叉箭头是先建造的,另一个箭头是其次建造的,因此它没有效果。具有交叉效果的箭头必须始终最后建造。当无法以通常的方式执行此操作时,您始终可以使用绝对位置最后构建它们。
\documentclass[border=5mm]{standalone}
%\usepackage[utf8]{inputenc}%<-- useless always loaded
%\usepackage[english]{babel}
%\usepackage{amsthm}
%\usepackage{amsfonts}
%\usepackage{amsmath}
%\usepackage{xfrac}
\usepackage{tikz-cd}
\begin{document}
% \begin{equation}
\begin{tikzcd}
0 \arrow[rr] & & A\arrow{dd} \arrow[rd]\arrow[rr]&& B\arrow[rd]\arrow[rr]\arrow{dd} && C\arrow[rr]\arrow[rd] && 0\\
& 0 \arrow[crossing over]{rr} && A'%\arrow[crossing over]{dd}
\arrow[crossing over]{rr} && B'%\arrow[crossing over]{dd}
\arrow[crossing over]{rr} && C'%\arrow[crossing over]{dd}
\arrow[rr] && 0\\
0 \arrow{rr} & & I^0\arrow{rr}&& I^0 \oplus J^0\arrow{rr} && J^0\arrow{rr} && 0 \\
& 0 \arrow[crossing over]{rr} && I^{0'} \arrow[crossing over]{rr} && I^{0'}\oplus J^{0'}\arrow[crossing over]{rr} && J^{0'} \arrow[rr] && 0
%-- absolute placement of arrows --%
\arrow[blue,from=2-4,to=4-4,crossing over]
\arrow[blue,from=2-6,to=4-6,crossing over]
\arrow[blue,from=2-8,to=4-8,crossing over]
\end{tikzcd}
% \end{equation}
\end{document}
答案3
我确认命令crossing over
正确运行。从代码比较中可以看出,我已正确定位交叉点。检查您的代码是否有两个\begin{equation*}
。
\documentclass[a4paper,12pt]{article}
\usepackage{amsmath}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}
0 \arrow[rr] & & A\arrow{dd} \arrow[rd]\arrow[rr]&& B\arrow[rd]\arrow[rr]\arrow{dd} && C\arrow[rr]\arrow[rd] && 0\\
& 0 \arrow[crossing over]{rr} && A'\arrow{dd} \arrow[crossing over]{rr} && B'\arrow{dd}\arrow{rr} && C'\arrow{dd} \arrow[rr] && 0\\
0 \arrow{rr} & & I^0\arrow[crossing over]{rr}&& I^0 \oplus J^0\arrow[crossing over]{rr} && J^0\arrow[crossing over]{rr} && 0 \\
& 0 \arrow{rr} && I^{0'} \arrow{rr} && I^{0'}\oplus J^{0'}\arrow{rr} && J^{0'} \arrow[rr] && 0
\end{tikzcd}
\end{document}
答案4
在稍后绘制(并从而指定)交叉箭头时,对于简单的情况,指定应在背景中绘制箭头(这也意味着在单元格/标签后面)可能会很有用。
因此,可以使用\ar
or来代替or 。\arrow
\bgar
\bgarrow
我没有添加快捷方式变体\bgrar
等。
代码
\documentclass{article}
\usepackage[english]{babel}
\usepackage{tikz-cd}
\usetikzlibrary{backgrounds}
\makeatletter
\let\tikzcd@ar@new@orig\tikzcd@ar@new
\def\tikzcd@ar@new@bg[#1]{%
\pgfutil@g@addto@macro\tikzcd@savedpaths{%
\pgfonlayer{background}\path[/tikz/commutative diagrams/.cd,every arrow,#1]%
(\tikzcd@ar@start\tikzcd@startanchor)to(\tikzcd@ar@target\tikzcd@endanchor);
\endpgfonlayer}\let\tikzcd@ar@new\tikzcd@ar@new@orig}
\tikzcdset{every diagram/.append code=%
\def\bgarrow{\let\tikzcd@ar@new\tikzcd@ar@new@bg\tikzcd@arrow}%
\let\bgar\bgarrow}
\makeatother
\begin{document}
\begin{equation}
\begin{tikzcd}[column sep={3.5em,between origins}]
0 \arrow[rr]
&& A\arrow[dd] \arrow[rd]\arrow[rr]
&& B\arrow[rd]\arrow[rr]\arrow[dd]
&& C\arrow[rr]\arrow[rd]
&& 0\\
& 0 \arrow[crossing over, rr]
&& A'\arrow[crossing over, dd] \arrow[crossing over, rr]
&& B'\arrow[crossing over, dd]\arrow[crossing over, rr]
&& C'\arrow[crossing over, dd] \arrow[rr]
&& 0\\
0 \arrow[rr]
&& I^0 \bgarrow[rr] % ← \bgarrow
&& I^0 \oplus J^0 \bgarrow[rr] % ← \bgarrow
&& J^0 \bgarrow[rr] % ← \bgarrow
&& 0 \\
& 0 \arrow[crossing over, rr]
&& I^{0'} \arrow[crossing over, rr]
&& I^{0'}\oplus J^{0'}\arrow[crossing over, rr]
&& J^{0'} \arrow[rr]
&& 0
\end{tikzcd}
\end{equation}
\end{document}