在 Tikz 中的交换图中使箭头平行

在 Tikz 中的交换图中使箭头平行

我只是想让交换正方形中所有应该平行的箭头实际上平行。这是我的图表: 在此处输入图片描述

外层方块显示来自所显示域和余域的函数。内层方块(问题方块)精确显示这些函数对元素的作用。我希望所有相应的线都是平行的。此外,右下角的内部节点侵入了外部节点。我该如何将其移开并获得正确的方块?

这是我的代码:

\documentclass[12pt]{article}
\usepackage{pictexwd,dcpic}
\usepackage{amsmath,amsfonts,amsthm,dsfont,bbm}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows,decorations.pathmorphing}
\usepackage{tikz-cd}
\usepackage{verbatim}

\begin{document}

\begin{tikzpicture}[baseline=(current  bounding  box.center), scale = 1.5]

\node (homa) at (2, 2) {$\text{hom}_{D}(a, a)$};
\node (homb) at (2,0) {$\text{hom}_{D}(a, b)$};
\node (Ta) at (6, 2) {$Ta$};
\node (Tb) at (6,0) {$Tb$};
\node (id) at (homa.south east) {$1_a$};
\node (f) at (homb.north east) {$f$};
\node (x) at (Ta.south west) {$x$};
\node (Tfx) at (Tb.north west) {$Tf(x)$};
\path[->]
(homa) edge node[left]{$\text{hom}_{D}(a, f)$} (homb)
(Ta) edge node[right] {$Tf$} (Tb)
(homa) edge node[above] {$\tau_a$} (Ta)
(homb) edge node[below] {$\tau_{b}$} (Tb);    
\path[>=stealth,|->] 
(id) edge (f)
(id) edge (x)
(f) edge (Tfx)
(x) edge (Tfx);
\end{tikzpicture}

\end{document}

我已使用(node.south west)处方将节点定位在内正方形中。我确实希望内正方形的节点恰好位于外正方形节点的角上,因为内正方形的节点是外正方形节点所表示的各个集合的成员。

答案1

以 为例tikz-cd

输出

在此处输入图片描述

代码

\documentclass{article}
\usepackage{tikz-cd}

\begin{document}
\[\begin{tikzcd}[row sep={6mm,between origins},column sep={1cm,between origins}]
hom_{D}(a,a) \arrow[rrrr, "\tau_{a}"] \arrow[ddd, "{hom_{D}(a,f)}", swap] 
    & & & & Ta \arrow[ddd, "Tf"] \\  
    & 1_{a} \arrow[rr, |->] \arrow[d, |->] & & x \arrow[d, |->] & \\[1cm]
    & f \arrow[rr, |->] & & Tf(x) \\
hom_{D}(a,b) \arrow[rrrr, "\tau_{b}", swap] & & & & Tb\\  
\end{tikzcd}\]
\end{document}

答案2

对于交换图我总是使用tikz 的 \matrix命令与 一起matrix of math nodes使用。这提供了一种简单的方法,可以将图表的节点放入数组中,然后在节点之间绘制线条。要使用此功能,您需要有

\usetikzlibrary{matrix}

在你的序言中。基本思想是这样的:

\begin{tikzpicture}[auto]
  \matrix (M)[matrix of math nodes,row sep=1cm,column sep=16mm]{
     A&B\\
     C&D\\
   };
   \draw[->](M-1-1)--(M-1-2)--(M-2-2)--(M-2-1)--(M-1-1);
\end{tikzpicture}

生成结果:

在此处输入图片描述

因此,您可以将节点称为(M-<row>-<col>)。是的M第一个参数。您可以随意将其设置为任意值。(M)\matrix

通常,行和列的间距由 控制row sep=1cm,column sep=16mm,对于所有行和列都是恒定的(再次选择合适的值)。对于 OP 图,我们需要稍微改变间距,您可以使用矩阵内的可选参数来实现,如下所示。指定您想要的行和列距离也是很好的,between origins因为这会带来更好的间距。最终结果是:

在此处输入图片描述

以下是代码:

\documentclass{article}
\usepackage{mwe}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows}
\usepackage{amsmath}

\begin{document}

  \begin{center}
    \begin{tikzpicture}[>=stealth,->,shorten >=2pt,looseness=.5,auto]
      \matrix (M)[matrix of math nodes,row sep={6mm,between origins},
                                       column sep={6mm,between origins}]{
        \hom_{D}(a, a)&      &[28mm] &  Ta\\% 28mm=extra space between cols 2&3
                      &  1_a & x     &    \\[16mm]% extra space between rows 2&3
                      &    f & Tf    &   \\
        \hom_{D}(a, a)&      &       & Tb\\
       };
       \draw[->](M-1-1)--node{$\tau_a$}(M-1-4);
       \draw[->](M-4-1)--node[below]{$\tau_b$}(M-4-4);
       \draw[->](M-1-1)--node[left]{$\hom_D(a,f)$}(M-4-1);
       \draw[->](M-1-4)--node{$Tf$}(M-4-4);
       % inner square
       \draw[|->](M-2-2)--(M-2-3);
       \draw[|->](M-3-2)--(M-3-3);
       \draw[|->](M-2-2)--(M-3-2);
       \draw[|->](M-2-3)--(M-3-3);
    \end{tikzpicture}
  \end{center}

\end{document}

请注意,我使用\hom而不是\text{hom}来表示 hom-spaces。我还使用了“隐形”箭头,因为我更喜欢它们。

相关内容