如何使用 TikZ 在交换图中绘制标记的平行箭头?

如何使用 TikZ 在交换图中绘制标记的平行箭头?

我想用 TikZ 在交换图中绘制带标签的平行箭头,我在谷歌和 Tex Stackexchange 上搜索过,然而,我只找到了绘制平行箭头的方法transform canvas,我试图添加标签但失败了。

这是我的照片:

在此处输入图片描述

我想要标记一张从$\mathfrak{P}=\bigoplus_{i\inI}\mathfrak{P_{i}}$$\mathfrak{P_{i}}$ and from $\mathfrak{P_{i}}$到 的地图$\mathfrak{P}=\bigoplus_{i\inI}\mathfrak{P_{i}}$,即正方形的箭头。

以下是代码:

\begin{tikzpicture}[node distance=2.8cm, auto]
\node (P) {$\mathfrak{P}=\bigoplus_{i\in I}\mathfrak{P_{i}}$};
\node(Q)[right of=P] {$\mathfrak{P_{j}}$};
\node (B) [below of=P] {$\mathfrak{B}$};
\node (C) [right of=B] {$\mathfrak{C}$};
\draw[transform canvas={yshift=0.5ex},->] (P) - -(Q);
\draw[transform canvas={yshift=-0.5ex},->](Q) -- (P); 
\draw[->](Q) to node {$a$}(B);
\draw[->](Q) to node {$a$}(C);
\draw[->] (P) to node {$\pi_{j}$} (B);
\draw[->] (B) to node {$\psi$} (C);
\draw[->, dashed] (Q) to node [swap] {$g$} (B);
\end{tikzpicture}

答案1

这是您标记的线条。

还有其他方法可以转移节点,但在我看来这transform canvas是最直接的,所以你在这方面做得很好。

要标记一条线,您可以在线规范的末尾添加一个节点命令。标签可以放置在above或,您可以使用关键字(例如或更通用的)below指定沿线的位置。我还移动了对角线,以便它们都可以被看到(因为其中一条是虚线)。midwaypos=<fraction along line>

我添加了一个宏来简化对角线的移动。

\documentclass[border=5pt]{standalone}

\usepackage{amsmath,amssymb}

\usepackage{tikz}
\usetikzlibrary{calc}


\begin{document}

\begin{tikzpicture}[node distance=2.8cm, auto]

\pgfmathsetmacro{\shift}{0.3ex}

\node (P) {$\mathfrak{P}=\bigoplus_{i\in I}\mathfrak{P_{i}}$};
\node(Q)[right of=P] {$\mathfrak{P_{j}}$};
\node (B) [below of=P] {$\mathfrak{B}$};
\node (C) [right of=B] {$\mathfrak{C}$};

\draw[transform canvas={yshift=0.5ex},->] (P) --(Q) node[above,midway] {\tiny top};
\draw[transform canvas={yshift=-0.5ex},->](Q) -- (P) node[below,midway] {\tiny bottom}; 
\draw[->](Q) to node {$a$}(C);
\draw[->] (P) to node[swap] {$\pi_{j}$} (B);
\draw[->,dashed] (B) to node {$\psi$} (C);

\draw[->,transform canvas={xshift=-\shift,yshift=\shift}](Q) to node {$a$}(B);
\draw[->, dashed,transform canvas={xshift=\shift,yshift=-\shift}] (Q) to node[swap] {$g$} (B);

\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

也许是为了澄清一些观点。

1) 第一种([yshift=...]P)--([yshift=...]Q)不起作用。示例:

\documentclass{scrartcl}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
  \node(A) at (0,0) {A};   \node(B) at (5,0) {B};
   \draw[green] (A) -- (B);
   \draw [yellow,yshift=.5 cm] (0,0) -- (5,0);
   \draw[blue,yshift=1 cm] (A) -- (B); %problem
   \draw[red] ([yshift=1 cm]A) -- ([yshift=1 cm]B);  %problem
   \draw[magenta] ([yshift=1 cm]A.east) -- ([yshift=1 cm]B.west);     
\end{tikzpicture}   

\begin{tikzpicture}
  \coordinate(A) at (0,0) ;   \coordinate(B) at (5,0);
  \draw (A) -- (B);
  \draw[red] ([yshift=.5 cm]A) -- ([yshift=.5 cm]B);  %fine 
  \draw[blue,yshift=1 cm] (A) -- (B); %problem    
\end{tikzpicture} 
\end{document}

在此处输入图片描述

2)关于transform canvas

应谨慎使用画布变换。在大多数情况下,您不希望图片中的线宽发生变化,因为这会造成视觉不一致。同样重要的是,当您使用画布变换时,pgf 会丢失节点位置和图片大小的轨迹,因为它在计算节点坐标时不考虑画布变换的影响(但不要依赖这一点;它可能会在未来发生变化)。最后,请注意,画布变换始终适用于整个路径,不可能(对于坐标变换)在路径的不同部分使用不同的变换。简而言之,除非您真正知道自己在做什么,否则不应使用画布变换。

我认为最好避免

3)我删除了right of等,因为我喜欢在必要时缩放图片

right of似乎更简洁,但你需要修复node distance=...并写得 right of=P at (5,0)更简洁或`-++(5,0)``

\documentclass{scrartcl}    
\usepackage{amsmath,amssymb}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}[auto,scale=2]

\node (P) at (0,0)  {$\mathfrak{P}=\bigoplus_{i\in I}\mathfrak{P_{i}}$};
\node (Q) at (3,0)  {$\mathfrak{P_{j}}$};
\node (B) at (0,-3) {$\mathfrak{B}$};
\node (C) at (3,-3) {$\mathfrak{C}$};    


\draw[->] ([yshift =  .3ex]P.east)  --  node[above] {\tiny top}     
          ([yshift =  .3ex]Q.west) ;
\draw[<-] ([yshift = -.3ex]P.east) --  node[below] {\tiny bottom}  
          ([yshift = -.3ex]Q.west); 
\draw[->](Q) to node {$a$}(C);
\draw[->] (P) to node[swap] {$\pi_{j}$} (B);
\draw[->,dashed] (B) to node {$\psi$} (C);  

\draw[->]    ( Q.south west)  -- node[above] {$a$}
             ( B.north east) ; 

\draw[->,dashed] ([xshift= 0.2ex ,yshift = - 0.3ex ] Q.south west) -- node[below] {$g$} 
                 ([xshift=  0.2ex ,yshift = - 0.3ex ]B.north east);

\end{tikzpicture}
\end{document} 

在此处输入图片描述

答案3

你可能还想看看这个相当新的包tikz-cd

其命令\arrow有一个强制参数,用于标识方向,例如r“右”。它还有一个可选参数来指定 TikZ 选项,例如transform canvas。它还有用于标签的进一步参数对(可选和“强制”)。

  • 指向右边的箭头:\arrow{r}
  • 上面带有标签的向右箭头:\arrow{r}{label}
  • 指向右侧的箭头,下方带有标签:\arrow{r}[swap]{label}
  • 指向右侧并移动的箭头:\arrow[transform canvas={yshift=.5ex}]{r}

以下是一次完整的尝试:

\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{tikz-cd}

\begin{document}

\begin{tikzcd}[row sep=3cm,column sep=2.5cm]
   \mathfrak{P}=\bigoplus_{i\in I}\mathfrak{P_{i}}
     \arrow[transform canvas={yshift=.5ex}]{r}
     \arrow[transform canvas={yshift=-.5ex},leftarrow]{r}
     \arrow{d}[swap]{\pi_{j}}
 & \mathfrak{P_{j}}
     \arrow{d}{a}
     \arrow[transform canvas={yshift=.3ex,xshift=-.3ex}]{ld}[swap]{g}
     \arrow[transform canvas={yshift=-0.3ex,xshift=.3ex},dashed]{ld}{a} \\
     \mathfrak{B}
     \arrow{r}{\psi}
 & \mathfrak{C}
\end{tikzcd}

\end{document}

在此处输入图片描述

相关内容