我想使用 tikz-cd 获得下面附加的交换图。源代码已在 TeX 中制作,底部行的节点(即 coker ker f 和 ker coker f)的定位已通过宏获得\hidewidth
。但是我如何在 tikzcd 中获得类似的结果\hidewidth
?
tikz-cd 中的代码(没有我想要获得的对齐)如下:
\begin{center}
\begin{tikzcd}
\ker f \arrow[r,"\varepsilon"] & A \arrow[r,"f"] \arrow[d] & B\arrow[r,"\pi"] & \coker f \\
& \coker\ker f\arrow[r,dotted,"\bar f"] & \ker\coker f\arrow[u]
\end{tikzcd}
\end{center}
答案1
基于\mathllap
和 的mathrlap
变体mathtools
;以及一个简单的\makebox
:
\documentclass{report}
\usepackage{mathtools,amssymb}
\usepackage{tikz-cd}
\usepackage{calc}
\DeclareMathOperator{\Ker}{Ker}
\DeclareMathOperator{\Coker}{Coker}
\begin{document}
\[
\begin{tikzcd}
\Ker f \arrow[r] & A \arrow[r]\arrow[d] & B \arrow[r] & \Coker f \\
& \mathllap{\Coker \Ker{}} f \arrow[r] & \makebox[\widthof{$B$}][l]{$\mathrlap{\Ker\Coker f}$}\arrow[u]
\end{tikzcd}
\]
\end{document}
答案2
也许不是一个完美的解决方案,但它是一个起点。
\documentclass{report}
\usepackage{amsthm,amsmath,amssymb,amsfonts}
\usepackage{tikz-cd}
\begin{document}
\[
\begin{tikzcd}
\operatorname{Ker} f \arrow[r] & A \arrow[r]\arrow[d] & B \arrow[r] & \operatorname{Coker} f \\
& \llap{$\operatorname{Coker} \operatorname{Ker}{}$}f \arrow[r] & \mathrm{K} \rlap{$\operatorname{er}\operatorname{Coker} f $}\arrow[u]
\end{tikzcd}
\]
\end{document}
答案3
说实话我更喜欢上面的那个。无论如何,这种情况可以通过简单地为长对象分配一个固定宽度(这里是 1em)来解决,使它们分别贴在左侧和右侧。
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz-cd}
\DeclareMathOperator{\coker}{coker}
\begin{document}
\[% not center
\begin{tikzcd}
\ker f \arrow[r,"\varepsilon"] &
A \arrow[r,"f"] \arrow[d] &
B\arrow[r,"\pi"] & \coker f
\\
&
\coker\ker f \arrow[r,dashed,"\bar f"] &
\ker\coker f \arrow[u]
\end{tikzcd}
\]
\[% not center
\begin{tikzcd}
\ker f \arrow[r,"\varepsilon"] &
A \arrow[r,"f"] \arrow[d] &
B\arrow[r,"\pi"] & \coker f
\\
&
\makebox[1em][r]{$\coker\ker f$} \arrow[r,dashed,"\bar f"] &
\makebox[1em][l]{$\ker\coker f$} \arrow[u]
\end{tikzcd}
\]
\end{document}
为什么不呢center
?因为\[...\]
显示不会被其上方的文本分隔开(之前没有空行\[
)。
如果您更喜欢大写字母“Ker”和“Coker”,请使用\DeclareMathOperator
如图所示的方式定义\Ker
和\Coker
。
答案4
一个纯粹的tikz-cd
解决方案,无需使用\makebox
、\mathllap
或\llap
类似手段进行破解。
您可以使用以下选项:
/tikz/column 2/.append style={nodes={anchor=base east}}
右对齐第二列的节点并:
/tikz/column 3/.append style={nodes={anchor=base west}}
将第二列的节点左对齐。
然后您可以使用选项to path
来指示您需要的路径,例如to path={-- (\tikztostart |- \tikztotarget.north)}]
表示“前往具有起点的 x 坐标和终点的 y 坐标的点,即北锚点。
对于从左下角节点到 B 的箭头,我曾经<-
反转箭头的方向以便从 B 开始并能够使用to path
。
我还习惯于&[-5em]
减少第一列与第二列之间以及第三列与最后一列之间的间距。
\documentclass{report}
\usepackage{amsthm,amsmath,amssymb,amsfonts}
\usepackage{tikz-cd}
\begin{document}
\[
\begin{tikzcd}[%
/tikz/column 2/.append style={nodes={anchor=base east}},
/tikz/column 3/.append style={nodes={anchor=base west}}
]
\operatorname{Ker} f \arrow[r] &[-5em] A \arrow[r]\arrow[d, start anchor=south,to path={-- (\tikztostart |- \tikztotarget.north)}] & B \arrow[r]\arrow[d, <-,to path={-- (\tikztostart |- \tikztotarget.north)}] &[-5em] \operatorname{Coker} f \\
& \operatorname{Coker} \operatorname{Ker} f \arrow[r] & \operatorname{Ker} \operatorname{Coker} f
\end{tikzcd}
\]
\end{document}